Мы изучили [1], как MinIO и Hudi работают вместе для создания современного озера данных. Целью этой публикации в блоге является развитие этих знаний и предоставление альтернативной реализации Hudi и MinIO, использующей службу Hive Metastore Service (HMS[2]). Отчасти из-за истории происхождения экосистемы Hadoop многие крупномасштабные реализации данных Hudi до сих пор используют HMS. Часто истории миграции из устаревших систем связаны с некоторой степенью гибридности, поскольку успех достигается за счет использования лучших из всех задействованных продуктов.
Эволюция Hudi от использования HDFS к облачному объектному хранилищу, такому как MinIO, идеально согласуется с отходом индустрии данных от монолитных и неподходящих устаревших решений. Производительность[3], масштабируемость[4] и экономичность[5] MinIO делают его идеальным для хранения и управления данными Hudi. Кроме того, оптимизации Hudi для Apache Spark, Flink, Presto, Trino, StarRocks и других современных данных легко интегрируются с MinIO для обеспечения производительности в облаке в любом масштабе. Эта совместимость представляет собой важную закономерность в современной архитектуре озера данных.
Хотя Hudi предоставляет основные возможности управления данными «из коробки», интеграция с HMS добавляет еще один уровень контроля и видимости. Вот как интеграция HMS дает преимущества крупномасштабному развертыванию Hudi:
Для завершения этого руководства вам потребуется настроить некоторое программное обеспечение. Вот подробности:
Установка. Установщик Docker Desktop предоставляет удобное универсальное решение для установки Docker и Docker Compose на определенной платформе (Windows, macOS или Linux). Обычно это проще, чем загружать и устанавливать их по отдельности. После установки Docker Desktop или комбинации Docker и Docker Compose вы можете проверить их наличие, выполнив в терминале следующую команду:
docker-compose --version
Обратите внимание, что это руководство создано для Linux/amd64, и для его работы с чипом Mac M2 также необходимо установить Rosetta 2. Вы можете сделать это в окне терминала, выполнив следующую команду:
softwareupdate --install-rosetta
Rosetta также необходимо включить двоичную эмуляцию x86_64/amd64 на Apple Silicone в настройках Docker Desktop. Для этого перейдите в «Настройки» → «Основные» и установите флажок Rosetta, как показано ниже.
В этом руководстве используется демонстрационный репозиторий StarRocks. Клонируйте репозиторий, найденный здесь [6]. В окне терминала перейдите в каталог document-samples, затем перейдите в папку hudi и выполните следующую команду:
docker compose up
После выполнения приведенной выше команды вы должны увидеть работающие StarRocks, HMS и MinIO. Получите доступ к консоли MinIO через http://localhost:9000/ и войдите в систему, используя учетные данные admin:пароль. Вы увидите, что хранилище сегментов хранилища было создано автоматически.
Выполните следующую команду, чтобы получить доступ к оболочке внутри контейнера spark-hudi:
docker exec -it hudi-spark-hudi-1 /bin/bash
Затем выполнение следующей команды приведет к входу в Spark REPL:
/spark-3.2.1-bin-hadoop3.2/bin/spark-shell
После входа в оболочку выполните следующие строки Scala, чтобы создать базу данных, таблицу и вставить данные в таблицу:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
import org.apache.spark.sql.SaveMode._
import org.apache.hudi.DataSourceReadOptions._
import org.apache.hudi.DataSourceWriteOptions._
import org.apache.hudi.config.HoodieWriteConfig._
import scala.collection.JavaConversions._
val schema = StructType(Array(
StructField("language", StringType, true),
StructField("users", StringType, true),
StructField("id", StringType, true)
))
val rowData= Seq(
Row("Java", "20000", "a"),
Row("Python", "100000", "b"),
Row("Scala", "3000", "c")
)
val df = spark.createDataFrame(rowData, schema)
val databaseName = "hudi_sample"
val tableName = "hudi_coders_hive"
val basePath = "s3a://warehouse/hudi_coders"
df.write.format("hudi").
option(org.apache.hudi.config.HoodieWriteConfig.TABLE_NAME, tableName).
option(RECORDKEY_FIELD_OPT_KEY, "id").
option(PARTITIONPATH_FIELD_OPT_KEY, "language").
option(PRECOMBINE_FIELD_OPT_KEY, "users").
option("hoodie.datasource.write.hive_style_partitioning", "true").
option("hoodie.datasource.hive_sync.enable", "true").
option("hoodie.datasource.hive_sync.mode", "hms").
option("hoodie.datasource.hive_sync.database", databaseName).
option("hoodie.datasource.hive_sync.table", tableName).
option("hoodie.datasource.hive_sync.partition_fields", "language").
option("hoodie.datasource.hive_sync.partition_extractor_class", "org.apache.hudi.hive.MultiPartKeysValueExtractor").
option("hoodie.datasource.hive_sync.metastore.uris", "thrift://hive-metastore:9083").
mode(Overwrite).
save(basePath)
Озеро данных MinIO теперь настроено с использованием Hudi и HMS. Вернитесь по адресу http://localhost:9000/, чтобы увидеть заполненную папку репозитория.
При желании вы можете использовать следующую Scala в той же оболочке для дальнейшего изучения данных.
val hudiDF = spark.read.format("hudi").load(basePath + "/*/*")
hudiDF.show()
val languageUserCount = hudiDF.groupBy("language").agg(sum("users").as("total_users"))
languageUserCount.show()
val uniqueLanguages = hudiDF.select("language").distinct()
uniqueLanguages.show()
// Stop the Spark session
System.exit(0)
Hudi, MinIO и HMS работают вместе, обеспечивая комплексное решение для создания и управления современными озерами данных в любом масштабе. Интеграция этих технологий обеспечивает гибкость, масштабируемость и безопасность, необходимые для раскрытия всего потенциала ваших данных.
[1]
Уже исследовано: [https://blog.min.io/streaming-data-lakes-hudi-minio/?utm_term=&utm_campaign=&utm_source=adwords&utm_medium=ppc&hsa_acc=8976569894&hsa_cam=20466868543&hsa_grp=&hsa_ad=&hsa_src=x&hsa_tgt=&hsa_kw=&hsa_mt=&hsa_net=adwords&hsa_ver=3&gad_source=1&gclid=CjwKCAiA0PuuBhBsEiwAS7fsNQanvkO02hS9l_MY0HTiH2XjcPVJVDITKXq4ydcHFmDYUGrwgVH0WBoCXtEQAvD_BwE](https://blog.min.io/streaming-data-lakes-hudi-minio/?utm_term=&utm_campaign=&utm_source=adwords&utm_medium=ppc&hsa_acc=8976569894&hsa_cam=20466868543&hsa_grp=&hsa_ad=&hsa_src=x&hsa_tgt=&hsa_kw=&hsa_mt=&hsa_net=adwords&hsa_ver=3&gad_source=1&gclid=CjwKCAiA0PuuBhBsEiwAS7fsNQanvkO02hS9l_MY0HTiH2XjcPVJVDITKXq4ydcHFmDYUGrwgVH0WBoCXtEQAvD_BwE)
[2]
HMS: [https://hive.apache.org/?ref=blog.min.io](https://hive.apache.org/?ref=blog.min.io)
[3]
производительность: [https://blog.min.io/nvme_benchmark/](https://blog.min.io/nvme_benchmark/)
[4]
Масштабируемость: [https://min.io/product/scalable-object-storage?ref=blog.min.io](https://min.io/product/scalable-object-storage?ref=blog.min.io)
[5]
Экономическая эффективность: [https://blog.min.io/the-long-term-costs-of-storage-in-the-cloud/](https://blog.min.io/the-long-term-costs-of-storage-in-the-cloud/)
[6]
Здесь: [https://github.com/StarRocks/demo?ref=blog.min.io](https://github.com/StarRocks/demo?ref=blog.min.io)