09.Hive

Hive

一、Hive概述

1). MapReducer的不足

HDFS上的文件并没有schema的概念(比如关系型数据库中的表、字段的概念)

2). Hive特点

  1. 由Facebook开源的,用于解决海量结构化日志的数据统计问题
  2. 构建在Hadoop之上的数据仓库,为超大的数据集设计的计算/扩展能力
  3. Hive提供的SQL查询语言:HQL;语法与TSQL一样;统一的元数据管理
    • Hive数据是存放在HDFS
    • 元数据信息(记录数据的数据)是存放在MySQL中
    • SQL on Hadoop: Hive、Spark SQL、impala....
  4. 底层支持多种不同的执行引擎:MR/Tez/Spark

Hive在Hadoop生态系统中的位置.png

3). Hive体系架构


Hibe体系架构.png
  1. client:

    • shell:终端
    • thrift/jdbc(server/jdbc):连接协议
    • WebUI(HUE/Zeppelin):web界面写sql执行
  2. metastore:元数据信息存放在MySQL数据库中

    • database:name、location、owner....
    • table:name、location、owner、column name/type ....

二、Hive安装部署

1.Hive部署架构


Hive部署架构.png

2.Hive与RDBMS的区别

  1. Hive适合离线处理,不建议使用insert和update功能
  2. Hive适合大数据,PB级别的数据都是小意思

3. Hive部署

  1. 下载

参考之前hadoop下载

  1. 解压到~/app
tar -zvxf hive-1.1.0-cdh5.15.1.tar.gz -C ~/app/
  1. 添加HIVE_HOME到系统环境变量

方便直接启动hive

> vim ~/.bash_profile

export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.15.1
export PATH=$PATH:$HIVE_HOME/bin

> source ~/.bash_profile
  1. $HIVE_HOME下的常见目录
    • bin: 脚本文件
    • conf: 配置
    • lib: Hive依赖jar包
  1. 修改配置$HIVE_HOME/conf/hive-env.sh
> cp hive-env.sh.template hive-env.sh

> vim hive-env.sh

HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.15.1 # 系统变量$HADOOP_HOME的值;这一步非必需的!建议配置上

  1. 修改配置$HIVE_HOME/conf/hive-site.xml
vim hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

    <!-- MySQL地址 -->
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://hadoop000:3306/hadoop_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>hadoop</value>
    </property>
    
    <!-- 密码 -->
    <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>abc123</value>
    </property>
</configuration>
  1. 拷贝MySQL驱动包到$HIVE_HOME/lib

需要自己下载(Java开发者可以到本地Maven仓库中找)

  1. 前提是要准备安装一个MySQL数据库(推荐MySQL开源分支 --> MariaDB )

三、hive客户端测试

1).hive客户端启动

  1. 先初始化数据库(首次启动hive之前执行)

否则可能会出现sql语句执行错误;

sh $HIVE_HOME/bin/schematool -dbType mysql -initSchema

如果提示Duplicate,将数据库中的hadoop_hive删除再试。

  1. 启动Hive
[hadoop@hadoop000 ~]$ hive

2). 测试案例

  1. 前期准备
jps
vim ~/data/helloworld.txt
1   zhangsan
2   wangwu
3   lisi
  1. hive操作
hive
create database test_db;
use test_db;
show tables;
create table helloworld(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
show tables;
select * from helloworld;
load data local inpath '/home/hadoop/data/helloworld.txt' overwrite into table helloworld;
select * from helloworld;
select count(1) from helloworld;
  1. mysql查看信息
show databases;
use hadoop_hive;
select * from DBS; # Hive创建的数据库信息存放位置
  1. hdfs 查看信息
hadoop fs -ls /user/hive/warehouse/

四、Hive语法

推荐参考官网https://cwiki.apache.org/confluence/display/Hive#space-menu-link-content

1). DDL数据库操作

  1. DDL:Hive Data Definition Language

    • create、delete、alter...
  2. Hive数据抽象/结构

    • database: HDFS一个目录
      • table: HDFS一个目录
        • data: 具体文件
        • partition: 分区表 HDFS一个目录
          • data: 具体文件
          • bucket: 分桶,HDFS一个文件
  3. 官方数据库创建语法

(A|B|...)表示多选一必填;[]表示可选参数

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name 
  [COMMENT database_comment]   # 数据库注释
  [LOCATION hdfs_path]         # 指定存放在hdfs的路径;默认`/user/hive/warehouse`
  [WITH DBPROPERTIES (property_name=property_value, ...)];  # 自定义属性
  1. 创建数据库案例
# 创建数据库
CREATE DATABASE IF NOT EXISTS hive;

# 默认创建的数据库路径在hdfs上的 /user/hive/warehouse上,可以自定义;hive会自动创建该路径
CREATE DATABASE IF NOT EXISTS hive2 LOCATION '/test/location';

# 自定义数据库属性
CREATE DATABASE IF NOT EXISTS hive3 WITH DBPROPERTIES('creator'='lc');

/user/hive/warehouse是Hive默认的存储在HDFS上的路径

  1. 查看数据库
# 显示所有数据库
show databases;

# 切换数据库
use hive3;

# 查看数据库信息
desc database hive3;

# 查看数据库详细信息
desc database extended hive3;

# 正则查询数据库
show databases like 'hive*';
  1. 设置查看当前使用的数据库(让命令行自动显示,默认使用default数据库)
set hive.cli.print.current.db=true;

# 查看正在使用的数据库
SELECT current_database();
  1. 删除数据库(只能删除非空的数据库)
drop database hive3;

# 级联操作删除(忘记吧)
drop database hive3 cascade;

2). DDL表操作

  1. 表定义语言(详细请参照官网文档)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
  1. 创建模拟数据/home/hadoop/data/emp.txt
7369    SMITH   CLERK   7902    1980-12-17  800.00      20
7499    ALLEN   SALESMAN    7698    1981-2-20   1600.00 300.00  30
7521    WARD    SALESMAN    7698    1981-2-22   1250.00 500.00  30
7566    JONES   MANAGER 7839    1981-4-2    2975.00     20
7654    MARTIN  SALESMAN    7698    1981-9-28   1250.00 1400.00 30
7698    BLAKE   MANAGER 7839    1981-5-1    2850.00     30
7782    CLARK   MANAGER 7839    1981-6-9    2450.00     10
7788    SCOTT   ANALYST 7566    1987-4-19   3000.00     20
7839    KING    PRESIDENT       1981-11-17  5000.00     10
7844    TURNER  SALESMAN    7698    1981-9-8    1500.00 0.00    30
7876    ADAMS   CLERK   7788    1987-5-23   1100.00     20
7900    JAMES   CLERK   7698    1981-12-3   950.00      30
7902    FORD    ANALYST 7566    1981-12-3   3000.00     20
7934    MILLER  CLERK   7782    1982-1-23   1300.00     10
8888    HIVE    PROGRAM 7839    1988-1-23   10300.00        
  1. 创建表
# 创建表
CREATE TABLE emp(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';  # 指定分隔符

# 查看信息
desc emp;

# 查看详细信息
desc extended emp;

# 查看详细信息高级版
desc formatted emp;

# 加载数据到表中
LOAD DATA LOCAL INPATH '/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE emp;

# 查看数据
select * from emp;

# 改表名
alter table emp rename to emp2;
alter table emp2 rename to emp;

3). DML加载和导出数据

  1. 加载数据语法
    • LOCAL:本地系统,如果没有local那么就是指的HDFS的路径
    • OVERWRITE:是否数据覆盖,如果没有那么就是数据追加
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
  1. 案例
# 加local表示从本地,默认为本机的hdfs
LOAD DATA LOCAL INPATH '/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE emp;

# 从hdfs完整路径加载【hdfs源数据会被移动到指定的其他文件夹】
LOAD DATA INPATH 'hdfs://hadoop000:8020/data/emp.txt' INTO TABLE emp;

# 写数据到本地
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/hive/'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select empno,ename,sal,deptno from emp;

# 创建临时表
create table emp1 as select * from emp;

插入数据,更新数据的功能建议不要使用;因为会非常影性能

4). 查询语法

与SQL标准语法一致

select ename,empno from emp limit 3
select ename from emp where empno > 900;
select * from emp where between 800 and 1500;

5). 聚合函数

聚合: max/min/sum/count/avg

select count(1) from emp where deptno >= 10;

select max(sal),min(sal),sum(sal),avg(sal) from emp;

6). 分组函数

分组函数:group by; 查询条件:where; 分组后过滤:having; 限制条数:limit

# 求每个部门的平均工资,出现在select中的字段,如果没有出现在聚合函数里,那么一定要实现在group by里
select depno, avg(sal) from emp group by depno;

# 求每个部门、工作岗位的平均工资
select depno, job, avg(sal) from emp group by depno,job;

# 求每个部门的平均工资大于2000的部门;对于分组函数过滤要使用having
select depno,avg(sal) sal_avg from emp group by depno having sal_avg > 2000;

7). Join操作

  1. 准备数据
[hadoop@hadoop000 data]$ pwd
/home/hadoop/data
[hadoop@hadoop000 data]$ vim dept.txt
10      ACCOUNTING      NEW UORK
20      RESEARCH        DALLAS
30      ASLES   CHICAGO
40      OPERATIONS      BOSTON
  1. 准备表
# 创建dept表

CREATE TABLE dept(
    deptno int,
    dname string,
    loc string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

# 加载数据
LOAD DATA LOCAL INPATH '/home/hadoop/data/dept.txt' OVERWRITE INTO TABLE dept;
  1. 执行join:多表 emp+dept
select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e join dept d on e.deptno=d.deptno;
  1. 执行计划:解释命令
# 简略信息
explain select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e  join dept d on e.deptno=d.deptno;

# 详细信息,包含抽象语法树
explain EXTENDED select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e  join dept d on e.deptno=d.deptno;

五、项目实战

1). Hive外部表与内部表

生产上建议使用 外部表

  1. 查看表的类型
# Hive
# 查看表结构
desc formatted emp;

... 
Table Type  MANAGED_TABLE # 内部表
...
Table Type  EXTERNAL_TABLE # 外部表
...


# MySQL也可以查看信息
use hadoop_hive;
select * form TBLS;

  1. 外部表演示
CREATE TABLE emp(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

LOAD DATA LOCAL INPATH '/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE emp;

select * from emp;

drop table emp_external;

删除内部表,HDFS上的数据被删除 并且 Meta元数据也被删除

MANAGED_TABLE:内部表

  1. 外部表演示
CREATE EXTERNAL TABLE emp_external(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/external/emp/';  # 指定hdfs的目录

LOAD DATA LOCAL INPATH '/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE emp_external;

select * from emp;

drop table emp_external;

# 再执行一下创建表的操作,不用导入数据;发现数据能查到

删除EXTERNAL_TABLE,删除HDFS上的数据不被删除 但是 Meta被删除

2). Hive的分区表

  1. 创建分区表,自定义按照天分区
create external table track_info(
    ip string,
    url string,
    sessionId string,
    time string,
    country string,
    province string,
    city string,
    page string
) partitioned by (day string)  # 假如按照天进行分区
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/project/trackinfo/';

desc formatted track_info;
... 
FieldSchema(name:day ...) # 按照天分区
... 

3). 项目的Hive实现

  1. 导入数据,ETL操作,将数据写入表中
# 准备原始数据
hadoop fs -mkdir -p /hive_test/resource
hadoop fs -put trackinfo_origin.log /hive_test/resource

# ETL操作
vim etl.sh
hadoop jar ~/lib/hadoop-learning-2.0-RELEASE.jar com.hahadasheng.bigdata.hadooplearning.loganalyze.v2.ETLApp /hive_test/trackinfo_origin.log /hive_test/etl

sh etl.sh

# Hive~~~~~~~~~~~~~~~~~~~~~~~~~~ 创建外部分区表
create external table track_info(
    ip string,
    url string,
    sessionId string,
    time string,
    country string,
    province string,
    city string,
    page string
) partitioned by (day string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/hive_test/trackinfo/';

# 将数据导入到Hive外部表: 注意分区字段
LOAD DATA INPATH 'hdfs://hadoop000:8020/hive_test/etl' OVERWRITE INTO TABLE track_info partition(day='2013-07-21');

# 查询测试 --> 跑MaoReduce作业
select count(*) from track_info where day='2013-07-21';
select province,count(*) as cnt from track_info where day='2013-07-21' group by province;

  1. 省份统计表目标表【按照天进行分区】
# Hive ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
create external table track_info_province_stat(
    province string,
    cnt bigint
) partitioned by (day string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/hive_test/trackinfo/';

# 从track_info表中导出数据
insert overwrite table track_info_province_stat partition(day='2013-07-21')
select province,count(*) as cnt from track_info where day='2013-07-21' group by province;

# 查询
select * from track_info_province_stat where day='2013-07-21' limit 5;

统计的数据已经在Hive表track_info_province_stat而且这个表是一个分区表,后续统计报表的数据可以直接从这个表中查询也可以将hive表的数据导出到RDBMS(推荐使用sqoop工具)

  1. Hive离线处理流程总结
    1. ETL操作:(此操作建议使用MapReduce操作;或者Spark操作;别用Hive)
    2. 把ETL输出的数据加载到track_info分区表里
    3. 各个维度统计结果的数据输出到各自维度的表里(track_info_province_stat)
    4. 将数据导出(optional)

如果一个框架不能落地到SQL层面,这个框架就不是一个非常适合的框架

  1. 补充
[hadoop@hadoop000 lib]$ jps
1509 NameNode
31766 RunJar  # 正在执行的Hive进程
1959 ResourceManager
35415 Jps
1608 DataNode
35400 MRAppMaster
1802 SecondaryNameNode
2062 NodeManager

[hadoop@hadoop000 lib]$ kill -9 31766 # 可以终止进程,
  1. 拓展
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • 一. Hive架构说明 Hive是什么 Hive是一款基于Hadoop的数据仓库软件,用于处理Hadoops上的结...
    伊落阅读 682评论 0 3
  • 1. Hive基本介绍和基础: Facebook公司最早完成并开源了hive框架,可以将sql语句直接翻译成Map...
    奉先阅读 3,333评论 0 43
  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,263评论 0 34
  • 【什么是大数据、大数据技术】 大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法在合理时间内通过传统的应...
    kimibob阅读 2,738评论 0 51
  • 一、初识Hive 1、Hive简介     (1) 什么是Hive? Hive是基于Hadoop的一个数据仓库可以...
    这个太难了阅读 2,457评论 0 1