Hadoop:AWS EMR作业中的输入和输出路径

时间:2013-02-14 02:37:59

标签: hadoop amazon-web-services amazon-s3 amazon-emr emr

我正在尝试在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中指定输入和输出路径?

2 个答案:

答案 0 :(得分:2)

所以基本上这是在尝试创建可执行jar时 not-defined-the-main-class 的经典错误。当你不让jar知道main-class时,第一个参数被认为是主类,因此错误就在这里。

因此,请确保在创建可执行jar时,在清单中指定main-class。

OR

分别对输入和输出使用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

答案 1 :(得分:1)

我遇到了同样的问题。因为当你提交自定义jar文件时,你需要3个结果(除2之外)。第一个是您的Main类名,第二个是输入文件的inputpath,第三个是输出文件夹的outputpath。 无论如何,我想你可能已经解决了这个问题。