Hudi 搭建
- 环境准备
- 一、安装 Maven
- 1.解压
- 2.配置环境变量
- 3.修改 Maven 下载源
- 二、安装 Hudi
- 1.解压
- 2.配置环境变量
- 3.修改 Hudi 下载源与对应版本号
- 4.修改源码以兼容 Hadoop3.x
- 5. 解决 Spark 依赖冲突
- 6. 解决 Spark 向 Hudi 插入报错
- 7. 编译 Hudi
- 8. 启动测试
集群其它生态安装与配置:
-
Hadoop 完全分布式搭建(超详细)
-
Hive 搭建(将 MySQL 作为元数据库)
-
Spark 集群搭建(多种方式)
-
Sqoop 安装配置(超详细)
环境准备
安装 Hudi 前我的集群版本如下:
组件 | 版本号 |
---|---|
Hadoop | 3.1.3 |
Spark | 3.2.2 |
Hive | 3.1.2 |
JDK | 1.8 |
MySQL | 5.7 |
注意,开始安装 Hudi 前请先检索你的集群,选择合适的 Hudi 版本。
一、安装 Maven
我这里使用的 Maven 版本为 3.6.1
。
1.解压
解压到你的指定路径中。
tar -zxvf apache-maven-3.6.1-bin.tar.gz -C /opt/module/
# 改个名称
mv apache-maven-3.6.1/ maven-3.6.1/
2.配置环境变量
vi /etc/profile
#MAVEN_HOME
MAVEN_HOME=/opt/module/maven-3.6.1
PATH=$PATH:$MAVEN_HOME/bin
保存退出后注意使环境变量生效,souce /ect/profile
。
输入 mvn -v
检查是否安装成功。
3.修改 Maven 下载源
vi $MAVEN_HOME/conf/settings.xml
找到镜像属性配置的那里,添加镜像,我这里选用的阿里云镜像。
<!-- 添加阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
二、安装 Hudi
1.解压
tar -zxvf hudi-0.12.0.src.tgz -C /opt/module/
2.配置环境变量
vi /etc/profile
#HUDI_HOME
HUDI_HOME=/opt/module/hudi-0.12.0
保存退出后注意使环境变量生效,souce /ect/profile
。
3.修改 Hudi 下载源与对应版本号
vi $HUDI_HOME/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>
继续编辑 pom.xml
文件,修改组件的对应版本号。
4.修改源码以兼容 Hadoop3.x
Hudi 默认依赖的 Hadoop 为 Hadoop2.x,要兼容 Hadoop3.x,则需要修改 Hudi 源码。
vim $HUDI_HOME/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java
在 HoodieParquetDataBlock.java
文件中的大约第 110 行中的参数中添加一个 null
值。
5. 解决 Spark 依赖冲突
我使用的 Hive 版本为 3.1.2
,其携带的 jetty 版本是 0.9.3
,而 Hudi 本身用的 jetty 版本是 0.9.4
,存在依赖冲突,会造成编译错误。
vim $HUDI_HOME/packaging/hudi-spark-bundle/pom.xml
解决 hive-service 依赖冲突:
在大约第 382 行。
<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>
解决 hive-jdbc 依赖冲突:
在大约第 413 行。
<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>
解决 hive-metastore 依赖冲突:
在大约第 420 行。
<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>
解决 hive-common 依赖冲突:
在大约第 427 行。
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.servlet</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
增加 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. 解决 Spark 向 Hudi 插入报错
vim $HUDI_HOME/packaging/hudi-utilities-bundle/pom.xml
解决 Hudi 冲突:
大约在第 345 行
<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-service 冲突:
大约在第 417 行
<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>
解决 hive-jdbc 冲突:
大约在第 450 行
<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>
解决 hive-metastore 冲突:
大约在第 471 行
<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>
解决 hive-common 冲突:
大约在第 496 行
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.servlet</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
增加 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>
7. 编译 Hudi
mvn clean package -DskipTests -Dspark3.2 -Dscala-2.12 -Dhadoop.version=3.1.3 -Pflink-bundle-shade-hive3
需要 10 分钟左右,等待依赖下载完成。
8. 启动测试
cd $HUDI_HOME
# 启动 hudi-cli
hudi-cli/hudi-cli.sh
出现如下界面,表示 Hudi 编译成功。
编译完成后,相关的包都在 $HUDI_HOME/packaging
目录下:
到此为止,Hudi 0.12.0 安装完成。