gpt4 book ai didi

java - 从 Java 写入 HDFS,得到 "could only be replicated to 0 nodes instead of minReplication"

转载 作者:可可西里 更新时间:2023-11-01 14:08:40 28 4
gpt4 key购买 nike

我已经下载并启动了 Cloudera 的 Hadoop Demo VM for CDH4(运行 Hadoop 2.0.0)。我正在尝试编写一个 Java 程序,它将在我的 Windows 7 机器(运行 VM 的同一机器/操作系统)上运行。我有一个示例程序,例如:

public static void main(String[] args) {
try{
Configuration conf = new Configuration();
conf.addResource("config.xml");
FileSystem fs = FileSystem.get(conf);
FSDataOutputStream fdos=fs.create(new Path("/testing/file01.txt"), true);
fdos.writeBytes("Test text for the txt file");
fdos.flush();
fdos.close();
fs.close();
}catch(Exception e){
e.printStackTrace();
}

}

我的 config.xml 文件只定义了一个属性:fs.default.name=hdfs://CDH4_IP:8020。

当我运行它时,出现以下异常:

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)
at org.apache.hadoop.ipc.Client.call(Client.java:1160)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202)
at $Proxy9.addBlock(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83)
at $Proxy9.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:290)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1150)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1003)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:463)

我浏览了互联网,似乎当磁盘空间不足时会发生这种情况,但当我运行“hdfs dfsadmin -report”时情况并非如此,我得到以下信息:

Configured Capacity: 25197727744 (23.47 GB)
Present Capacity: 21771988992 (20.28 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used: 1273856 (1.21 MB)
DFS Used%: 0.01%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Live datanodes:
Name: 127.0.0.1:50010 (localhost.localdomain)
Hostname: localhost.localdomain
Decommission Status : Normal
Configured Capacity: 25197727744 (23.47 GB)
DFS Used: 1273856 (1.21 MB)
Non DFS Used: 3425738752 (3.19 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used%: 0.01%
DFS Remaining%: 86.4%
Last contact: Fri Jan 11 17:30:56 EST 201323 EST 2013

我也可以在 VM 中很好地运行这段代码。我不确定问题是什么或如何解决。这是我第一次使用 hadoop,所以我可能遗漏了一些基本的东西。有什么想法吗?

更新

我在日志中看到的唯一异常是类似于客户端上的异常:

java.io.IOException: File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)

我尝试更改数据目录 (/var/lib/hadoop-hdfs/cache/hdfs/dfs/data) 的权限,但并没有解决问题(我什至给予所有人完全访问权限)。

我注意到,当我通过 HUE 网络应用程序浏览 HDFS 时,我看到文件夹结构已创建并且文件确实存在但它是空的。我尝试使用

将文件放在默认用户目录下
FSDataOutputStream fdos=fs.create(new Path("testing/file04.txt"), true); 

代替

FSDataOutputStream fdos=fs.create(new Path("/testing/file04.txt"), true);

这使得文件路径变为“/user/dharris/testing/file04.txt”(“dharris”是我的 Windows 用户)。但这给了我同样的错误。

最佳答案

我遇到了同样的问题。
就我而言,问题的关键在于错误消息。
有 1 个数据节点正在运行,1 个节点被排除在该操作中。

这意味着您的 hdfs-client 无法使用 50010 端口连接到您的数据节点。当你连接到 hdfs namenode 时,你可以获得数据节点的状态。但是,您的 hdfs-client 将无法连接到您的数据节点。

(在hdfs中,一个namenode管理着文件目录,还有datanodes。如果hdfs-client连接到一个namnenode,它会找到一个目标文件路径和有数据的datanode地址,然后hdfs-client会和datanode通信。 (您可以使用 netstat 检查那些数据节点 uri。因为,hdfs-client 将尝试使用名称节点通知的地址与数据节点通信)

我通过以下方式解决了这个问题:

  1. 在防火墙中打开 50010(dfs.datanode.address) 端口。
  2. 添加属性 "dfs.client.use.datanode.hostname", "true"
  3. 将主机名添加到我的客户端 PC 的主机文件中。

对不起,我的英语水平很差。

关于java - 从 Java 写入 HDFS,得到 "could only be replicated to 0 nodes instead of minReplication",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com