这个问题并不是指在整个集群中分发罐子以供工人使用它们。
它指的是在客户端计算机上指定许多其他库。更具体一点:我正在尝试运行以下命令以检索SequenceFile的内容:
/path/to/hadoop/script fs -text /path/in/HDFS/to/my/file
它抛出了这个错误:text: java.io.IOException: WritableName can't load class: util.io.DoubleArrayWritable
我有一个名为DoubleArrayWritable的可写类。事实上,在另一台计算机上一切运行良好。
我尝试设置HADOOP_CLASSPATH
以包含包含该类但没有结果的jar。实际上,在运行时:
/path/to/hadoop/script classpath
结果不包含我添加到HADOOP_CLASSPATH的jar。
问题是:在运行hadoop时如何指定额外的库(通过额外的意思是其他库而不是hadoop脚本在类路径中自动包含的库)
可能会有所帮助的更多信息:
export HADOOP_CLASSPATH=$HADOOP_HOME/lib
这可能解释了我的HADOOP_CLASSPATH env var被忽略的原因。答案 0 :(得分:15)
如果您被允许设置HADOOP_CLASSPATH
,那么
export HADOOP_CLASSPATH=/path/to/jar/myjar.jar:$HADOOP_CLASSPATH; \
hadoop fs -text /path/in/HDFS/to/my/file
将完成这项工作。因为在您的情况下,此变量在hadoop-env.sh
中被重写,因此请考虑使用-libjars
选项:
hadoop fs -libjars /path/to/jar/myjar.jar -text /path/in/HDFS/to/my/file
或者手动调用FsShell
:
java -cp $HADOOP_HOME/lib/*:/path/to/jar/myjar.jar:$CLASSPATH \
org.apache.hadoop.fs.FsShell -conf $HADOOP_HOME/conf/core-site.xml \
-text /path/in/HDFS/to/my/file
答案 1 :(得分:0)
尝试在默认的CLASSPATH变量中添加jar文件,并将HADOOP_CLASSPATH附加到它。 然后执行你的命令。
export CLASSPATH=/your/jar/file/myjar.jar:$CLASSPATH:$HADOOP_CLASSPATH
/path/to/hadoop/script fs -text /path/in/HDFS/to/my/file
答案 2 :(得分:0)
如果有人要检查hadoop类路径,请在终端中输入hadoop classpath
。
要编译它,请使用以下命令:javac -cp $(hadoop classpath):path/to/jars/* java_file.java