大数据组件Hive性能测试和性能优化

目录

1、项目介绍

2、测试方法

3、性能优化

3.1 Hive原理

3.2 优化过程


1、项目介绍

这是我在华为做的最后一个项目,当时在华为海思部门。部门主要是给一些国产芯片做服务器的软件性能测试,包括大数据生态软件Hadoop、Hbase、Hive等。本人负责的是Hive软件的性能测试和性能优化,最终对比Hive在x86和arm服务器上的性能。

2、测试方法

使用业界sql性能测试工具tpc-ds,选择个别SQL做性能分析优化。

TPC-DS是与真实场景非常接近的一个测试集,它包含7张事实表,17张纬度表,平均每张表含有18列。用这个数据集能够很好的模拟企业数据查询、报表生成以及数据挖掘等复杂应用。

下面是测试的数据集部分表的关系图:

大数据组件Hive性能测试和性能优化_第1张图片

测试用例举例:

-- 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;

3、性能优化

3.1 Hive原理

Hive是hadoop生态中的数据仓库,数据存储于hdfs上。最开始Hadoop生态使用MapReduce做数据计算,由于MapReduce程序难以开发、比较复杂,所以出现了Hive,对于hdfs上的数据进行结构化,映射到Hive里面的表,并提供HQL查询入口,内部将HQL解析成MapReduce任务执行。Hive解析HQL的过程:
1、接受一个sql字符串,解析成AST;
2、再经过语法分析器解析成查询单元QB,经过逻辑计划生成器,生成操作树;
3、操作数进一步被优化,变成优化后的一个有向无环图,优化手段包括谓词下推,关联排序,分区裁剪等;
4、再经过物理计划生成器,以一定的规则生成可执行的任务;
5、物理计划可以再经过物理优化器进一步优化;

3.2 优化过程

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的存储格式

表2.2-1 存储格式对比
存储格式 存储方式 特点
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核上。

你可能感兴趣的:(大数据,性能优化,性能测试,hive,hadoop,sql)