我已经完成了一项简单的hadoop工作。现在我想在不创建jar文件的情况下运行它,而不是在网上找到很多教程。
我从ubuntu平台上的shell脚本调用它,它运行hadoop(2.0.0 + 91)的cloudera CHD4发行版。
我无法创建作业的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 以及所有必需的库和配置文件都可以在 $ CLASSPATH 和 $ HADOOP_CLASSPATH 环境中找到我在调用hadoop作业之前设置的varibales
为什么在运行脚本时我的程序无法找到该类。 我不能像普通的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包含我的工作代码x.y.z.MyJob类。 我的所有配置文件都不在CONFIG_DIR
当我打印我的CLASSPATH和HADOOP_CLASSPATH时,它会显示正确的值。但是,每当我在执行作业之前调用hadoop classpath时,它会向我显示以下输出。
$ 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 varibales。这些环境变量在哪里?
答案 0 :(得分:1)
在我的shell脚本中,我使用Cloudera的hdfs用户运行hadoop jar命令
sudo -u hdfs hadoop jar x.y.z.MyJob /input /output
这个代码实际上是从脚本中调用的,常规的ubuntu用户正在设置如上所述的CLASSPATH和HADOOP_CLASSPATH变量。并且在执行时,没有使用相同的常规ubuntu用户调用hadoop jar命令。因此,有一个例外表明找不到该课程。
因此,您必须使用实际设置CLASSPATH和HADOOP_CLASSPATH环境变量的同一用户运行该作业。
谢谢大家的时间。