Hadoop 常见问题集锦:原因 + 解决,遇到直接查
大数据组件多、版本杂、配置碎,出问题才是常态。这篇把 Hadoop 生态里几个常见问题记录下来——遇到什么问题、为什么报错、怎么解决。
Flume 写 HDFS 报 NoSuchMethodError
报错信息:
1 | java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V |
问题定位:
Flume 和 Hadoop 都用到了 Google 的 Guava 库,但版本不一样。checkArgument 这个方法在高版本 Guava 里的签名有变化,Flume 编译时用的是高版本,运行时加载了 Hadoop 的低版本 Guava,方法对不上,就抛 NoSuchMethodError。
怎么确认是版本冲突?
看错误栈顶部的类名——com.google.common.base.Preconditions 是 Guava 的核心类,NoSuchMethodError 说明方法签名不匹配,十有八九是版本冲突。
解决办法:
- 分别找到 Flume 和 Hadoop 的
lib目录里的 Guava JAR:
1 | Flume |
- 比较版本,比如 Flume 是
guava-28.0-jre.jar,Hadoop 是guava-11.0.2.jar,把 Hadoop 的低版本删掉,把 Flume 的高版本复制到 Hadoop 的lib目录下。 - 如果两个版本都不高,直接下载一个统一的高版本(比如
guava-30.0-jre.jar),替换两边。 - 重启 Flume Agent 和 Hadoop 相关服务。
这类问题的本质: Flume 和 Hadoop 共用同一套 Guava 库,但不同版本之间方法不兼容。多组件共用一个库的时候,版本必须一致。
HDFS 写文件失败:没有 DataNode 运行
报错信息:
1 | could only be written to 0 of the 1 minReplication nodes. There are 0 datanode(s) running and 0 node(s) are excluded in this operation. |
问题定位:
这条报错直译是”0 个 DataNode 可用,无法满足最小副本数要求”。根本原因是没有 DataNode 进程在运行,或者 DataNode 虽然进程在但没向 NameNode 注册成功。
怎么确认?
1 | jps |
如果看不到 DataNode 进程,说明节点没起来。如果看到了但还是报错,去 DataNode 的日志里看有没有 Connection refused 或 Block report 相关的错误。
1 | tail -100 $HADOOP_HOME/logs/hadoop-<user>-datanode-<host>.log |
解决办法:
- DataNode 进程没起来 → 检查
hdfs-site.xml里dfs.datanode.data.dir配置的目录是否存在、权限对不对(Hadoop 用户要可读写)。 - DataNode 进程起来了但注册失败 → 检查
core-site.xml里的fs.defaultFS地址是否正确,NameNode 是否正常启动(jps看有没有NameNode进程)。 - 数据目录有残留的 namespaceID 冲突 → 删除 DataNode 数据目录下的
current文件夹:
1 | rm -rf /opt/data/hadoop/hdfs/data/current |
然后重新启动 DataNode。注意:这样做会清空该节点上的数据块,NameNode 会从其他副本恢复数据,适用于测试环境或数据有其他副本的生产环境。
修复后重启 DataNode:
1 | 单独启动 DataNode |
这类问题的本质: HDFS 写入需要至少一个活的 DataNode。DataNode 起不来,根本原因通常集中在三处——目录权限、NameNode 地址不通、数据目录脏了。