本文将Hadoop生态圈中的一个重要组件Hive。内容包括安装,运行测试,使用MySQL存储Hive的matedata, 还包括其他使用Hive的知识,比如数据分区等。本文是本人学习Hive过程中的记录,对于一些“理所当然”的简单的东西就只是一笔带过或者没有记录在这里。阅读本文需要对Hadoop有一定的了解,特别是对HDFS,所以,对HDFS的安装和使用部分写得比较简略。一开始的时候,对于Hive的安装是最简单的方式,只需要能够运行和测试就可以了,随着我们对Hive的了解再慢慢把它运行在分布式集群中-其实这两者没有太多的区别。欢迎留言!
## 安装
Hive依赖于Hadoop中的HDFS,而HDFS运行在JDK上面的,所以,在安装Hive之前,需要安装JDK和Hadoop。
步骤:
安装JDK,配置JAVA_HOME,版本为1.8.0;
安装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.defaultFSname>
<value>hdfs://localhost:9000value>
property>
configuration>
etc/hadoop/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
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的环境变量。
安装参考地址
安装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数据库代替Derby数据库,从而使得hive能够支持多个人同时使用:
在hive的conf目录下增加配置文件hive-site.xml即可
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=truev
alue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>mysqlvalue>
property>
configuration>
配置好之后,启动Hive,创建一个表格,就可以在MySQL数据库中发现hive这个数据库,里面存储了Hive的元数据。
使用:使用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 /
。
先看一个建表语句:
create table employees(
name string,
salary float,
subordinates array<string>,
deducations map<string, float>,
address structstring, city:string,state:string,zip:int>
);
Hive支持tinyint\smalint\int\bigint\boolean\float\double\string\timestamp\binary
同时还支持集合数据类型map\array\structs
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;
外部表相对于内部表(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;
,最后面会显示表的类型。
分区的目的是加快查询速度。在建表的时候指定分区的字段,该字段可以不是表中的某字段。在查询的结果中,用于分区的字段将作为表中的字段显示出来。需要在导入数据之前或者在导入的过程中手动指定分区数据。每一个分区将是一个目录。
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');