gpt4 book ai didi

java - 从 Web 应用程序运行 MapReduce 作业

转载 作者:行者123 更新时间:2023-12-01 13:37:11 26 4
gpt4 key购买 nike

引用类似问题: Running a Hadoop Job From another Java ProgramCalling a mapreduce job from a simple java program

我在 Hadoop 远程计算机中也有一个 MapReduce 作业 jar 文件,并且我正在创建一个 Web 应用程序,该应用程序通过按钮单击事件调用该 jar 文件并执行该作业。此网络应用程序在单独的计算机上运行。

我已经尝试了上面两篇文章中的建议,但无法使其工作,即使使用提供的字数示例,但仍然遇到错误消息 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;
}

Caused by: java.lang.NoClassDefFoundError: org/codehaus/jackson/map/JsonMappingException at org.apache.hadoop.mapreduce.Job$1.run(Job.java:513) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149) at org.apache.hadoop.mapreduce.Job.connect(Job.java:511) at org.apache.hadoop.mapreduce.Job.submit(Job.java:499) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530) at com.example.hadoopclient.HDFSTable.runHadoopJob(HDFSTable.java:181) at 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) at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ... 36 more

将以下内容添加到我的 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>

最佳答案

要运行 Map-Reduce 程序,您需要有 jackson-mapper-asl-*.jarjackson-core-asl-*.jar 文件在你的map-reduce程序类路径上。实际的 jar 文件名将根据您使用的 hadoop 发行版和版本而有所不同。

这些文件位于 $HADOOP_HOME/lib 文件夹下。解决这个问题的两种方法:

  • 使用hadoop jar命令调用map-reduce程序。这将确保所有必需的 jar 文件自动包含在您的 map-reduce 程序的类路径中。

  • 如果您希望从应用程序触发 Map-Reduce 作业,请确保在应用程序类路径中包含这些 jar 文件(以及其他必要的 jar 文件),以便在生成 Map-Reduce 时程序会自动从应用程序类路径中获取 jar 文件。

org.apache.hadoop.ipc.RemoteException: User: kohtianan is not allowed to impersonate hadoopUser

此错误表明用户 kohtianan 无权访问 Hadoop DFS。您可以做的是,只需在 HDFS 上创建一个目录(通过 hdfs super 用户)并将该目录的所有者更改为 kohtianan。这应该可以解决您的问题。

关于java - 从 Web 应用程序运行 MapReduce 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com