Загрузка данных (постепенно) в 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 я делаю именно это:
Сжатие и загрузка данных в 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 )
Используйте команду 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, который является сервисом аналитики с открытым исходным кодом, и посмотреть, можете ли вы изменить его в соответствии с вашими потребностями.