Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在非常小的集群(3个节点或更少)上附加到hdfs文件_Java_Hadoop_Hdfs - Fatal编程技术网

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

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

我试图附加到单节点集群上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 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在当前版本中被忽略)。