Автоматическая загрузка данных в Redshift с помощью функции КОПИРОВАНИЯ

#amazon-web-services #amazon-s3 #amazon-redshift

#amazon-веб-сервисы #amazon-s3 #amazon-redshift

Вопрос:

В документации Amazon Redshift указано, что лучший способ загрузки данных в базу данных — это использование функции КОПИРОВАНИЯ. Как я могу запускать его автоматически каждый день с файлом данных, загруженным на S3?

Более длинная версия: я запустил кластер Redshift и настроил базу данных. Я создал корзину S3 и загрузил файл CSV. Теперь из редактора запросов Redshift я могу легко запустить функцию КОПИРОВАНИЯ вручную. Как мне это автоматизировать?

Комментарии:

1. У вас есть несколько вариантов! Проще всего настроить задание cron для запуска в экземпляре ec2 каждый день в определенное время, задание cron будет использовать psql для выполнения вашей команды копирования

2. Спасибо, я посмотрю в psql.

3. Вы можете написать лямбда-функцию, которая запускает ее при каждой загрузке файла в корзину триггером. Это всего лишь несколько строк кода, я использую python и boto3 для таких ситуаций

4. С Лямбдой все в порядке, но время ожидания истекает через 15 минут.

5. @MiloBellano где мне написать эти лямбда-функции?

Ответ №1:

Прежде чем доработать свой подход, вам следует рассмотреть следующие важные моменты:

  1. Если возможно, сжимайте csv-файлы в gzips, а затем загружайте в соответствующие таблицы redshift. Это значительно уменьшит размер вашего файла и повысит общую производительность обработки данных.

  2. Доработайте схему сжатия столбцов таблицы. Если вы хотите, чтобы redshift выполнял эту работу, автоматическое сжатие можно включить с помощью «COMPUPDATE ON» в команде копирования. Обратитесь к документации aws

Теперь, чтобы ответить на ваш вопрос:

Поскольку вы создали S3 bucket для того же, создайте каталоги для каждой таблицы и разместите там свои файлы. Если ваши входные файлы большие, разделите их на несколько файлов (количество файлов следует выбирать в соответствии с количеством имеющихся у вас узлов, чтобы обеспечить лучший параллельный прием, обратитесь к aws doc за более подробной информацией).

Ваша команда копирования должна выглядеть примерно так :

 PGPASSWORD=<password> psql -h <host> -d <dbname> -p 5439 -U <username> -c "copy <table_name> from 's3://<bucket>/<table_dir_path>/'     credentials 'aws_iam_role=<iam role identifier to ingest s3 files into redshift>' delimiter ',' region '<region>' GZIP COMPUPDATE ON REMOVEQUOTES IGNOREHEADER 1"
  

следующим шагом будет создание lambda и включение sns через redshift s3 bucket, этот sns должен активировать lambda, как только вы получите новые файлы в s3 bucket. Альтернативным методом было бы настроить cloudwatch scheduler на запуск lambda.

Можно создать Lambda (java / python или любой другой язык программирования), который считывает файлы s3, подключается к redshift и загружает файлы в таблицы с помощью команды copy.

У Lambda есть ограничение в 15 минут, если это вас беспокоит, то fargate было бы лучше. Выполнение заданий на EC2 приведет к большему выставлению счетов, чем на lambda или fargate (на случай, если вы забудете выключить компьютер ec2)

Ответ №2:

Вы могли бы создать внешнюю таблицу поверх своей корзины. Redshift автоматически сканирует все файлы в корзине. Но имейте в виду, что производительность запросов может быть не такой хорошей, как при загрузке данных через COPY, но что вы получаете, так это отсутствие необходимости в планировщике.

Кроме того, если у вас есть внешняя таблица, вы можете загрузить ее в redshift один раз с помощью одного CREATE TABLE AS SELECT ... FROM your_external_table . Преимущество этого подхода в том, что он идемпотентный — вам не нужно отслеживать свои файлы — он всегда будет загружать все данные из всех файлов в корзине.