Spark + Kyuubi + Iceberg = Lakehouse

語言: CN / TW / HK

Spark

開源地址:https://spark.apache.org/

開源的、強大的計算引擎。

  1. 官網下載Release,比如:Spark 3.1.2
  2. 進入解壓目錄,執行: sbin/start-master.sh 啟動 Spark Master
  3. 執行: sbin/start-worker.sh spark://_YOUR_HOST_NAME_:7077 啟動 Spark Worker

Spark Standalone叢集啟動成功!

Kyuubi

開源地址:https://kyuubi.apache.org/

支援多租戶的升級版的Hive Thrift Server。大大降低了Spark的使用門檻,只用SQL就能使用Spark。

  1. 官網下載Kyuubi Release, 由於我們已經單獨啟動了Spark Standalone叢集,可以下載 kyuubi-x.y.z-bin-without-spark.tar.gz
  2. 修改 conf/kyuubi_defaults.conf 加入Spark的配置: 指定Spark叢集位置、Spark Executor記憶體、開啟強大的AQE(優化查詢速度)
    spark.master=spark://_YOUR_HOST_NAME_:7077
    spark.executor.memory=5g
    spark.sql.adaptive.enabled=true
  3. 執行 bin/kyuubi run 啟動kyuubi server。

於是就可以使用你熟悉的JDBC工具來連線Kyuubi(Spark)了, 比如:DataGrip

Iceberg

開源地址:https://iceberg.apache.org/

為了標準化大資料儲存格式做努力。資料湖領域有三大巨頭:

  • Databricks DeltaLake
  • Apache Hudi
  • Apache Iceberg

各有各的特點和優勢,這裡就不再描述了(網上已經有很多了)。

Iceberg的好處是:它的資料和描述這些資料的元資料是放在一起的! 這個非常重要!

之前Spark也能儲存資料,但是元資料是放在內建的Hive(也可以單獨部署Hive Metastore),相當於是存在了兩個部分:

  • 資料檔案(比如Parquet)是儲存在檔案系統(Local、S3、HDFS等)
  • 元資料是儲存在關係型資料庫,比如內建的Derby,或者外部MySQL、Postgresql

但是這個對於個人資料湖,或者新概念Lakehouse是不太適合了。我需要儲存計算分離,需要不用時把價格降低到只有儲存的費用(廉價的物件儲存),所以,我需要把元資料和真實資料儲存在一起。

而 Iceberg 更好的是,和 Dremio 一樣,它支援按照目錄層級來作為名稱空間(Schema)!讓我們來實際體驗一下吧。

  1. 下載iceberg程式碼, 並編譯,將編譯好的 iceberg-spark3-runtime-*.jar 檔案(比如: spark3-runtime/build/libs/iceberg-spark3-runtime-fa17d82.jar) 放到 Spark 的 jars 目錄下。
  2. 比如: 我打算把所有資料檔案放在 /Users/wubaoqi/data/iceberg_warehouse , 那我在 kyuubi_defaults.conf 中,增加配置:

    spark.sql.defaultCatalog=bwu spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.bwu=org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.bwu.type=hadoop spark.sql.catalog.bwu.warehouse=/Users/wubaoqi/data/iceberg_warehouse
  3. 重啟Spark 和 Kyuubi

在 DataGrip 中,我們可以執行如下命令來建立一個table1, 並插入一些資料:

CREATE TABLE bwu.db1.table1 (id bigint, data string) USING iceberg;
 
INSERT INTO bwu.db1.table1 VALUES (1, 'a'), (2, 'b'), (3, 'c');
 

當然,我們也可以把資料組成成各級子目錄層級的形式。

CREATE TABLE bwu.db1.level1.level2.table123 (id bigint, data string) USING iceberg;
 
INSERT INTO bwu.db1.level1.level2.table123 VALUES (1, 'a'), (2, 'b'), (3, 'c');

我們來看一下,/Users/wubaoqi/data/iceberg_warehouse 下的目錄結構吧

所有的內容(資料+元資料)都在一個目錄。這個好處是:我可以完全關閉Spark,重新安裝Spark,甚至我用Presto(Trino)等,都可以使用這些資料!

Iceberg目前可能還有很多坑,但是感覺方向對了就不怕路遠。接下來,在更深入探索Iceberg的同時,還會使用dbt來深入把更多資料加入到這套“Lakehouse”,並調研 https://projectnessie.org/ 來做資料的git版本控制化。

 

本文由作者授權釋出

作者:吳寶琪,某大資料公司架構師

 

更多閱讀:

Apache Kyuubi(Incubating):網易對 Serverless Spark 的探索與實踐

全票通過!網易數帆開源專案Kyuubi進入Apache孵化器

提效 7 倍,Apache Spark 自適應查詢優化在網易的深度實踐及改進

大資料實戰:Kyuubi 與 Spark ThriftServer 的全面對比分析

網易數帆開源Kyuubi:基於Spark的高效能JDBC和SQL執行引擎