BigData大数据应用开发学习笔记(03)离线处理--数据仓库Hive
一.离线批处理特点
处理时间要求不高、数据量巨大、数据格式多样、占用计算存储资源多
MR作业,Spark作业,HSQL作业实现
数据源:流式数据、文件数据、数据库
数据采集:实时采集(Flume、第三方采集),批量采集(Flume、Sqoop、第三方ETL)
离线批处理引擎:HDFS,Yarn,MapReduce,Hive,Spark,Spark SQL
业务应用:数据集市,数据仓库(交互式分析),专题库
离线批处理常用组件:
HDFS: 分布式文件系统,为各种批处理引擎提供数据存储,可以存储各种文件格式数据。
YARN: 资源调度引擎,为各种批处理引擎提供资源调度能力。
MapReduce: 大数据批处理引擎,用于处理海量数据,但是处理速度较慢。
Hive: 大数据SQL批处理引擎,用于处理SQL类批处理作业,但是处理速度较慢。
Spark: 基于内存的数据处理引擎,适合海量数据,处理速度高效。
Spark SQL: Spark处理结构化数据的一个模块。
二.数据仓库Hive
1.Hive说明
Hive是基于Hadoop的数据仓库软件,可以查询和管理PB级别的分布式数据。
Hive特性:
灵活方便的ETL(Extract/Transform/Load)
支持MapReduce、Tez、Spark多种计算引擎
可直接访问HDFS文件以及HBASE
易用易编程
2.Hive的数据存储
数据库、内部表、桶、分区、外部表、倾斜数据、正常数据
Hive内部表和外部表的区别
CREATE/LOAD 内部表数据移到仓库目录,外部表数据位置不移动
DROP 内部表元数据和数据会被一起删除,外部表只删除元数据
命令:
desc formatted tablename; -- 查询表的类型
alter table tablename set tblproperties('EXTERNAL'='TRUE'); -- 修改内部表为外部表
alter table tablename set tblproperties('EXTERNAL'='FALSE'); -- 修改外部表为内部表
3.Hive内置函数
show functions; -- 查看系统函数
desc function upper; -- 查看函数的用法
desc function extended upper; -- 详细显示函数的用法
常用函数:
数学函数:round(),abs(),rand(),...
日期函数:to_date(),current_date(),...
字符串函数:trim(),length(),substr(),...
4.Hive自定义函数UDF
UDF(User-Defined-Function):用于接收单个数据行,并产生一个数据行作为输出。
UDAF(User-Defined Aggregation Function):用于接收多个数据行,并产生一个数据行作为输出。
UDTF(User-Defined Table-Generating Functions):用于接收单个数据行,并产生多个数据行作为输出。
UDF开发步骤:
继承org.apache.hadoop.hive.ql.exec.UDF
实现一个evaluate()方法,编写要实现的逻辑
打包并上传到HDFS
Hive创建临时函数
调用该函数
5.Hive调优:
数据倾斜:
数据倾斜指计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。
容易造成数据倾斜的原因归纳为几点:
group by
distinct count (distinct xxx)
join
调优参数:
set hive.map.aggr=true; -- 在Map中会做部分聚集操作,效率更高但需要更多内存
set hive.groupby.skewindata=true; -- 生成的查询计划会有两个MRjob,可实现数据倾斜时负载均衡
map side join:
set hive.auto.convert.join=true; -- 当连接一个较小和较大表时,把较小的表直接放到内存中,然后再对较大的表进行Map操作。
并行执行:
每个查询会被Hive转化为多个阶段,当有些阶段关联性不大时,可以并行执行,减少整个任务的执行时间。
set hive.exec.parallel=true; -- 开启并行
set hive.exec.parallel.thread.number=8; -- 设置同一个SQL允许并行任务的最大线程数
6.HQL开发(Hive SQL)
(1).创建表
CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
id INT Comment '编号',
name STRING Comment '姓名',
salary DOUBLE Comment '薪水金额',
deductions MAP<STRING, DOUBLE> Comment '缴税税种'
)
-- "DELIMITED FIELDS TERMINATED BY"指定列与列之间的分隔符为',',"MAP KEYS TERMINATED BY"指定MAP中健值的分隔符为'&'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' MAP KEYS TERMINATED BY '&'
-- 指定表的存储格式为TEXTFILE
STORED AS TEXTFILE;
(2).数据加载
从本地加载数据到表
LOAD DATA LOCAL INPATH '/opt/hive_examples_data/employee_info.txt' OVERWRITE INTO TABLE employee_info;
从HDFS加载数据到表
LOAD DATA INPATH '/usr/hive_examples_data/employee_contract.txt' OVERWRITE INTO TABLE employee_contract;
(3).查询
一般查询:
SELECT a.name,
b.tel_phone,
b.email
FROM employees_info a
JOIN employees_contact b ON a.id = b.id
WHERE usd_flag='D';
将查询结果写到表中的某个分区中
INSERT OVERWRITE TABLE employees_info_extended PARTITION (entrytime = '2019')
SELECT a.id,
b.tel_phone
FROM employees_info a
JOIN employees_contract b ON a.id = b.id
WHERE a.entrytime = '2019';
查询:
SELECT COUNT(*) FROM employees_contract;
SELECT a.name, b.tel_phone
FROM employees info a
JOIN employees contact b ON a.id = b.id
WHERE b.email like '%cn';
7.Hive数据仓库
数据集市(Data Mart)与数据仓库。
数据仓库分层:
ODS:原始数据层(Operational Data Store)
DWD:结构和粒度与原始表保持一致,简单清洗(Data Warehouse Detail)
DWS:以DWD为基础,进行轻度汇总(Data Warehouse Service)
ADS:为各种统计报表提供数据(Application Data Store)
分层的优点:
复杂问题简单化:将任务分解成多个步骤完成,每一层只处理单一的步骤,比较简单,方便定位。
减少重复开发:规范数据分层,通过中间层数据,减少最大的重复计算,增加一次计算结果的复用性。
隔离原始数据:避免数据异常或者数据敏感,使真实数据与统计数据解耦。