Flume在采集数据到HDFS时出现NoSuchMethodError异常分析及解决
环境说明
Hadoop-3.3.0
Flume-1.9.0
异常信息
cess(HDFSEventSink.java:459)] process failed
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1380)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1361)
at org.apache.hadoop.conf.Configuration.setBoolean(Configuration.java:1703)
at org.apache.flume.sink.hdfs.BucketWriter.open(BucketWriter.java:221)
at org.apache.flume.sink.hdfs.BucketWriter.append(BucketWriter.java:572)
at org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:412)
at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:67)
at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:145)
at java.lang.Thread.run(Thread.java:748)
分析
通常是Guava版本导致的,即Hadoop中使用的guava版本与Flume中不一致
解决
核心是 统一 Guava 版本,确保 Flume 和 Hadoop 使用兼容的版本
# 找到 Flume 进程的 PID
jps | grep Application
# 查看该进程加载的 Guava 类来源
lsof -p <PID> | grep guava
# 如果出现多个guava版本则需要统一版本 执行下列指令
# 删除 Hadoop common/lib 中的低版本
rm -f /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-11.0.2.jar
# 删除 Flume lib 中的低版本
rm -f /export/server/apache-flume-1.9.0-bin/lib/guava-11.0.2.jar
保留统一版本
Hadoop 3.3.0 本身已经包含 guava-27.0-jre.jar(在 common/lib 和 hdfs/lib 中),无需额外复制,只需确保 Flume 也使用该版本:
# 复制 Hadoop 的高版本 Guava 到 Flume 的 lib 目录
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar /export/server/apache-flume-1.9.0-bin/lib/
验证是否还有其他版本的guava
find /export/server/hadoop-3.3.0 /export/server/apache-flume-1.9.0-bin -name "guava-11.0.2.jar"
重启Flume并验证
# 启动Hadoop
start-dfs.sh
# 启动Flume
cd /export/server/flume
bin/flume-ng agent -c ./conf -f ./conf/flume2HDFS.conf -n a1 -Dflume.root.logger=INFO,console