0

我是 Hadoop 新手。我正在使用 Hadoop 0.22。在驱动程序中,我使用了以下代码:

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

在 Map 类中,我必须使用什么代码将 jar 添加到本地类路径中?

更多细节

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

4

1 回答 1

0

你不需要做任何事情。

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

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

只要您的映射器和缩减器从映射器和缩减器基类扩展,那么它就会“正常工作”。

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

另一种方法(我们这样做)是创建一个包含您的源代码和依赖项的单个 jar。

像往常一样构建您的代码 jar,然后在 jar 中创建一个名为“lib”的子目录,并在此处添加所有依赖项 jar。然后你的整个工作是独立的,你不需要担心将其他 jars 添加到分布式缓存中。

因此,例如,您将有一个包含以下内容的 jar:

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

(jar 只是一个 zip 文件,因此您可以使用常规的 zip 创建实用程序来构建它)

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

于 2012-04-15T17:02:26.337 回答