天天看點

Apache Hudi內建Apache Zeppelin實戰

1. 簡介

Apache Zeppelin 是一個提供互動資料分析且基于Web的筆記本。友善你做出可資料驅動的、可互動且可協作的精美文檔,并且支援多種語言,包括 Scala(使用 Apache Spark)、Python(Apache Spark)、SparkSQL、 Hive、 Markdown、Shell等等。目前Hive與SparkSQL已經支援查詢Hudi的讀優化視圖和實時視圖。是以理論上Zeppelin的notebook也應當擁有這樣的查詢能力。

2.實作效果

2.1 Hive

2.1.1 讀優化視圖

Apache Hudi內建Apache Zeppelin實戰

2.1.2 實時視圖

Apache Hudi內建Apache Zeppelin實戰

2.2 Spark SQL

2.2.1 讀優化視圖

Apache Hudi內建Apache Zeppelin實戰

2.2.2 實時視圖

Apache Hudi內建Apache Zeppelin實戰

3.常見問題整理

3.1 Hudi包适配

cp hudi-hadoop-mr-bundle-0.5.2-SNAPSHOT.jar    zeppelin/lib
cp hudi-hive-bundle-0.5.2-SNAPSHOT.jar         zeppelin/lib
cp hudi-spark-bundle_2.11-0.5.2-SNAPSHOT.jar   zeppelin/lib
           

Zeppelin啟動時會預設加載lib下的包,對于Hudi這類外部依賴,适合直接放在zeppelin/lib下以避免 Hive或Spark SQL在叢集上找不到對應Hudi依賴。

3. 2 parquet jar包适配

Hudi包的parquet版本為1.10,目前CDH叢集parquet版本為1.9,是以在執行Hudi表查詢時,會報很多jar包沖突的錯。

解決方法:在zepeelin所在節點的spark/jars目錄下将parquet包更新成1.10。

副作用:zeppelin 以外的saprk job 配置設定到 parquet 1.10的叢集節點的任務可能會失敗。

建議:zeppelin 以外的用戶端也會有jar包沖突的問題。是以建議将叢集的spark jar 、parquet jar以及相關依賴的jar做全面更新,更好地适配Hudi的能力。

3.3 Spark Interpreter适配

相同sql在Zeppelin上使用Spark SQL查詢會出現比hive查詢記錄條數多的現象。

問題原因:當向Hive metastore中讀寫Parquet表時,Spark SQL預設将使用Spark SQL自帶的Parquet SerDe(SerDe:Serialize/Deserilize的簡稱,目的是用于序列化和反序列化),而不是用Hive的SerDe,因為Spark SQL自帶的SerDe擁有更好的性能。

這樣導緻了Spark SQL隻會查詢Hudi的流水記錄,而不是最終的合并結果。

解決方法:set

spark.sql.hive.convertMetastoreParquet=false

方法一:直接在頁面編輯屬性

Apache Hudi內建Apache Zeppelin實戰

方法二:編輯 zeppelin/conf/interpreter.json添加

interpreter

"spark.sql.hive.convertMetastoreParquet": {
          "name": "spark.sql.hive.convertMetastoreParquet",
          "value": false,
          "type": "checkbox"
        },
           

4. Hudi增量視圖

對于Hudi增量視圖,目前隻支援通過寫Spark 代碼的形式拉取。考慮到Zeppelin在notebook上有直接執行代碼和shell 指令的能力,後面考慮封裝這些notebook,以支援sql的方式查詢Hudi增量視圖。