声明!本篇博客记录博主遇到的所有Hive相关的错误!
希望这篇博客能够帮助到你,如果你也有遇到Hive相关的错误,但苦于无法解决,可以私信博主,博主很乐意解决bug,但是不一定能解决!!!
(图片来源于网络,侵删)
错误【1】
WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapred/MRVersion
at org.apache.hadoop.hive.shims.Hadoop23Shims.isMR2(Hadoop23Shims.java:942)
at org.apache.hadoop.hive.shims.Hadoop23Shims.getHadoopConfNames(Hadoop23Shims.java:1013)
at org.apache.hadoop.hive.conf.HiveConf$ConfVars.<clinit>(HiveConf.java:370)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:64)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:650)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:634)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapred.MRVersion
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 12 more
我们可以看到异常说是找不到一个类,但是我想了想,我以前搭建hive时候没有出现这个错误呀!
我思来想去,然后查阅了一些资料,终于让我知道了原因!!!
这里要感谢一个老哥的博客,他提醒了我,因为我的hadoop使用的·是Apache的,但是我的hive使用的是CDH的,所以不兼容
此时有两种解决方法:
方式一:
下载与HIve的CDH版本对应的hadoop-core
的jar包
例如我的Hive是 cdh5.14.0
,hadoop是2.6.5
,就下载hadoop-core-2.6.0-mr1-cdh5.14.0.jar
,下载如下,自行修改👇
https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hadoop/hadoop-core/2.6.0-mr1-cdh5.14.0/hadoop-core-2.6.0-mr1-cdh5.14.0.jar
然后将下载完成的jar包放到hive根目录的lib下
此时再去启动即可!!!
注意:如果启动的时候报错如下👇
应该就是hadoop的jline
jar包版本太低了,拷贝hive的lib目录下的jline
到$HADOOP_HOME/share/hadoop/yarn/lib
目录下即可!!!
方式二:
将ApacheHadoop
换成cdhHadoop
即可完美解决! QAQ
错误【2】
在使用 beeline + !connect jdbc:hive2://node01:10000
连接上hive之后,我在创建hive数据库的时候出现了如下错误👇
原因就是因为我一直用的都是 zsy
这个用户在操作,所以HDFS上的权限是zsy
而我粗心大意,使用!connect jdbc:hive2://node01:10000
连接的时候,却用的是root
用户登录,所以就导致权限不足!
这里肯定有小伙伴很疑惑,root不是超级管理员用户嘛?怎么还没权限了?
其实,root用户对于Linux系统确实是超级管理员用户,但对于HDFS文件系统来说,所有用户都一样,它只认名字不认人,HDFS文件上的文件你要是有权限,就可以操作,没有权限,就不行!这就是HDFS的机制,你告诉HDFS你是谁,你就是谁!
所以这个问题只需要重新连接Hive,更换用户即可!
错误【3】
启动hive时,报了如下错误:
/spark//lib/spark-assembly-*.jar: No such file or directory
查阅了资料后发现问题原因如下:
新版本的spark,hive没有及时支持更新
问题解决方式如下:
// 修改hive的启动脚本
vim bin/hive +116
// 定位到位置,上面一行是原有的,下一行是修改的
#sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`
sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`
错误【4】
使用beeline连接HiveServer2时出现了如下错误👇
Error: Could not open client transport with JDBC Uri: jdbc:hive2://node01:10000: Failed to open new session:
java.lang.RuntimeException:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.
security.authorize.AuthorizationException): User: zsy is not allowed to
impersonate root (state=08S01,code=0)
问题解决方式如下:
<property>
<name>hadoop.proxyuser.zsy.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.zsy.hosts</name>
<value>*</value>
</property>
这里是zsy用户,其他用户自行调整,即执行beeline的用户名,修改完成后重启hdfs和yarn
错误【5】
使用beeline连接HiveServer2时出现了如下错误👇
ERROR [main]: DataNucleus.Datastore (Log4JLogger.java:error(115)) - An exception wa
s thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 76
7 bytes
问题解决方式如下:
alter database Hive元数据库名称 character set latin1;
错误【6】
在使用两表关联查询时,其中一个表是分区表,查询报错如下,相信你们很熟悉!
ERROR Error while compiling statement: FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "factvirtualcouponcard_consume" Table "factvirtualcouponcard_consume"
查询的SQL格式模板如下:select 字段 from 非分区表 left join 分区表 on 关联条件 where 限制分区表字段
结果上述SQL给我报错了,我当时就懵逼了,我不是限定分区了吗?咋会报这个错呢?在我询问大佬之后,我把 where 后面的限制分区条件放到了 on 后面,然后就行了,当时我…