这几天在折腾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

  1. 在Hive的官网下载Hive1.2.1的压缩包
  2. 解压缩到/usr/local/Cellar/hive文件夹中
  3. 修改配置文件sudo vi /etc/profile 添加
HIVE_HOME=/usr/local/Cellar/hive
PATH=$PATH:$HIVE_HOME/bin
export PATH
  1. 切换到conf目录下cd /usr/local/Cellar/hive/conf
  2. 修改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
  1. 修改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> 即表示正常

  1. 创建表测试 hive>create table test(id int);
  2. 将hdfs中的文件内容加载到表中 hive> load data inpath '/user/Gao/input/duplicate.txt' into table 测试;
  3. 测试求平均值
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方式方便太多了