参考类似的问题: Running a Hadoop Job From another Java Program 和 Calling 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>
答案 0 :(得分:1)
要运行map-reduce程序,您需要在map-reduce程序类路径中显示jackson-mapper-asl-*.jar
和jackson-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
。这应该可以解决您的问题。