欢迎访问我的博客
Hudi + Spark3入门第一课
Apache Hudi 是下一代流数据湖平台。Apache Hudi 将数仓和数据库核心功能迁移到数据湖。Hudi 提供表、 事务、高效的 upserts/deletes、高级索引、 流式摄取、数据集群/压缩优化和并发,同时将数据使用开源文件格式。
hudi 0.10.1源码编译
- maven 3.5.4,spark3.1.1,配置了aliyun的maven源
- hudi目录修改pom.xml中的spark version为3.1.1,本来是3.1.2的,小版本的差异不大,看自己的环境。
- 编译命令
mvn clean package -DskipTests -Dscala-2.12 -Dspark3
- 编译产物在
packaging
下的hudi-spark-bundle
目录 - spark绑定jar包名称为:
hudi-spark3.1.1-bundle_2.12-0.10.1.jar
,大小约38M
之前的hudi 0.9.0 版本在和spark3.1一起使用时有明显的问题,可以和spark3.0.3搭配使用。当然,这在hudi的发版说明里也有提及。
hudi-spark3.1.2-bundle_2.12-0.10.1.jar
hudi-spark3.0.3-bundle_2.12-0.10.1.jar
这两个包不用自己编译,可以从maven中央仓库获取,(页面很不好找,hudi得把仓库类目梳理一下了)贴一下。
# 3.1.2版本
<!-- https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.1.2-bundle -->
<dependency>
<groupId>org.apache.hudi</groupId>
<artifactId>hudi-spark3.1.2-bundle_2.12</artifactId>
<version>0.10.1</version>
</dependency>
# 3.0.3版本
<!-- https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.0.3-bundle -->
<dependency>
<groupId>org.apache.hudi</groupId>
<artifactId>hudi-spark3.0.3-bundle_2.12</artifactId>
<version>0.10.1</version>
</dependency>
使用上述预编译的包,就省略自己编译的过程了。
官网发布的支持矩阵:
Spark 3 Support Matrix
Hudi | 支持的 Spark 3 版本 |
---|---|
0.10.0 - 0.10.1 | 3.1.x (default build), 3.0.x |
0.7.0 - 0.9.0 | 3.0.x |
0.6.0 and prior | 不支持 |
可以看到hudi 0.10版本默认构建出来是spark3.1的,也可以构建spark3.0的。
测试步骤
环境信息
- 已安装了Spark3.1.1
- 已安装Hive3.1
- 操作系统:CentOS 7.4
- Java 8
Spark3快速测试
-
把hudi jar拷贝到spark安装目录的jars中,例如
cp hudi-spark3.1.1-bundle_2.12-0.10.1.jar /usr/hdp/3.0.1.0-187/spark3/jars
-
启动spark-sql客户端看看是否正常:
-
因为我们已经把hudi-spark的jar放入spark的jar包加载路径中,我们无需再显式指定它。
-
此外,如果有报权限类的错误,可以切换有访问hive权限的用户,这里是使用hive用户执行的操作。
./bin/spark-sql --master yarn --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'
-
-
显示 > 等待输入命令即可!(这时我还没有拷贝avro的包,也没有报错。)
-
创建一张不分区的hudi表:
默认就是cow格式的表,默认主键是uuid,没有预聚合字段。
create table hudi_cow_nonpcf_tbl ( uuid int, name string, price double ) using hudi;
-
查看表:
show tables
,可以看到一行刚才的表名:default hudi_table0 false
-
给表插入2条数据:
insert into hudi_table0 select 1, 'my name is kiki', 20; insert into hudi_table0 select 2, 'qiqi', 16;
-
查询刚才的数据:
select * from hudi_table0; …… Time taken 0.361 seconds,Fetched 2 row(s)
- 小试牛刀,ok。
网友评论