org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException

本文解析了Hadoop中NotReplicatedYetException异常的原因及处理流程。重点介绍了在写文件过程中分配新数据块时,如何确保数据块的副本数量符合系统设定的安全标准。

org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException: Not replicated yet:/nnThroughputBenchmark/addblock/AddblockBenchDir0/AddblockBench0
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1350)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:400)
    at org.apache.hadoop.hdfs.NNThroughputBenchmark.addBlocks(NNThroughputBenchmark.java:1228)
    at org.apache.hadoop.hdfs.NNThroughputBenchmark.testAddBlcok(NNThroughputBenchmark.java:1216)
    at org.apache.hadoop.hdfs.NNThroughputBenchmark.main(NNThroughputBenchmark.java:1247)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
    at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:141)
    at org.apache.hadoop.test.AllTestDriver.main(AllTestDriver.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:165)
    at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
    at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)

     NotReplicatedYetException这个异常是在写文件过程中新分配一个数据块getAdditionalBlock()时调用checkFileProgress(pendingFile, false)检查文件的倒数第二个数据块的副本数是否达到系统安全副本数要求,不达到则抛NotReplicatedYetException。

     checkFileProgress(pendingFile, true)还会在写完文件关闭时completeFileInternal()调用,对文件的所有数据块进行检查,若有文件有数据块的副本数少于安全要求则返回CompleteFileStatus.STILL_WAITING状态;

     下面主要对写文件过程新分配数据块的流程进行分析:

     1,Namenode在命名空间新建一个INode节点;

     2,为新数据块选DN位置location返回Client,检查文件的倒数第二个数据块副本数是否达到安全要求,否则抛NotReplicatedYetException(当然第一个数据块跳过这样的检查);

     3,Client写pipeline;

     4,pipeline上DN的PacketResponder线程等待下一级的ack,在成功接受完一个数据块后finalizeBlock,调用addBlock添加到volumeMap,之后在offerService()向NN上报告知已经存好到这个数据块了;

     5,NN处理blockReceived();

     6,有新数据块则继续步骤2;


     所以测试时的代码片段如下:

NameNode.format(conf);  
Namenode.createNamenode();  
  
for(int idx=0; idx < dnNum; idx++) {  
  datanodes[idx] = new Datanode();  
  datanodes[idx].register();  
  datanodes[idx].sendHeartbeat();  
}  
  
nameNode.setSafeMode(FSConstants.SafeModeAction.SAFEMODE_LEAVE);  
  
nameNode.create(fileName, FsPermission.getDefault(),  
          clientName, true, repl, BLOCK_SIZE);  
  
LocatedBlock loc = nameNode.addBlock(fileName, clientName);  
  
datanodes[jdx].addBlock(loc.getBlock());  
  
nameNode.blockReceived(  
          datanodes[jdx].dnRegistration,  
          new Block[] {loc.getBlock()},  
          new String[] {""});  
  
nameNode.complete(fileName, clientName);


<think>根据用户问题,需要解决Hive任务中由于Hadoop DataNode未运行导致的文件复制错误。错误信息为:"File could only be replicated to 0 nodes instead of minReplication=1. 0 datanodes running"。结合引用内容,此问题通常与DataNode未启动或未与NameNode通信有关。 ### 解决步骤 1. **检查DataNode状态** 使用`hadoop dfsadmin -report`或`hdfs dfsadmin -report`命令查看DataNode运行状态。若报告显示0个活动DataNode,则需启动DataNode。 2. **启动DataNode** 进入Hadoop安装目录的`sbin`文件夹,执行以下命令启动DataNode: ```bash ./hadoop-daemon.sh start datanode # Hadoop 2.x ``` 或 ```bash ./hdfs --daemon start datanode # Hadoop 3.x ``` 启动后检查日志文件(如`/opt/package/hadoop-2.7.2/logs/hadoop-root-datanode-node1.out`)确认是否启动成功[^2]。 3. **检查HDFS副本因子** 若DataNode已运行但问题仍存在,检查HDFS的副本因子设置: ```bash hdfs getconf -confKey dfs.replication ``` 默认值为3,若集群规模小(如单节点),需修改为1: ```bash hdfs dfs -setrep -w 1 /path/to/dir # 临时修改目录副本数 ``` 或在`hdfs-site.xml`中永久修改: ```xml <property> <name>dfs.replication</name> <value>1</value> </property> ``` 4. **等待DataNode注册** DataNode启动后需时间向NameNode注册(通常1-2分钟)。若立即操作HDFS可能触发`NotReplicatedYetException`,稍等重试即可[^3]。 5. **验证修复** 上传测试文件确认问题解决: ```bash hdfs dfs -put testfile /tmp ``` ### 注意事项 - **HA集群**:若配置高可用(HA),需确保所有NameNode和DataNode均运行。 - **防火墙**:检查节点间端口(如50010, 50020)是否开放,避免通信阻塞。 - **磁盘空间**:DataNode磁盘不足也会导致复制失败,使用`df -h`检查。 §§相关问题§§ 1. 如何永久修改HDFS的副本因子? 2. Hadoop集群启动的正确顺序是什么? 3. 如何排查HDFS写入失败的其他常见原因?</think>### 解决Hive文件复制错误:0 DataNode运行问题 #### 问题分析 错误信息 `File could only be replicated to 0 nodes instead of minReplication=1. 0 datanodes running` 表明Hadoop集群中的DataNode未正常运行,导致Hive无法将文件复制到HDFS。核心原因是DataNode未启动或未与NameNode通信[^1][^3]。 #### 解决方案 1. **检查DataNode状态** ```bash # 查看DataNode进程 jps | grep DataNode # 检查HDFS节点报告 hdfs dfsadmin -report ``` 若输出中无`DataNode`进程或显示`0 datanodes running`,需手动启动DataNode。 2. **启动DataNode** ```bash # 进入Hadoop的sbin目录 cd $HADOOP_HOME/sbin # 启动单个DataNode(替换node1为实际节点名) ./hadoop-daemon.sh start datanode # Hadoop 2.x # 或 ./hdfs --daemon start datanode # Hadoop 3.x ``` 启动后检查日志文件(如`/opt/package/hadoop-2.7.2/logs/hadoop-root-datanode-node1.out`)确认无报错[^2]。 3. **检查副本因子配置** ```bash # 查看当前副本设置 hdfs getconf -confKey dfs.replication ``` 若集群规模较小(如单节点),需在`hdfs-site.xml`中修改副本因子: ```xml <property> <name>dfs.replication</name> <value>1</value> <!-- 单节点设置为1 --> </property> ``` 4. **等待DataNode注册** DataNode启动后需1-2分钟向NameNode注册。若立即操作HDFS可能触发`NotReplicatedYetException`,稍等后重试Hive任务即可[^3]。 5. **检查防火墙与端口** ```bash # 确保50010(DataNode数据传输)和50020(IPC)端口开放 sudo firewall-cmd --list-ports | grep 50010 ``` #### 验证修复 ```bash # 测试HDFS写入 hdfs dfs -put testfile /tmp # 检查副本数 hdfs fsck /tmp/testfile -files -blocks -locations ``` 成功输出应包含 `Replicated: 1` 和活动的DataNode地址。 #### 预防措施 - **启动顺序**:先启动HDFS(`start-dfs.sh`),再启动YARN(`start-yarn.sh`) - **添加开机启动**:在`/etc/rc.d/rc.local`中添加DataNode启动命令 - **监控配置**:使用Ambari或Cloudera Manager监控节点状态
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值