参考类似的问题:从另一个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>
1条答案
按热度按时间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
. 这应该能解决你的问题。