概述
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。 Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。 Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析等。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。同时,Hive也是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),并且提供了存储、查询和分析Hadoop中的大规模数据的机制。Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据。这个语言也允许熟悉MapReduce的开发者的设计自定义的Mapper和Reducer来处理内建的Mapper和Reducer无法完成的复杂的分析工作。
架构
Hive提供了一个SQL命令的操作接口,允许用户可以使用类似SQL的Hive的Query Language执行一些离线的SQL分析。但是Hive和传统的数据库不同,Hive只是构建在Hadoop的MapReduce之上的SQL解析工具,并不参与数据的管理和存储,Hive中所有的数据都是在运行任务的时候才会真正的加载。
总的来说Hive有以下几点特性:
-
Hive和关系数据库存储文件的系统不同,Hive使用的是Hadoop的HDFS,关系数据库则是服务器本地的文件系统。
-
Hive使用的计算模型是MapReduce,而关系数据库则是自己设计的计算模型。
-
关系数据库都是为OLTP进行设计的,而Hive则是为海量数据做数据挖掘设计的,实时性很差,实时性的区别导致Hive的应用场景和关系数据库有很大的不同。
-
Hive很容易扩展自己的存储能力和计算能力,这个是继承Hadoop的特性,而关系数据库在这个方面要比Hive差很多。
Hive安装
由于hive需要存储一些一些建表的元数据信息,因此在生产环境下安装Hive需要事先安装MySQL数据库服务(注意:MySQL数据库的编码必须是Latin1编码)。其次Hive是构建在Hadoop存储和计算之上的工具,因此还需要在配置和安装hive之前保证Hadoop的hdfs和MapReduce正常运行。最后Hive的安装主机上必须配置HADOOP_HOME
环境变量,这样Hive可以通过该环境变量感知用户的Hadoop计算集群的位置和规模。
MySQL配置
[root@CentOS ~]# yum install -y mysql-server
[root@CentOS ~]# service mysqld start
[root@CentOS ~]# chkconfig mysqld on
[root@CentOS ~]# mysqladmin -uroot password 'root'
[root@CentOS ~]# mysql -u root -proot
mysql> use mysql
mysql> delete from user where password='';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql> flush privileges;
mysql> create database hive;
mysql> show database;
Hadoop配置
1、配置etc/hadoop/core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://CentOS:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-2.9.2/hadoop-${user.name}</value>
</property>
2、配置etc/hadoop/hdfs-site.xml
<!--block副本因子-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--配置Sencondary namenode所在物理主机-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>CentOS:50090</value>
</property>
<!--设置datanode最大文件操作数-->
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
<!--设置datanode并行处理能力-->
<property>
<name>dfs.datanode.handler.count</name>
<value>6</value>
</property>
3、配置etc/hadoop/mapred-site.xml
<!--MapRedcue框架资源管理器的实现-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
4、配置etc/hadoop/yarn-site.xml
<!--配置MapReduce计算框架的核心实现Shuffle-洗牌-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--配置资源管理器所在的目标主机-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>CentOS</value>
</property>
<!--关闭物理内存检查-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--关闭虚拟内存检查-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
5、在.bashrc下配置HADOOP_HOME环境变量
HADOOP_HOME=/usr/hadoop-2.9.2
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
CLASSPATH=.
export JAVA_HOME
export PATH
export HADOOP_HOME
export CLASSPATH
6、启动Hadoop的存储和计算服务
[root@CentOS ~]# start-dfs.sh
[root@CentOS ~]# start-yarn.sh
Hive配置
1、解压hive安装包,解压到/usr目录下
[root@CentOS ~]# tar -zxf apache-hive-1.2.2-bin.tar.gz -C /usr/
[root@CentOS ~]# cd /usr/apache-hive-1.2.2-bin/
2、创建conf/hive-site.xml,配置以下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://CentOS:3306/hive?createDatabaseIfNotExist=true</value>
</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>root</value>
</property>
</configuration>
3、将MySQL的驱动jar拷贝到lib目录下
MacBookPro:~ admin$ scp .m2/repository/mysql/mysql-connector-java/5.1.48/mysql-connector-java-5.1.48.jar root@CentOS:/usr/apache-hive-1.2.2-bin/lib
root@centos's password:
mysql-connector-java-5.1.48.jar 100% 983KB 103.5MB/s 00:00
4、配置HIVE_HOME环境变量
HADOOP_HOME=/usr/hadoop-2.9.2
HIVE_HOME=/usr/apache-hive-1.2.2-bin
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
CLASSPATH=.
export JAVA_HOME
export PATH
export HADOOP_HOME
export CLASSPATH
export HIVE_HOME
5、启动Hive
-
单用户模式
[root@CentOS ~]# hive Logging initialized using configuration in jar:file:/usr/apache-hive-1.2.2-bin/lib/hive-common-1.2.2.jar!/hive-log4j.properties hive> show tables; OK Time taken: 0.726 seconds hive>
-
多用户模式
[root@CentOS apache-hive-1.2.2-bin]# ./bin/hiveserver2 >/dev/null 2>&1 & [3] 26279 [root@CentOS apache-hive-1.2.2-bin]# ./bin/beeline -u jdbc:hive2://CentOS:10000 -n root Connecting to jdbc:hive2://CentOS:10000 Connected to: Apache Hive (version 1.2.2) Driver: Hive JDBC (version 1.2.2) Transaction isolation: TRANSACTION_REPEATABLE_READ Beeline version 1.2.2 by Apache Hive 0: jdbc:hive2://CentOS:10000>
表操作
Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:
原始类型
类型 | 描述 | 字面量示例 |
---|---|---|
BOOLEAN | 布尔值,可选值true/false | true |
TINYINT | 1字节的有符号整数 -128~127 | 1Y |
SMALLINT | 2个字节的有符号整数,-32768~32767 | 1S |
INT | 4个字节的带符号整数 | 1 |
BIGINT | 8字节带符号整数 | 1L |
FLOAT | 4字节单精度浮点数1.0 | |
DOUBLE | 8字节双精度浮点数 | 1.0 |
DEICIMAL | 任意精度的带符号小数 | 1.0 |
STRING | 字符串,变长 | “Abc” |
VARCHAR | 变长字符串 | “Aac” |
CHAR | 固定长度字符串 | “a”,’b’ |
BINARY | 字节数组 | |
TIMESTAMP | 时间戳,纳秒精度 | 122327493795 |
DATE | 日期 | ‘2020-01-01 |
复杂类型
类型 | 描述 | 字面量示例 |
---|---|---|
ARRAY | 有序的的同类型的集合 | array(1,2) |
MAP | key-value,key必须为原始类型,value可以任意类型 | map(‘a’,1,’b’,2) |
STRUCT | 字段集合,类型可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |
案例测试
1,链接hive服务,创建test数据库
[root@CentOS ~]# beeline -u jdbc:hive2://CentOS:10000 -n root
Connecting to jdbc:hive2://CentOS:10000
Connected to: Apache Hive (version 1.2.2)
Driver: Hive JDBC (version 1.2.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.2.2 by Apache Hive
0: jdbc:hive2://CentOS:10000> show databases;
+----------------+--+
| database_name |
+----------------+--+
| default |
+----------------+--+
1 row selected (0.051 seconds)
0: jdbc:hive2://CentOS:10000> create database test;
No rows affected (0.193 seconds)
0: jdbc:hive2://CentOS:10000> use test;
No rows affected (0.044 seconds)
0: jdbc:hive2://CentOS:10000> select current_database();
+-------+--+
| _c0 |
+-------+--+
| test |
+-------+--+
2、在test库下创建t_employee表
create table if not exists t_employee (
id int,
name varchar(32),
age int,
salary double,
birthDay date,
hobbies array<string>,
address struct<street:string,country:string>,
detail map<string,double>
);
3、查看建表详情,用户可以使用desc formatted 表名
查看更多的表信息
0: jdbc:hive2://CentOS:10000> desc t_employee;
+-----------+---------------------------------------+----------+--+
| col_name | data_type | comment |
+-----------+---------------------------------------+----------+--+
| id | int | |
| name | varchar(32) | |
| age | int | |
| salary | double | |
| birthday | date | |
| hobbies | array<string> | |
| address | struct<street:string,country:string> | |
| detail | map<string,double> | |
+-----------+---------------------------------------+----------+--+
8 rows selected (0.076 seconds)
数据格式
默认分隔符
在创建完表之后,需要准备数据,其中hive默认的字段分割符号如下,因此上述建表等价写法如下:
分隔符 | 描述 |
---|---|
\n | 对于文本文件而言,一行表示一条文本记录,因此可以使用\n表示 |
^A(Ctrl+A) | 用于分割字符的列,在创建表的时候可以使用八进制’\001’表示 |
^B(Ctrl+B) | 用于分割ARRAY、STRUCT或者MAP中的元素,在创建表的时候可以使用八进制’\002’表示 |
^C(Ctrl+C) | 用于分割MAP中的key,value,在创建表的时候可以使用八进制’\003’表示 |
create table if not exists t_employee (
id int,
name varchar(32),
age int,
salary double,
birthDay date,
hobbies array<string>,
address struct<street:string,country:string>,
detail map<string,double>
)
row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;
按照如下数据格式输入数据,然后倒入到指定的表中
1^Azhangsan^A17^A15000.0^A1990-12-13^Awatch tv^Bpaly game^Abeijing^Bchina^Alevel^C1^Bdept^C2
2^Alisi^A18^A10000.0^A1995-12-13^Awatch tv^Bpaly game^Ahanghai^Bchina^Alevel^C1^Bdept^C2
load data local inpath ‘xxx路径’ overwrite into table Xxx表
0: jdbc:hive2://CentOS:10000> select id,name,age,salary,address,hobbies from t_employee;
+-----+-----------+------+----------+-----------------------------------------+---------------------------+--+
| id | name | age | salary | address | hobbies |
+-----+-----------+------+----------+-----------------------------------------+---------------------------+--+
| 1 | zhangsan | 17 | 15000.0 | {"street":"beijing","country":"china"} | ["watch tv","paly game"] |
| 2 | lisi | 18 | 10000.0 | {"street":"hanghai","country":"china"} | ["watch tv","paly game"] |
+-----+-----------+------+----------+-----------------------------------------+---------------------------+--+
0: jdbc:hive2://CentOS:10000> select id,name,hobbies,detail from t_employee;
+-----+-----------+---------------------------+---------------------------+--+
| id | name | hobbies | detail |
+-----+-----------+---------------------------+---------------------------+--+
| 1 | zhangsan | ["watch tv","paly game"] | {"level":1.0,"dept":2.0} |
| 2 | lisi | ["watch tv","paly game"] | {"level":1.0,"dept":2.0} |
+-----+-----------+---------------------------+---------------------------+--+
2 rows selected (0.053 seconds)
自定义分割符号
1,zhangsan,true,18,15000,TV|Game,001>建设|002>招商,china|bj
2,lisi,true,28,15000,TV|Game,001>建设|002>招商,china|bj
3,wangwu,false,38,5000,TV|Game,001>建设|002>招商,china|sh
create table if not exists t_user(
id int,
name string,
sex boolean,
age int,
salary double,
hobbies array<string>,
card map<string,string>,
address struct<country:string,city:string>
)
row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by '>'
lines terminated by '\n'
stored as textfile;
正则格式数据
192.168.0.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00
192.168.2.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00
192.168.0.1 xx com.xx.xx.XxxService#xx 2018-10-10 10:10:00
192.168.202.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00
create table if not exists t_access(
ip string,
app varchar(32),
service string,
last_time timestamp
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex"="^(.*)\\s(.*)\\s(.*)\\s(.*\\s.*)"
);
CSV格式文件
1,apple,3,20.5
2,orange,2,21.5
3,pear,2,22.5
4,banana,1,23.0
CREATE TABLE if not exists t_product(
id int,
item string,
count int,
price double
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"escapeChar" = "\\"
);
JSON格式文件
{"id":1,"name":"zhangsan","sex":true,"register":"1991-02-08","score":100.0}
{"id":2,"name":"lisi","sex":true,"register":"1991-02-08","score":80.0}
create table if not exists t_student(
id int,
name varchar(32),
sex boolean,
register date,
score double
)ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';
需要添加jar文件 add jar /usr/apache-hive-1.2.2-bin/hcatalog/share/hcatalog/hive-hcatalog-core-1.2.2.jar删除的时候使用delete指令