Hudi安装部署
编译环境准备
1.安装maven
(1)上传maven包到/opt/software目录,解压更名
先安装unzip(如果系统未预装,以 CentOS 为例)
sudo yum install unzip -y解压到/opt/module/目录:
unzip apache-maven-3.6.1.zip -d /opt/module/
mv apache-maven-3.6.1 maven-3.6.1添加环境变量
vim /etc/profile.d/my_env.sh
#maven环境变量
export MAVEN_HOME=/opt/module/maven-3.6.1
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile验证安装
如果没权限的执行
chmod +x /opt/module/maven-3.6.1/bin/mvn
mvn -v
(2)修改为阿里镜像
修改setting.xml 指定为阿里仓库地址
在conf目录下
vim settings.xml
2、编译Hudi
(1)上传Hudi包
上传并解压
tar -zxvf hudi-0.12.0.src.tgz -C /opt/module/(2)Hudi下修改pom文件
vim pom.xml

(3)修改源码兼容hadoop3
hudi默认依赖hadoop2,需要修改
vim /opt/module/hudi-0.12.0/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java添加一个参数,null,避免版本不兼容报错

(4)解决spark模块依赖冲突
修改了Hive版本为3.1.2,其携带的jetty是0.9.3,hudi本身用的0.9.4,存在依赖冲突。
否则在使用spark向hudi表插入数据时,会报错
vim /opt/module/hudi-0.12.0/packaging/hudi-spark-bundle/pom.xml在382行的位置,添加如下(红色部分):
<!-- 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>
(5)修改hudi-utilities-bundle的pom文件
排除低版本jetty,添加hudi指定版本的jetty
vim /opt/module/hudi-0.12.0/packaging/hudi-utilities-bundle/pom.xml在405行的位置,修改如下(红色部分):
否则在使用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>
</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>
(6)执行编译命令
用这个
mvn clean package -DskipTests -Dspark3.1 -Dflink1.13 -Dscala-2.12 -Dhadoop.version=3.1.3 -Pflink-bundle-shade-hive3(7)编译成功

编译成功后,进入hudi-cli说明成功:
hudi-cli/hudi-cli.sh
(8)运行测试
在opt目录下创建 hudi-jars目录
mkdir hudi-jars将这俩jar包上传至目录下

启动时显式指定 client 模式启动 spark-shell 时,通过参数强制指定 client 模式:
(1)启动
spark-shell --deploy-mode client- 未指定 master:默认使用 Spark 的默认 master(通常是
local[*],即使用本地所有可用 CPU 核心)。 - 未加载额外 Jar 包:仅使用 Spark 自身的默认依赖,无法直接操作 Hudi 表(会报类找不到错误)。
- 未指定序列化器:使用 Spark 默认的序列化器(
JavaSerializer,性能不如 Kryo)。 - 仅指定部署模式:明确使用客户端模式,但其他配置均为默认值。
- 用途:适合简单的 Spark 语法测试、不需要额外依赖的场景.
(2)用这个
spark-shell \
--master local[2] \
--deploy-mode client \
--jars /opt/hudi-jars/hudi-spark3.1-bundle_2.12-0.12.0.jar,/opt/hudi-jars/hudi-utilities-bundle_2.12-0.12.0.jar \
--conf "spark.serializer=org.apache.spark.serializer.KryoSerializer"- 指定了运行模式:
--master local[2]强制 Spark 在本地模式运行,使用 2 个 CPU 核心。 - 指定了依赖 Jar 包:
--jars加载了 Hudi 相关的两个 Jar 包,用于支持 Hudi 数据湖操作(如读写 Hudi 表)。 - 指定了序列化器:
--conf配置了 Kryo 序列化器(Spark 优化性能的常用序列化方式)。 - 部署模式:同样显式指定了
--deploy-mode client(客户端模式)。 - 用途:适合需要使用 Hudi 功能、本地调试、并优化序列化性能的场景。
--deploy-mode client:Driver 在本地终端运行,适合交互式场景(如spark-shell),支持本地模式。--deploy-mode cluster:Driver 在集群节点运行,适合生产环境的非交互式任务,不支持本地模式。

启动spark-shell命令以后,编写scala语言代码,保存数据至Hudi表及Hudi表加载数据
ip/主机名+4040
查看jar包已经上传,成功。

