使用JNI获取hadoop 2.6版本显示Unknown
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用JNI获取hadoop 2.6版本显示Unknown,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1591字,纯文字阅读大概需要3分钟。
内容图文
![使用JNI获取hadoop 2.6版本显示Unknown](/upload/InfoBanner/zyjiaocheng/1058/caa0693469684a28b59f26d41853d6ce.jpg)
问题:
c++通过JNI调用hive-jdbc连接hive-server,当hadoop版本为2.6时,总是报错
Illegal Hadoop Version: Unknown (expected A.B.* format)
原因:
hadoop 2.6 获取版本源码如下(hadoop 3.x 版本修改了此代码,所以不会遇到此问题):
protected VersionInfo(String component) { info = new Properties(); String versionInfoFile = component + "-version-info.properties"; InputStream is = null; try { is = Thread.currentThread().getContextClassLoader() .getResourceAsStream(versionInfoFile); if (is == null) { throw new IOException("Resource not found"); } info.load(is); } catch (IOException ex) { LogFactory.getLog(getClass()).warn("Could not read ‘" + versionInfoFile + "‘, " + ex.toString(), ex); } finally { IOUtils.closeStream(is); } }
调用了函数 getContextClassLoader 获取classloader来加载hadoop版本信息文件,这个函数默认获取到的是system class loader,但是在JNI中使用了函数AttachCurrentThread,函数getContextClassLoader 获取到的将是 bootstrap class loader,加载文件错误,所以会抛出获取hadoop版本异常
Java Native Interface Specification: 5 - The Invocation API (oracle.com)
AttachCurrentThread
jint AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args);
Attaches the current thread to a Java VM. Returns a JNI interface pointer in the
JNIEnv
argument.Trying to attach a thread that is already attached is a no-op.
A native thread cannot be attached simultaneously to two Java VMs.
When a thread is attached to the VM, the context class loader is the bootstrap loader.
解决方法:
连接hive之前先调用函数 setContextClassLoader 重新设置 context loader
java.lang.Thread.currentThread().setContextClassLoader( java.lang.ClassLoader.getSystemClassLoader() );
原文:https://www.cnblogs.com/kouruyi/p/14871276.html
内容总结
以上是互联网集市为您收集整理的使用JNI获取hadoop 2.6版本显示Unknown全部内容,希望文章能够帮你解决使用JNI获取hadoop 2.6版本显示Unknown所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。