1

Amazonクラウド(1サーバー)のubuntu 12 LTSサーバーにCDH4を正常にインストールしました。Cloudera Manager フリー版を使用してソフトウェアをインストールしましたが、エラーは発生しませんでした)。

Java API を使用して、自宅のコンピューターからクラウドの HDFS にファイルをロードするプログラムがあります。このプログラムが失敗する理由とその修正方法を知りたいです。

Configuration conf = new Configuration();       
conf.set("fs.defaultFS", "hdfs://node01:8020");
FileSystem fs = FileSystem.get(conf);       
Path targetPath = new Path("/users/<username>/myfile.txt");
Path sourcePath = new Path("/home/<username>/myfile.txt");
fs.copyFromLocalFile(false,true,sourcePath,targetPath);

次のエラーが表示されます (namenode ログ):

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/<username>/myfile.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)

次に、コードをクラウドにアップロードし、コードをローカルで実行します (ローカル fs から hdfs にファイルをアップロードします)。エラーはありません。パソコンからコードを実行したときにのみ発生します...

クラウド サーバーで cli 'hadoop fs -put' コマンドを使用すると、hdfs への書き込み時にエラーが発生しません。Hue を使用してファイルをアップロードすることもできます。いくつか読んだところ、十分なディスク容量がない場合にこの問題が発生することがわかりましたが、dfs と非 dfs の両方に十分な容量があります (以下のレポートを参照)。自宅のコンピューターから Java API を使用して Hadoop ファイルシステムを正常に読み取ることができ、API を使用して HBase に接続して読み取り/書き込みを行うこともできます。このサーバーのすべてのポートが私の IP に対して開かれています。ファイルのパーミッションがチェックされました。プログラムが失敗した後、アップロードしようとしたファイルが hdfs に表示されますが、内容は空白です (この投稿に似ています: https://groups.google.com/a/cloudera.org/forum/?fromgroups=#! topic/cdh-user/XWA-3H0ekYY )

これは hd​​fs dfsadmin -report からの出力です

Configured Capacity: 95120474112 (88.59 GB)
Present Capacity: 95120474112 (88.59 GB)
DFS Remaining: 95039008768 (88.51 GB)
DFS Used: 81465344 (77.69 MB)
DFS Used%: 0.09%
Under replicated blocks: 177
Blocks with corrupt replicas: 0
Missing blocks: 0

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

Live datanodes:
Name: privateip:port (node01)
Hostname: node01
Rack: /default
Decommission Status : Normal
Configured Capacity: 95120474112 (88.59 GB)
DFS Used: 81465344 (77.69 MB)
Non DFS Used: 0 (0 KB)
DFS Remaining: 95039008768 (88.51 GB)
DFS Used%: 0.09%
DFS Remaining%: 99.91%
Last contact: Sun Jan 27 03:01:53 UTC 2013
4

1 に答える 1

2

私は問題を解決しました-

私は、Hadoopローカルネットワーク上ではなく、自宅のマシンからHadoopに接続していました。どうやらこれを行うと、namenodeは私のホームマシンにデータノードのプライベートIPを使用してデータノードに書き込むように指示します。同じネットワーク上にないため、ホームマシンがデータノードに接続できず、このエラーが発生します。

ホームネットワークからHadoopネットワークへのVPN接続を作成することで問題を解決し、すべてが機能するようになりました。

于 2013-02-08T16:39:30.907 に答える