Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过jobClient自动向hadoop提交jar_Java_Maven_Hadoop - Fatal编程技术网

Java 如何通过jobClient自动向hadoop提交jar

Java 如何通过jobClient自动向hadoop提交jar,java,maven,hadoop,Java,Maven,Hadoop,我目前正在使用maven进行依赖项管理 在本例中,我编写了一个将MapReduce作业提交给hadoop的方法,然后为该方法编写了一个junit测试 当我运行mvn包时,它编译成功(所有依赖项都正确),失败的是单元测试 在job tracker上,我可以看到一个ClassNotFoundException表示在节点上找不到我的map、combine&reduce类 我不想使用conf.setJar手动设置此jar文件的路径 有什么方法可以做到这一点并使其自动工作吗?您需要一种机制,通过该机制,您

我目前正在使用maven进行依赖项管理

在本例中,我编写了一个将MapReduce作业提交给hadoop的方法,然后为该方法编写了一个junit测试

当我运行
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);
}

谢谢当我将这些测试标记为集成测试时,它适用于甲烷罐。当我将这些测试标记为集成测试时,它适用于我