Портирование частично-реляционных данных S3 в Redshift через Spark и Glue - PullRequest
0 голосов
/ 15 мая 2018

Я должен предварять это тем фактом, что я использую Enhanced VPC Routing для своей учетной записи AWS, что не позволяет мне использовать традиционные запросы S3 для Redshift:

" В вашем кластере не может быть включена расширенная маршрутизация VPC. (Для использования Spectrum) "


Мое понимание заключается в том, что AWS Redshift является высокооктановым Postgres-as-a-service, который оптимизирован для чрезвычайно быстрого чтения на больших объемах данных. Так что, если у вас лотов есть реляционные данные, которые вы хотите запросить / проанализировать, тогда Redshift - это хороший выбор для вас.

Мое понимание AWS Athena заключается в том, что он просто использует что-то вроде Apache Drill (или аналогичное) для обеспечения SQL-подобного интерфейса над любыми данными, хранящимися в сегментах S3 (реляционные и в противном случае, а также в любом формате: неструктурированный текст, JSON, XML и т. д.). Так что, если у вас есть данные в S3, которые вы хотите запросить с помощью SQL-подобного синтаксиса, Athena - хороший выбор для вас.

Для начала, может ли кто-нибудь начать с подтверждения / уточнения моего понимания выше? Предполагая, что я более или менее прав ...

Я структурированный / реляционный (хранится в файлах JSON и CSV), который живет на S3. Я хотел бы создать процесс ETL, который считывает эти данные из S3 и выгружает их в Redshift, чтобы последующие процессы могли их анализировать.

Так что я думаю о создании ETL-конвейера на основе Spark, в результате чего:

  1. Spark использует Athena для запроса данных S3 в DataFrames; Мне также интересно, может ли AWS Glue сделать здесь тяжелую работу
  2. Spark записывает содержимое этих DataFrames в Redshift

Итак, мой вопрос: это самый эффективный способ переноса БОЛЬШИХ объемов частично структурированных / реляционных данных S3 (снова хранящихся в различных форматах файлов) в Redshift, или есть лучший / более простой способ?

1 Ответ

0 голосов
/ 15 мая 2018

EDIT Поскольку ваш кластер Redshift вообще не имеет доступа к S3 (из-за расширенной маршрутизации VPC), я вижу здесь вариант использования JDBC для записи в Redshift.

Относительно Афины : Поскольку вы используете Spark, вам здесь не нужна Афина - spark может считывать данные с S3 и создавать из них информационный фрейм.

Относительно клея : Glue представляет собой Spark предложение Spark, которое поставляется с Glue Catalog (Metastore), сканерами для обнаружения таблиц и генератором кода Spark для простых преобразований. Лучше всего то, что он также запускает простой искровой код. Я не знаю, как вы выполняете свои искровые рабочие нагрузки, но это может быть вариантом.

Запись DataFrame в конечную точку JDBC в Spark может выглядеть следующим образом:

val spark = SparkSession.getOrCreate(...)
val dataframe = spark
   .read
   .format("csv") //or json
   .load("s3://your-s3-path") 

val connectionProps = new Properties()
redshiftConnProps.setProperty(...)

dataframe
    .write
    .jdbc("redshift-url", "tablename", connectionProperties)

Подробную информацию о свойствах соединения jdbc смотрите в Spark DataFrameWriter документации .

Обратите внимание : Как я уже упоминал в комментарии, загрузка данных через интерфейс JDBC в Redshift не рекомендуется, поскольку весь трафик проходит через главный узел и не может должным образом использовать параллелизм.


Существует более простой способ, даже два:

  1. Для загрузки данных из s3 в Redshift вам не нужен какой-либо внешний процесс ETL (при условии, что вам не нужно преобразовывать данные). Redshift поддерживает прямую загрузку данных с S3

    copy venue from 's3://mybucket/venue'
    iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
    delimiter '|';
    
  2. Другим вариантом является использование спектра Redshift (и это нечто очень похожее на AWS Athena, но с механизмом sql красного смещения вместо Presto), который позволяет выставлять сегменты S3 в виде таблиц без необходимости перемещения данных куда-либо. Вы просто создаете EXTERNAL SCHEMA и EXTERNAL TABLE, и ваша таблица является видимой и доступной для просмотра из Redshift (а также из Афины). Подробнее в официальной документации AWS

Обратите внимание : Redshift поддерживает только схемы flat , поэтому, если у вас есть struct, array или map в вашей схеме, вы не сможете загрузите его в Redshift до того, как вы его сгладите (AWS Glue предоставляет функцию relationalize, которая делает это автоматически). Поскольку Presto DOES поддерживает вложенные схемы, вы МОЖЕТЕ использовать Athena для запроса сложных схем.

...