Job提交前如何分发jar到hadoop

How to distribute jar to hadoop before Job submission

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

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

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:

中找到更多详细信息