Spark + Kyuubi + Iceberg = Lakehouse

09/06 09:29
阅读数 4.3K

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执行引擎

展开阅读全文
打赏
1
4 收藏
分享
加载中
吴老师,这篇文章写的通俗易懂,简介明了。
09/09 14:46
回复
举报
更多评论
打赏
1 评论
4 收藏
1
分享
返回顶部
顶部