0


Hudi(2):Hudi的编译和安装

0. 相关文章链接

** Hudi文章汇总 **

1. 编译环境准备

  • 相关组件版本如下:
    Hadoop3.1.3Hive3.1.2Flink1.13.6,scala-2.12Spark3.2.2,scala-2.12

  • 安装Maven(博主原有Maven安装博文:Maven的下载安装和使用)

2. 上传Hudi源码包并修改pom文件

  • 上传源码包:
# 将hudi-0.12.0.src.tgz上传到/opt/software,并解压:
tar -zxvf /opt/software/hudi-0.12.0.src.tgz -C /opt/software

# github地址:https://github.com/apache/hudi/
  • 在pom文件中新增repository加速依赖下载:
# 编辑pom文件
vim /opt/software/hudi-0.12.0/pom.xml

# 新增repository加速依赖下载
<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文件中修改依赖的组件版本:
<hadoop.version>3.1.3</hadoop.version>
<hive.version>3.1.2</hive.version>

3. 修改源码兼容hadoop3

Hudi默认依赖的hadoop2,要兼容hadoop3,除了修改版本,还需要修改如下代码:

vim /opt/software/hudi-0.12.0/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java

修改第110行,原先只有一个参数,添加第二个参数null:

否则会因为hadoop2.x和3.x版本兼容问题(找不到合适的FSDataOutputStream构造器)。

4. 手动安装Kafka依赖

有几个kafka的依赖需要手动安装,否则编译会报错。

  • 下载jar包
# 通过网址下载:http://packages.confluent.io/archive/5.3/confluent-5.3.4-2.12.zip

# 解压后找到以下jar包,上传编译服务器
common-config-5.3.4.jar
common-utils-5.3.4.jar
kafka-avro-serializer-5.3.4.jar
kafka-schema-registry-client-5.3.4.jar
  • install到maven本地仓库
mvn install:install-file -DgroupId=io.confluent -DartifactId=common-config -Dversion=5.3.4 -Dpackaging=jar -Dfile=./common-config-5.3.4.jar
mvn install:install-file -DgroupId=io.confluent -DartifactId=common-utils -Dversion=5.3.4 -Dpackaging=jar -Dfile=./common-utils-5.3.4.jar
mvn install:install-file -DgroupId=io.confluent -DartifactId=kafka-avro-serializer -Dversion=5.3.4 -Dpackaging=jar -Dfile=./kafka-avro-serializer-5.3.4.jar
mvn install:install-file -DgroupId=io.confluent -DartifactId=kafka-schema-registry-client -Dversion=5.3.4 -Dpackaging=jar -Dfile=./kafka-schema-registry-client-5.3.4.jar

5. 解决spark模块依赖冲突

修改了Hive版本为3.1.2,其携带的jetty是0.9.3,hudi本身用的0.9.4,存在依赖冲突。

5.1. 修改hudi-spark-bundle的pom文件

目的:排除低版本jetty,添加hudi指定版本的jetty

pom文件位置:vim /opt/software/hudi-0.12.0/packaging/hudi-spark-bundle/pom.xml (在382行的位置,修改如下红色部分)

<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>

否则在使用spark向hudi表插入数据时,会报错如下:

java.lang.NoSuchMethodError: org.apache.hudi.org.apache.jetty.server.session.SessionHandler.setHttpOnly(Z)V

5.2. 修改hudi-utilities-bundle的pom文件

目的:排除低版本jetty,添加hudi指定版本的jetty

位置:vim /opt/software/hudi-0.12.0/packaging/hudi-utilities-bundle/pom.xml(在405行的位置,修改如下(红色部分))

<!-- 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>
<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>

否则在使用DeltaStreamer工具向hudi表插入数据时,也会报Jetty的错误。

6. 编译并进入Hudi客户端

  • 编译命令:
mvn clean package -DskipTests -Dspark3.2 -Dflink1.13 -Dscala-2.12 -Dhadoop.version=3.1.3 -Pflink-bundle-shade-hive3
  • 进入hudi-cli说明成功:

  • 编译完成后,相关的包在packaging目录的各个模块中

7. Hudi集成Spark的环境准备

7.1. Hudi支持的Spark版本

Hudi

Supported Spark 3 version

0.12.x

3.3.x,3.2.x,3.1.x

0.11.x

3.2.x(default build, Spark bundle only),3.1.x

0.10.x

3.1.x(default build), 3.0.x

0.7.0-0.9.0

3.0.x

0.6.0 and prior

Not supported

注意:0.11.x不建议使用,如果要用请使用补丁分支:[DO NOT MERGE] 0.11.1 release patch branch by danny0405 · Pull Request #6182 · apache/hudi · GitHub

7.2. 集成Spark

其实就是将上述编译好的安装包拷贝到spark下的jars目录中:

cp /opt/software/hudi-0.12.0/packaging/hudi-spark-bundle/target/hudi-spark3.2-bundle_2.12-0.12.0.jar /opt/module/spark-3.2.2/jars

注意:启动Spark之前需要启动Hadoop等相关组件。

8. Hudi集成Flink的环境准备

8.1. Hudi支持的Flink版本

Hudi

Supported Flink version

0.12.x

1.15.x、1.14.x、1.13.x

0.11.x

1.14.x****、1.13.x

0.10.x

1.13.x

0.9.0

1.12.2

注意:0.11.x不建议使用,如果要用请使用补丁分支:[DO NOT MERGE] 0.11.1 release patch branch by danny0405 · Pull Request #6182 · apache/hudi · GitHub

8.2. 集成Flink

  • 将上述编译好的安装包拷贝到flink下的jars目录中:
cp /opt/software/hudi-0.12.0/packaging/hudi-flink-bundle/target/hudi-flink1.13-bundle_2.12-0.12.0.jar /opt/module/flink-1.13.6/lib/
  • 拷贝guava包,解决依赖冲突
cp /opt/module/hadoop-3.1.3/share/hadoop/common/lib/guava-27.0-jre.jar /opt/module/flink-1.13.6/lib/
  • 配置Hadoop环境变量
sudo vim /etc/profile.d/my_env.sh

export HADOOP_CLASSPATH=`hadoop classpath`
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

source /etc/profile.d/my_env.sh

注意:启动Flink之前需要启动Hadoop等相关组件。

9. Hudi集成Hive

    Hudi 源表对应一份 HDFS 数据,通过 Spark,Flink 组件或者 Hudi CLI,可以将 Hudi 表的数据映射为 Hive 外部表,基于该外部表, Hive可以方便的进行实时视图,读优化视图以及增量视图的查询。

注意:以 hive3.1.2、hudi 0.12.0为例,其他版本类似。

9.1. 拷贝编译好的jar包

将 hudi-hadoop-mr-bundle-0.12.0.jar , hudi-hive-sync-bundle-0.12.0.jar 放到 hive 节点的lib目录下:

cp /opt/software/hudi-0.12.0/packaging/hudi-hadoop-mr-bundle/target/hudi-hadoop-mr-bundle-0.12.0.jar /opt/module/hive/lib/

cp /opt/software/hudi-0.12.0/packaging/hudi-hive-sync-bundle/target/hudi-hive-sync-bundle-0.12.0.jar /opt/module/hive/lib/

9.2. 配置完后重启 hive

// 按照需求选择合适的方式重启
nohup hive --service metastore &
nohup hive --service hiveserver2 &

注意:启动Hive之前需要启动Hadoop等相关组件。


注:**其他Hudi相关文章链接由此进 -> Hudi文章汇总 **



本文转载自: https://blog.csdn.net/yang_shibiao/article/details/128456864
版权归原作者 电光闪烁 所有, 如有侵权,请联系我们删除。

“Hudi(2):Hudi的编译和安装”的评论:

还没有评论