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

目录

1、项目介绍

2、测试方法

3、性能优化

3.1 Hive原理

3.2 优化过程


1、项目介绍

这是在华为公司做的最后一个项目,归属华为海思部门。当时部门和团队主要是给华为国产芯片做服务器的软件性能测试验证和优化,包括对华为大数据平台FusionInsight Arm版本开发和性能优化测试,包括大数据生态组件Hadoop、Hbase、Hive等。本文描述了Hive软件的性能测试过程和性能优化方案,通过对Hive架构的分析、软件参数的调整、源码优化等措施提升Hive SQL的性能,并总结调优的结果。

2、测试方法

测试方法是使用业界sql性能测试工具tpc-ds 500G级别的测试数据,选择样例SQL中个别具有代表性的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;

3、性能优化

3.1 Hive架构原理

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

3.2 优化过程

以下是对优化过程或结果的分点总结:

1、并行化执行

每个查询会被Hive转化为多个任务执行,这些任务有些没有关联性,则可以并行化运行,特别是在具备多核优势的Arm服务器上,充分利用多核资源,减少总体执行时间;

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核数,同样是利用Arm服务器的多核优势;

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、源码的优化

源码方面分析了MapReduce的执行过程,依据Arm服务器CPU numa架构特性(Numa节点本地内存访问快于跨Numa访问),通过numa绑核的方式将yarnchild线程绑定到特定的numa核上,避免跨Numa访问。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值