如何在作业提交之前将jar分发给hadoop

时间:2015-04-24 12:58:42

标签: java hadoop mapreduce yarn

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

1 个答案:

答案 0 :(得分:1)

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

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中找到更多详细信息: