本文将Hadoop生态圈中的一个重要组件Hive。内容包括安装,运行测试,使用MySQL存储Hive的matedata, 还包括其他使用Hive的知识,比如数据分区等。本文是本人学习Hive过程中的记录,对于一些“理所当然”的简单的东西就只是一笔带过或者没有记录在这里。阅读本文需要对Hadoop有一定的了解,特别是对HDFS,所以,对HDFS的安装和使用部分写得比较简略。一开始的时候,对于Hive的安装是最简单的方式,只需要能够运行和测试就可以了,随着我们对Hive的了解再慢慢把它运行在分布式集群中-其实这两者没有太多的区别。欢迎留言!

## 安装
Hive依赖于Hadoop中的HDFS,而HDFS运行在JDK上面的,所以,在安装Hive之前,需要安装JDK和Hadoop。

步骤:

1. JDK

安装JDK,配置JAVA_HOME,版本为1.8.0;

2. Hadoop

安装Hadoop(免编译版),版本为2.8.0,配置HADOOP_HOME环境变量。

安装ssh:

$ sudo apt-get install ssh
  $ sudo apt-get install pdsh

解压hadoop安装文件,进行伪分布安装,修改hadoop配置文件
etc/hadoop/core-site.xml:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

etc/hadoop/hdfs-site.xml:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

设置ssh,进行本机内的免密码登录

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
  $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  $ chmod 0600 ~/.ssh/authorized_keys

  $ ssh localhost

格式化dfs文件系统

$ bin/hdfs namenode -format

启动文件系统

$ sbin/start-dfs.sh

Hive是通过系统环境变量的HADOOP_HOME来关联hadoop的,所以,需要配置hadoop的环境变量。

安装参考地址

3. Hive

安装hive(免编译版pache-hive-1.2.2-bin ),版本为1.2.2,同时配置HIVE_HOME环境变量。

解压

$ tar -xzvf hive-x.y.z.tar.gz

在hdfs中建立相应的hive目录,注意,不是本地文件系统。

$ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
  $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

启动hive

$ $HIVE_HOME/bin/hive

安装参考地址

1、如果想先让hive跑起来,可以不用管hive的配置文件。
2、上面的版本最好对应,否则会出现兼容性问题。

环境变量配置

#JDK
export JAVA_HOME=/usr/java/jdk1.8.0_91
export PATH=$JAVA_HOME/bin:$PATH

#hive
export HIVE_HOME=/home/duobeiyun/huai/hive
export PATH=$HIVE_HOME/bin:$PATH

#hadoop
export HADOOP_HOME=/home/duobeiyun/huai/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH

简单测试

启动hive

bin/hive

接下来可以测试一下hive,执行下面命令:

bin/hive

create table x (a int);
drop table x;
exit;

使用MySQL存储元数据

\\\\\\\\\——–\\\\\\\\
使用MySQL数据库代替Derby数据库,从而使得hive能够支持多个人同时使用:
在hive的conf目录下增加配置文件hive-site.xml即可

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
   <!-- 
   该版本的hive没有这个属性了
    <property>
        <name>hive.metastore.local</name>
        <value>true</value>
    </property>
    -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</v
alue>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>mysql</value>
    </property>
</configuration>

配置好之后,启动Hive,创建一个表格,就可以在MySQL数据库中发现hive这个数据库,里面存储了Hive的元数据。

hive 变量和属性的命名空间:

  • hivevar, 可读可写, 用户自定义的变量;
  • hiveconf, 可读可写, hive相关的配置属性;
  • system, 可读可写, java定义的配置属性;
  • env, 只可读, Shell环境定义的环境变量;

使用:使用set命令进行显示或者修改,类似于shell。
例如

hive>set env:HOME

hive> set hivevar:foo=bar2;
hive> create table toss1(i int, ${hivevar:foo} string);

1.、使用hive –help和hive -h查看帮助信息(这两个命令是不一样的)
2、直接使用hive命令执行查询命令,比如hive -S -e "select * from whatsit" > /tmp/myquery
3、一个有用的技巧:如果不能完整记清楚某一个属性的名字的时候,可以使用hive -S -e "set" | grep warehouse查看。

Hive启动时自动执行文件~/.hiverc, 也可以在启动hive的时候通过命令hive -i filename指定。
可以在.hiverc中配置下面内容:

set hive.cli.print.current.db=true;
set hive.exec.mode.local.auto=true;

在hive中,在前面加上!号就可以执行shell命令,无需退出hive。也可以直接执行hdfs中的命令,比如dfs -ls /

Hive 数据类型

先看一个建表语句:

create table employees(
name string,
salary float,
subordinates array<string>,
deducations map<string, float>,
address struct<street:string, city:string,state:string,zip:int>
);

Hive支持tinyint\smalint\int\bigint\boolean\float\double\string\timestamp\binary
同时还支持集合数据类型map\array\structs

Hive不支持行级的插入操作、删除操作和更新操作。

Hive默认分隔符:

  • \n, 对于文本文件来说,每一行都是一个记录;
  • ^A(ctrl + A),分隔字段(列);
  • ^B, array或者struct中的元素或者map中键值之间的分隔;
  • ^C, Map中键值之间的分隔。

自定义分隔符

create external table student(
    name string, 
    age int, 
    height int
)
row format delimited fields terminated by ','
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
location '/data/stocks';

查看表或者数据库或者表格某个字段的信息:hive > describe formatted databaseName.tableName.fieldName;

external table(外部表)

外部表相对于内部表(managed_table)而言,表的定义对于数据的约束减少。数据可以被其他工具共享。当删除表定义的时候,数据不会被删除。
定义一个外部表(多了一个external关键字);

create external table student(
name string, age int, height int
)

row format delimited fields terminated by ','
location '/data/stocks';

把数据放到hdfs的/data/stocks目录下面。数据为:

liangyihuai,12,56
zhongguo,22,33
hanguo,33,66

这样之后就可以直接使用hive操作数据了。

查询一个表是不是外部表,可以执行:describe extended tableName;,最后面会显示表的类型。

Hive分区

分区的目的是加快查询速度。在建表的时候指定分区的字段,该字段可以不是表中的某字段。在查询的结果中,用于分区的字段将作为表中的字段显示出来。需要在导入数据之前或者在导入的过程中手动指定分区数据。每一个分区将是一个目录。

partitioned by (country string, province string);

这个分区将产生两个目录,分别是country(国家)和province(省),其中province将是country的子目录。

在导入数据前增加分区的数据:

ALTER TABLE table_name ADD PARTITION(country='CN', province='Guangdong');

导入数据的时候指明分区的数据:

LOAD DATA LOCAL INPATH 'path_of_data' INTO TABLE table_name 
PARTITION (country = 'CN', province='GuangDong');