我是Hadoop的新手。我正在使用Hadoop 0.22。在驱动程序中,我使用了以下代码:
Job job = Job.getInstance(configuration);
...
job.addArchiveToClassPath(new Path(JAR_DIR);
...
在 Map 类中,我必须使用什么代码在本地类路径中添加 jar?
更多详情
我有一个需要在映射中并减少阶段 htmlunit.jar.我用上面的代码将此 jar 添加到类路径中,但是当我提交作业时,我有一个 ClassNotFoundException 在我使用 htmlunit 引用的行。如果上面的代码没问题,并且分布式缓存会自动在任务跟踪器类路径中添加 jar,那么可能有什么问题?当我提交作业时.jar我还必须使用选项 -libjars htmlunit?我必须使用另一个 hadoop 组件?
你不需要做任何事情。
将 jar 添加到作业类路径后,您所说的是
只要您的映射器和化简器"将其包含在地图的类路径中并减少作业"
从映射器和化简器基类扩展而来,那么它就会"正常工作"。
值得注意的是,您可能应该对您需要的每个单独的 Jar 使用 addFileToClassPath。
另一种选择(我们这样做)是创建一个包含源代码和依赖项的 jar。
像往常一样构建代码 jar,然后在 jar 中创建一个名为 'lib' 的子目录,并在此处添加所有依赖项 jar。然后,您的整个作业都是独立的,您无需担心将其他 jar 添加到分布式缓存中。
例如,您将有一个包含以下内容的罐子:
/com/example/Something.class
/com/example/SomethingElse.class
/lib/dependency.jar
/lib/dependency2.jar
(jar 只是一个 zip 文件,因此您可以使用常规的 zip 创建实用程序来构建它)
由于各种原因,这也比将依赖项的.class文件直接添加到 jar 中性能更好。