这几天在折腾Hive的相关东西,所以打算在自己的机器上安装下Hive,可是按照教程总是出这样那样的错误,着实蛋疼,最终发现错误是我的Mysql端口是3307,WTF。。这个问题已经坑了我几次了。在此把查看Mysql开启端口的命令放这,以后别被坑到了。SHOW GLOBAL VARIABLES LIKE 'PORT';
下面为完整安装Hive的全过程
安装MySQL服务器端和MySQL客户端,并启动MySQL服务
这个就不用说了,Mac下下载Mysql的DMG安装包安装即可
为Hive建立相应的MySQL账户,并赋予足够的权限
hadoop@ubuntu:~$ mysql -uroot -pmysql
mysql> CREATE USER 'hive' IDENTIFIED BY 'mysql';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION;
mysql> flush privileges;
建立 Hive 专用的元数据库,记得创建时用刚才创建的“hive”账号登陆
$ mysql -uhive -pmysql
mysql> create database hive;
把MySQL的JDBC驱动包复制到Hive的lib目录下
JDBC驱动包的版本:mysql-connector-java-5.1.26-bin.jar
安装Hadoop
这个我之前有博文专门介绍了,坑也挺多,注意安装
安装Hive
- 在Hive的官网下载Hive1.2.1的压缩包
- 解压缩到
/usr/local/Cellar/hive
文件夹中 - 修改配置文件
sudo vi /etc/profile
添加
HIVE_HOME=/usr/local/Cellar/hive
PATH=$PATH:$HIVE_HOME/bin
export PATH
- 切换到conf目录下
cd /usr/local/Cellar/hive/conf
- 修改Hive的xml配置 把几个带.template后缀的模板文件,复制一份变成不带.template的配置文件,注意hive-default.xml.template这个要复制二份,一个是hive-default.xml,另一个是hive-site.xml,其中hive-site.xml为用户自定义配置,hive-default.xml为全局配置,hive启动时,-site.xml自定义配置会覆盖-default.xml全局配置的相同配置项。
cp hive-default.xml.template hive-default.xml
cp hive-default.xml.template hive-site.xml
cp hive-exec-log4j.properties.template hive-exec-log4j.properties
cp hive-log4j.properties.template hive-log4j.properties
cp beeline-log4j.properties.template beeline-log4j.properties
- 修改hive-site.xml 下面的配置文件中,有一些关于目录的参数,先提前把目录建好,
hive.exec.local.scratchdir
hive.downloaded.resources.dir
这二项对应的目录,是指本地目录(必须先手动建好),其它目录为hdfs中的目录(hive启动时,先自动建好,如果自动创建失败,也可以手动通过shell在hdfs中创建)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!--
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:postgresql://localhost:5432/hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.postgresql.Driver</value>
</property>
-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1:3307/hive?characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mysql</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/Cellar/hive/tmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/Cellar/hive/tmp/${hive.session.id}_resources</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
替换hadoop 2.6.0中的jline jar包
由于hive 1.2.0自带的jline包跟hadoop 2.6.0自带的版本不一致,因此需要将$HIVE_HOME/lib/jline-2.12.jar 这个文件替换掉$HADOOP_HOME/share/hadoop/yarn/lib 下原来的版本 (即:将旧版本删除,复制新版本到此目录),否则hive启动将失败.即将hive中的jar包复制到hadoop的对应目录下,重新启动Hadoop
测试验证,输入hive查看是否运行正常
$HIVE_HOME/bin/hive
如果能正常进入 hive> 即表示正常
- 创建表测试 hive>create table test(id int);
- 将hdfs中的文件内容加载到表中
hive> load data inpath '/user/Gao/input/duplicate.txt' into table 测试;
- 测试求平均值
hive> select avg(id) from 测试;
Query ID = jimmy_20150607191924_ccfb231f-6c92-47ac-88f1-eb32882a0010
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Job running in-process (local Hadoop)
2015-06-07 19:19:27,980 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local1537497991_0001
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 190 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
3.909090909090909
Time taken: 3.322 seconds, Fetched: 1 row(s)
从输出的信息看,hive底层仍然是将SQL语句翻译成mapreduce作业,提交给hadoop的MR引擎。从使用层面看,采用SQL语句方式来分析数据,确实比MapReduce或PIG方式方便太多了