0
Edit: IDE is Intellij IDEA
      OS: Mac OS X Lion
      Hadoop: 1.2.1

編集:これは、ファイルパスが現在のファイルシステムの場所に存在する場合に機能します。したがって、問題は、IDE から実行するときに hdfs で動作させる方法になります。

IDE (Intellij IDEA) 内から実行すると例外が発生します。以下を参照してください。

プログラムの引数で「入出力」を指定します

もちろん、「入力」はデータファイルを含む HDFS に存在します。

しかし、コードは、HDFS からではなく、ローカル プロジェクト ファイル システムの場所からディレクトリにアクセスしようとしています。

hdfs コマンド:

James-MacBook-Pro:conf james$ hadoop fs -ls input
Found 1 items
-rw-r--r--   1 james supergroup         15 2013-11-01 07:31 /user/james/input/simple.txt

Java ソース コード:

public class WordCount extends Configured implements Tool {
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new WordCount(), args);
        System.exit(res);
    }
    @Override
    public int run(String[] args) throws Exception {
        if (args.length != 2) {
            System.err.println("Usage: hadoop jar mrjob-1.0-SNAPSHOT-job.jar"
                                       + " [generic options] <in> <out>");
            System.out.println();
            ToolRunner.printGenericCommandUsage(System.err);
            return 1;
        }
        Job job = new Job(getConf(), "WordCount");
        job.setJarByClass(getClass());
        job.setMapperClass(TokenizingMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        boolean success = job.waitForCompletion(true);
        return success ? 0 : 1;
    }
}

構成:

core-site.xml

<configuration>
 <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
 </property>
</configuration>

hdfs-site.xml

<configuration>
     <property>
        <name>dfs.replication</name>
        <value>1</value>
     </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>localhost:9001</value>
     </property>
</configuration>

IDE の引数:

input output

例外:

Nov 03, 2013 9:46:00 AM org.apache.hadoop.security.UserGroupInformation doAs
SEVERE: PriviledgedActionException as:james cause:org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/Users/james/work/projects/hadoop/mrjob/input
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/Users/james/work/projects/hadoop/mrjob/input

私は何を間違えましたか?

4

1 に答える 1

0

ローカルの Eclipse から、クラスター構成の Hadoop 構成ファイル (core-site.xml) がクラスパス上になく、hadoop jar などにバンドルされているものによってクラスパス上に隠されていると想定しています。

ジョブを送信する前に、コードでジョブ構成プロパティ「fs.default.name」を手動で設定することにより、これを修正できます。

job.getConf().set('fs.default.name', "hdfs://localhost:9000");

ローカルのものを使用しないように、ジョブトラッカーも設定する必要があるでしょう:

job.getConf().set('mapred.jobtracker.address', "localhost:9001");

ホスト名、ポート、さらにはプロパティ名は、環境や展開によって異なる場合があることに注意してください。

または、hadoop conf フォルダーをクラスパスに追加することもできます (そして、hadoop jar よりも優先度が高いことを確認してください)。

于 2013-11-02T15:31:50.547 に答える