Невозможно записать в HDFS через Java: файл ... может быть записан только в 0 из 1 узлов minReplication - PullRequest
0 голосов
/ 07 ноября 2018

Пытаюсь написать что-н. HDFS с использованием Java.

HDFS работает хорошо, и я могу вручную загружать файлы на HDFS:

sudo -u hdfs hdfs dfs -put file /tmp

Согласно веб-интерфейсу HDFS (http://nn_ip:9870) все датододы исправны.

Но когда я пытаюсь сделать это с помощью Java, я получаю исключение:

Exception in thread "main" org.apache.hadoop.ipc.RemoteException(java.io.IOException): File ... could only be written to 0 of the 1 minReplication nodes. There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2103)
at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:287)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2702)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:865)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:550)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1726)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1481)
at org.apache.hadoop.ipc.Client.call(Client.java:1427)
at org.apache.hadoop.ipc.Client.call(Client.java:1337)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:227)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
at com.sun.proxy.$Proxy10.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:440)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:398)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:163)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:155)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:335)
at com.sun.proxy.$Proxy11.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.DataStreamer.locateFollowingBlock(DataStreamer.java:1733)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1536)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:658)

Java-коды могут генерировать путь и файл HDFS, но файл пуст:

    public static void main(String[] args) throws Exception { 
    String hdfsuri = "hdfs://namenodeserver:8020";

    String path="/user/hdfs/example1/hdfs/";
    String fileName="hello.csv";
    String fileContent="hello;world";

    // ====== Init HDFS File System Object
    Configuration conf = new Configuration(); 
    conf.set("fs.defaultFS", hdfsuri); 
    conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
    conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());

    System.setProperty("HADOOP_USER_NAME", "hdfs");
    System.setProperty("hadoop.home.dir", "/");

    FileSystem fs = FileSystem.get(URI.create(hdfsuri), conf); 

    //Create a path
    Path hdfswritepath = new Path(newFolderPath + "/" + fileName);
    //Init output stream
    FSDataOutputStream outputStream=fs.create(hdfswritepath);
    //Cassical output stream usage
    outputStream.writeBytes(fileContent);
    outputStream.close(); 
    //Create a path
    Path hdfsreadpath = new Path(newFolderPath + "/" + fileName);
    //Init input stream
    FSDataInputStream inputStream = fs.open(hdfsreadpath);
    //Classical input stream usage
    String out= IOUtils.toString(inputStream, "UTF-8"); 
    inputStream.close();
    fs.close();

}

Как решить эту проблему?

Я видел несколько вопросов, таких как this . Некоторые люди предлагают форматировать наменоде. Но зачем форматировать наменоде? Какую проблему решает этот шаг? Я переустанавливал HDFS несколько раз. Но эта проблема все еще существует.

Любая помощь приветствуется.

...