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 讀優化視圖
2.1.2 實時視圖
2.2 Spark SQL
2.2.1 讀優化視圖
2.2.2 實時視圖
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
方法一:直接在頁面編輯屬性
方法二:編輯 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增量視圖。