问题描述:
hadoop版本:hadoop-2.5.0
jdk:jdk1.8.0_51
在用hdfs.h中的C接口连接hadoop集群时出现以下问题:
loadFileSystems error:
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
hdfsBuilderConnect(forceNewInstance=0, nn=node01, port=8020, kerbTicketCachePath=(NULL), userName=(NULL)) error:
解决方法:
在参考了https://issues.apache.org/jira/browse/HDFS-4552中的回答后茅塞顿开,终于明白问题所在。
该回答的主要意思是说hadoop2以上版本都是采用通配符的形式用hadoop classpath启动的,而1.x的版本是采用全路径,但是呢java没有没有扩展这种通配符的支持,下面又说了hadoop2.6.0及以上版本是支持通配符的,因此这个问题是这样产生的:hadoop2.0以上到2.6.0的版本因为hadoop classpath的通配符不被java支持因此导致启动时hadoop classpath无效。2.6.0及以上版本就不存在这个问题。
什么是hadoop classpath?
在装有haddoop集群的机器上执行:
那些用*号表示的就是通配符形式的路径。
怎么解决呢?
参考https://stackoverflow.com/questions/21064140/hadoop-c-hdfs-test-running-exception和https://blog.csdn.net/Aquester/article/details/25242215,解决方法是,
在启动之前,将hadoop安装目录下的所有jar放到CLASSPATH环境变量里:
export CLASSPATH=${HADOOP_HOME}/etc/hadoop:`find ${HADOOP_HOME}/ | awk '{path=path":"$0}END{print path}'`
export LD_LIBRARY_PATH="${HADOOP_HOME}/lib/native":$LD_LIBRARY_PATH