0


Hudi学习01 -- Hudi简介及编译安装

文章目录

Hudi简介

Hudi概述

Apache Hudi (

Hadoop Upserts Delete and Incremental

) 是下一代流数据湖平台。Apache Hudi 将核心仓库和数据库功能直接引入数据湖。Hudi 提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同时保持数据的开源文件格式。

Apache Hudi 不仅适合于流工作负载,还允许创建高效的增量批处理管道。可以对接SparkFlink、Presto、Trino、Hive等执行引擎。
Hudi架构图

Hudi特性

  • 可插拔索引机制支持快速Upsert/Delete
  • 支持增量拉取表变更以进行处理
  • 支持事务提交回滚,并发控制
  • 支持SparkFlink、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的配置文件

${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
  1. 在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>

在这里插入图片描述

  1. 修改依赖的组件版本
<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

说明成功
在这里插入图片描述

hudi客户端
编译完成后,相关的包在

packaging

目录的各个模块中
在这里插入图片描述
譬如

spark

与hudi的包
在这里插入图片描述

标签: 大数据

本文转载自: https://blog.csdn.net/qq_23120963/article/details/128499156
版权归原作者 patrick_wang_bigdata 所有, 如有侵权,请联系我们删除。

“Hudi学习01 -- Hudi简介及编译安装”的评论:

还没有评论