2012-04-11 3 views
6

ローカルファイルシステムからマッパーに入力を与えました。これはEclipseから正常に実行されていますが、ローカル入力が見つからないためクラスタから実行されません入力パスが存在しません。入力ファイルのパスが存在しません。クラスタ内で実行できるように、マッパーにローカルファイルパスを与える方法を教えてください。ローカルファイルシステムディレクトリをクラスタ内のMapperの入力として実行する

答えて

3

クラスタで実行するには、分散ストレージ(HDFS)にロードされるデータ。最初にhadoop fs -copyFromLocalを使用してHDFSにデータをコピーしてから、HDFSのデータのパスを与えて再度ジョブを実行してください。

+0

ローカルファイルをjavaプログラムを介してmap-reduceの入力として与えたい場合は、どうすれば指定できますかjavaプログラムでは、クラスタ内で実行するように? – user1326784

+1

ファイルをHDFSにアップロードした後、そのファイルを 'TextInputFormat.addInputPaths(job、"/path/to/file/in/hdfs ");' –

0

処理するMapReduceジョブのデータはHDFSでなければなりません。したがって、ローカルファイルシステムやネットワークパス、Webベースのストア(Azure Blob StorageやAmazon Block stoageなど)などのソースを持っていても、まずHDFSでデータをコピーしてからジョブを実行する必要があります。 最終的にデータをHDFSにプッシュする必要があり、データソースによってはいくつかの方法がありますが、ソースからHDFSへのデータ転送はローカルファイルシステムなどから実行します。次のコマンドを使用します:-f CopyFromLocal SourceFileOrStoragePath _HDFS__Or_directPathatHDFS_

+1

などの入力フォーマットのユーティリティメソッドを使用してドライバコードに設定します。ローカルプログラムをjavaプログラムを使ってmap-reduceの入力として与えたいのであれば、それをjavaプログラムで指定してクラスター内で実行する必要がありますか? – user1326784

1

$のHadoopの質問は興味深いものです。 S3のデータを持ち、ジョブを実行する前にHDFSへの明示的なコピーをせずにこのデータにアクセスすることができます。語数の例では、次のように1本を指定します:

Hadoopの瓶の.jar WORDCOUNT s3n://bucket/input s3n://bucket/output

を何本で起こることはマッパーが直接S3からレコードを読むことです。

これはS3で行うことができれば、なぜ

file:///input file:///output 

S3Nこの構文を使用する代わりに、同様にHadoopのではないでしょうか?

経験的には、これは興味深い方法で失敗するようです。実際に入力ディレクトリにあるファイルに対して、Hadoopが例外を見つけられないことがわかりました。つまり、putディレクトリのファイルをローカルディスク上にリストすることができるようですが、レコードを読むためにファイルを開くときにファイルが見つからない(またはアクセス可能な)場合があります。

+0

実際、これについて議論したところ、データはまずHDFSになければならないが、Hadoopマッパーはローカルファイルに存在するレコードを取得する方法がないという答えではありません。ローカルマシン上でサーバを実行する必要はなく、サーバをHadoopに指定する方法もありません。 – Jeff

0

この

FileInputFormat.addInputPath(confに、新しいパス(ファイル:///ローカルのファイルシステム上のディレクトリ))のように入力パスを設定してみてください。

ファイル拡張子を与える場合、これは非常に古い質問ですLocalSystemの

3

からファイルにアクセスすることができます。最近同じ問題に直面した。 私はこのことがわかっています。この解決策は私のために働いています。これには何らかの欠点があることに気づいてください。ここに私がしたことがあります。

Reading a solution from the mail-archives、私は私がfile:///hdfs://localhost:8020/からfs.default.nameを変更した場合、それはローカルファイルシステムにアクセスすることができます実現しました。しかし、私はすべての私のmapreduceの仕事のためにこれを望んでいない。そこで私はcore-site.xmlのコピーをローカルシステムフォルダに作成しました(私のMRジャーをhadoop jarに提出する場所と同じです)。

と私は追加MRのための私のDriverクラスでは、

Configuration conf = new Configuration(); 
conf.addResource(new Path("/my/local/system/path/to/core-site.xml")); 
conf.addResource(new Path("/usr/lib/hadoop-0.20-mapreduce/conf/hdfs-site.xml")); 

MRは、ローカルシステムからの入力を受け取り、私は次のコードを試してみましたが、解決策を持っているhdfs:

+0

私は3ノードのクラスタを持っています。私はマシン1のローカルファイルシステムからファイルを読み込みたいのですが、どうすればいいですか? – TKHN

0

に出力を書き込みます。.. 。 それを試してみてください。

ローカルファイルシステムのFileSystemオブジェクトを取得してから、makequalifiedメソッドを使用してpaを返す必要があります私たちはローカルファイルシステムのパスを渡す必要があるので(これを他の方法でinputformatに渡す必要はありません)、make修飾子を使用してローカルファイルシステムパスのみを返します。

コードは以下のとおりです。 。

Configuration conf = new Configuration(); 
FileSystem fs = FileSystem.getLocal(conf); 
Path inputPath = fs.makeQualified(new Path("/usr/local/srini/")); // local path 

FileInputFormat.setInputPaths(job, inputPath); 

私はそれが私が信じている任意の構成の変更を必要としない...それは私のためにうまく働いた...それは非常に遅れ投稿ですけれども、これは、あなたの条件のために働く願っています。..

+0

util.NativeCodeLoader:ご使用のプラットフォーム用のnative-hadoopライブラリを読み込めません...可能であれば組み込みJavaクラスを使用 スレッド "main"の例外java.lang.UnsupportedOperationException:DistributedFileSystem FileSystem実装では実装されていません –

0

Uはこれを試してたいかもしれません構成を

に設定すると、
Configuration conf=new Configuration(); 
conf.set("job.mapreduce.tracker","local"); 
conf.set("fs.default.name","file:///"); 

これ以降、ローカルパスでurlとfileinputformatを設定することができます。

関連する問題