没有合适的资源?快使用搜索试试~ 我知道了~
首页深入浅出数据仓库中SQL性能优化之Hive篇
深入浅出数据仓库中SQL性能优化之Hive篇

Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle, sort等多个阶段,所以针对hive查询的优化可以大致分为针对MR中单个步骤的优化,针对MR全局的优化以 及针对整个查询的优化。
资源详情
资源评论
资源推荐

深入浅出数据仓库中SQL性能优化之Hive篇
发表于2015011310:42|3660次阅读|来源CSDN|16条评论|作者孙逸
数据仓库性能优化SQLHiveMapReduce
 ;摘要:Hive查询生成多个mapreducejob,一个mapreducejob又有map,reduce,spill,shuffle,
sort等多个阶段,所以针对hive查询的优化可以大致分为针对MR中单个步骤的优化,针对MR全局的优化以
及针对整个查询的优化。
一个Hive查询生成多个MapReduceJob,一个MapReduceJob又有Map,Reduce,Spill,Shuffle,Sort等
多个阶段,所以针对Hive查询的优化可以大致分为针对MR中单个步骤的优化(其中又会有细分),针对
MR全局的优化,和针对整个查询(多MRJob)的优化,下文会分别阐述。
在开始之前,先把MR的流程图帖出来(摘自Hadoop权威指南),方便后面对照。另外要说明的是,这个
优化只是针对Hive0.9版本,而不是后来Hortonwork发起Stinger项目之后的版本。相对应的Hadoop版本是
1.x而非2.x。

Map阶段的优化(Mapphase)
Map阶段的优化,主要是确定合适的Map数。那么首先要了解Map数的计算公式:
[js]viewplaincopy
1.num_Map_tasks=max[${Mapred.min.split.size},
2.min(${dfs.block.size},${Mapred.max.split.size})]
Mapred.min.split.size指的是数据的最小分割单元大小。
Mapred.max.split.size指的是数据的最大分割单元大小。
dfs.block.size指的是HDFS设置的数据块大小。
一般来说dfs.block.size这个值是一个已经指定好的值,而且这个参数Hive是识别不到的:
[js]viewplaincopy
1.Hive>setdfs.block.size;
2.dfs.block.sizeisundefined
所以实际上只有Mapred.min.split.size和Mapred.max.split.size这两个参数(本节内容后面就以min和max指
代这两个参数)来决定Map数量。在Hive中min的默认值是1B,max的默认值是256MB:
[js]viewplaincopy
1.Hive>setMapred.min.split。size;
2.Mapred.min.split.size=1
3.Hive>setMapred.max.split。size;
4.Mapred.max.split.size=256000000

所以如果不做修改的话,就是1个Maptask处理256MB数据,我们就以调整max为主。通过调整max可以起
到调整Map数的作用,减小max可以增加Map数,增大max可以减少Map数。需要提醒的是,直接调整
Mapred.Map.tasks这个参数是没有效果的。
调整大小的时机根据查询的不同而不同,总的来讲可以通过观察Maptask的完成时间来确定是否需要增加
Map资源。如果Maptask的完成时间都是接近1分钟,甚至几分钟了,那么往往增加Map数量,使得每个
Maptask处理的数据量减少,能够让Maptask更快完成;而如果Maptask的运行时间已经很少了,比如10
20秒,这个时候增加Map不太可能让Maptask更快完成,反而可能因为Map需要的初始化时间反而让Job总
体速度变慢,这个时候反而需要考虑是否可以把Map的数量减少,这样可以节省更多资源给其他Job。
Reduce阶段的优化(Reducephase)
这里说的Reduce阶段,是指前面流程图中的Reducephase(实际的Reduce计算)而非图中整个Reduce
task。Reduce阶段优化的主要工作也是选择合适的Reducetask数量,跟上面的Map优化类似。
与Map优化不同的是,Reduce优化时,可以直接设置Mapred。Reduce。tasks参数从而直接指定Reduce的
个数。当然直接指定Reduce个数虽然比较方便,但是不利于自动扩展。Reduce数的设置虽然相较Map更灵
活,但是也可以像Map一样设定一个自动生成规则,这样运行定时Job的时候就不用担心原来设置的固定
Reduce数会由于数据量的变化而不合适。
Hive估算Reduce数量的时候,使用的是下面的公式:
[js]viewplaincopy
1.num_Reduce_tasks=min[${Hive.exec.Reducers.max},
2.
(${input.size}/${Hive.exec.Reducers.bytes.per.Red
ucer})]
也就是说,根据输入的数据量大小来决定Reduce的个数,默认Hive.exec.Reducers.bytes.per.Reducer为
1G,而且Reduce个数不能超过一个上限参数值,这个参数的默认取值为999。所以我们可以调整
Hive.exec.Reducers.bytes.per.Reducer来设置Reduce个数。
设置Reduce数同样也是根据运行时间作为参考调整,并且可以根据特定的业务需求、工作负载类型总结出
经验,所以不再赘述。
Map与Reduce之间的优化(Spill,copy,Sort
phase)
Mapphase和Reducephase之间主要有3道工序。首先要把Map输出的结果进行排序后做成中间文件,其次
这个中间文件就能分发到各个Reduce,最后Reduce端在执行Reducephase之前把收集到的排序子文件合并

成一个排序文件。这个部分可以调的参数挺多,但是一般都是不要调整的,不必重点关注。
Spill与Sort
在Spill阶段,由于内存不够,数据可能没办法在内存中一次性排序完成,那么就只能把局部排序的文件先
保存到磁盘上,这个动作叫Spill,然后Spill出来的多个文件可以在最后进行merge。如果发生Spill,可以通
过设置io.Sort.mb来增大Mapper输出buffer的大小,避免Spill的发生。另外合并时可以通过设置
io.Sort.factor来使得一次性能够合并更多的数据。调试参数的时候,一个要看Spill的时间成本,一个要看
merge的时间成本,还需要注意不要撑爆内存(io.Sort.mb是算在Map的内存里面的)。Reduce端的merge
也是一样可以用io.Sort.factor。一般情况下这两个参数很少需要调整,除非很明确知道这个地方是瓶颈。
Copy
copy阶段是把文件从Map端copy到Reduce端。默认情况下在5%的Map完成的情况下Reduce就开始启动
copy,这个有时候是很浪费资源的,因为Reduce一旦启动就被占用,一直等到Map全部完成,收集到所有
数据才可以进行后面的动作,所以我们可以等比较多的Map完成之后再启动Reduce流程,这个比例可以通
Mapred.Reduce.slowstart.completed.Maps去调整,他的默认值就是5%。如果觉得这么做会减慢Reduce端
copy的进度,可以把copy过程的线程增大。tasktracker.http.threads可以决定作为server端的Map用于提供
数据传输服务的线程,Mapred.Reduce.parallel.copies可以决定作为client端的Reduce同时从Map端拉取数据
的并行度(一次同时从多少个Map拉数据),修改参数的时候这两个注意协调一下,server端能处理client
端的请求即可。
文件格式的优化
文件格式方面有两个问题,一个是给输入和输出选择合适的文件格式,另一个则是小文件问题。小文件问
题在目前的Hive环境下已经得到了比较好的解决,Hive的默认配置中就可以在小文件输入时自动把多个文件
合并给1个Map处理,输出时如果文件很小也会进行一轮单独的合并,所以这里就不专门讨论了。相关的参
数可以在这里找到。
关于文件格式,Hive0.9版本有3种,textfile,sequencefile和rcfile。总体上来说,rcfile的压缩比例和查询时
间稍好一点,所以推荐使用。
关于使用方法,可以在建表结构时可以指定格式,然后指定压缩插入:
[js]viewplaincopy
1.createtablerc_file_test(colint)storedasrcfile;
2.setHive.exec.compress.output=true;
3.insertoverwritetablerc_file_test
4.select*fromsource_table;
另外时也可以指定输出格式,也可以通过Hive。default。fileformat来设定输出格式,适用于createtableas
select的情况:
剩余15页未读,继续阅读



















NinjaPanda
- 粉丝: 28
- 资源: 232
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- Xilinx SRIO详解.pptx
- Informatica PowerCenter 10.2 for Centos7.6安装配置说明.pdf
- 现代无线系统射频电路实用设计卷II 英文版.pdf
- 电子产品可靠性设计 自己讲课用的PPT,包括设计方案的可靠性选择,元器件的选择与使用,降额设计,热设计,余度设计,参数优化设计 和 失效分析等
- MPC5744P-DEV-KIT-REVE-QSG.pdf
- 通信原理课程设计报告(ASK FSK PSK Matlab仿真--数字调制技术的仿真实现及性能研究)
- ORIGIN7.0使用说明
- 在VMware Player 3.1.3下安装Redhat Linux详尽步骤
- python学生信息管理系统实现代码
- 西门子MES手册 13 OpcenterEXCR_PortalStudio1_81RB1.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论1