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

时间:2014-07-03 08:30:27

标签: java hadoop hdfs

我试图在单个节点集群上附加到hdfs上的文件。我也试过了一个2节点集群但得到了相同的例外。

在hdfs-site中,我将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 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.

如果我按照configuration in hdfs-default.xml的评论中针对极小群集(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"));

我发现status[i].block_replication设置为3。我认为这不是问题,因为当我将dfs.replication的值更改为0时,我得到了相关的异常。显然它确实服从dfs.replication的价值,但为了安全起见,有没有办法改变每个文件的block_replication值?

2 个答案:

答案 0 :(得分:11)

正如我在编辑中提到的那样。即使dfs.replication设置为1fileStatus.block_replication也会设置为3.

可能的解决方案是运行

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

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

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

修改

事实证明,dfs.replication属性也必须在Configuration实例中设置,否则它会请求文件的复制因子为默认值3,无论设置的值如何HDFS-site.xml中

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

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

答案 1 :(得分:1)

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

但是我不明白,如果我有复制会怎么样?在那种情况下是不是可以附加到文件?

如果您有相关经验,我将非常感谢您的回答。

由于