【问题标题】:Hadoop: Input and Output paths in AWS EMR jobHadoop:AWS EMR 作业中的输入和输出路径
【发布时间】:2013-01-29 18:57:07
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    所以基本上这是一个典型的 not-defining-the-main-class 错误,同时试图创建一个可执行的 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多