2017-04-04 2 views
2

Ich möchte eine Datei von einem externen Windows-Server zu Hdfs auf einem anderen Server hochladen. Hdfs ist Teil des Cloudera-Docker-Containers auf diesem Server.Hochladen einer Datei von einem Server auf Hdfs in einem anderen Server

angeschlossen ich den HDFS von Windows-Server wie folgt:

Configuration conf = new Configuration(); 
conf.set("fs.defaultFS", "hdfs://%HDFS_SERVER_IP%:8020"); 
fs = FileSystem.get(conf); 

Als ich fs.copyFromLocalFile(localFilePath, hdfsFilePath); nennen, wirft es unter Ausnahmen und erstellt die Datei ohne Inhalt in HDFS. :

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/test/test.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.chooseTarget4NewBlock(BlockManager.java:1595) 
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3287) 
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:677) 
    at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.addBlock(AuthorizationProviderProxyClientProtocol.java:213) 
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:485) 
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) 
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617) 
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073) 
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2086) 
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2082) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693) 
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2080) 

    at org.apache.hadoop.ipc.Client.call(Client.java:1475) 
    at org.apache.hadoop.ipc.Client.call(Client.java:1412) 
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229) 
    at com.sun.proxy.$Proxy15.addBlock(Unknown Source) 
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:418) 
    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:191) 
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102) 
    at com.sun.proxy.$Proxy16.addBlock(Unknown Source) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1455) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1251) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448) 

Und es scheint ein Problem in DataNode wird die unten von seinem Protokoll kopiert:

Retrying Verbindung zum Server: 0.0.0.0/0.0.0.0:8022. Bereits ausprobiert 0 Zeit (s); Politik versuchen RetryUpToMaximumCountWithFixedSleep (MaxRetries = 10, sleeptime = 1000 MILLISEKUNDEN)

ich die Datanodes formatiert und hdfs neu starten, aber immer noch nicht die Datei in diesem Fall hochladen. Neben anderen Funktionen wie Lesen, Schreiben von Dateien arbeiten mit der Konfiguration und die Datei kann übertragen werden, wenn das lokale System und Hdfs auf dem gleichen Server sind.

Die Server sind mit dem Proxy-Server verbunden, und ich habe die Proxy-Umgebung des Docker-Containers von Hdfs konfiguriert. Wie wird die Datei mit Hdfs Java API zwischen verschiedenen Servern übertragen?

Update 1:

hdfs dfsadmin -report:

17/04/05 07:14:02 INFO client.RMProxy: Connecting to ResourceManager at /127.0.0.1:8032 
Total Nodes:1 
     Node-Id    Node-State Node-Http-Address  Number-of-Running-Containers 
quickstart.cloudera:37449    RUNNING quickstart.cloudera:8042         0 
[[email protected] conf]# hdfs dfsadmin -report 
Configured Capacity: 211243687936 (196.74 GB) 
Present Capacity: 78773199014 (73.36 GB) 
DFS Remaining: 77924307110 (72.57 GB) 
DFS Used: 848891904 (809.57 MB) 
DFS Used%: 1.08% 
Under replicated blocks: 0 
Blocks with corrupt replicas: 0 
Missing blocks: 0 
Missing blocks (with replication factor 1): 0 

------------------------------------------------- 
Live datanodes (1): 

Name: XXXX:50010 (quickstart.cloudera) 
Hostname: quickstart.cloudera 
Decommission Status : Normal 
Configured Capacity: 211243687936 (196.74 GB) 
DFS Used: 848891904 (809.57 MB) 
Non DFS Used: 132470488922 (123.37 GB) 
DFS Remaining: 77924307110 (72.57 GB) 
DFS Used%: 0.40% 
DFS Remaining%: 36.89% 
Configured Cache Capacity: 0 (0 B) 
Cache Used: 0 (0 B) 
Cache Remaining: 0 (0 B) 
Cache Used%: 100.00% 
Cache Remaining%: 0.00% 
Xceivers: 6 
Last contact: Wed Apr 05 07:15:00 UTC 2017 

Garn Knoten -list -all:

17/04/05 07:14:02 INFO client.RMProxy: Connecting to ResourceManager at /127.0.0.1:8032 
Total Nodes:1 
     Node-Id    Node-State Node-Http-Address  Number-of-Running-Containers 
quickstart.cloudera:37449    RUNNING quickstart.cloudera:8042         0 

Kern-site.xml:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

<configuration> 
    <property> 
    <name>fs.defaultFS</name> 
    <value>hdfs://quickstart.cloudera:8020</value> 
    </property> 

    <!-- OOZIE proxy user setting --> 
    <property> 
    <name>hadoop.proxyuser.oozie.hosts</name> 
    <value>*</value> 
    </property> 
    <property> 
    <name>hadoop.proxyuser.oozie.groups</name> 
    <value>*</value> 
    </property> 

    <!-- HTTPFS proxy user setting --> 
    <property> 
    <name>hadoop.proxyuser.httpfs.hosts</name> 
    <value>*</value> 
    </property> 
    <property> 
    <name>hadoop.proxyuser.httpfs.groups</name> 
    <value>*</value> 
    </property> 

    <!-- Llama proxy user setting --> 
    <property> 
    <name>hadoop.proxyuser.llama.hosts</name> 
    <value>*</value> 
    </property> 
    <property> 
    <name>hadoop.proxyuser.llama.groups</name> 
    <value>*</value> 
    </property> 

    <!-- Hue proxy user setting --> 
    <property> 
    <name>hadoop.proxyuser.hue.hosts</name> 
    <value>*</value> 
    </property> 
    <property> 
    <name>hadoop.proxyuser.hue.groups</name> 
    <value>*</value> 
    </property> 

</configuration> 

hdfs-site.xml:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

<configuration> 
    <property> 
    <name>dfs.replication</name> 
    <value>1</value> 
    </property> 
    <!-- Immediately exit safemode as soon as one DataNode checks in. 
     On a multi-node cluster, these configurations must be removed. --> 
    <property> 
    <name>dfs.safemode.extension</name> 
    <value>0</value> 
    </property> 
    <property> 
    <name>dfs.safemode.min.datanodes</name> 
    <value>1</value> 
    </property> 
    <property> 
    <name>dfs.permissions.enabled</name> 
    <value>false</value> 
    </property> 
    <property> 
    <name>dfs.permissions</name> 
    <value>false</value> 
    </property> 
    <property> 
    <name>dfs.safemode.min.datanodes</name> 
    <value>1</value> 
    </property> 
    <property> 
    <name>dfs.webhdfs.enabled</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>hadoop.tmp.dir</name> 
    <value>/var/lib/hadoop-hdfs/cache/${user.name}</value> 
    </property> 
    <property> 
    <name>dfs.namenode.name.dir</name> 
    <value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/name</value> 
    </property> 
    <property> 
    <name>dfs.namenode.checkpoint.dir</name> 
    <value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/namesecondary</value> 
    </property> 
    <property> 
    <name>dfs.datanode.data.dir</name> 
    <value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/data</value> 
    </property> 
    <property> 
    <name>dfs.namenode.rpc-bind-host</name> 
    <value>0.0.0.0</value> 
    </property> 

    <property> 
    <name>dfs.namenode.servicerpc-address</name> 
    <value>0.0.0.0:8022</value> 
    </property> 
    <property> 
    <name>dfs.https.address</name> 
    <value>0.0.0.0:50470</value> 
    </property> 
    <property> 
    <name>dfs.namenode.http-address</name> 
    <value>0.0.0.0:50070</value> 
    </property> 
    <property> 
    <name>dfs.datanode.address</name> 
    <value>0.0.0.0:50010</value> 
    </property> 
    <property> 
    <name>dfs.datanode.ipc.address</name> 
    <value>0.0.0.0:50020</value> 
    </property> 
    <property> 
    <name>dfs.datanode.http.address</name> 
    <value>0.0.0.0:50075</value> 
    </property> 
    <property> 
    <name>dfs.datanode.https.address</name> 
    <value>0.0.0.0:50475</value> 
    </property> 
    <property> 
    <name>dfs.namenode.secondary.http-address</name> 
    <value>0.0.0.0:50090</value> 
    </property> 
    <property> 
    <name>dfs.namenode.secondary.https-address</name> 
    <value>0.0.0.0:50495</value> 
    </property> 

    <!-- Impala configuration --> 
    <property> 
    <name>dfs.datanode.hdfs-blocks-metadata.enabled</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>dfs.client.file-block-storage-locations.timeout.millis</name> 
    <value>10000</value> 
    </property> 
    <property> 
    <name>dfs.client.read.shortcircuit</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>dfs.domain.socket.path</name> 
    <value>/var/run/hadoop-hdfs/dn._PORT</value> 
    </property> 
</configuration> 
+0

Wohin führen Sie diesen Code? Es muss auf dem Windows Server sein. Veröffentlichen Sie auch den kompletten Stacktrace. – franklinsijo

+0

Wie initialisierst du das Dateisystem? – Serhiy

+0

Hat der Datenknoten genügend Platz? Fügen Sie die Ausgabe von 'hdfs dfsadmin -report',' garn node -list -all' und die Eigenschaften 'core-site.xml',' hdfs-site.xml' hinzu. – franklinsijo

Antwort

0

Ich änderte nur conf.set("fs.defaultFS", "hdfs://%HDFS_SERVER_IP%:8020")-conf.set("fs.defaultFS", "webhdfs://%HDFS_SERVER_IP%:50070") und dann lade ich erfolgreich die Dateien an die hdfs im anderen Server. Ich habe darauf Bezug genommen link.

1

Die RPC Ports sind in Konflikt zwischen den Eigenschaften fs.defaultFS in core-site.xml und dfs.namenode.servicerpc-address in hdfs-site.xml.

Ändern Sie dies in hdfs-site.xml und starten Sie die Dienste neu.

<property> 
    <name>dfs.namenode.servicerpc-address</name> 
    <value>0.0.0.0:8020</value> 
</property> 
+0

Ich modifizierte und namenode konnte nicht initialisiert werden. Ich änderte den Namen der Eigenschaft als dfs.namenode.rpc-Adresse und bekam immer noch dieselben Ausnahmen. org.apache.hadoop.ipc.Client: Erneut versuchen, eine Verbindung zum Server herzustellen: 0.0.0.0/0.0.0.0:8020. befindet sich immer noch im Protokoll des Datenknotens. – isspek

+0

Was ist der Fehler, den Sie bekommen? – franklinsijo

+0

Sie sind RemoteException gleich wie in der Frage beschrieben und org.apache.hadoop.ipc.Client: Erneut versuchen, Verbindung zum Server herzustellen: 0.0.0.0/0.0.0.0:8020 im Log des Datanodes – isspek

Verwandte Themen