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