【问题标题】:Hadoop: External jar folder referenceHadoop:外部 jar 文件夹参考
【发布时间】:2013-03-02 20:39:50
【问题描述】:

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

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

【问题讨论】:

    标签: hadoop


    【解决方案1】:

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

    如果您尚未将它们存储在 HDFS 中,则可以使用 GenericOptionsParser 的 -libjars 参数。这将导致 JobClient 为您的作业将 jar 上传到 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]
    

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

    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 变量)。

    【讨论】:

    • 谢谢你,克里斯。如果可行,我会尝试并更新。对于第一种方法,是否可以将所有 jar 添加到一个文件夹中。类似 /tmp/jars/*.我一直在问,我有超过 15-20 个依赖的罐子。而且,我在几个博客中读到,如果我们在主 jar 中有 lib 文件夹,那么 lib 文件夹中的 jar 将自动添加到类路径中。但这对我不起作用。你知道吗?
    • 我也有同样的问题。我正在使用 hadoop-2.5.2。我使用了这种机制(添加了 -libjars 参数),但它不起作用。我还尝试将依赖 jar 添加到我的 MapReduce jar 的 lib 目录中。那也没用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多