当人们无法解释某些事情的时候,就用命运一带而过,而不去管那当中有多少苦痛。——《梦回大清》
1、概述
1.1 什么是Hive
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
1.2 为什么使用Hive
- 直接使用hadoop所面临的问题
人员学习成本太高
项目周期要求太短
MapReduce实现复杂查询逻辑开发难度太大
- 为什么要使用Hive
操作接口采用类SQL语法,提供快速开发的能力。
避免了去写MapReduce,减少开发人员的学习成本。
扩展功能很方便。
1.3 Hive的特点
¬ 可扩展
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
¬ 延展性
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
¬ 容错
良好的容错性,节点出现问题SQL仍可完成执行。
本文主要介绍Hive的安装、配置和在安装过程中遇到的问题。
2、安装与配置
(1)上传hive的tar包
下载地址:http://mirror.bit.edu.cn/apache/hive/
本文为了用hadoop的mapreduce计算框架,所以用了老版本的hive,新版本的计算框架建议使用spark。
(2)解压
tar -zxvf hive-0.9.0.tar.gz -C /cloud/
(3)安装Mysql数据库
安装教程:http://www.linuxidc.com/Linux/2014-12/111019.htm
修改mysql的密码
/usr/bin/mysql_secure_installation
(注意:删除匿名用户,允许用户远程连接)
登陆mysql
mysql -u root -p
(4)配置hive
在hive的conf文件夹下,新建hive-site.xml配置元数据库信息
vi hive-site.xml
并添加以下内容
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
</configuration>
(5)拷贝MySQL连接驱动到hive的lib中
MySQL连接驱动下载地址:http://search.maven.org/
(6)配置MySQL远程权限
如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)
mysql -uroot -p
#(执行下面的语句 .:所有库下的所有表 %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
(6)Jline包版本不一致的问题
Jline包版本不一致的问题,需要拷贝hive的lib目录中jline.2.12.jar的jar包替换掉hadoop中的
/home/hadoop/app/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar
(7)启动
在hive的bin目录下
./hive
启动成功:
(8)查看数据库
hive语句与MySQL语句基本一致,查看数据库测试下:
3、安装过程中的问题
我在安装过程中,执行第7步启动hive时出错如下:
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
at sun.reflect.GeneratedConstructorAccessor36.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4874)
at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:912)
at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:83)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
... 78 more
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2431)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)
... 87 more
找了好久也解决问题,最终的解决方案是:
上述问题是由mysql数据库的配置引起的。mysql将其连接的等待时间(wait_timeout)缺省为8小时。在其客户程序中可以这样来查看其值:
mysql> show global variables like “wait_timeout”;
+—————+———+
| Variable_name | Value |
+—————+———+
| wait_timeout | 1814400 |
+—————+———+
1 row in set (0.00 sec)
如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql就将该连接关闭。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。
解决办法:
1、修改MySQL数据配置文件,Windows文件名是my.ini,路径在MYSQL安装路径下;Linux中文件名是my.cnf 路径在/etc/my.cnf。修改wait_timeout = 1814400;
2、重启MySQL数据库: service mysqld restart
这样就解决了hive的启动问题,可以愉快的写HQL,再也不用纠结于mapreduce的设计了。