8. Hive基础

96
奉先
1.1 2017.02.20 00:30* 字数 2686

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没有专门的数据存储格式。

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

显示效果如下:

Hive配置显示头信息

(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              只有表结构没有数据。  

Hadoop