Hadoop多次格式化出现17/12/19 00:19:51 WARN hdfs.DataStreamer: DataStreamer Excep

本文介绍了在Hadoop伪分布式环境中遇到的一个异常问题及其解决方法。异常原因是由于频繁格式化导致datanode与namenode的ID不一致。提供了两种解决方案:一种是删除并重新格式化,另一种是手动修改datanode上的clusterID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

####在进行Hadoop伪分布式安装的时候我格式化一次,后来又修改了core-site.xml,又进行了一次格式化,然后使用MapReduce 进行测试计算的时候抛出下面的异常:

[hadoop@zydatahadoop001 hadoop]$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar pi 5 10
Number of Maps  = 5
Samples per Map = 10
17/12/19 00:19:51 WARN hdfs.DataStreamer: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/QuasiMonteCarlo_1513613989668_1586732403/in/part0 could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1738)
        at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:265)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2496)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:828)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:506)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:447)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:845)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:788)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1807)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2455)

        at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1481)
        at org.apache.hadoop.ipc.Client.call(Client.java:1427)
        at org.apache.hadoop.ipc.Client.call(Client.java:1337)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:227)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
        at com.sun.proxy.$Proxy10.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:440)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:398)
        at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:163)
        at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:155)
        at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:335)
        at com.sun.proxy.$Proxy11.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.DataStreamer.locateFollowingBlock(DataStreamer.java:1733)
        at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1536)
        at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:658)
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/QuasiMonteCarlo_1513613989668_1586732403/in/part0 could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1738)
        at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:265)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2496)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:828)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:506)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:447)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:845)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:788)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1807)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2455)

        at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1481)
        at org.apache.hadoop.ipc.Client.call(Client.java:1427)
        at org.apache.hadoop.ipc.Client.call(Client.java:1337)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:227)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
        at com.sun.proxy.$Proxy10.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:440)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:398)
        at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:163)
        at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:155)
        at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:335)
        at com.sun.proxy.$Proxy11.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.DataStreamer.locateFollowingBlock(DataStreamer.java:1733)
        at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1536)
        at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:658)

错误原因:由于进行了多次格式化使得datanode无法正常启动,即出现
下面的错误信息:

17/12/19 00:19:51 WARN hdfs.DataStreamer: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/QuasiMonteCarlo_1513613989668_1586732403/in/part0 could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.

百度上总结了很多基本解决办法,总结如下:

  • 先后启动namenode、datanode
$hadoop-daemon.sh start namenode
$hadoop-daemon.sh start datanode
  • 确保master(namenode) 、slaves(datanode)的防火墙已经关闭
  • 确保DFS空间的使用情况
  • Hadoop默认的hadoop.tmp.dir的路径为/tmp/hadoop-${user.name},而有的linux系统的/tmp目录文件系统的类型往往是Hadoop不支持的。

但还是不行,原因是因为当我们执行文件系统格式化时,会在namenode数据文件夹(/tmp/hadoop-hadoop/dfs/data/current)中保存一个current/VERSION文件,记录namespaceID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。

####以下提供两种解决办法:

#####方式1

  • 删除前先关闭进程
[hadoop@zydatahadoop001 sbin]$ jps
26884 Jps
26043 SecondaryNameNode
25756 NameNode
[hadoop@zydatahadoop001 sbin]$ kill -9 26043
[hadoop@zydatahadoop001 sbin]$ kill -9 25756
  • 删除 /tmp/hadoop-hadoop/dfs/data/data目录下的文件
[hadoop@zydatahadoop001 ~]$ cd /tmp/hadoop-hadoop/dfs/data/
[hadoop@zydatahadoop001 data]$ ll
total 8
drwxrwxr-x. 3 hadoop hadoop 4096 Dec 19 00:33 current
-rw-rw-r--. 1 hadoop hadoop   21 Dec 19 00:33 in_use.lock
[hadoop@zydatahadoop001 data]$ rm -rf current
  • 这时候在进行格式化
    [hadoop@zydatahadoop001 bin]$ hdfs namenode -format

问题就解决了。

#####方式2

  • 修改current目录的VERSION中的clusterID使两个的clusterID相同,就可以解决了(/tmp/hadoop-hadoop/dfs/data/)
[hadoop@zydatahadoop001 ~]$ cd /tmp/hadoop-hadoop/dfs/data/
[hadoop@zydatahadoop001 data]$ ll
total 8
drwxrwxr-x. 3 hadoop hadoop 4096 Dec 19 00:33 current
-rw-rw-r--. 1 hadoop hadoop   21 Dec 19 00:33 in_use.lock

[hadoop@zydatahadoop001 current]$ cat VERSION 
#Tue Dec 19 00:33:48 CST 2017
storageID=DS-d9b740ba-fe83-44ec-b3d2-e21da706a597
clusterID=CID-2544b3e3-8400-47a6-a253-63dffc356e47
cTime=0
datanodeUuid=79d78c7d-cd1b-4854-89df-c063ce5fba86
storageType=DATA_NODE
layoutVersion=-57
  • 这时候在进行格式化
    [hadoop@zydatahadoop001 bin]$ hdfs namenode -format

格式化之后jps查看datanode启动。问题就解决了。

<think>好的,我现在需要帮助用户解决关于HDFS文件上传时出现ConnectException警告的问题。用户担心已成功上传的文件是否有潜在问题,以及后续的影响,特别是tez.tar.gz这个文件的情况。 首先,我应该回忆一下HDFS文件上传的过程。当使用`hadoop fs -put`命令上传文件时,客户端会与NameNode通信获取DataNode的位置信息,然后将数据块写入这些DataNode。如果在上传过程中出现连接拒绝的异常,可能是在与NameNodeDataNode建立连接时出现问题。 接下来,用户提到的警告日志中出现ConnectException,但部分文件已经成功上传。我需要确定这种情况下已上传的部分是否完整可用。HDFS的设计是保证数据完整性的,所以一旦文件显示上传成功,客户端应该已经收到确认,数据块已经正确复制到多个DataNode上。但如果在传输过程中出现异常,可能文件并未完全上传,这时候需要检查文件的状态。 然后,考虑tez.tar.gz文件的情况。如果该文件在上传过程中中断,可能会导致文件不完整,进而影响后续任务,比如Tez作业无法正确读取该文件,导致任务失败。需要用户检查文件的校验和或使用hdfs命令验证文件的完整性,比如`hadoop fs -checksum`。 此外,用户可能需要了解如何排查ConnectException的原因。常见原因包括网络问题、NameNodeDataNode服务未运行、防火墙配置阻止连接等。建议用户检查相关服务的日志,确认端口是否开放,网络是否通畅。 最后,关于后续影响,如果文件确实已成功上传,则不会受影响。但如果上传中断导致文件不完整,可能需要重新上传。用户应该使用`hadoop fs -ls`确认文件大小,或尝试解压tez.tar.gz来验证是否损坏。 总结回答要点:已成功上传的文件通常没问题,需验证完整性和大小;ConnectException可能影响未完成的上传;排查网络和服务状态;建议具体检查文件和重新上传损坏的部分。</think>关于HDFS文件上传出现$ConnectException$警告日志的影响分析如下: ### 一、已上传文件状态判断 1. **成功标记机制** HDFS客户端仅在所有数据块完成3副本写入后才会返回成功状态。若`hadoop fs -put`命令最终报错退出,但控制台显示部分进度完成,需用`hadoop fs -ls /目标路径/tez.tar.gz`检查文件大小是否完整[^1] 2. **部分写入处理** 若上传中断时正在写入数据块,HDFS会自动清理未完成写入的临时文件。已完整写入的数据块会保留,但可能出现以下情况: $$ 实际文件大小 < 原始文件大小 \quad \Rightarrow \quad 文件损坏 $$ ### 二、连接拒绝原因排查 || 常见原因 | 检测命令 | |---|---|---| | 1 | NameNode RPC端口关闭 | `netstat -tlnp \| grep 8020` | | 2 | DataNode IPC端口异常 | `telnet <DataNode_IP> 50020` | | 3 | 客户端网络隔离 | `traceroute <NameNode_IP>` | ### 三、tez.tar.gz文件验证 1. **完整性校验** ```bash # 本地原始文件校验 md5sum tez.tar.gz # HDFS文件校验 hadoop fs -cat /hdfs/path/tez.tar.gz \| md5sum ``` 2. **解压测试** ```bash hadoop fs -get /hdfs/path/tez.tar.gz tar -tzvf tez.tar.gz > /dev/null 2>&1 && echo "文件正常" || echo "文件损坏" ``` ### 四、后续影响范围 - ✅ **成功写入部分**:通过校验的文件不会导致任务失败 - ⚠️ **部分写入文件**:可能导致MapReduce任务报`ChecksumException`或Tez任务出现`InvalidInputException` - ❗ **元数据残留**:需检查`/tmp`目录是否存在残留临时文件(参考命令:`hadoop fs -ls /tmp/.staging`) 建议优先执行完整性校验,若发现tez.tar.gz不完整应立即删除HDFS上的对应文件并重新上传[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值