从web应用程序运行mapreduce作业

wecizke3  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(342)

参考类似的问题:从另一个java程序运行hadoop作业,从一个简单的java程序调用mapreduce作业
我在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 at org.apache.hadoop.mapreduce.job$1.run(作业)。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(作业。java:511)在org.apache.hadoop.mapreduce.job.submit(作业。java:499)在org.apache.hadoop.mapreduce.job.waitforcompletion(作业。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(本机方法)在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>
slwdgvem

slwdgvem1#

要运行map reduce程序,您需要 jackson-mapper-asl-*.jar 以及 jackson-core-asl-*.jar Map上的文件减少了程序类路径。实际的jar文件名将根据hadoop发行版和您使用的版本而有所不同。
这些文件存在于 $HADOOP_HOME/lib 文件夹。解决此问题的两种方法:
使用调用map reduce程序 hadoop jar 命令。这将确保所有必需的jar文件自动包含在map reduce程序的类路径中。
如果希望从应用程序触发map reduce作业,请确保在应用程序类路径中包含这些jar文件(以及其他必要的jar文件),以便在生成map reduce程序时,它会自动从应用程序类路径中提取jar文件。
org.apache.hadoop.ipc.remoteexception:用户:不允许kohtianan模拟hadoopuser
此错误表示用户 kohtianan 无法访问hadoop dfs。您可以做的是,只需在hdfs上创建一个目录(从hdfs superuser)并将该目录的所有者更改为 kohtianan . 这应该能解决你的问题。

相关问题