Hadoop分布式缓存不起作用

时间:2012-04-13 18:16:28

标签: hadoop mapreduce distributed-cache

我是Hadoop的新手。我正在使用Hadoop 0.22。 在驱动程序中我使用了这段代码:

    Job job = Job.getInstance(configuration);
    ...
    job.addArchiveToClassPath(new Path(JAR_DIR);
    ...

在Map类中,我必须使用哪些代码在本地类路径中添加jar?

更多详情

我在地图中需要一个工作并减少阶段htmlunit.jar。我使用上面的代码将此jar添加到classpath,但是当我提交作业时,我在使用htmlunit references的行中有一个ClassNotFoundException。如果上面的代码没问题,而且DistributedCache会自动在tasktrackers类路径中添加jar,可能是什么问题? 我提交作业时还必须使用-libjars htmlunit.jar选项吗?我必须使用另一个hadoop组件吗?

1 个答案:

答案 0 :(得分:0)

您无需做任何事情。

将jar添加到作业类路径后,您所说的是

  

“将其包含在地图的类路径中并减少作业”

只要你的映射器和Reducer从Mapper和Reducer基类扩展,它就会“正常工作”。

值得注意的是,你可能应该为你需要的每个Jar使用addFileToClassPath。

另一种选择(我们这样做)是创建一个包含源和依赖项的jar。

像往常一样构建代码jar,然后在名为'lib'的jar中创建一个子目录,并在此处添加所有依赖项jar。然后,您的整个作业都是自包含的,您无需担心将其他jar添加到分布式缓存中。

例如,你有一个包含以下内容的jar:

/com/example/Something.class
/com/example/SomethingElse.class
/lib/dependency.jar
/lib/dependency2.jar

(jar只是一个zip文件,所以你可以使用常规的zip创建工具来构建它)

由于各种原因,这也比将依赖项的.class文件直接添加到jar中更好。