2012-03-14 3 views
3

付属のテストプログラムで、ローカルディスクから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コマンド、それはうまく動作します。だから私は何が間違っているの?

+0

コマンドラインユーティリティからHDFSにアクセスできますか?その場合、クラスタで実行しているHadoopと同じバージョンに対してコードをコンパイルしていますか? –

+0

あなたは知っています、私は彼らが同じバージョンであることを誓う用意がありました。つまり、開発マシンとして名前ノードを使用しています。確かに私は同じバージョンに対して開発しているだろう!しかし私はそれに私の名前を入れる前に、私はチェックすることを決めた、あなたはそれを知っていないだろう!クラスターはクロウダージャーを実行しており、開発のために提供されたジャーは同じではありません。 cloudera jarをclasspathに入れて、問題を解決しました!それを「答え」に入れてください。 – david

答えて

15

クラスタで実行しているのと同じHadoopバージョンに対してコンパイルしていることを確認してください。

+1

私たちの場合、それはもっと難解でした。つまり、別のバージョンのhadoopクライアントと組み込みのpig-udf.jarがあります。 hadoop-core.jar(0.20.2-cdh3u2)とpig-udf.jarのバージョンが同じで、同じフォルダのクラスパスに置かれ、 '-cp lib/* '結果は不確定であった... – ihadanny

+0

Hadoop上のApache Sparkに対してSpark Job ServerからHDFSファイルストリーミングジョブを実行しているとき、私は同じ' java.io.EOFException'を持っていました。私がSpark Job Serverにクラスパス上でSparkのバージョンを使用させたときに、ターゲットランタイムSparkクラスターとまったく同じバージョンのHadoopに対してビルドされていたのは、EOFExceptionがなくなってファイルストリーミングジョブが動作することでした。 – snark

1

適切な例外がシリアル化可能なインターフェイスであり、適切なバージョンのhadoopを使用していることを確認してください。

0

問題のためのあなたのコード私は、過去に同様の問題に直面していた障害

+2

答えがこの短い場合は、コメントを検討してください。 – placeybordeaux

0

で、おそらく「foo」というディレクトリパス。しかし、問題は私のものだった、私はhadoopの2つの異なるバージョンを持っていた。以前のバージョンからデーモンを起動し、bash_profileが新しいものを指していたので、この問題が発生しました。バージョンミスマッチで遊んでいないことを確認してください。 '

関連する問題