Загрузка данных (постепенно) в Amazon Redshift, S3 против DynamoDB против вставки

У меня есть веб-приложение, которое должно отправлять отчеты о его использовании. Я хочу использовать Amazon RedShift в качестве хранилища данных для этой цели. Как мне собирать данные?

Каждый раз, когда пользователь взаимодействует с моим приложением, я хочу сообщить об этом... так когда мне следует записывать файлы на S3? а сколько? Я имею в виду следующее: - Если информация не будет отправлена ​​немедленно, то я могу потерять ее в результате потери соединения или из-за ошибки в моей системе, когда она была собрана, и подготовиться к отправке на S3... - Если я буду записывать файлы в S3 при каждом взаимодействии с пользователем, я получу сотни файлов (в каждом файле есть минимальное количество данных), которые нужно будет обработать, отсортировать, удалить после копирования в RedShift... эта доза не выглядит как хорошее решение.

Что мне не хватает? Должен ли я использовать DynamoDB вместо этого, Должен ли я вместо этого использовать простую вставку в Redshift!?
Если мне нужно записать данные в DynamoDB, я должен удалить таблицу удержания после того, как была скопирована... Каковы лучшие практики?

В любом случае, каковы лучшие методы, чтобы избежать дублирования данных в RedShift?

Ценю помощь!

5 ответов

Решение

Рекомендуется объединять журналы событий перед их использованием в Amazon Redshift.

Преимущества:

  • Вы будете лучше использовать параллельную природу Redshift; КОПИЯ на набор больших файлов в S3 (или из большой таблицы DynamoDB) будет намного быстрее, чем отдельная вставка или копирование небольшого файла.

  • Вы можете предварительно отсортировать данные (особенно если сортировка основана на времени события) перед загрузкой в ​​Redshift. Это также улучшит производительность нагрузки и уменьшит потребность в VACUUM ваших таблиц.

Вы можете накапливать свои события в нескольких местах перед агрегацией и загрузкой их в Redshift:

  • Локальный файл на S3 - наиболее распространенный способ - объединить ваши журналы на клиент / сервер и каждые x МБ или y минут загружать их на S3. Есть много приложений для журналов, которые поддерживают эту функцию, и вам не нужно вносить какие-либо изменения в код (например, FluentD или Log4J). Это можно сделать только с помощью конфигурации контейнера. Недостатком является то, что вы рискуете потерять некоторые журналы, и эти локальные файлы журналов могут быть удалены перед загрузкой.

  • DynamoDB - как описано @Swami, DynamoDB - очень хороший способ накапливать события.

  • Amazon Kinesis - недавно выпущенный сервис также является хорошим способом быстрой и надежной передачи ваших событий с различных клиентов и серверов в центральное место. События расположены в порядке вставки, что позволяет легко загружать его, предварительно предварительно отсортировав его в Redshift. События хранятся в Kinesis в течение 24 часов, и вы можете запланировать чтение из kinesis и загрузку в Redshift, например, каждый час для повышения производительности.

Обратите внимание, что все эти сервисы (S3, SQS, DynamoDB и Kinesis) позволяют передавать события напрямую от конечных пользователей / устройств без необходимости проходить через промежуточный веб-сервер. Это может значительно улучшить высокую доступность вашего сервиса (как справиться с повышенной нагрузкой или сбоями сервера) и стоимость системы (вы платите только за то, что используете, и вам не нужно иметь недостаточно загруженные серверы только для журналов).

Посмотрите, например, как вы можете получить временные токены безопасности для мобильных устройств здесь: http://aws.amazon.com/articles/4611615499399490

Другим важным набором инструментов, позволяющих напрямую взаимодействовать с этими службами, являются различные SDK. Например, для Java, .NET, JavaScript, iOS и Android.

Относительно требования дедупликации; в большинстве описанных выше опций вы можете сделать это на этапе агрегации, например, когда вы читаете из потока Kinesis, вы можете проверить, что у вас нет дубликатов в ваших событиях, но анализировать большой буфер событий перед тем, как поместить в хранилище данных.

Однако вы можете сделать эту проверку и в Redshift. Хорошей практикой является COPY данные в промежуточные таблицы, а затем ВЫБРАТЬ В хорошо организованную и отсортированную таблицу.

Еще одна лучшая практика, которую вы можете реализовать, - это иметь ежедневный (или еженедельный) раздел таблицы. Даже если вы хотите иметь одну большую таблицу длинных событий, но большинство ваших запросов выполняются в один день (например, в последний день), вы можете создать набор таблиц с похожей структурой (events_01012014, events_01022014, events_01032014...). Тогда ты можешь SELECT INTO ... WHERE date = ... к каждой из этих таблиц. Если вы хотите запросить данные за несколько дней, вы можете использовать UNION_ALL.

Один из вариантов - создание таблиц временных рядов в DynamoDB, где вы создаете таблицу каждый день или неделю в DynamoDB, чтобы записывать каждое взаимодействие с пользователем. В конце периода времени (день, час или неделя) вы можете скопировать журналы в Redshift.

Для получения дополнительной информации о таблице временных рядов DynamoDB см. Этот шаблон: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html

и этот блог:

http://aws.typepad.com/aws/2012/09/optimizing-provisioned-throughput-in-amazon-dynamodb.html

Для Redshift DynamoDB копия: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html

Надеюсь это поможет.

Хотя здесь уже есть принятый ответ, AWS запустил новый сервис под названием Kinesis Firehose, который обрабатывает агрегацию в соответствии с заданными пользователем интервалами, временную загрузку в s3 и загрузку (SAVE) для красного смещения, повторных попыток и обработки ошибок, управления пропускной способностью и т. Д....

Это, наверное, самый простой и надежный способ сделать это.

Вы можете записать данные в файл CSV на локальном диске, а затем запустить скрипт Python/boto/psycopg2 для загрузки данных в Amazon Redshift.

В моем CSV_Loader_For_Redshift я делаю именно это:

  1. Сжатие и загрузка данных в S3 с использованием модуля Python boto и многоэтапной загрузки.

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
    bucket = conn.get_bucket(bucket_name)
    k = Key(bucket)
    k.key = s3_key_name
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr )
    
  2. Используйте команду psycopg2 COPY для добавления данных в таблицу Redshift.

    sql="""
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
    

Просто быть немного эгоистичным и точно описать, что делает Snowplow, платформа аналитики событий. Они используют этот удивительный уникальный способ сбора журналов событий от клиента и агрегирования их на S3.

Для этого они используют Cloudfront. Что вы можете сделать, так это разместить пиксель в одном из сегментов S3 и поместить этот сегмент за дистрибутив CloudFront в качестве источника. Включите журналы в корзину S3 для того же CloudFront.

Вы можете отправлять журналы в качестве параметров url всякий раз, когда вызываете этот пиксель на своем клиенте (аналог Google Analytics). Эти журналы могут быть обогащены и добавлены в базу данных Redshift с помощью Copy.

Это решает цель агрегации журналов. Эта настройка будет обрабатывать все это для вас.

Вы также можете заглянуть в Piwik, который является сервисом аналитики с открытым исходным кодом, и посмотреть, можете ли вы изменить его в соответствии с вашими потребностями.

Другие вопросы по тегам