在没有创建jar文件的情况下运行hadoop作业

时间:2012-08-10 12:23:13

标签: jar hadoop classpath

我已经完成了一项简单的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。这些环境变量在哪里?

1 个答案:

答案 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环境变量的同一用户运行该作业。

谢谢大家的时间。