vlambda博客
学习文章列表

Hive架构原理和性能优化

一. Hive介绍

h ive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。 hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。

为什么要使用Hive?

  • MapReduce实现复杂查询逻辑开发难度太大,避免了去写MapReduce,减少开发人员的学习成本。

  • 操作接口采用类SQL语法,提供快速开发的能力。

  • Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

提供统一的元数据管理。

  • Hive很容易扩展本身的存储能力和计算能力(数仓),最适合应用在基于大量不可变数据的批处理作业。

Hive的缺点:

  1. Hive的HQL表达能力有限,如迭代式算法无法表达。

  2. Hive自动生成的MapReduce作业,粒度较粗,运行效率不算高。


二. Hive架构及原理


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。


三. DDL、DML操作

1. DDL 操作
   
     
     
   
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;

2. DML操作

查询学生的总人数

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语法

表本身能支持ACID

3. 可视化客户端工具

DBeave


四. Hive性能优化

1. join优化

小表驱动大表,Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出错误的几率。

2. 数据倾斜

(1)key分布不均匀

(2)业务数据本身的特性

(3)建表时考虑不周

(4)某些SQL语句本身就有数据倾斜

参数优化:hive.map.aggr=true 聚合操作放在Map阶段执行,从而减轻清洗阶段数据传输和Reduce阶段的执行时间,提升总体性能、join倾斜设置hive.optimize.skewjoin=true、group by倾斜设置hive.groupby.skewindata=true等

3. 合并小文件

小文件过多,会给 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合并文件的大小

4. 排序优化

Order by  对查询结果进行全局排序,消耗时间长

Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高


参数设置:
hive-site.xm永久生效/hive --hiveconf 单次生效/cli set 会话有效。


Hive架构原理和性能优化
END


更多精彩干货分享

点击下方名片关注

IT那活儿

IT那活儿
不管IT什么活儿,干就完了。
412篇原创内容
Official Account