从Web应用程序运行MapReduce作业

时间:2014-01-17 07:24:08

标签: 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文件并执行该作业。此Web应用程序在单独的计算机上运行。

我已尝试过上述两个帖子的建议,但无法使其工作,即使是在提供的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)       at java.security.AccessController.doPrivileged(Native Method)       在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)       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)       在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>

1 个答案:

答案 0 :(得分: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 superuser),并将该目录的所有者更改为kohtianan。这应该可以解决您的问题。