1

我写了一个简单的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 变量。这些环境变量在哪里。

4

1 回答 1

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

谢谢大家的时间。

于 2012-08-11T10:24:49.897 回答