Hudi集成CDH

发布于 2022-11-22  328 次阅读


编译

Flink CDC + Hudi + Hive + Presto构建实时数据湖最佳实践 (qq.com)

环境

  • Hadoop 3.0.0-cdh3.6.1
  • Hive 2.1.1-cdh3.6.1

建议

  • 最外层pom文件修改hadoop和hive版本
  • 使用 mvn clean package '-DskipTests' '-Drat.skip=true' '-Dflink1.13' '-Dscala-2.11' '-Dspark2.4' '-Dhadoop.version=3.0.0-cdh6.3.1' '-Pflink-bundle-shade-hive2' 的方式指定各组件版本进行编译
  • 使用对应hudi版本的flink和scala
    • hudi0.9.0使用flink1.12.2,scala2.11
    • hudi0.9.0版本中内置的flink-runtime.jar是1.12.2版本,1.12.2以上的版本会使用不存在的org.apache.flink.runtime.operators.coordination.OperatorCoordinatorHolder#notifySubtaskReady方法
    • hudi0.10.0使用flink1.13,scala2.11

可能遇到的问题

java.lang.IllegalArgumentException: Cannot find project Scala library 2.11.12 for module hudi-spark3_2.12

解决方案: 不用解决,不影响打包

cdh的jar包在阿里仓库找不到

添加如下代码(但其实他本身就有)

<repository>
      <id>cloudera-repo-releases</id>
      <url>https://repository.cloudera.com/artifactory/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>

maven无法识别 带.的参数 比如 -Dflink1.12

解决方案: 在参数上加上引号

java.io.IOException: Cannot run program "/bin/bash": CreateProcess error=2

解决方案:环境变量中加上Git路径(不要加\bin)

hadoop3兼容问题

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

vim /hudi-0.x.0/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java

在new FSDataOutPutStream(baos,null)中添加一个null

无法将类 org.apache.zookeeper.server.ZooKeeperServer中的方法 shutdown应用到给定类型

hadoop版本的问题,编译hudi0.12.0使用-Dhadoop.version=3.0.0时出现,改为-Dhadoop.version=3.1.2-Dhadoop.version=3.0.0-cdh6.3.1解决

json方法未抛出异常

  • org.apache.hudi.utilities.sources.helpers.CloudObjectsSelector类中的getFileAttributesFromRecord(JSONObject record)方法
  • org.apache.hudi.utilities.sources.helpers.S3EventsMetaSelector类中processAndDeleteInvalidMessages方法
  • org.apache.hudi.utilities.sources.helpers.TestCloudObjectsSelector类中testFileAttributesFromRecordShouldReturnsExpectOutput方法
  • org.apache.hudi.utilities.sources.helpers.TestS3EventsMetaSelector类中testNextEventsFromQueueShouldReturnsEventsFromQueue方法

Hive集成

需要将以下两个jar放入hive目录: hudi-hadoop-mr-bundle-0.12.0.jar , hudi-hive-sync-bundle-0.12.0.jar

在每个结点的 hive根目录下创建 auxlib/ 文件夹,并将 hudi-hadoop-mr-bundle-0.12.0.jar,hudi-hive-sync-bundle-0.12.0.jar 移动到 auxlib文件夹中

无效方法

将jar包放入每个节点的 /opt/cloudera/parcels/CDH/jars

/opt/cloudera/parcels/CDH/lib/hive/lib 建立软链接

ln -s ../../../jars/hudi-hadoop-mr-bundle-0.12.0.jar  hudi-hadoop-mr-bundle-0.12.0.jar
ln -s ../../../jars/hudi-hive-sync-bundle-0.12.0.jar  hudi-hive-sync-bundle-0.12.0.jar

可能出现的问题

hive分区字段不能出现中文

Unrecognized Hadoop major version number: 3.0.0-cdh6.3.1

使用hive catalog时,官方的flink-sql-connector-hive包会报Unrecognized Hadoop major version number: 3.0.0-cdh6.3.1的错,需要使用flink源码重新编译生成flink-sql-connector-hive-2.2.0_2.11,编译时需要修改flink-sql-connector-hive-2.2.0中的pom文件,将hive-exec的版本改成2.1.1-cdh6.3.1

HiveServer2异常退出

具体报错如下:ERROR org.apache.parquet.hadoop.ParquetRecordReader:Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl

解决方案:修改HiveServer2的Java堆栈大小,CDH6.2.1版本默认是50M,较小

运行时问题

flink重启任务报错

[HUDI-2997] Skip the corrupt meta file for pending rollback action by danny0405 · Pull Request #4296 · apache/hudi (github.com)

参考文献

整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0_江南独孤客的技术博客_51CTO博客

0871-6.3.2-如何基于CDH6环境编译Hudi-0.9.0并使用 - 腾讯云开发者社区-腾讯云 (tencent.com)