使用本地runner在独立模式下运行hadoop2.4.0作业的单元测试

nom7f22z  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(339)

在使用以前版本的hadoop时,我通常为整个作业(mapper和reducer)构建junit测试,并通过调用maven或直接从ide本身运行测试。系统上没有安装hadoop。我使用以下属性来确保使用本地进程内运行程序:

config.set("mapred.job.tracker", "local");
config.set("fs.default.name", "file:///test-fs");

这些测试运行成功。
我升级到了更新版本的hadoop(2.4.0)以利用新的api。我希望我的部队能和以前一样。我现在使用的属性是:

config.set("fs.default.name", "file:///test-fs");
config.set("mapreduce.jobtracker.address", "local");
config.set("mapreduce.framework.name", "local");

我在测试中构造配置对象,并将其传递给创建作业对象的实际代码。
但是,这不起作用,我得到以下错误:
java.io.ioexception:无法初始化群集。请检查mapreduce.framework.name的配置以及相应的服务器地址。在org.apache.hadoop.mapreduce.cluster.initialize(cluster。java:120)在org.apache.hadoop.mapreduce.cluster。java:82)在org.apache.hadoop.mapreduce.cluster。java:75)在org.apache.hadoop.mapreduce.job$9.run(job。java:1255)在org.apache.hadoop.mapreduce.job$9.run(job。java:1251)位于java.security.accesscontroller.doprivileged(本机方法)在javax.security.auth.subject.doas(subject。java:415)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1548)在org.apache.hadoop.mapreduce.job.connect(job。java:1250)在org.apache.hadoop.mapreduce.job.submit(作业。java:1279)在org.apache.hadoop.mapreduce.job.waitforcompletion(作业。java:1303)在com.roblox.games.retention.w1从新玩家返回上一周的计算器作业1。计算w1返回作业1(w1从新玩家返回上一周的计算器作业1)。java:68)在com.roblox.games.retention.w1 returns from newplayers the previousweekcalculatordriver.calculatew1 return(w1 returns from newplayers the previousweekcalculatordriver。java:74)在com.roblox.games.retention.w1returnfrom newplayers the previousweekcalculatordrivertest.testcase(w1returnfrom newplayers the previousweekcalculatordrivertest。java:89)在sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在junit.framework.testcase.runtest(testcase。java:154)在junit.framework.testcase.runbare(testcase。java:127)在junit.framework.testresult$1.protect(testresult。java:106)在junit.framework.testresult.runprotected(testresult。java:124)在junit.framework.testresult.run(testresult。java:109)在junit.framework.testcase.run(testcase。java:118)位于junit.framework.testsuite.runtest(testsuite)。java:208)在junit.framework.testsuite.run(testsuite。java:203)在org.eclipse.jdt.internal.junit.runner.junit3.junit3testreference.run(junit3testreference)。java:131)在org.eclipse.jdt.internal.junit.runner.testexecution.run(testexecution。java:38)位于org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner)。java:459)在org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner)。java:675)位于org.eclipse.jdt.internal.junit.runner.remotetestrunner.run(remotetestrunner)。java:382)在org.eclipse.jdt.internal.junit.runner.remotetestrunner.main(remotetestrunner。java:192)
有人能指出我做错了什么吗?重申一下,我运行这些测试的主机上没有任何hadoop安装或二进制文件。

zzzyeukh

zzzyeukh1#

我在Hadoop2.7.1中遇到了同样的问题,并通过添加一个为独立模式提供协议实现的依赖项来修复它,类的名称是org.apache.hadoop.mapred.localclientprotocolprovider

<dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-common</artifactId>
        <version>2.7.1</version>
        <scope>test</scope>
</dependency>

您不需要设置“mapred.job.tracker”或“fs.default.name”,因为独立运行程序是从类路径自动加载的。

相关问题