Java 如何通过jobClient自动向hadoop提交jar
我目前正在使用maven进行依赖项管理 在本例中,我编写了一个将MapReduce作业提交给hadoop的方法,然后为该方法编写了一个junit测试 当我运行Java 如何通过jobClient自动向hadoop提交jar,java,maven,hadoop,Java,Maven,Hadoop,我目前正在使用maven进行依赖项管理 在本例中,我编写了一个将MapReduce作业提交给hadoop的方法,然后为该方法编写了一个junit测试 当我运行mvn包时,它编译成功(所有依赖项都正确),失败的是单元测试 在job tracker上,我可以看到一个ClassNotFoundException表示在节点上找不到我的map、combine&reduce类 我不想使用conf.setJar手动设置此jar文件的路径 有什么方法可以做到这一点并使其自动工作吗?您需要一种机制,通过该机制,您
mvn包时,它编译成功(所有依赖项都正确),失败的是单元测试
在job tracker上,我可以看到一个ClassNotFoundException
表示在节点上找不到我的map、combine&reduce类
我不想使用conf.setJar
手动设置此jar文件的路径
有什么方法可以做到这一点并使其自动工作吗?您需要一种机制,通过该机制,您的用户代码(映射器、组合器、还原器类等)可以供TaskTracker使用。这通常是通过将类绑定到jar文件中,然后使用setJar
/setJarByClass
方法来处理的。在幕后,hadoop将把这个jar上传到HDFS中的tmp作业目录,并将tmp HDFS作业jar添加到分布式缓存中
我的建议是将您的单元测试变成集成测试——maven生命周期的这个阶段发生在打包之后,您将拥有一个jar,通过它您可以调用setJar,并知道您将构建一个jar(我猜在这里您不想在普通测试阶段调用setJar,因为jar尚未构建)
最后,如果您想测试mapper/reducer代码而不在真正的集群中运行,您应该在hadoop本地模式下查看或运行该作业,这两种模式都不需要构建jar
作为参考,这里有一个在本地模式下运行的JUnit代码片段,可以在我的Ubuntu桌面上运行(如果桌面是windows,则需要安装cygwin或unxutils)。它不是单元测试,因为它不断言输出:
@Test
public void testLocalRun() throws IOException, InterruptedException, ClassNotFoundException {
Job job = new Job();
job.setInputFormatClass(TextInputFormat.class);
FileInputFormat.setInputPaths(job,
"src/test/java/csw/hadoop/sandbox/LocalHadoopTest.java");
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path(
"target/hadoop-local-output"));
job.setNumReduceTasks(0);
job.waitForCompletion(true);
}
您需要一种机制,通过该机制,您的用户代码(映射器、组合器、还原器类等)可以供TaskTracker使用。这通常是通过将类绑定到jar文件中,然后使用setJar
/setJarByClass
方法来处理的。在幕后,hadoop将把这个jar上传到HDFS中的tmp作业目录,并将tmp HDFS作业jar添加到分布式缓存中
我的建议是将您的单元测试变成集成测试——maven生命周期的这个阶段发生在打包之后,您将拥有一个jar,通过它您可以调用setJar,并知道您将构建一个jar(我猜在这里您不想在普通测试阶段调用setJar,因为jar尚未构建)
最后,如果您想测试mapper/reducer代码而不在真正的集群中运行,您应该在hadoop本地模式下查看或运行该作业,这两种模式都不需要构建jar
作为参考,这里有一个在本地模式下运行的JUnit代码片段,可以在我的Ubuntu桌面上运行(如果桌面是windows,则需要安装cygwin或unxutils)。它不是单元测试,因为它不断言输出:
@Test
public void testLocalRun() throws IOException, InterruptedException, ClassNotFoundException {
Job job = new Job();
job.setInputFormatClass(TextInputFormat.class);
FileInputFormat.setInputPaths(job,
"src/test/java/csw/hadoop/sandbox/LocalHadoopTest.java");
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path(
"target/hadoop-local-output"));
job.setNumReduceTasks(0);
job.waitForCompletion(true);
}
谢谢当我将这些测试标记为集成测试时,它适用于甲烷罐。当我将这些测试标记为集成测试时,它适用于我