1. Hive基本介绍和基础:
Facebook公司最早完成并开源了hive框架,可以将sql语句直接翻译成MapReduce程序。Hive是基于Hadoop的一个数据仓库工具,可以将结构化数据文件映射成一张表,并提供类似SQL的查询功能。Hive相当于一个客户端。
1. Hive框架的作用:
(1)可以让不懂java的数据分析人员使用hadoop进行数据分析;
(2)MapReduce开发非常繁琐复杂,使用hive可以提高效率。
(3)统一的元数据管理,可与impala/spark共享元数据。
2. Hive基础:
(1)使用HQL作为查询接口;使用MapReduce进行计算;数据存储在HDFS上;运行在Yarn上。
(2)Hive比较灵活和可扩展性,支持UDF和多种文件格式。
(3)Hive适合离线数据分析(批量处理、延时要求很大)。
2. SQL on Hadoop框架:
Hive是一种最常见、使用最为广泛的SQL on Hadoop框架。还包括几个其他常见的sql on hadoop框架:
1. Presto:
最早由Facebook开源,国内京东使用比较广泛。
2. Drill:
3. impala:
由Cloudera公司提供,基于内存的。hive是基于硬盘的。
4. Spark SQL:
3. Hive架构:
Hive可以作为ETL工具(有一个常见的开源ETL工具,kettle)、报表工具 和数据分析工具。Hive可以访问HBase数据。Hive没有专门的数据存储格式。
(1)客户端:CLI:
Hive的使用场景中,99%的情况使用CLI,JDBC比较少用(因为Hive主要是用作离线分析的)。
(2)元数据MetaStore(企业一般使用MySQL;为了避免单点故障,搭建HA、主从结构): 存储数据库、表名、字段等。Spark、Impala也有自己的MetaStore,并且可以和Hive的MetaStore共享。
(3)驱动器Driver:
解析器、编译器、优化器、执行器。
(4)使用MapReduce计算
(5)数据存储在HDFS上。
由于Hive只是一个客户端,在安装时,我们可以在Hadoop集群中,选择一台安装Hive。Hive没有集群的概念,但是可以搭建Server/Client端。
4. Hive的安装:
1. 安装Java和Hadoop环境:
我们使用 “5.分布式集群环境” 的结果,Java和Hadoop环境已经安装好。
2.下载、解压hive源文件:
我使用的版本是:apache-hive-0.13.1-bin.tar.gz 。解压文件:
$ tar zxf apache-hive-0.13.1-bin.tar.gz -C /opt/modules/
3. 修改配置文件、安装测试:
(1)根据模板生成配置文件:
$ cp hive-default.xml.template hive-site.xml
$ cp hive-env.sh.template hive-env.sh
(2)在hive-env.sh中添加环境变量:
需要添加JAVA_HOME、HADOOP_HOME 和 HIVE_HOME环境变量:
export JAVA_HOME=/opt/modules/jdk1.7.0_67
export HADOOP_HOME=/opt/modules/hadoop-2.5.0
export HIVE_CONF_DIR/opt/modules/apache-hive-0.13.1-bin/conf
(3)添加HIVE_HOME系统环境变量:
# vi /etc/profile
#HIVE HOME
HIVE_HOME=/opt/modules/apache-hive-0.13.1-bin
添加$HIVE_HOME/bin到PATH变量。
(4)按照Hive官方文档配置:
$ bin/hdfs dfs -mkdir /tmp
$ bin/hdfs dfs -mkdir -p /user/hive/warehouse
$ bin/hdfs dfs -chmod g+w /tmp
$ bin/hdfs dfs -chmod g+w /user/hive/warehouse
/tmp目录是hive仓库的临时目录,例如在Load文件到hive表中时,要先把文件放在临时目录/tmp中,再挪到Hive表对应的目录中。
/user/hive/warehouse 是仓库的主目录。
(5)测试hive:
直接输入命令hive进入:
hive> show databases; #开始时,系统给默认创建一个数据库,叫做default。
hive> create database pma;
hive> use pma;
hive> create table students(id int,name String);
hive> show tables;
在创建了表之后,在HDFS上可以看到这个表的目录结构:/user/hive/warehouse/pma.db/students
Hive会在数据库名后加上“.db”,作为数据库这一级别的目录。数据库、数据表(包括后边介绍的分区)在Hive中其实都是目录。
(6)其他常用的Hive的命令:
hive> desc database pma;
hive> desc pma.students;
hive> desc extended pma.students;
hive> desc formatted pma.students;
hive> show functions;
hive> desc function instr;
desc formatted是比较有用的命令,可以获取表的很多信息。
Linux家目录下.hivehistory文件保存了我们输入过的hive命令:
$ cat /home/natty/.hivehistory
5. 修改元数据库为MySQL:
上一章节,使用的是默认的Derby数据库。在企业中,几乎使用的都是MySQL,所以这里介绍安装MySQL作为MetaStore。
1. 切换到root安装MySQL Client 和Server rpm包:
首先,删除系统中已经安装的MySQL rpm包:
# rpm -qa | grep mysql
# rpm -e --nodeps mysql-libs-5.1.66-2.el6_3.x86_64
其中,-e表示卸载rpm包, --nodeps 表示强制删除,不考虑依赖。
现在,就可以安装rpm包了。
# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm MySQL-server-5.6.24-1.el6.x86_64.rpm
# rpm -qa | grep -i mysql
2. 登陆Mysql
MySQL安装完成后,root密码保存在 /root/.mysql_secret中。
# cat /root/.mysql_secret
启动 mysql 服务:
# service mysql start
root用户登陆MySQL,修改root密码:
# mysql -uroot -pES5KZsKZRZQ6OaVU
mysql> set password=password('123456');
3. hive关联MySQL数据库:
hive官方文档中 “Setting Up Metastore”有关于配置MySQL的介绍。
(1)配置hive-site.xml文件:
(2)获取mysql jdbc驱动jar包:
解压mysql驱动压缩包,获取mysql驱动jar包:
$ tar zxf mysql-connector-java-5.1.27.tar.gz -C ./mysql-connector/
将驱动jar包拷贝到 $HIVE_HOME/lib下:
$ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/apache-hive-0.13.1-bin/lib/
(3)MySQL数据库授权用户:
mysql> grant all privileges on *.* to root@"hadoop-senior01.pmpa.com" identified by "123456";
mysql> flush privileges;
将对所有数据库的权限赋予,在hadoop-senior01.pmpa.com主机上以用户名root和密码123456登陆的用户。
4 . 登陆Hive测试:
我再次使用hive命令登陆Hive,这时候Hive会自动在MySQL中创建metastore等 元数据信息。
这时,我们再次登陆到MySQL,可以查看到metastore库(保存Hive元数据信息的库),并且可以看到这库下的一些表。
6. Hive基本操作:
1. 简单测试:
基本操作实验过程:创建一个表,加载外部文件进入表中(文件字段以逗号分隔),查询该表。
(1)创建表:
hive> create table student (id int,name string)
> row format delimited
> fields terminated by ',';
(2)加载外部文件入表:
hive> load data local inpath '/home/natty/students.txt' overwrite into table student;
其中local项、overwrite项是可选择项。
(3)确认加载:
hive> select * from student;
2. Hive Shell常用命令:
了解Hive Shell的所有命令 可以使用 -h选项(下面例子配置的$HIVE_HOME/bin 到Path):
$ hive -h
下面列举几个常用的选项:
-e选项可以直接接查询的sql:
$ hive -e "select * from pmdw.student;"
$ hive -e "select * from pmdw.student;" > student.output
-f选项,可以执行一个SQL脚本(包含多个SQL语句):
$ hive -f dw_student.sql
--hiveconf 选项,可以指定一些在你打开的这个hive CLI Session有效的一些配置项参数,例如,我们可以配置$HIVE_HOME/conf/hive-log4j.properties下的一个配置项。hive.root.logger=INFO,DRFA , 默认输出日志是INFO级别,可以修改成DEBUG级别来输出。
$ hive --hiveconf hive.root.logger=DEBUG,DRFA
3. 常用的配置属性:
(1)数据仓库的位置:
默认配置在“/user/hive/warehouse”,可以在hive-site.xml配置。配置项是hive.metastore.warehouse.dir。
(2)运行日志信息位置:
启用log4j.properties文件:
$ cp -a hive-log4j.properties.template hive-log4j.properties
配置hive.log.dir项,指定一个绝对路径。
hive.log.dir=/opt/modules/apache-hive-0.13.1-bin/logs
如果想修改日志显示级别,修改项 hive.root.logger :
(3)显示当前查询的库信息,表头信息:
修改配置文件 hive-site.xml 以下两个选项,值修改为“true”:
hive.cli.print.header
hive.cli.print.current.db
显示效果如下:
(4)查看当前所有的配置信息:
使用set命令来查看或者修改。 修改只在会话级别生效。
hive (pmdw)> set;
4. 在Hive CLI中使用HDFS和Linux命令:
(1)与HDFS交互:
在Hive CLI中,直接使用dfs命令与HDFS交互:
hive (pmdw)> dfs -ls /;
hive (pmdw)> dfs -text /output01/part*;
(2)与Linux交互:
使用感叹号! 后边接linux命令即可。
hive (default)> !pwd;
hive (default)> !ls / ;
(3)启动hiveserver2服务:
$ hive --service hiveserver2
7.Hive数据类型:
Hive除了一些基本的数据类型(常用的是int,bigint,double,string),还有复杂数据类型:map、Array、Struct等等。
8. Hive建表:
在Hive中,经常使用的表包括 管理表(内部表)、外部表 和分区表。
在建表时,主要关注下面的信息(要注意先后的顺序一定不可以乱):
CREATE [EXTERNAL] TABLE [db_name.]table_name
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[AS select_statement];
下面举两个例子建emp和dept表:
1. 外部表和内部表的区别:
内部表(管理表)在删除时,会一并删除元数据和HDFS文件,也就是删除表结构的同时也删除数据。但是外部表在删除时,只删除元数据,不删除HDFS文件(数据)。
2. 外部表使用场景:
有几个业务部分都需要用到表table1,到某个时间,如果业务部门1不再使用table1,则业务部门1删除这个表即可,不会删除HDFS文件,业务部门2和3还可以看HDFS的数据。
3. 分区表业务场景:
(1)分时段存放日志,例如每小时保存一次日志,每小时一个分区。
(2)提高查询速度,类似于RDMS的索引。
4. 创建表的三种方式:
(1)直接使用CREATE语句创建表; 只创建表结构,之后加载数据。
(2)CREATE TABLE tbl2 as SELECT ... 有表结构也有数据。
(3)CREATE TABLE tbl3 like tbl4 只有表结构没有数据。