付属のテストプログラムで、ローカルディスクからHDFSにファイルをコピーしようとしています。次のようにコードは次のとおりです。hadoopでHDFSに接続中のEOFException
package foo.foo1.foo2.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestTestTest {
public static void main(String[] args) {
String srcLocation = "foo";
String destination = "hdfs:///tmp/";
FileSystem hdfs = null;
Configuration configuration = new Configuration();
configuration.set("fs.default.name", "hdfs://namenode:54310/");
try {
hdfs = FileSystem.get(configuration);
} catch (IOException e2) {
e2.printStackTrace();
return;
}
Path srcpath = new Path(srcLocation);
Path dstpath = new Path(destination);
try {
hdfs.copyFromLocalFile(srcpath, dstpath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
これは、次の例外で失敗します。これを引き起こしている何を、どのように私はこのプログラムを動作させることができます。
java.io.IOException: Call to namenode/10.1.1.1:54310 failed on local exception: java.io.EOFException
at org.apache.hadoop.ipc.Client.wrapException(Client.java:775)
at org.apache.hadoop.ipc.Client.call(Client.java:743)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)
at $Proxy0.getProtocolVersion(Unknown Source)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:359)
at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:106)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:207)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:170)
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:82)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1378)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1390)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:196)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:95)
at foo.foo1.foo2.test.TestTestTest.main(TestTestTest.java:22)
Caused by: java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:375)
at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:501)
at org.apache.hadoop.ipc.Client$Connection.run(Client.java:446)
私の質問は一見シンプルですか?私が見つけた少しの情報から、HDFSへの接続に問題があり、これが設定のfs.default.nameプロパティと関係していることがわかりました。以下は私のコア-site.xmlファイルの関連セクションです:おそらく、特別な関心の
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://namenode:54310</value>
</property>
</configuration>
が事実であること、私は1メガジャーに私のクラスパス内のすべてのjarファイルをバンドルし、経由でこのプログラムを実行する場合hadoopコマンド、それはうまく動作します。だから私は何が間違っているの?
コマンドラインユーティリティからHDFSにアクセスできますか?その場合、クラスタで実行しているHadoopと同じバージョンに対してコードをコンパイルしていますか? –
あなたは知っています、私は彼らが同じバージョンであることを誓う用意がありました。つまり、開発マシンとして名前ノードを使用しています。確かに私は同じバージョンに対して開発しているだろう!しかし私はそれに私の名前を入れる前に、私はチェックすることを決めた、あなたはそれを知っていないだろう!クラスターはクロウダージャーを実行しており、開発のために提供されたジャーは同じではありません。 cloudera jarをclasspathに入れて、問題を解決しました!それを「答え」に入れてください。 – david