编译
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,较小
运行时问题
参考文献
整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0_江南独孤客的技术博客_51CTO博客
0871-6.3.2-如何基于CDH6环境编译Hudi-0.9.0并使用 - 腾讯云开发者社区-腾讯云 (tencent.com)
Comments NOTHING