【问题标题】:Run MapReduce Job from a web application从 Web 应用程序运行 MapReduce 作业
【发布时间】:2014-01-17 07:24:07
【问题描述】:

参考类似问题: Running a Hadoop Job From another Java ProgramCalling a mapreduce job from a simple java program

我在 Hadoop 远程计算机中也有一个 mapreduce 作业 jar 文件,我正在创建一个 Web 应用程序,该应用程序带有一个按钮单击事件,将调用该 jar 文件并执行该作业。此网络应用在单独的计算机上运行。

我已经尝试了上述两个帖子中的建议,但无法使其发挥作用,即使是在提供的 wordcount 示例上工作,但仍然遇到错误消息 NoClassDefFoundError。

有没有我遗漏的代码行?

下面是我的代码:

public void buttonClick(ClickEvent event) {
        UserGroupInformation ugi;
        try {
            ugi = UserGroupInformation.createProxyUser("hadoopUser", UserGroupInformation.getLoginUser());
            ugi.doAs(new PrivilegedExceptionAction<Object>(){
                public Object run() throws Exception {
                    runHadoopJob();
                    return null;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }   
    }

private boolean runHadoopJob(){
try {       
            Configuration conf = new Configuration();
            conf.set("fs.default.name", "hdfs://192.168.4.248:9000");
            conf.set("mapred.job.tracker", "192.168.4.248:9001");
            Job job = new Job(conf, "WordCount");
            job.setMapperClass(TokenizerMapper.class);
            job.setReducerClass(IntSumReducer.class);
            job.setJarByClass(TokenizerMapper.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            FileInputFormat.addInputPath(job, new Path("/flume/events/160114/*"));
            Path out = new Path("output");
            FileSystem fs = FileSystem.get(conf);
            fs.delete(out, true);
            FileOutputFormat.setOutputPath(job, out);
            job.waitForCompletion(true);
            System.out.println("Job Finished");
        } catch (Exception e) {
            e.printStackTrace();
        }
return true;
}

引起:java.lang.NoClassDefFoundError: org/codehaus/jackson/map/JsonMappingException 在 org.apache.hadoop.mapreduce.Job$1.run(Job.java:513) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(未知来源) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149) 在 org.apache.hadoop.mapreduce.Job.connect(Job.java:511) 在 org.apache.hadoop.mapreduce.Job.submit(Job.java:499) 在 org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530) 在 com.example.hadoopclient.HDFSTable.runHadoopJob(HDFSTable.java:181) 在 com.example.hadoopclient.HDFSTable.access$0(HDFSTable.java:120) 在 com.example.hadoopclient.HDFSTable$SearchButtonClickListener.buttonClick(HDFSTable.java:116) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ... 36 更多

在我的 hadoop core-site.xml 文件中添加了以下内容,其中hadoop 是我的hadoopUser 所属的用户组

<property>
           <name>hadoop.proxyuser.kohtianan.groups</name>
           <value>hadoop</value>
           <description></description>
         </property>
         <property>
           <name>hadoop.proxyuser.kohtianan.hosts</name>
           <value>*</value>
           <description></description>
         </property>

【问题讨论】:

    标签: java hadoop mapreduce hdfs


    【解决方案1】:

    要运行 map-reduce 程序,您的 map-reduce 程序类路径中需要有 jackson-mapper-asl-*.jarjackson-core-asl-*.jar 文件。实际的 jar 文件名将根据您使用的 hadoop 发行版和版本而有所不同。

    这些文件位于$HADOOP_HOME/lib 文件夹下。 解决这个问题的两种方法:

    • 使用hadoop jar 命令调用map-reduce 程序。这将确保所有需要的 jar 文件都自动包含在您的 map-reduce 程序的类路径中。

    • 如果您希望从应用程序触发 map-reduce 作业,请确保在应用程序类路径中包含这些 jar 文件(和其他必要的 jar 文件),以便在生成 map-reduce 时程序它会自动从应用程序类路径中获取 jar 文件。

    org.apache.hadoop.ipc.RemoteException: 用户: kohtianan 不允许 冒充hadoopUser

    此错误表示用户 kohtianan 无权访问 Hadoop DFS。您可以做的是,只需在 HDFS 上创建一个目录(来自 hdfs 超级用户)并将该目录的所有者更改为 kohtianan。这应该可以解决您的问题。

    【讨论】:

    • Shandbhag 谢谢。它似乎已经解决了这个问题。但是,当我遇到另一个错误时,当作业必须在 HDFS 上写入/删除文件时,这涉及远程用户权限问题。我已经使用 UserGroupInformation 类编辑了调用“runHadoopJob”方法的代码部分,但似乎无法使其正常工作。你能帮我确定我在哪里实施错误吗?谢谢
    • org.apache.hadoop.ipc.RemoteException: User: kohtianan is not allowed to impersonate hadoopUser 这是我收到的错误信息。
    • @Koh :我已经修改了帖子。看看吧。
    • 谢谢。我环顾四周,意识到我错过了对 core.xml 配置文件的一些编辑。我添加了以下内容,似乎已解决
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多