Недавно мы писали про чтение данных из AWS S3 с помощью PySpark-задний. Продолжая разбираться, как перейти от HDFS к облачным объектным хранилищам, сегодня рассмотрим пример чтения и записи файлов из Google Cloud Storage с помощью Apache Spark.
От HDFS к GCS
Распределенная файловая система Apache Hadoop (HDFS) уже много лет используется в качестве главного средства хранения больших данных и является основой корпоративных озер данных (Data Lake). Ее распределенный характер упрощает горизонтальное масштабирование, позволяя добавлять больше серверов для размещения растущего объема данных. Но управлять большим количеством серверов не самая простая задача. Кроме того, как и в любой распределенной системе, между серверами случаются сетевые проблемы, которые необходимо оперативно устранять. Наконец, много серверов HDFS – это довольно дорогой ресурс даже для крупных предприятий.
Поэтому многие современные компании стремятся перейти от собственных HDFS-кластеров к облачным объектным хранилищам, например, AWS S3 или Google Cloud Storage (GCS). Они обходятся дешевле в обслуживании, сохраняют высокую доступность и гибкую масштабируемость по запросу. GCS совместим со всей экосистемой Hadoop, включая вычислительный движок Apache Spark и NoSQL-СУБД Hive. Рассмотрим, как читать и записывать файлы в GCS с помощью Spark-приложения. Прежде всего, следует создать и настроить корзину GCS, а также создать учетную запись сервиса, который будет использоваться приложением Spark для доступа к корзине. Сделать это можно в веб-GUI GCS, зайдя на страницу учетной записи службы в службе GCP IAM. После создания служебной учетной записи необходимо получить ее ключ JSON. Это действие также выполняется в пользовательском интерфейсе Google Cloud Storage, где можно создать новый ключ в формате JSON, который Spark-приложение будет использовать для доступа к корзине GCS.
После создания корзины необходимо разрешить учетной записи сервиса доступ к объектам в ней. Как и предыдущие действия, разрешения добавляются в веб-GUI. Чтобы предоставлять созданной учетной записи полный контроль над объектами только в этой корзине, ей следует назначить роль администратор объекта хранилища. Код Spark-приложения, которое читает и записывает данные в GCS, ничем не отличается от того, которое работает с HDFS, кроме замены префикса hdfs:// или file:// на gs:// в путях к файлам.
Коннектор Hadoop для приложения Apache Spark
Для отправки приложения Spark в облачную платформу Google требуются JSON-файл ключа учетной записи сервиса и JAR-файл коннектора GCS к Apache Hadoop, который можно загрузить бесплатно. Имея ключ JSON и файл JAR, можно выполнить команду отправки Spark-приложения в кластер через spark-submit:
spark-submit --class "com.example.MainApp" --master "local[*]" --conf spark.executor.extraClassPath=/home/fariqodri/Experiment/gcs-connector-hadoop2-2.2.7-shaded.jar --conf spark.driver.extraClassPath=/home/fariqodri/Experiment/gcs-connector-hadoop2-2.2.7-shaded.jar --conf spark.hadoop.google.cloud.auth.service.account.json.keyfile=/home/fariqodri/Experiment/data-experiment-21-418b180d6b34.json --conf spark.hadoop.fs.gs.implicit.dir.repair.enable=false build/libs/spark_gcs.jar
В этой команде файл JAR включается в путь к классам драйвера и исполнителя Apache Spark. Альтернативным способом сделать это является помещение JAR-файла непосредственно в путь к классам Spark или его включение в JAR-файл приложения Spark. Файл ключа учетной записи сервиса также включается в конфигурацию Spark. Можно сделать это по-другому, например, используя переменную среды:
export GOOGLE_APPLICATION_CREDENTIALS="/home/fariqodri/Experiment/data-experiment-21-418b180d6b34.json"
Конфигурация коннектора GCS к Hadoop под названием spark.hadoop.fs.gs.implicit.dir.repair.enable, установленная в значение false, предотвращает закрытие приложения Spark даже после завершения всех заданий.
В заключение отметим, что для отправки SQL-запросов к Google Cloud Storage, Apache Spark может использовать JDBC-драйвер CData, который обеспечивает высокую производительность при взаимодействии с оперативными данными благодаря встроенным алгоритмам оптимизированной обработки. Драйвер отправляет поддерживаемые операции SQL, такие как фильтры и агрегации, непосредственно в Google Cloud Storage и использует встроенный механизм для обработки неподдерживаемых операций на стороне клиента. Это позволяет выполнять запросы динамических метаданных при анализе данных в Google Cloud Storage, используя их собственные типы. Подробнее про использование JDBC-драйверов в Spark-приложениях мы писали здесь и здесь.
Освойте использование Apache Spark в аналитике больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark