如何附加到极小群集(3 个节点或更少)上的 hdfs 文件

2022-09-04 21:41:56

我正在尝试附加到单节点集群上的hdfs上的文件。我也在2节点群集上尝试过,但得到了相同的异常。

在 hdfs-site 中,我已设置为 1。如果我设置为“我得到以下异常”dfs.replicationdfs.client.block.write.replace-datanode-on-failure.policyDEFAULT

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.

如果我遵循注释中的建议,在hdfs-default中进行配置.xml对于极小的集群(3个或更少),并设置为“我得到以下异常:dfs.client.block.write.replace-datanode-on-failure.policyNEVER

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.replication1

FileStatus[] status = fs.listStatus(new Path("/user/hadoop"));

我发现 设置为 。我不认为这是问题所在,因为当我将值更改为时,我得到了一个相关的异常。因此,显然它确实服从了值,但为了安全起见,有没有办法更改每个文件的值?status[i].block_replication3dfs.replication0dfs.replicationblock_replication


答案 1

正如我在编辑中提到的。即使 设置为 ,也设置为 3。dfs.replication1fileStatus.block_replication

一个可能的解决方案是运行

hadoop fs -setrep -w 1 -R /user/hadoop/

这将以递归方式更改给定目录中每个文件的复制因子。可在此处找到该命令的文档。

现在要做的是看看为什么 hdfs-site.xml 中的值被忽略了。以及如何强制该值为默认值。1

编辑

事实证明,该属性也必须在实例中设置,否则它会请求文件的复制因子为默认值,即3,而不管在hdfs-site中设置的值如何.xmldfs.replicationConfiguration

将以下语句添加到代码中将解决它。

conf.set("dfs.replication", "1");

答案 2

我也遇到了与您最初发布的相同的异常,并且由于您的评论,我解决了这个问题(将dfs.replication设置为1)。

但是我不明白一些事情,如果我有复制会发生什么?在这种情况下,是否可以附加到文件?

我会感谢您的回答,如果您有经验。

谢谢


推荐