首先,这里的报错的hive版本是0.13,版本确实有点旧,大家见怪不怪。
这里说下几个在0.13版本下遇到的报错!
最开始要搭建hive必须先修改hive默认的参数,就是添加hive-site.xml
并且在里面声明数据库的选择,其实就jdbc的四要素:
<--!132-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop.beifeng.com:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<--!138-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<--!162-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<--!168-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
并且要拷贝jdbc驱动包到hive安装目录下的lib目录下
$ cp /opt/software/mysql-connector-java-5.1.34-bin.jar /opt/modules/apache-hive-0.13.1-bin/lib/
接下来就是该版本下是几个常见的报错:
报错一:当你开开心心的修改完配置,但是hive启动时却不加载自己修改的hive-site.xml等配置文件的问题。它总是加载默认的配置文件,很烦。。。。
这时候可能会有人问,怎么看出来的,有什么区别吗?
解释:如果你是用默认的配置文件,hive会连接自带的derby数据库,会在hive的根目录下生成derby.log这个日志文件,并且当启动两个bin/hive的时候,就会报错(如果是mysql就不会)
原因:
大概原因是因为hive依赖hadoop,但是hadoop的环境变量却没有读到hive-site.xml
所以解决方法如下:
hadoop的配置文件中(其实就是hadoop的根目录下的etc/hadoop里面的那些配置文件里)
找到export HADOOP_CLASSPATH这行,修改值为
export HADOOP_CLASSPATH=$HIVE_HOME/conf:$HADOOP_CLASSPATH
注意:这里的$HIVE_HOME不是你直接复制上去就可以了,你要自己改成自己hive的路径,
或者:(以下方法选一种就可以,两种同时用也行,但是别写错了。。。)
1、在/etc/profile这个文件里面加上这个变量,跟配置JAVA_HOME,HADOOP_HOME是一样的
2、直接在这个文件里面你声明JAVA_HOME的地方,也声明个HIVE_HOME,这样你就可以使用这个变量了
再注意下:这里其实有可能会埋下伏笔,在搭建hbase的数据迁移的一个环境的时候。。。出现了另一个问题,其实原因是因为环境变量$HADOOP_CLASSPATH应该是叠加(本文用的是叠加的方式),但是在另一篇文章当中,我一开始用的是覆盖。所以hbase是没问题了,反而hive报了错,文章链接(错误我有改正):
修改完之后重启下hadoop的进程
执行bin/hive 检查mysql里是否有新建的数据库,或者检查是否可以创建多个bin/hive的连接(因为derby只能一个连接)
接下来的这几个报错,其实差不多可以归纳为这个版本的BUG,提供修改方式,就不再具体阐述,因为如果用新版本就有很大几率不会遇见这些问题。
报错:Error: Invalid URL: jdbc:hive2://bigdata-03:10000 (state=08S01,code=0)
解决:
<property>
<name>hive.server2.thrift.bind.host</name>
<value>bigdata-03</value> //把这里改成你启动的server2的主机名
<description>Bind host on which to run the HiveServer2 Thrift interface.
Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST</description>
</property>
报错:Error: For input string: "5000L" (state=,code=0)
找到如下行,修改下value
解决:
<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000</value>
<description>Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling</description>
</property>
报错:Error: Error while compiling statement: FAILED: RuntimeException Cannot make directory: hdfs://bigdata-03:8020/tmp/hive-beifeng/hive_2017-07-26_16-55-43_257_4456975382084132472-3 (state=42000,code=40000)
请使用你hadoop上的用户来操作beeline,不要搞一些骚操作!!
警告:
在hiveserver2的窗口里面会有
WARN conf.HiveConf: DEPRECATED: hive.metastore.ds.retry.* no longer has any effect. Use hive.hmshandler.retry.* instead
这个是说关于hive.metastore.ds.retry.*这些配置已经不起作用,使用hive.hmshandler.retry.*来配置,这也是版本迭代更新的问题,不过警告在测试环境中,一般来说是没什么太大关系的,但是真实开发还是要好好关注下是什么情况。
<property>
<name>hive.metastore.ds.retry.attempts</name>
<value>1</value>
<description>The number of times to retry a metastore call if there were a connection error,当出现数据连接错误后,尝试连接后台数据存储的最大次数。 </description>
</property>
<property>
<name>hive.metastore.ds.retry.interval</name>
<value>1000</value>
<description>The number of milliseconds between metastore retry attempts,每次尝试连接后台数据存储的时间间隔,以毫秒为单位。 </description>
</property>
接下来是用开发工具,比如myeclipse等工具,去远程连接hiveserver2的时候报的错误:
在写hiveserver2的jdbc连接的时候报错:Exception in thread "main" java.sql.SQLException: Invalid URL: jdbc:hive2://bigdata-03:10000/hadoop
原因:使用的是hiveserver2这个服务,所以导包的时候驱动是org.apache.hive.jdbc.HiveDriver,不要写成org.apache.hadoop.hive.jdbc.HiveDriver,这个应该是hiveserver1版本的,如果你想写个代码测试下,提供官网:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBCClientSampleCode
报错:Exception in thread "main" java.sql.SQLException: Could not open connection to jdbc:hive2://bigdata-03:10000/hadoop: .ConnectException: Connection refused: connect
这个错就是连接拒绝,原因就是hiveserver2没启动。。。。
解决:那你就启动下嘛,$HIVE_HOME/bin/hiveserver2
关于这个hiveserver2怎么配置,官网也有说(你可以百度中文的博客):https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-RunningHiveServer2andBeeline
好,就整理到这里,如果有什么遗漏的,或者说的不对的,请各路大神指出!!虚心讨教~