Java 如何在非常小的集群(3个节点或更少)上附加到hdfs文件
我试图附加到单节点集群上hdfs上的文件。我还尝试了一个2节点集群,但得到了相同的异常 在hdfs站点中,我将dfs.replication设置为1。如果我将Java 如何在非常小的集群(3个节点或更少)上附加到hdfs文件,java,hadoop,hdfs,Java,Hadoop,Hdfs,我试图附加到单节点集群上hdfs上的文件。我还尝试了一个2节点集群,但得到了相同的异常 在hdfs站点中,我将dfs.replication设置为1。如果我将dfs.client.block.write.replace datanode on failure.policy设置为DEFAULT我会得到以下异常 java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more g
dfs.client.block.write.replace datanode on failure.policy
设置为DEFAULT
我会得到以下异常
java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[10.10.37.16:50010], original=[10.10.37.16:50010]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
如果我按照注释中针对非常小的群集(3个节点或更少)的建议,并将dfs.client.block.write.replace datanode on failure.policy
设置为NEVER
,我会得到以下异常:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot append to file/user/hadoop/test. Name node is in safe mode.
The reported blocks 1277 has reached the threshold 1.0000 of total blocks 1277. The number of live datanodes 1 has reached the minimum number 0. In safe mode extension. Safe mode will be turned off automatically in 3 seconds.
下面是我如何尝试附加:
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://MY-MACHINE:8020/user/hadoop");
conf.set("hadoop.job.ugi", "hadoop");
FileSystem fs = FileSystem.get(conf);
OutputStream out = fs.append(new Path("/user/hadoop/test"));
PrintWriter writer = new PrintWriter(out);
writer.print("hello world");
writer.close();
代码中是否有我做错的地方?
也许,配置中缺少一些东西?
任何帮助都将不胜感激
编辑
即使dfs.replication
设置为1
,当我通过
FileStatus[] status = fs.listStatus(new Path("/user/hadoop"));
我发现
状态[I]。block_replication
设置为3
。我认为这不是问题所在,因为当我将dfs.replication
的值更改为0
时,我得到了一个相关的异常。显然,它确实遵守了dfs.replication的值,但为了安全起见,有没有办法更改每个文件的块复制值?,正如我在编辑中提到的那样。即使dfs.replication
设置为1
,fileStatus.block\u replication
设置为3
一个可能的解决方案是运行
hadoop fs -setrep -w 1 -R /user/hadoop/
这将递归地更改给定目录中每个文件的复制因子。可以找到该命令的文档
现在要做的是查看hdfs-site.xml中的值被忽略的原因。以及如何强制值1
为默认值
编辑
事实证明,dfs.replication
属性也必须在Configuration
实例中设置,否则它要求文件的复制因子为默认值,即3,而不管在hdfs-site.xml中设置的值如何
向代码中添加以下语句将解决此问题
conf.set("dfs.replication", "1");
我还遇到了与您最初发布时相同的异常,由于您的评论(将dfs.replication设置为1),我解决了这个问题
但我不明白,如果我有复制会发生什么?在这种情况下,是否可以附加到文件中
我会很感激你的回答,如果你有经验的话
感谢我想对于单节点群集,复制应该为零,dfs.support.append的值是多少?@sambhavSharma我试图将其设置为0,但它也引发了一个异常,即没有活动数据节点,并且dfs.support.append确实设置为trueYepp,需要进行复制1@peeskillet我觉得问题不一样,,在这里,安全模式会在几秒钟内自动关闭,我可以正常操作任何东西,但是,如果我再次尝试将其附加到安全模式中。进行复制时,必须确保复制因子小于或等于数据节点数。当复制因子大于数据节点数时,第一次写入成功而追加失败的原因是追加更严格,以确保一致性,而第一次写入可以容忍复制不足。p、 您的输入更适合作为注释,而不是回答,以便更清楚地供将来参考:新文件的解决方案是将conf.set(“dfs.replication”,“1”)添加到FileSystem.get配置中。对于现有文件,还需要运行hadoop fs-setrep-w 1/user/hadoop/(-R在当前版本中被忽略)。