首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在极小的集群(3个节点或以下)上追加hdfs文件

如何在极小的集群(3个节点或以下)上追加hdfs文件
EN

Stack Overflow用户
提问于 2014-07-03 08:30:26
回答 2查看 4.4K关注 0票数 13

我试图在单个节点集群上的hdfs上添加一个文件。我也尝试了一个2节点集群,但是得到了相同的异常。

在hdfs-site中,dfs.replication设置为1。如果将dfs.client.block.write.replace-datanode-on-failure.policy设置为DEFAULT,则会得到以下异常

代码语言:javascript
复制
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个节点或更少)的configuration in hdfs-default.xml的建议,并将dfs.client.block.write.replace-datanode-on-failure.policy设置为NEVER,则会得到以下例外:

代码语言:javascript
复制
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.

以下是我试图添加的方法:

代码语言:javascript
复制
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,当我通过

代码语言:javascript
复制
FileStatus[] status = fs.listStatus(new Path("/user/hadoop"));

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-03 09:50:19

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

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

代码语言:javascript
复制
hadoop fs -setrep -w 1 -R /user/hadoop/

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

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

编辑

结果是,dfs.replication属性也必须在Configuration实例中设置,否则它要求文件的复制因子是默认的,这与hdfs-site.xml中的值设置无关。

添加到代码中,下面的语句将解决这个问题。

代码语言:javascript
复制
conf.set("dfs.replication", "1");
票数 11
EN

Stack Overflow用户

发布于 2015-02-22 14:47:01

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

但是我不明白,如果我有复制会发生什么?在这种情况下,难道不可能追加到文件中吗?

我很感激你的回答,如果你有经验的话。

谢谢

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24548699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档