【问题标题】:How to distribute jar to hadoop before Job submission作业提交前如何将jar分发到hadoop
【发布时间】:2015-04-24 12:58:41
【问题描述】:

我想实现 REST API 来提交 Hadoop 作业以供执行。这纯粹是通过 Java 代码完成的。如果我编译一个 jar 文件并通过“hadoop -jar”执行它,一切都会按预期工作。但是,当我通过 REST API 中的 Java 代码提交 Hadoop 作业时 - 作业已提交但由于 ClassNotFoundException 而失败。 是否可以以某种方式将 jar 文件(使用我的作业代码)部署到 hadoop(nodemanagers 及其容器),以便 hadoop 能够通过类名定位 jar 文件?我应该将 jar 文件复制到每个节点管理器并在那里设置 HADOOP_CLASSPATH 吗?

【问题讨论】:

  • 您能否简要介绍一下您是如何使用 REST API 调用作业的。您是否尝试在应用程序库或类路径中添加 Hadoop jar
  • 是 MapReduce 作业还是自定义的?您使用的是 mapReduce1 还是 2?

标签: java hadoop mapreduce hadoop-yarn


【解决方案1】:

您可以创建一个方法,将 jar 文件添加到 Hadoop 的分布式缓存中,以便在需要时可供 tasktraker 使用。

private static void addJarToDistributedCache(
    String jarPath, Configuration conf)
throws IOException {


File jarFile = new File(jarPath);

// Declare new HDFS location
Path hdfsJar = new Path(jarFile.getName());

// Mount HDFS
FileSystem hdfs = FileSystem.get(conf);

// Copy (override) jar file to HDFS
hdfs.copyFromLocalFile(false, true,
    new Path(jar), hdfsJar);

// Add jar to distributed classPath
DistributedCache.addFileToClassPath(hdfsJar, conf);
}

然后在您的应用程序中,在提交作业之前调用 addJarToDistributedCache:

public static void main(String[] args) throws Exception {

// Create Hadoop configuration
Configuration conf = new Configuration();

// Add 3rd-party libraries
addJarToDistributedCache("/tmp/hadoop_app/file.jar", conf);


// Create my job
Job job = new Job(conf, "Hadoop-classpath");
.../...
}

你可以在这个blog找到更多细节:

【讨论】:

  • 谢谢!那是我一直在寻找的。所以我将我的 jar 添加到 hdfs,并通过以下方式指定它的工作:job.addFileToClassPath(new Path("hdfs://127.0.0.1:9000/test-1.0-SNAPSHOT.jar"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多