Hive官网:https://cwiki.apache.org/confluence/display/Hive
Hadoop
- 狭义
Hadoop是最重要最基础的一个部分 - 广义
Hadoop生态圈,包括Hadoop、Hive、Sqoop、HBase…
Hive概述
构建在Hadoop(HDFS/MapReduce/YARN)之上的数据仓库
Hive的数据是存放在HDFS之上
Hive底层执行引擎:MapReduce/Tez/Spark,只需要通过一个参数就能够切换底层的执行引擎,Hive作业提交到YARN上运行
提供了HQL查询语言
和SQL类似,但不完全相同
所谓的大数据“云化”:是一个很大项目
适用于离线处理/批处理
HDFS上的数据:文本 压缩、列式存储
SQL on Hadoop:Hive/Presto/Impala/Spark SQL…
元数据 vs 源数据
源数据:HDFS上的文件
元数据:是描述数据的数据
Hive架构
用户接口层:黑窗口(cli)、JDBC
Driver/驱动器
SQL解析:SQL ==> AST(antlr)
查询优化:逻辑/物理执行计划
UDF/SerDes:
Execution:执行
元数据:表名、所属数据库、列(名/类型/index)、表类型、表数据所在目录
id,username,password,age
Hive的数据是存放在HDFS之上
Hive的数据分为两部分:数据 + 元数据
Hive和RDBMS的对比
Hive和RDBMS的对比
相同点
SQL
事务
insert/update/delete Hive-0.14才支持
针对Hive数据仓库,写比较少的,批次加载数据到Hive然后进行统计分析
不同点
体量/集群规模
延迟/时性
Hive部署
前置
要求 linux,jdk8以上,hadoop2.x以及mysql数据库
安装
移动tar包到指定目录下
[root@JD ~]# mv hive-1.1.0-cdh5.16.2.tar.gz /home/hadoop/software
切换hadoop用户
[root@JD ~]# su - hadoop
解压到app目录下
[hadoop@JD software]$ tar -zxvf hive-1.1.0-cdh5.16.2.tar.gz -C ~/app/
在配置环境变量
[hadoop@JD hive-1.1.0-cdh5.16.2]$ vi ~/.bashrc
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.16.2
export PATH=$HIVE_HOME/bin:$PATH
重新加载环境变量
[hadoop@JD hive-1.1.0-cdh5.16.2]$ source ~/.bashrc
配置
$HIVE_HOME下目录说明
bin:脚本
lib:依赖包
conf:配置文件
修改配置文件
-
创建hive-site.xml并增加配置,包括配置mysql数据配
javax.jdo.option.ConnectionURL jdbc:mysql://JD:3306/ruozedata_hive?createDatabaseIfNotExist=true[hadoop@JD conf]$ vi hive-site.xml
<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>xxx</value> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> <property> <name>hive.cli.print.header</name> <value>true</value> </property>
-
将mysql驱动放到lib目录下
使用root用户将驱动放到lib目录下 [root@JD ~]# mv mysql-connector-java-5.1.27-bin.jar /home/hadoop/app/hive-1.1.0-cdh5.16.2/lib 修改该文件的用户和用户组 [root@JD lib]# cd /home/hadoop/app/hive-1.1.0-cdh5.16.2/lib [root@JD lib]# chown hadoop:hadoop mysql-connector-java-5.1.27-bin.jar
-
配置hive日志
[hadoop@JD conf]$ cp hive-log4j.properties.template hive-log4j.properties
-
解析hive日志路径
在hive-log4j.properties中查看到日志的生成路径 hive.log.dir=${java.io.tmpdir}/${user.name} hive.log.file=hive.log 解析结果 ${java.io.tmpdir}/${user.name}/${hive.log.file} /tmp/hadoop/hive.log
-
Hive配置属性
全局配置在hive-site.xml中进行配置 当前session配置 查看当前的属性:set key; 修改当前的属性:set key=value; hive -hiveconf hive.cli.print.current.db=true
-
Hive中交互式命令
-e:不需要进入hive命令后,就可以跟上sql语句查询 -f:执行指定文件(内容是SQL语句)
-
拓展:基于Hive的离线统计/数据仓库
把SQL封装到shell脚本中去,使用hive -e "query sql..." 定时调度:crontab
Hive使用
启动hive
[hadoop@JD hive-1.1.0-cdh5.16.2]$ hive
基本命令
查看库
hive (default)> show databases;
OK
database_name
default
Time taken: 3.231 seconds, Fetched: 1 row(s)
创建表
hive (default)> create table stu(id int,name string,age int);
OK
Time taken: 2.546 seconds
向表中插入数据
hive (default)> insert into stu values(1,'stefanboy',18);
Time taken: 16.617 seconds
查询数据
hive (default)> select * from stu;
OK
stu.id stu.name stu.age
1 stefanboy 18
Time taken: 0.059 seconds, Fetched: 1 row(s)
清屏
hive (default)> !clear;
退出
hive (default)> !exit;
切换数据库
hive (default)> use dbname;
查看表结构
hive (default)> desc stu;
OK
col_name data_type comment
id int
name string
age int
Time taken: 0.063 seconds, Fetched: 3 row(s)
查看表的详细信息
hive (default)> desc formatted stu;
OK
col_name data_type comment
# col_name data_type comment
id int
name string
age int
# Detailed Table Information
Database: default
OwnerType: USER
Owner: hadoop
CreateTime: Sun Dec 15 17:35:59 CST 2019
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://JD:9000/user/hive/warehouse/stu
Table Type: MANAGED_TABLE
Table Parameters:
COLUMN_STATS_ACCURATE true
numFiles 1
numRows 1
rawDataSize 14
totalSize 15
transient_lastDdlTime 1576402663
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.098 seconds, Fetched: 34 row(s)
默认存放路径和执行日志
创建stu表,默认存储在HDFS的目录是(可通过desc formatted stu命令进行查看)
hdfs://JD:9000/user/hive/warehouse/stu
其中hive默认的存放路径(hive.metastore.warehouse.dir)为:/user/hive/warehouse
表名:stu
表的完整路径是: ${hive.metastore.warehouse.dir}/tablename
创建删除库
Hive中的数据抽象
Hive中的表(stu)必须要归属于某个数据库(default)
Database
包含了0到N张表,每个db对应HDFS上的一个文件夹
default==>/user/hive/warehouse
创建数据库(可以指定存储路径)
其中!是表示选择一个 []表示可选
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]#备注
[LOCATION hdfs_path]#指定存储路径
[WITH DBPROPERTIES (property_name=property_value, ...)];#数据库的信息
例如
CREATE DATABASE IF NOT EXISTS bigdata_hive;
CREATE DATABASE IF NOT EXISTS bigdata_hive3 COMMENT 'this is bigdata database' WITH DBPROPERTIES('creator'='stefanoy', 'date'='2016-12-15');
删除数据库(如果数据库下面有表则删除不成功;强制删除命令CASCADE,哪怕下面有表也会删除,慎用)
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
命令样例
DROP DATABASE IF EXISTS bigdata_hive2;
CASCADE(了解即可,慎用): one2many == 1 db 对 多 table
数据类型
数值类型:int bigint float double decimal
字符串类型:string 90% #用的最广
布尔类型:boolean: true/false
日期类型:date timestamp ...
分隔符
各种分隔符介绍
delimiter code
^A \001 字段之间的分隔符
\n \n 记录分隔符
^B \002 ARRAY/STRUCT (Hive中的复杂数据类型)
^C \003 key/value of MAP (Hive中的复杂数据类型)
创建表的时候可以指定分隔符
指定','为分隔符
create table stu2(id int, name string, age int) row format delimited fields terminated by ',';
insert into stu2 values(1,'stefanboy',18);
把/user/hive/warehouse/stu/000000_0下载到本地,查看数据的内容。