该代码是libhdfs测试代码。
int main(int argc, char**argv)
{
hdfsFS fs = hdfsConnect("hdfs://labossrv14", 9000);
const char* writePath = "/libhdfs_test.txt";
hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0);
if(!writeFile)
{
fprintf(stderr, "Failed to open %s for writing!\n", writePath);
exit(-1);
}
char* buffer = "Hello, libhdfs!";
tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);
if (hdfsFlush(fs, writeFile))
{
fprintf(stderr, "Failed to 'flush' %s\n", writePath);
exit(-1);
}
hdfsCloseFile(fs, writeFile);
}
我花了很多努力才成功地编译了这段代码,但是当我运行程序时它就不起作用了。错误信息如下。
loadFileSystems error:
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
hdfsBuilderConnect(forceNewInstance=0, nn=labossrv14, port=9000, kerbTicketCachePath=(NULL), userName=(NULL)) error:
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
hdfsOpenFile(/libhdfs_test.txt): constructNewObjectOfPath error:
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
Failed to open /libhdfs_test.txt for writing!
我根据官方文件玩这些东西。我发现问题可能是类路径不正确。下面是我的类路径,它由“hadoop classpath--glob”生成的类路径和jdk和jre的lib路径组合而成。
export CLASSPATH=/home/junzhao/hadoop/hadoop-2.5.2/etc/hadoop:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/common/lib/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/common/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/hdfs:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/hdfs/lib/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/hdfs/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/yarn/lib/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/yarn/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/mapreduce/lib/*:/home/junzhao/hadoop/hadoop-2.5.2/share/hadoop/mapreduce/*:/contrib/capacity-scheduler/*.jar:/usr/lib/jvm/java-8-oracle/lib:/usr/lib/jvm/java-8-oracle/jre/lib:$CLASSPATH
有人有什么好办法吗?谢谢!
1条答案
按热度按时间arknldoa1#
我再次阅读了教程中的一些信息和之前提出的一些问题。最后我发现这个问题是由于jni没有扩展类路径中的通配符造成的。所以我把所有的jar放到类路径中,问题就解决了。因为这个命令“hadoop classpath--glob”也会生成通配符,所以它解释了为什么官方文档会这样说
使用通配符语法指定多个jar是无效的。运行hadoop classpath--glob或hadoop classpath--jar为您的部署生成正确的类路径可能很有用。
我昨天误解了这一段。
另请参阅hadoopc++hdfs测试运行异常,是否可以让jni执行类路径中的通配符扩展?