ETJava Beta | Java    注册   登录
  • Flume启动时出现NoSuchMethodError

    发表于 2025-11-07 10:07:55     阅读(36)     博客类别:Flume

    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
    
    	

     

     

     

     

上一篇: 生成可执行jar包


下一篇:sudo 指令调整