我写了一个简单的hadoop工作。现在我想在不创建 jar 文件的情况下运行它,而不是在网上找到很多教程。
我从运行 hadoop(2.0.0+91) 的 cloudera CHD4 发行版的 ubuntu 平台上的 shell 脚本调用它。
我无法创建作业的 jar 文件,因为它依赖于其他几个第三方 jar 和配置文件,这些文件已经集中部署在我的机器上,并且在创建 jar 时无法访问。因此,我正在寻找一种可以包含这些自定义 jar 文件和配置文件的方法。
我也不能使用 -libjars 和 DistributedCache 选项,因为它们只影响 map/reduce 阶段,但我的驱动程序类也在使用这些 jar 和配置文件。我的工作使用了几个内部实用程序代码,这些代码在内部使用这些第三方库和配置文件,我只能从集中部署的位置读取这些文件。
这是我从 shell 脚本中调用它的方式。
sudo -u hdfs hadoop x.y.z.MyJob /input /output
它向我展示了一个
Caused by: java.lang.ClassNotFoundException: x.y.z.MyJob
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
我的调用 shell 脚本成功地设置了 hadoop 类路径,并从一个集中部署的位置包含了我所需的所有第三方库和配置文件。
我确信我的类xyzMyJob以及所有必需的库和配置文件都在我在调用 hadoop 作业之前设置的$CLASSPATH和$HADOOP_CLASSPATH环境变量中找到
为什么在运行脚本时我的程序找不到类。我不能将作业作为普通的 java 类运行吗?我所有其他普通的 java 程序都使用相同的类路径,他们总是可以毫无问题地找到类和配置文件。
请让我知道如何访问集中部署的 haddop 作业代码并执行它。
编辑:这是我设置类路径的代码
CLASSES_DIR=$BASE_DIR/classes/current
BIN_DIR=$BASE_DIR/bin/current
LIB_DIR=$BASE_DIR/lib/current
CONFIG_DIR=$BASE_DIR/config/current
DATA_DIR=$BASE_DIR/data/current
CLASSPATH=./
CLASSPATH=$CLASSPATH:$CLASSES_DIR
CLASSPATH=$CLASSPATH:$BIN_DIR
CLASSPATH=$CLASSPATH:$CONFIG_DIR
CLASSPATH=$CLASSPATH:$DATA_DIR
LIBPATH=`$BIN_DIR/lib.sh $LIB_DIR`
CLASSPATH=$CLASSPATH:$LIBPATH
export HADOOP_CLASSPATH=$CLASSPATH
lib.sh 是将所有第三方文件连接为 : 分隔格式的文件,CLASSES_DIR 包含我的工作代码 xyzMyJob 类。我所有的配置文件都在 CONFIG_DIR 下
当我打印我的 CLASSPATH 和 HADOOP_CLASSPATH 时,它会显示正确的值。但是,每当我在执行作业之前调用 hadoop 类路径时,它都会显示以下输出。
$ hadoop classpath
/etc/hadoop/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:myname:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-0.20-mapreduce/./:/usr/lib/hadoop-0.20-mapreduce/lib/*:/usr/lib/hadoop-0.20-mapreduce/.//*
$
它显然没有附加任何以前设置的 $CLASSPATH 和 $HADOOP_CLASSPATH 变量。这些环境变量在哪里。