无法在 HDFS“datanode”中写入数据 - 已在排除列表中添加节点

Posted

技术标签:

【中文标题】无法在 HDFS“datanode”中写入数据 - 已在排除列表中添加节点【英文标题】:Unable to write data in HDFS "datanode" - Node added in excluded list 【发布时间】:2019-10-19 07:35:05 【问题描述】:

我在同一个 jvm 中运行“namenode”和“datanode”,当我尝试写入数据时出现以下异常

org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy$NotEnoughReplicasException: 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseRandom(BlockPlacementPolicyDefault.java:836) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseRandom(BlockPlacementPolicyDefault.java:724) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseLocalRack(BlockPlacementPolicyDefault.java:631) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseLocalStorage(BlockPlacementPolicyDefault.java:591) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseTargetInOrder(BlockPlacementPolicyDefault.java:490) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseTarget(BlockPlacementPolicyDefault.java:421) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseTarget(BlockPlacementPolicyDefault.java:297) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseTarget(BlockPlacementPolicyDefault.java:148) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault.chooseTarget(BlockPlacementPolicyDefault.java:164) 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2127) 在 org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:294) 在 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2771) 在 org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:876) 在 org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:567) 在 org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) 在 org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:524) 在 org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1025) 在 org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:876) 在 org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:822) 在 java.base/java.security.AccessController.doPrivileged(本机方法) 在 java.base/javax.security.auth.Subject.doAs(Subject.java:423) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730) 在 org.apache.hadoop.ipc.Server$Handler.run(Server.java:2682)

        final File file = new File("C:\\ManageEngine\\test\\data\\namenode");
        final File file1 = new File("C:\\ManageEngine\\test\\data\\datanode1");
        BasicConfigurator.configure();
        final HdfsConfiguration nameNodeConfiguration = new HdfsConfiguration();
        FileSystem.setDefaultUri(nameNodeConfiguration, "hdfs://localhost:5555");
        nameNodeConfiguration.set(DFSConfigKeys.DFS_NAMENODE_NAME_DIR_KEY, file.toURI().toString());
        nameNodeConfiguration.set(DFSConfigKeys.DFS_REPLICATION_KEY, "1" );
        final NameNode nameNode = new NameNode(nameNodeConfiguration);



        final HdfsConfiguration dataNodeConfiguration1 = new HdfsConfiguration();
        dataNodeConfiguration1.set(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY, file1.toURI().toString());
        dataNodeConfiguration1.set(DFSConfigKeys.DFS_DATANODE_ADDRESS_KEY, "localhost:5556" );
        dataNodeConfiguration1.set(DFSConfigKeys.DFS_REPLICATION_KEY, "1" );
        FileSystem.setDefaultUri(dataNodeConfiguration1, "hdfs://localhost:5555");
        final DataNode dataNode1 = DataNode.instantiateDataNode(new String[], dataNodeConfiguration1);



        final FileSystem fs = FileSystem.get(dataNodeConfiguration1);

        Path hdfswritepath = new Path(fileName);
        if(!fs.exists(hdfswritepath)) 
            fs.create(hdfswritepath);
            System.out.println("Path "+hdfswritepath+" created.");
        
        System.out.println("Begin Write file into hdfs");

        FSDataOutputStream outputStream=fs.create(hdfswritepath);
        //Cassical output stream usage
        outputStream.writeBytes(fileContent);
        outputStream.close();
        System.out.println("End Write file into hdfs");

Request data - Image

【问题讨论】:

你不能拥有replication number > number of data nodes 嘿,谢谢你的评论,但我想运行单个数据节点,有没有可能的方法来存档这个。 在日志中发现这一行“未能找到数据节点 (scope=""excludedScope="/default-rack").numOfDatanodes=0" 【参考方案1】:

副本数不能高于数据节点数。

如果您想在单个节点上运行,请在 hdfs-site.xml 中将 dfs.replication 设置为 1。

【讨论】:

以上是关于无法在 HDFS“datanode”中写入数据 - 已在排除列表中添加节点的主要内容,如果未能解决你的问题,请参考以下文章

HDFS的写入流程及副本复制策略

HDFS读取数据发生异常

Hadoop-HDFS

HDFS Namenode&Datanode

HDFS写数据流程

hdfs体系架构