Hive架构原理和性能优化
为什么要使用Hive?
MapReduce实现复杂查询逻辑开发难度太大,避免了去写MapReduce,减少开发人员的学习成本。
操作接口采用类SQL语法,提供快速开发的能力。
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
提供统一的元数据管理。
Hive很容易扩展本身的存储能力和计算能力(数仓),最适合应用在基于大量不可变数据的批处理作业。
Hive的缺点:
Hive的HQL表达能力有限,如迭代式算法无法表达。
Hive自动生成的MapReduce作业,粒度较粗,运行效率不算高。
1. 用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
2. 元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;一般结合MySQL数据库来存储Metastore
3. Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
4. 驱动器:Driver
解析器(SQL Parser):
将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
编译器(Physical Plan):
将AST编译生成逻辑执行计划。
优化器(Query Optimizer):
对逻辑执行计划进行优化。
执行器(Execution):
把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
▼▼▼
CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
TRUNCATE TABLE
ALTER DATABASE/SCHEMA, TABLE, VIEW
MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name
创建数据库:
create database if not exists hive; show databases;
创建学生表:
create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)row format delimited fields terminated by ','stored as textfile;
创建课程表
create table course(Cno int,Cname string) row format delimited fields terminated by ',' stored as textfile;
创建分数表
create table sc(Sno int,Cno int,Grade int)row format delimited fields terminated by ',' stored as textfile;
插入数据到表
insert into student values(95001,'李勇','男',20,'CS');
或者批量插入数据到学生,课程,分数表
load data local inpath '/home/gpadmin/hivedata/students.txt' overwrite into table student;
查询学生的总人数
select count(distinct Sno)count from student;
查询各科成绩平均分
select Cno,avg(Grade) from sc group by Cno;
查询选修了3门以上的课程的学生学号
select Sno from (select Sno,count(Cno) CountCno from sc group by Sno)a where a.CountCno>3;
查询选修了课程的学生姓名(inner join)
select distinct Sname from student inner join sc on student.Sno=Sc.Sno;
hive命令执行:
hive -e "select * from hive.student;"
delete /update语法
3. 可视化客户端工具
DBeave
小表驱动大表,Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出错误的几率。
(1)key分布不均匀
(2)业务数据本身的特性
(3)建表时考虑不周
(4)某些SQL语句本身就有数据倾斜
参数优化:hive.map.aggr=true 聚合操作放在Map阶段执行,从而减轻清洗阶段数据传输和Reduce阶段的执行时间,提升总体性能、join倾斜设置hive.optimize.skewjoin=true、group by倾斜设置hive.groupby.skewindata=true等
小文件过多,会给 HDFS 带来压力,影响处理效率,可以通过合并 Map 和 Reduce 的结果文件来消除这样的影响(修改hive hive-site.xml配置文件):
hive.merge.mapfiles = true是否合并 Map 输出文件,默认为 True
hive.merge.mapredfiles = false是否合并 Reduce 输出文件,默认为 False
hive.merge.size.per.task = 256*1000*1000合并文件的大小
Order by 对查询结果进行全局排序,消耗时间长
Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高
更多精彩干货分享
点击下方名片关注
IT那活儿