Apache Hudi表自動同步至阿里雲數據湖分析DLA

  • 2020 年 8 月 10 日
  • 筆記

1. 引入

Hudi 0.6.0版本之前只支援將Hudi表同步到Hive或者兼容Hive的MetaStore中,對於雲上其他使用與Hive不同SQL語法MetaStore則無法支援,為解決這個問題,近期社區對原先的同步模組hudi-hive-sync進行了抽象改造,以支援將Hudi表同步到其他類型MetaStore中,如阿里雲的數據湖分析DLA(//www.aliyun.com/product/datalakeanalytics中。

2. 抽象

將Hudi表同步至Hive MetaStore的程式碼在hudi-hive-sync模組,為兼容更多類型MetaStore,現將其改造為如下模組

hudi-sync
|-hudi-sync-common
|-hudi-hive-sync
|-hudi-dla-sync

其中各模組說明如下

  • hudi-sync-common表示元數據同步公共模組,用於存放一些用於同步的公共父類;
  • hudi-hive-sync表示同步Hive模組;
  • hudi-dla-sync表示同步阿里雲DLA模組;

基於上述結構,用戶可基於hudi-sync-common構建自定義的元數據同步邏輯。

3. 配置

下面以DLA為例,介紹如何通過Spark寫入Hudi表後自動將Hudi表同步至DLA中,同步核心配置如下

df.write().format("hudi").
  options(getQuickstartWriteConfigs()).
  option(PRECOMBINE_FIELD_OPT_KEY(), "ts").
  option(RECORDKEY_FIELD_OPT_KEY(), "name").
  option(PARTITIONPATH_FIELD_OPT_KEY(), "location").
  option("hoodie.embed.timeline.server", false).
  option(TABLE_NAME, tableName).
  option(TABLE_TYPE_OPT_KEY(), tableType).
  option(META_SYNC_CLIENT_TOOL_CLASS(), "org.apache.hudi.dla.DLASyncTool").
  option(META_SYNC_ENABLED_OPT_KEY(), "true").
  option("hoodie.datasource.dla_sync.database", dbName).
  option("hoodie.datasource.dla_sync.table", tableName).
  option("hoodie.datasource.dla_sync.username", dlaUsername).
  option("hoodie.datasource.dla_sync.password", dlaPassword).
  option("hoodie.datasource.dla_sync.jdbcurl", dlaJdbcUrl).
  option("hoodie.datasource.dla_sync.partition_fields", "location").
  option("hoodie.datasource.dla_sync.partition_extractor_class", "org.apache.hudi.hive.MultiPartKeysValueExtractor").
  mode(saveMode).
  save(basePath);

關鍵配置項說明如下:

  • META_SYNC_CLIENT_TOOL_CLASS()表示進行同步的類,指定為org.apache.hudi.dla.DLASyncTool表示通過DLASyncTool進行同步,與HiveSyncTool同步至Hive功能類似;
  • hoodie.datasource.dla_sync.database表示同步至DLA中的資料庫名;
  • hoodie.datasource.dla_sync.table表示同步至DLA中的表名;
  • hoodie.datasource.dla_sync.username表示連接DLA的用戶名;
  • hoodie.datasource.dla_sync.password表示連接DLA的密碼;
  • hoodie.datasource.dla_sync.jdbcurl表示連接DLA的JDBC連接;
  • hoodie.datasource.dla_sync.partition_fields表示同步至DLA的分區欄位;
  • hoodie.datasource.dla_sync.partition_extractor_class表示同步至DLA的分區值解析器;

除了上述配置外,還需要在pom.xml依賴中新增hudi-dla-sync依賴(hudi.version為0.6.0-SNAPSHOT)

<dependency>
	<groupId>org.apache.hudi</groupId>
	<artifactId>hudi-dla-sync</artifactId>
	<version>${hudi.version}</version>
</dependency>

4. 同步

上述配置中,資料庫名配置為hudi_dla_demo_db,表名配置為hudi_trips_dal_demo;其他用戶名、密碼、JDBC連接配置可參考如下鏈接://help.aliyun.com/document_detail/110829.html。配置完後即可在Spark寫入Hudi時自動將Hudi表同步至DLA,同步結果如下

查詢表結果如下:

為方便用戶直觀感受到將Hudi表同步到DLA,可參考這裡//help.aliyun.com/document_detail/173653.html直接運行對應Jar包來快速構建基於Hudi和DLA的數據湖。

5. 總結

可以看到基於最新的Hudi版本,用戶可自定義Hudi表同步MetaStore邏輯,同時只需要非常簡單的配置即可完成自動同步,並且以同步至DLA為例,給出了關鍵配置,該功能將在近期發布的0.6.0版本中釋出。