gpt4 book ai didi

Hadoop:外部 jar 文件夹引用

转载 作者:可可西里 更新时间:2023-11-01 15:17:56 25 4
gpt4 key购买 nike

我已经编写了一个简单的 MapReduce 代码,它将调用外部 jar 中的几个方法。我在 hadoop/lib 文件夹中添加了这个 jar,它正在被拾取。单节点集群一切正常。我有一个多节点集群,我想在其中运行相同的代码。我想知道是否有一种方法可以将我的 jars 复制到 dfs,这样我就不需要在所有节点上手动添加 jars。我想将所有 jar 添加到另一个文件夹(不是 hadoop/lib)中。有可能实现这一目标吗?即向包含许多 jar 的文件夹添加外部引用。我按照 cloudera 博客做了同样的事情,但仍然没有帮助。关于此的任何指示都会非常有帮助。我使用的是 hadoop 1.0.4 版本。

P.S:我已经在主作业 jar 中添加了所有外部 jar。即便如此,它也没有被拾起。

最佳答案

有两种机制可以将其他 jar 包含到作业的类路径中:

如果您还没有将它们存储在 HDFS 中,您可以使用 GenericOptionsParser 的 -libjars 参数。这将导致 JobClient 将 jars 上传到您作业的 HDFS 中的临时目录,并将它们包含在作业的分布式缓存中。为此,您需要通过 ToolRunner.run 界面运行您的作业:

public class MyJob extends COnfigured implements Tool {
public int run(String args[]) {
Job job = new Job(getConf());
// configure your job
// ..

return job.waitForCompletion() ? 0 : 1;
}

public static void main(String args[]) throws Exception {
ToolRunner.run(new MyJob(), args));
}
}

然后您将按如下方式运行作业(将 jars 1-3 添加到作业类路径):

#> hadoop jar myjob.jar MyJob -libjars jar1.jar,jar2.jar,jar3.jar [other args]

如果您的 Jar 已经在 HDFS 中,那么您只需将 jar 添加到分布式缓存中:

public int run(String args[]) {
Job job = new Job(getConf());
// configure your job
// ..

// acquire job configuration
Configuration conf = job.getConf();

// create a FileSystem
FileSystem fs = FileSystem.get(fs);

DistributedCache.addFileToClassPath(new Path("/myapp/jar1.jar"), conf, fs);
DistributedCache.addFileToClassPath(new Path("/myapp/jar2.jar"), conf, fs);
DistributedCache.addFileToClassPath(new Path("/myapp/jar3.jar"), conf, fs);

return job.waitForCompletion() ? 0 : 1;
}

第二种方法的唯一缺点是您不能在作业配置中引用这些 jar 中的任何类(除非您也有客户端副本,并且您配置了 HADOOP_CLASSPATH env 变量)。

关于Hadoop:外部 jar 文件夹引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com