【发布时间】:2014-01-17 07:24:07
【问题描述】:
参考类似问题: Running a Hadoop Job From another Java Program 和 Calling 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