Как получить доступ к данным в AWS S3 из кластера Apache Hadoop через Hive и Spark

Автор Категория , ,
Как получить доступ к данным в AWS S3 из кластера Apache Hadoop через Hive и Spark

Чтобы сделать наши курсы по Apache Hadoop и компонентам этой экосистемы хранения и эффективной аналитики больших данных еще более полезными, сегодня рассмотрим, как получить данные из облачного объектного хранилища AWS S3 с помощью заданий Hive и Spark. А также заглянем внутрь конфигурационных xml-файлов Hadoop и Hive.

Еще раз о разнице между AWS S3 и Hadoop HDFS

При том, что облачное объектное хранилище AWS S3 сегодня стало практически стандартом де-факто для надежного хранения данных, оно не может полностью заменить распределенную файловую систему HDFS. В S3 данные хранятся в виде объектов в ресурсах, которые называются корзинами или бакетами (buckets), доступным через API или с помощью консоли Amazon. Хотя интеграция AWS с клиентом Hadoop представляет корзину S3 как файловую систему, bucket следует рассматривать как хранилище объектов, где операции с каталогами потенциально медленные и неатомарные. Также в корзине S3 поддерживаются не все файловые операции, например, отсутствует переименование, а данные не видны, пока не записан весь выходной поток.

Наконец, AWS S3 гарантирует согласованность в конечном счете (eventual consistency), когда объекты реплицируются между серверами для обеспечения доступности, но репликация изменения данных выполняется долго и может привести к несогласованности. Еще S3 не поддерживает разрешения файлов и каталогов HDFS, а также ACL-механизм для безопасного доступа к объектам по контрольным спискам (Access Control List).

Основы Hadoop

Код курса
INTR
Ближайшая дата курса
28 февраля, 2022
Длительность обучения
24 ак.часов
Стоимость обучения
60 000 руб.

За взаимодействие HDFS с AWS S3 используется коннектор S3A – клиента файловой системы, которая позволяет представить облачное объектное хранилище как файловую систему, чтобы обеспечить совместимость с распределенной файловой системой Хадуп. Файловая система S3A включает классы для интеграции с протоколами фиксации заданий Hadoop и Spark с механизмом многокомпонентной загрузки (MultiPart Upload, MPU) файлов в S3. Это позволяет клиенту записывать данные в нескольких POST-запросах по HTTP и автоматически используется при записи больших объемов данных в S3. Подробнее об этом мы рассказывали здесь.

Однако, для взаимодействия Hadoop c S3 одного S3A-коннектора недостаточно. Рассмотрим пример, когда заданию MapReduce, Spark или Hive необходимо получить данные из AWS S3.

Обращение к данных в AWS S3 из экосистемы Hadoop

Если заданию MapReduce, Spark или Hive нужно получить данные из AWS S3, необходимы следующие компоненты:

  • идентификатор ключа доступа к AWS;
  • ключ доступа к AWS Secret;
  • URI-адрес папки с файлами данных, который должен начинаться с s3a, поскольку предыдущие версии коннекторов s3 и s3n устарели и не поддерживаются в последнем релизе Apache Hadoop;
  • jar-файл hadoop-aws с реализацией коннектора S3A, версия которого должна совпадать с версией Хадуп;
  • jar-файл aws-java-sdk-bundle, который зависит от jar-файла hadoop-aws и тоже должен быть подходящей версии.

Чтобы получить из Hadoop доступ к данным в корзине S3, необходимо изменить конфигурации на каждом узле и перезапустить компоненты кластера:

  • HDFS с узла имен (NameNode);
  • YARN с узла диспетчера ресурсов;
  • хранилище метаданных Hive (Metastore);
  • сам Hive как инструмент SQL-on-Hadoop;
  • Livy как RESTful-интерфейс доступа к Spark.

Разберем несколько важных конфигураций в xml-файлах.

Файл core-site.xml сообщает демону Hadoop, где в кластере выполняется NameNode. Он содержит параметры конфигурации для Hadoop Core: свойства ввода-вывода, общие для HDFS и MapReduce. Здесь следует задать идентификатор ключа доступа к AWS и ключ доступа к AWS Secret:

<property>
   <name>fs.s3a.access.key</name>
   <value>AWS_ACCESS_KEY_ID</value>
</property><property>
   <name>fs.s3a.secret.key</name
   <value>AWS_ACCESS_SECRET_KEY</value>
</property><property>
    <name>fs.s3a.impl</name
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>

Файл hdfs-site.xml содержит параметры конфигурации для демонов HDFS, основного и вторичного узла имен, а также узлов данных (DataNodes). В файле hdfs-site.xml можно указать репликацию блока по умолчанию и проверку разрешений в HDFS, а также фактическое количество репликаций. Для интеграции Hadoop с AWS S3 в этом файле также задается идентификатор ключа доступа к AWS и ключ доступа к AWS Secret:

<property>
    <name>fs.s3a.access.key</name>
    <value>AWS_ACCESS_KEY_ID</value>
</property><property>
    <name>fs.s3a.secret.key</name>
    <value>AWS_ACCESS_SECRET_KEY</value>
</property>

Файл mapred-site.xml содержит параметры конфигурации для демонов MapReduce, трекеры заданий и задач. Для обращения к AWS S3 из Hadoop в этом файле указывается реализация коннектора S3A:

<property>
    <name>fs.s3a.impl</name>
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>

Файл hive-site.xml используется для установки значений всей конфигурации Hive. Для обращения к S3 из Hive здесь также указывается идентификатор ключа доступа к AWS и ключ доступа к AWS Secret:

<property>
    <name>fs.s3a.access.key</name>
    <value>AWS_ACCESS_KEY_ID</value>
</property><property>
    <name>fs.s3a.secret.key</name>
    <value>AWS_ACCESS_SECRET_KEY</value>
</property>

Проверить, что все работает верно, т.е. можно ли получить доступ к папке S3 и файлам из HDFS, помогут простые тестовые задания. Например, можно получить список всех файлов в папке S3 и посмотреть их содержимое. Для работы с Hive следует сперва создать внешнюю таблицу, которая будет указывать на папку S3 в качестве местоположения данных. Далее можно посмотреть строки в таблице и посчитать их. А удостовериться, что Spark работает корректно, поможет простое задание, которое считывает данные из папки S3 и выполняет несложные преобразования, например, перевод CSV-файлов в датафрейм. Также можно считать внешнюю таблицу Hive, указывающую на папку в S3, и перевести данные в датафрейм. Однако, если в Hive включен защищенный протокол Kerberos, могут потребоваться дополнительные настройки для реализации подобного теста.

В заключение отметим, что Hadoop также имеет встроенный jar-файл для объектного хранилища Azure, т.е. подобную последовательность действий можно выполнить не только для AWS S3. О том, почему не все бывает гладко при передаче данных в AWS S3 с помощью Apache Spark, читайте в нашей новой статье.

Узнайте больше про практическое применение Apache Hive для эффективной аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://github.com/aws-samples/eks-spark-benchmark/blob/master/performance/s3.md
  2. https://medium.com/@prempiyush/how-to-access-your-data-in-s3-from-your-spark-hadoop-hive-cluster-f950e346efb0
  3. https://www.edureka.co/blog/explaining-hadoop-configuration/