文章目录
Hudi简介
Hudi概述
Apache Hudi (
Hadoop Upserts Delete and Incremental
) 是下一代流数据湖平台。Apache Hudi 将核心仓库和数据库功能直接引入数据湖。Hudi 提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同时保持数据的开源文件格式。
Apache Hudi 不仅适合于流工作负载,还允许创建高效的增量批处理管道。可以对接Spark、Flink、Presto、Trino、Hive等执行引擎。
Hudi特性
- 可插拔索引机制支持快速
Upsert/Delete
- 支持增量拉取表变更以进行处理
- 支持事务提交回滚,并发控制
- 支持Spark、Flink、Presto、Trino、Hive等引擎的
SQL
读写 - 自动管理小文件,数据压缩和清理
- 流式摄入,内置CDC源和工具
- 内置可扩展存储访问的元数据跟踪
- 向后兼容支持表结构的变更
Hudi使用场景
一、近实时写入
- 减少碎片化工具的使用
- CDC增量导入RDBMS的数据
- 限制小文件的大小和数量
二、近实时分析
- 相对于秒级存储(Druid、OpenTSDB),节省资源
- 提供分钟级别的时效性,支持更高效的查询
- Hudi作为lib,非常轻量
三、增量Pipeline
- 区分arrive time和event time来处理延迟数据
- 更短的调度interval减少端到端的延迟,从小时降低到分钟级
Hudi编译安装
依赖的各组件版本如下表格所示
组件版本Hadoop3.3.2Hive3.1.2Spark3.3.1Flink1.14.5Hudi0.12.0Maven3.6.3
安装Maven
从清华镜像源下载maven的安装包
apache-maven-3.6.3-bin.tar.gz
,然后解压到服务器目录
/usr/local/src/apache-maven-3.6.3
,并设置软连接
maven
,创建对应的仓库路径
/usr/local/src/maven_repository
,以及在
/etc/profile
文件配置环境变量
测试maven安装是否成功
source /etc/profile
mvn -v
修改maven的配置文件
${MAVEN_HOME}/conf/settings.xml
指定用阿里云镜像,并指定本地仓库路径。
<settings><localRepository>/usr/local/src/maven_repository</localRepository><mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror></mirrors></settings>
编译hudi
从清华镜像源下载hudi-0.12.0版本的源码包
hudi-0.12.0.src.tgz
,上传到服务器并解压到目录
/usr/local/src/hudi-0.12.0
修改pom文件
pom.xml文件路径为
/usr/local/src/hudi-0.12.0/pom.xml
- 在hudi项目的pom.xml文件中指定阿里云仓库加速下载
<repository><id>nexus-aliyun</id><name>nexus-aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></repository>
- 修改依赖的组件版本
<hadoop.version>3.3.2</hadoop.version><hive.version>3.1.2</hive.version>
修改源码兼容hadoop3
hudi项目目录下
./hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java
文件需要修改
修改第110行,原先只有一个参数,添加第二个参数null即可
否则会因为hadoop2.x和3.x版本兼容问题报错(可不修改源码然后编译试试)
解决spark模块依赖的问题
修改了Hive版本为3.1.2,其携带的jetty是0.9.3,hudi本身用的0.9.4,存在依赖冲突
一、 修改
hudi-spark-bundle
的pom文件,排除低版本jetty,添加hudi指定版本的jetty:
/usr/local/src/hudi-0.12.0/packaging/hudi-spark-bundle/pom.xml
文件要修改,要指定
<dependency>
里的
<exclusions>
剔除hive模块的
jetty
依赖,然后添加hudi使用的
jetty
依赖
否则后面在使用
Spark
向hudi表添加数据时会报错(不信可以试试)
java.lang.NoSuchMethodError: org.apache.hudi.org.apache.jetty.server.session.SessionHandler.setHttpOnly(Z)V
<!-- Hive --><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-service</artifactId><version>${hive.version}</version><scope>${spark.bundle.hive.scope}</scope><exclusions><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>org.pentaho</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-service-rpc</artifactId><version>${hive.version}</version><scope>${spark.bundle.hive.scope}</scope></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-jdbc</artifactId><version>${hive.version}</version><scope>${spark.bundle.hive.scope}</scope><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>javax.servlet.jsp</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-metastore</artifactId><version>${hive.version}</version><scope>${spark.bundle.hive.scope}</scope><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>org.datanucleus</groupId><artifactId>datanucleus-core</artifactId></exclusion><exclusion><groupId>javax.servlet.jsp</groupId><artifactId>*</artifactId></exclusion><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-common</artifactId><version>${hive.version}</version><scope>${spark.bundle.hive.scope}</scope><exclusions><exclusion><groupId>org.eclipse.jetty.orbit</groupId><artifactId>javax.servlet</artifactId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><!-- 增加hudi配置版本的jetty --><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>${jetty.version}</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-util</artifactId><version>${jetty.version}</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-webapp</artifactId><version>${jetty.version}</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-http</artifactId><version>${jetty.version}</version></dependency>
二、 修改
hudi-utilities-bundle
的pom文件,排除低版本jetty,添加hudi指定版本的jetty:
/usr/local/src/hudi-0.12.0/packaging/hudi-utilities-bundle/pom.xml
文件要修改,要指定
<dependency>
里的
<exclusions>
剔除hudi-common、hive等模块的
jetty
依赖,然后添加hudi使用的
jetty
依赖
否则后面在使用
DeltaStreamer
工具向hudi表插入数据时,也会报Jetty的错误
<!-- Hoodie --><dependency><groupId>org.apache.hudi</groupId><artifactId>hudi-common</artifactId><version>${project.version}</version><exclusions><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.hudi</groupId><artifactId>hudi-client-common</artifactId><version>${project.version}</version><exclusions><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><!-- Hive --><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-service</artifactId><version>${hive.version}</version><scope>${utilities.bundle.hive.scope}</scope><exclusions><exclusion><artifactId>servlet-api</artifactId><groupId>javax.servlet</groupId></exclusion><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>org.pentaho</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-service-rpc</artifactId><version>${hive.version}</version><scope>${utilities.bundle.hive.scope}</scope></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-jdbc</artifactId><version>${hive.version}</version><scope>${utilities.bundle.hive.scope}</scope><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>javax.servlet.jsp</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-metastore</artifactId><version>${hive.version}</version><scope>${utilities.bundle.hive.scope}</scope><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>*</artifactId></exclusion><exclusion><groupId>org.datanucleus</groupId><artifactId>datanucleus-core</artifactId></exclusion><exclusion><groupId>javax.servlet.jsp</groupId><artifactId>*</artifactId></exclusion><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions></dependency><dependency><groupId>${hive.groupid}</groupId><artifactId>hive-common</artifactId><version>${hive.version}</version><scope>${utilities.bundle.hive.scope}</scope><exclusions><exclusion><groupId>org.eclipse.jetty.orbit</groupId><artifactId>javax.servlet</artifactId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><!-- 增加hudi配置版本的jetty --><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>${jetty.version}</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-util</artifactId><version>${jetty.version}</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-webapp</artifactId><version>${jetty.version}</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-http</artifactId><version>${jetty.version}</version></dependency>
hudi编译命令
mvn clean package -DskipTests-Dspark3.3-Dflink1.14 -Dscala-2.12 -Dhadoop.version=3.3.2 -Pflink-bundle-shade-hive3
编译成功后进入
./hudi-cli/hudi-cli.sh
说明成功
编译完成后,相关的包在
packaging
目录的各个模块中
譬如
spark
与hudi的包
版权归原作者 patrick_wang_bigdata 所有, 如有侵权,请联系我们删除。