java - 从 Web 应用程序运行 MapReduce 作业

标签 java hadoop mapreduce hdfs

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

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

我已经尝试了上面两篇文章中的建议,但无法使其工作,即使使用提供的字数示例,但仍然遇到错误消息 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;
}

Caused by: java.lang.NoClassDefFoundError: org/codehaus/jackson/map/JsonMappingException at org.apache.hadoop.mapreduce.Job$1.run(Job.java:513) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149) at org.apache.hadoop.mapreduce.Job.connect(Job.java:511) at org.apache.hadoop.mapreduce.Job.submit(Job.java:499) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530) at com.example.hadoopclient.HDFSTable.runHadoopJob(HDFSTable.java:181) at com.example.hadoopclient.HDFSTable.access$0(HDFSTable.java:120) at com.example.hadoopclient.HDFSTable$SearchButtonClickListener.buttonClick(HDFSTable.java:116) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ... 36 more

将以下内容添加到我的 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>

最佳答案

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

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

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

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

org.apache.hadoop.ipc.RemoteException: User: kohtianan is not allowed to impersonate hadoopUser

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

关于java - 从 Web 应用程序运行 MapReduce 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180120/

相关文章:

java - 安卓/Java : Check if url is valid youtube url

java - DataInputStream 、 GZIPInputStream 和 InputStream 区别

java - MapReduce - 不调用 Reduce

java - Spark聚合方法中的并发

java - 如何使用 Tiles 进行类似 Facelets 的模板合成?

java - Swing 定位问题

hadoop - 在 mapreduce 中使用键值对的重要性是什么?

java - 如何在 java 中使用 sparkSubmit 更改 hdfs 中的用户

斯卡拉/Hadoop : Specifying Context for Reducer

java - Driver 中的 job.setOutputKeyClass 和 setOutputValueClass 与 reducer 的 context.write 方法不匹配,程序仍然运行正常。怎么办?