【问题标题】:Flume sink to HDFS error: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgumentFlume sink to HDFS 错误:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
【发布时间】:2021-05-10 10:19:23
【问题描述】:

与:

  • Java 1.8.0_231
  • Hadoop 3.2.1
  • Flume 1.8.0

已在 9000 端口上创建了 hdfs 服务。

jps:

11688 DataNode
10120 Jps
11465 NameNode
11964 SecondaryNameNode
12621 NodeManager
12239 ResourceManager

Flume 配置:

agent1.channels.memory-channel.type=memory
agent1.sources.tail-source.type=exec
agent1.sources.tail-source.command=tail -F /var/log/nginx/access.log
agent1.sources.tail-source.channels=memory-channel

#hdfs sink
agent1.sinks.hdfs-sink.channel=memory-channel
agent1.sinks.hdfs-sink.type=hdfs
agent1.sinks.hdfs-sink.hdfs.path=hdfs://cluster01:9000/system.log
agent1.sinks.hdfs-sink.hdfs.fileType=DataStream
agent1.channels=memory-channel
agent1.sources=tail-source
agent1.sinks=log-sink hdfs-sink

然后启动水槽:

./bin/flume-ng agent --conf conf -conf-file conf/test1.conf --name agent1 -Dflume.root.logger=INFO,console

然后遇到错误:

Info: Including Hadoop libraries found via (/usr/local/hadoop-3.2.1/bin/hadoop) for HDFS access
...
2019-11-04 14:48:24,818 (lifecycleSupervisor-1-1) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.start(MonitoredCounterGroup.java:95)] Component type: SINK, name: hdfs-sink started
2019-11-04 14:48:28,823 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.hdfs.HDFSDataStream.configure(HDFSDataStream.java:57)] Serializer = TEXT, UseRawLocalFileSystem = false
2019-11-04 14:48:28,836 (SinkRunner-PollingRunner-DefaultSinkProcessor) [ERROR - org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:447)] 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:1357)
    at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
    at org.apache.hadoop.conf.Configuration.setBoolean(Configuration.java:1679)
    at org.apache.flume.sink.hdfs.BucketWriter.open(BucketWriter.java:226)
    at org.apache.flume.sink.hdfs.BucketWriter.append(BucketWriter.java:541)
    at org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:401)
    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)
Exception in thread "SinkRunner-PollingRunner-DefaultSinkProcessor" 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:1357)
    at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
    at org.apache.hadoop.conf.Configuration.setBoolean(Configuration.java:1679)
    at org.apache.flume.sink.hdfs.BucketWriter.open(BucketWriter.java:226)
    at org.apache.flume.sink.hdfs.BucketWriter.append(BucketWriter.java:541)
    at org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:401)
    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)

我已经搜索了一段时间,但在网上没有发现同样的错误。有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: hdfs flume


    【解决方案1】:

    这可能是由 lib/guava 引起的。

    我删除了 lib/guava-11.0.2.jar,然后重新启动 Flume,发现它可以工作了。

    输出:

    2019-11-04 16:52:58,062 (hdfs-hdfs-sink-call-runner-0) [WARN - org.apache.hadoop.util.NativeCodeLoader.<clinit>(NativeCodeLoader.java:60)] Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    2019-11-04 16:53:01,532 (Thread-9) [INFO - org.apache.hadoop.hdfs.protocol.datatransfer.sasl.SaslDataTransferClient.checkTrustAndSend(SaslDataTransferClient.java:239)] SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
    

    但我还是不知道它现在用的是哪个版本的番石榴。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。这似乎是水槽中的一个错误。它引用了该版本的 guava 中不存在的类名

      【讨论】:

        【解决方案3】:

        用 hadoop 3 通用库中的 guava-27.x.x.jar 替换 guava-11.x.x.jar 文件,这样就可以了

        hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar 把这个文件放到你的flume库中,别忘了先从flume库中删除旧版本

        【讨论】:

          【解决方案4】:

          正如其他人所说,guava-11 (hadoop2/flume 1.8.0/1.9.0) 和 guava-27 (hadoop3) 之间存在冲突。

          其他答案无法解释问题的根本原因:如果设置了$HADOOP_HOME 环境变量,$FLUME_HOME/bin/flume-ng 下的脚本会将我们 hadoop 分发中的所有 jar 放入水槽类路径中。

          关于为什么建议的操作“解决”问题的几句话:删除$FLUME_HOME/lib/guava-11.0.2.jar 只留下guava-27.0-jre.jar,不再冲突。

          所以,不需要在$FLUME_HOME/lib下复制,也不是Flume的bug,只是版本不兼容,因为Flume没有升级Guava,而Hadoop 3升级了。

          我没有深入研究这些 guava 版本之间的更改细节,可能会发生一切正常,直到出现问题(例如,如果两者之间存在任何向后不兼容的更改)。

          所以,在生产环境中使用这个“修复”之前,我建议进行广泛的测试以减少意外问题的风险。

          最好的解决方案是等待(或贡献)一个新的 Flume 版本,其中 Guava 升级到 v27。

          【讨论】:

            【解决方案5】:

            我同意 Alessandro S.

            Flume 通过 HDFS API 与 HDFS 进行通信,如果 API 不改变,那么在大多数情况下,Hadoop 平台运行的版本并不重要。实际上,flume 是使用某些特定版本的 hadoop 库构建的。问题是你使用了错误的hadoop库版本来运行flume。

            所以只需使用 2.x.x 版本的 hadoop 库来运行您的 1.8.0 水槽

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多