目录
1、项目介绍
2、测试方法
3、性能优化
3.1 Hive原理
3.2 优化过程
这是我在华为做的最后一个项目,当时在华为海思部门。部门主要是给一些国产芯片做服务器的软件性能测试,包括大数据生态软件Hadoop、Hbase、Hive等。本人负责的是Hive软件的性能测试和性能优化,最终对比Hive在x86和arm服务器上的性能。
使用业界sql性能测试工具tpc-ds,选择个别SQL做性能分析优化。
TPC-DS是与真实场景非常接近的一个测试集,它包含7张事实表,17张纬度表,平均每张表含有18列。用这个数据集能够很好的模拟企业数据查询、报表生成以及数据挖掘等复杂应用。
下面是测试的数据集部分表的关系图:
测试用例举例:
-- 1.符合某条件的每各客户单次消费额总额大于900的客户表
-- 条件:
-- 在1999-2001年期间,
-- 每月的1-3或25-28日的,
-- 来自williamson county的客户。
with sales_record(ss_ticket_number,ss_customer_sk,sales)as
(
select
ss_ticket_number,
ss_customer_sk,
sum(ss_sales_price)as sales
from
store_sales ss,
date_dim dd,
store s,
household_demographics hd
where
ss.ss_sold_date_sk=dd.d_date_sk
and ss.ss_store_sk=s.s_store_sk
and ss.ss_hdemo_sk=hd.hd_demo_sk
and(dd.d_dom between 1 and 3 or dd.d_dom between 25 and 28)
and dd.d_year in (1999,2000,2001)
and s.s_county in('williamson county')
group by
ss_ticket_number,
ss_cutomer_sk
)
select
c_last_name,
c_first_name,
c_salutation,
c_preferred_cust_flag,
sales,
count(*) as cnt
from
sales_record,
customer
where
ss_customer_sk=c_customer_sk
and sales>900
group by
c_last_name,
c_first_name,
c_salutation,
c_preferred_cust_flag,
sales
order by
c_last_name,
c_first_name,
c_salutation,
c_preferred_cust_flag desc;
Hive是hadoop生态中的数据仓库,数据存储于hdfs上。最开始Hadoop生态使用MapReduce做数据计算,由于MapReduce程序难以开发、比较复杂,所以出现了Hive,对于hdfs上的数据进行结构化,映射到Hive里面的表,并提供HQL查询入口,内部将HQL解析成MapReduce任务执行。Hive解析HQL的过程:
1、接受一个sql字符串,解析成AST;
2、再经过语法分析器解析成查询单元QB,经过逻辑计划生成器,生成操作树;
3、操作数进一步被优化,变成优化后的一个有向无环图,优化手段包括谓词下推,关联排序,分区裁剪等;
4、再经过物理计划生成器,以一定的规则生成可执行的任务;
5、物理计划可以再经过物理优化器进一步优化;
1、并行化执行
每个查询会被Hive转化为多个任务执行,这些任务有些没有关联性,则可以并行化运行,减少执行时间;
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
2、 job合并输入小文件
因为hive其实底层执行的是mapreduce程序,所以减少输入小文件可以提升性能。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
3、 job合并输出小文件
有点像map阶段完成后,向reduce阶段输入时使用combine,从而合并小文件向reduce输入
set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动新job合并文件
set hive.merge.size.per.task=64000000;合并之后的文件大小
4、修改map数量
通过设置参数mapred.max.split.size调整map数量为接近cpu核数;
5、设置reduce数量
通过设置mapred.reduce.tasks调整reduce数量;
6、中间数据启用压缩
设置参数hive.intermediate.compression.codec为true,并设置压缩算法hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
数据压缩减少了数据传输量,提高传输效率,但是以增加压缩和解压缩开销为代价,而Arm服务器有多核优势,这样正好利用了多核资源。
7、倾斜连接优化
在两表join的时候会将相同键值的行发到同一个reduce,数量多的个别键值就会造成数据倾斜,配置倾斜连接的相关属性可以优化倾斜连接。优化参数hive.optimize.skewjoin为true时,会将计算计划分为两个MR任务,第一个任务随机分发key到不同的reduce,聚合计算后再经过第二个MR任务分发相同的key数据到同一个reduce任务进行聚合。
8、启用基于成本的优化器
Hive提供了基于的成本优化器(CBO),其特性是可以根据查询成本指定执行计划。
例如:确定表连接的顺序、以何种方式执行连接、使用的并行度等。开启方式:hive.cbo.enable配置为true。
9、启用向量化
启用向量化方式后,fetch数据以批量的方式提升效率,启用方式:hive.vectorized.execution.enabled和hive.vectorized.execution.reduce.enabled配置为true。
10、存储格式优化
使用orc的存储格式
存储格式 | 存储方式 | 特点 |
---|---|---|
TextFile | 行存储 | 存储空间消耗比较大,并且压缩的text 无法分割和合并。 查询的效率最低,可以直接存储,加载数据的速度最高。 |
SequenceFile | 行存储 | 存储空间消耗最大,压缩的文件可以分割和合并。 查询效率高,需要通过text文件转化来加载。 |
RCFile | 数据按行分块, 每块按照列存储 |
存储空间最小, 查询的效率最高 , 需要通过text文件转化来加载, 加载的速度最低。 压缩快 快速列存取。 读记录尽量涉及到的block最少 。 读取需要的列只需要读取每个row group 的头部定义。 读取全量数据的操作 性能可能比sequencefile没有明显的优势。 |
ORCFile | 数据按行分块, 每块按照列存储 |
压缩快,快速列存取 ,效率比rcfile高,是rcfile的改良版本。 |
Parquet | 列存储 | 相对于PRC,Parquet压缩比较低,查询效率较低, 不支持update、insert和ACID.但是Parquet支持Impala查询引擎。 |
11、源码的优化
分别从软件配置、操作系统配置、源码优化等方面做性能的优化。
软件配置包括map、reduce数量的调整,数据压缩,压缩小文件等;操作系统配置包括修改磁盘调度算法等;源码方面主要分析了MapReduce的执行过程,通过numa绑核的方式将yarnchild线程绑定到特定的numa核上。