5

Amazon Elastic Mapreduce で Hadoop ジョブを実行しようとしています。データと jar が aws s3 にあります。ジョブフローをセットアップするとき、JAR引数を次のように渡します

s3n://my-hadoop/input s3n://my-hadoop/output

以下は私のhadoopの主な機能です

public static void main(String[] args) throws Exception
    {
        Configuration conf = new Configuration();
        Job job = new Job(conf, "MyMR");
        job.setJarByClass(MyMR.class);
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(CountryReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.setInputFormatClass(TextInputFormat.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

ただし、私のジョブフローは stderr の次のログで失敗します

Exception in thread "main" java.lang.ClassNotFoundException: s3n://my-hadoop/input
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:180)

では、aws emr で入力パスと出力パスを指定するにはどうすればよいですか?

4

2 に答える 2

2

したがって、基本的にこれは、実行可能なjarを作成しようとしているときにメインクラスを定義していないという古典的なエラーです。jarにメインクラスの知識を持たせないと、最初の引数がメインクラスと見なされるため、ここでエラーが発生します。

そのため、実行可能な jar を作成するときに、マニフェストでメインクラスを指定するようにしてください。

また

入力と出力にそれぞれ args[1] と args[2] を使用し、次のような Hadoop ステップを実行します。

ruby elastic-mapreduce -j $jobflow --jar s3:/my-jar-location/myjar.jar --arg com.somecompany.MyMainClass --arg s3:/input --arg s3:/output
于 2013-02-14T18:51:22.587 に答える
1

カスタムjarファイルを送信するときに、2つ以外の3つの引数が必要なためです。1 つ目はメイン クラス名、2 つ目は入力ファイルへの入力パス、3 つ目は出力フォルダーへの出力パスです。とにかく、おそらくこの問題を解決したと思います。

于 2016-09-24T22:30:03.837 に答える