前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
上篇文章 总结了Spark SQL Rollback, Hudi CLI 也能实现 Rollback,本文总结下 Hudi CLI 安装配置以及遇到的问题。
官方文档
https://hudi.apache.org/cn/docs/cli/
版本
- Hudi 0.13.0
- Spark 3.2.3
打包
1 | mvn clean package -DskipTests -Drat.skip=true -Dscala-2.12 -Dspark3.2 -Pflink-bundle-shade-hive3 -Dflink1.15 |
创建hudi-cli文件夹
1 | mkdir hudi-cli |
上传
将打包好的 conf
hudi-cli-bundle_2.12-0.13.0.jar
hudi-cli-with-bundle.sh
上传到 hudi-cli
修改文件权限和格式
1 | chmod -R 777 hudi-cli-with-bundle.sh |
环境变量
conf/hudi-env.sh
1 | export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop/conf"} |
使用
到现在就可以使用了
1 | ./hudi-cli-with-bundle.sh |
警告和异常解决
修改脚本
修改后的脚本如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
JAKARTA_EL_VERSION=3.0.3
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo "DIR is ${DIR}"
. "${DIR}"/conf/hudi-env.sh
if [ -z "$CLI_BUNDLE_JAR" ]; then
echo "Inferring CLI_BUNDLE_JAR path assuming this script is under Hudi repo"
CLI_BUNDLE_JAR=`ls $DIR/target/hudi-cli-bundle*.jar | grep -v source | grep -v javadoc`
fi
if [ -z "$SPARK_BUNDLE_JAR" ]; then
echo "Inferring SPARK_BUNDLE_JAR path assuming this script is under Hudi repo"
SPARK_BUNDLE_JAR=`ls $DIR/../hudi-spark-bundle/target/hudi-spark*-bundle*.jar | grep -v source | grep -v javadoc`
fi
echo "CLI_BUNDLE_JAR: $CLI_BUNDLE_JAR"
echo "SPARK_BUNDLE_JAR: $SPARK_BUNDLE_JAR"
HUDI_CONF_DIR="${DIR}"/conf
# hudi aux lib contains jakarta.el jars, which need to be put directly on class path
#HUDI_AUX_LIB="${DIR}"/auxlib
if [ ! -d $HUDI_AUX_LIB ]; then
echo "Downloading necessary auxiliary jars for Hudi CLI"
wget https://repo1.maven.org/maven2/org/glassfish/jakarta.el/$JAKARTA_EL_VERSION/jakarta.el-$JAKARTA_EL_VERSION.jar -P auxlib
wget https://repo1.maven.org/maven2/jakarta/el/jakarta.el-api/$JAKARTA_EL_VERSION/jakarta.el-api-$JAKARTA_EL_VERSION.jar -P auxlib
fi
if [ -z "$CLI_BUNDLE_JAR" ] || [ -z "$SPARK_BUNDLE_JAR" ]; then
echo "Make sure to generate both the hudi-cli-bundle.jar and hudi-spark-bundle.jar before running this script."
exit
fi
if [ -z "$SPARK_HOME" ]; then
echo "SPARK_HOME not set, setting to /usr/local/spark"
export SPARK_HOME="/usr/local/spark"
fi
echo "Running : java -cp ${HUDI_CONF_DIR}:${HUDI_AUX_LIB}/*:${SPARK_HOME}/*:${SPARK_HOME}/jars/*:${HADOOP_CONF_DIR}:${SPARK_CONF_DIR}:${CLI_BUNDLE_JAR}:${SPARK_BUNDLE_JAR} -DSPARK_CONF_DIR=${SPARK_CONF_DIR} -DHADOOP_CONF_DIR=${HADOOP_CONF_DIR} org.apache.hudi.cli.Main $@"
java -cp ${HUDI_CONF_DIR}:${HUDI_AUX_LIB}/*:${SPARK_HOME}/*:${SPARK_HOME}/jars/*:${HADOOP_CONF_DIR}:${SPARK_CONF_DIR}:${CLI_BUNDLE_JAR}:${SPARK_BUNDLE_JAR} -DSPARK_CONF_DIR=${SPARK_CONF_DIR} -DHADOOP_CONF_DIR=${HADOOP_CONF_DIR} org.apache.hudi.cli.Main $@
下载 HUDI_AUX_LIB
由于公司内网连不上maven仓库,可以选择手动下载,并上传到对应目录,这样就不用每次都下载了1
mkdir auxlib
日志配置文件解析错误
错误日志
1 | ERROR StatusLogger Unrecognized format specifier [d] |
解决方法
解决方法:删除 spark jars 下面的 hive-exec-2.3.9-core.jar 中的 Log4j2Plugins.dat 文件
问题原因:Log4j2Plugins.dat 文件冲突
参考文章:https://www.cnblogs.com/yeyang/p/10485790.html
查找冲突文件思路
根据 CLI 启动日志:1
java -cp /opt/hudi-cli/conf:/opt/hudi-cli/auxlib/*:/usr/hdp/3.1.0.0-78/spark/*:/usr/hdp/3.1.0.0-78/spark/jars/*:/etc/hadoop/conf:/etc/spark2/conf:/opt/hudi-cli/hudi-cli-bundle_2.12-0.13.0.jar:/usr/hdp/3.1.0.0-78/spark/jars/hudi-spark3.2-bundle_2.12-0.14.1.jar -DSPARK_CONF_DIR=/etc/spark2/conf -DHADOOP_CONF_DIR=/etc/hadoop/conf org.apache.hudi.cli.Main
挨个查找其中每个路径下的文件中是否有包含 Log4j2Plugins.dat 。最终发现在 spark jars 下面的 hive-exec-2.3.9-core.jar 中包含 Log4j2Plugins.dat 。删除其中的 Log4j2Plugins.dat ,问题解决。
1 | grep -rl Log4j2Plugins.dat /usr/hdp/3.1.0.0-78/spark/jars/* |
最终效果
Rollback
用法
1 | hudi->help |
1 | hudi->help commit rollback |
示例
1 | connect /tmp/hudi/test_flink_mor |
问题
问题一
只有第一次Rollback成功,第二次以及后续的Rollback失败:
也不能Rollback失败的 commit:
问题原因和上篇文章一样,但是升级 Hudi 版本到 0.14.1,并没有解决问题,说明Hudi CLI 相关的代码逻辑并没有修复。
问题二
没有 history 日志,history UI 无法查看,报 404 错误。
原因为源码中配置了 spark.eventLog.enabled=false , 这样虽然 spark-default.conf 中配置了 spark.eventLog.enabled=true , 但是代码优先级高,所以导致没有history 日志。
解决方法:修改源码,删除源码中spark.eventLog.enabled的默认设置,使照环境中 spark-default.conf 的配置生效,重新打包。
源码位置: SparkUtil
.getDefaultConf
安装包
链接:https://pan.baidu.com/s/1dbO8bh20R_9wFgf7_m9zhQ?pwd=4alo
提取码:4alo