版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《Hive数据仓库应用与实战》Hive数据仓库应用与实战项目四深入HiveQL任务四优化Hive性能回顾知识点1自定义函数介绍回顾知识点2自定义UDF函数实现回顾任务引入在生产环境中,我们有时会出现一些问题,比如Hive查询效率很慢,Hive作业进度停滞等,这时需要考虑对Hive性能进行优化,本任务将讲解一些优化策略。任务概要任务描述:Hive的缺点是性能较差,处理速度较慢。在前面的内容中,我们已经整体学习了Hive的使用方法,在此基础上,Hive还能通过一些方法来提高处理效率。本任务主要介绍一些常用的策略来提升Hive的性能,比如fetch抓取、本地模式、Hive的压缩存储、表的优化、数据倾斜的处理方法等。任务教学目标:掌握fetch抓取、Hive本地模式、Hive的压缩存储、表的优化方法。掌握数据倾斜的处理方法。一fetch抓取二本地模式教学内容三Hive的压缩存储四表的优化五数据倾斜fetch抓取知识点一(一)fetch抓取1、理论分析Fetch抓取是指Hive中对某些情况的查询可以不必使用MapReduce计算。在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不会使用mapreduce。(一)fetch抓取2、案例实操把hive.fetch.task.conversion设置成nonehive(default)>sethive.fetch.task.conversion=none;执行查询,此时会启动mapreduce程序。hive(default)>select*fromemp;hive(default)>selectenamefromemp;hive(default)>selectenamefromemplimit3;(一)fetch抓取2、案例实操把hive.fetch.task.conversion设置成morehive(default)>sethive.fetch.task.conversion=more;执行查询,此时不会启动mapreduce程序。hive(default)>select*fromemp;hive(default)>selectenamefromemp;hive(default)>selectenamefromemplimit3;本地模式知识点二(二)本地模式1、理论分析Hive在集群上查询时,默认是在集群上N台机器上运行,当Hive查询处理的数据量比较小时,其实没有必要启动分布式模式去执行,会消耗不必要的资源和时间。这个时间可以只使用本地模式来执行mapreducejob,只在一台机器上执行,速度会很快。(二)本地模式1、理论分析启动本地模式涉及到三个参数参数名默认值备注hive.exec.mode.local.autofalse让hive决定是否在本地模式自动运行hive.exec.moade.local.auto.input.files.max4不启动本地模式的task最大数hive.exec.mode.loacl.auto.inputbytes.max128M不启动本地模式的最大输入文件大小(二)本地模式1、理论分析启动本地模式涉及到三个参数开启本地mapreducesethive.exec.mode.local.auto=true;设置localmapreduce的最大输入数据量,当输入数据量小于这个值时采用local
mapreduce的方式,默认为134217728,即128Msethive.exec.mode.local.auto.inputbytes.max=50000000;设置localmapreduce的最大输入文件个数,当输入文件个数小于这个值时采用localmapreduce的方式,默认为4sethive.exec.mode.local.auto.input.files.max=10;(二)本地模式2、案例实操开启本地模式,并执行查询语句hive(default)>sethive.exec.mode.local.auto=true;hive(default)>select*fromempclusterbydeptno;......Timetaken:1.328seconds,Fetched:14row(s)(二)本地模式2、案例实操关闭本地模式,并执行查询语句hive(default)>sethive.exec.mode.local.auto=false;hive(default)>select*fromempclusterbydeptno;......Timetaken:2.29seconds,Fetched:14row(s);可以看出使用本地模式节省了将近一半的时间。Hive的压缩存储知识点三(三)Hive的压缩存储1、理论分析创建表时,尽量使用orc、parquet这些列式存储格式。Hive最终是转为MapReduce程序来执行的,而MapReduce的性能瓶颈在于网络IO和磁盘IO,要解决性能瓶颈,最主要的是减少数据量,对数据进行压缩是个好的方式。压缩充分利用了比较空闲的CPU。(三)Hive的压缩存储1、理论分析常用压缩方法对比压缩格式是否可拆分是否自带压缩率速度是否Hadoop自带gzip否是很高比较快是lzo是是比较高很快否,要安装snappy否是比较高很快否,要安装bzip2是否最高慢是(三)Hive的压缩存储1、理论分析各压缩方式对应的Class类压缩格式类Zlibpress.DefaultCodecGzippress.GzipCodecBzip2press.Bzip2CodecLzopress.lzo.LzoCodecLz4press.Lz4CodecSnappypress.SnappyCodec(三)Hive的压缩存储2、案例实操Job输出文件按照block以GZip的方式进行压缩setpress=truesetpress.type=BLOCKpress.codec=press.GzipCodec(三)Hive的压缩存储2、案例实操Map输出结果也以Gzip进行压缩:setpress=truesetpress.codec=press.GzipCodec(三)Hive的压缩存储2、案例实操对Hive输出结果和中间都进行压缩:setpress.output=truesetermediate=true表的优化知识点四(四)表的优化1、小表、大表Join理论分析:将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率。实际测试发现:新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别。(四)表的优化1、小表、大表Join案例实操:测试大表JOIN小表和小表JOIN大表的效率(1)建大表、小表和JOIN后表的语句createtablebigtable(idbigint,timebigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldsterminatedby'\t';createtablesmalltable(idbigint,timebigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldsterminatedby'\t';createtablejointable(idbigint,timebigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldsterminatedby'\t';(四)表的优化1、小表、大表Join案例实操:测试大表JOIN小表和小表JOIN大表的效率(2)分别向大表和小表中导入数据hive(default)>loaddatalocalinpath'/opt/module/datas/bigtable'intotablebigtable;hive(default)>loaddatalocalinpath'/opt/module/datas/smalltable'intotablesmalltable;(3)关闭mapjoin功能(默认是打开的)sethive.auto.convert.join=false;(四)表的优化1、小表、大表Join案例实操:测试大表JOIN小表和小表JOIN大表的效率(4)执行小表JOIN大表语句insertoverwritetablejointableselectb.id,b.time,b.uid,b.keyword,b.url_rank,b.click_num,b.click_urlfromsmalltablesleftjoinbigtablebonb.id=s.id;Timetaken:35.921seconds(四)表的优化1、小表、大表Join案例实操:测试大表JOIN小表和小表JOIN大表的效率(5)执行大表JOIN小表语句insertoverwritetablejointableselectb.id,b.time,b.uid,b.keyword,b.url_rank,b.click_num,b.click_urlfrombigtablebleftjoinsmalltablesons.id=b.id;Timetaken:34.196seconds;(四)表的优化2、大表Join大表——空KEY过滤理论分析:有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们需要在SQL语句中进行过滤。(四)表的优化2、大表Join大表——空KEY过滤理论分析:有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们需要在SQL语句中进行过滤。(四)表的优化2、大表Join大表——空KEY过滤案例实操:(1)配置历史服务器<property><name>mapreduce.jobhistory.address</name><value>ip地址:10020</value></property><property><name>mapreduce.jobhistory.webapp.address</name><value>ip地址:19888</value></property>(四)表的优化2、大表Join大表——空KEY过滤案例实操:(2)启动历史服务器sbin/mr-jobhistory-daemon.shstarthistoryserver(3)查看jobhistoryhttp://node21:19888/jobhistory(四)表的优化2、大表Join大表——空KEY过滤案例实操:(4)创建原始数据表、空id表、合并后数据表createtableori(idbigint,timebigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldsterminatedby'\t';createtablenullidtable(idbigint,timebigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldsterminatedby'\t';createtablejointable(idbigint,timebigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldsterminatedby'\t';(四)表的优化2、大表Join大表——空KEY过滤案例实操:(5)分别加载原始数据和空id数据到对应表中hive(default)>loaddatalocalinpath'/opt/module/datas/ori'intotableori;hive(default)>loaddatalocalinpath'/opt/module/datas/nullid'intotablenullidtable;(四)表的优化2、大表Join大表——空KEY过滤案例实操:(6)测试不过滤空idhive(default)>insertoverwritetablejointableselectn.*fromnullidtablenleftjoinorioonn.id=o.id;......Timetaken:42.038seconds(四)表的优化2、大表Join大表——空KEY过滤案例实操:(7)测试过滤空idhive(default)>insertoverwritetablejointableselectn.*from(select*fromnullidtablewhereidisnotnull)nleftjoinorioonn.id=o.id;......Timetaken:31.725seconds(四)表的优化2、大表Join大表——空KEY转换理论分析:有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以给表中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。(四)表的优化2、大表Join大表——空KEY转换案例实操:不随机分布空null值。(1)设置5个reduce个数setmapreduce.job.reduces=5;(2)JOIN两张表insertoverwritetablejointableselectn.*fromnullidtablenleftjoinoribonn.id=b.id;结果:可以看出来,出现了数据倾斜,某些reducer的资源消耗远大于其他reducer。(四)表的优化2、大表Join大表——空KEY转换案例实操:随机分布空null值(1)设置5个reduce个数setmapreduce.job.reduces=5;(2)JOIN两张表insertoverwritetablejointableselectn.*fromnullidtablenfulljoinoriooncasewhenn.idisnullthenconcat('hive',rand())elsen.idend=o.id;结果:可以看出来,消除了数据倾斜,负载均衡reducer的资源消耗数据倾斜知识点五(五)数据倾斜1、Map数一个MRJob的MapTask数量是由输入分片InputSplit决定的。而输入分片是由FileInputFormat.getSplit()决定的。一个输入分片对应一个MapTask,而输入分片是由三个参数决定的。MRJob的maptask数量mapreduce.input.fileinputformat.split.minsize(最小分片大小,默认1)mapreduce.input.fileinputformat.split.maxsize(最大分片大小)mapreduce.input.fileinputformat.split.maxsize(启动map最大的分片大小,默认256M)(五)数据倾斜1、Map数longsplitSize=Math.max(minSize,Math.min(maxSize,blockSize))输入分片大小的计算是否map数量越多越好呢是不是保证每个map处理接近128m的文件块就可以了呢?(五)数据倾斜1、Map数(五)数据倾斜2、小文件进行合并在map执行前合并小文件,减少map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。减少map数量(五)数据倾斜2、小文件进行合并小文件合并设定作用sethive.merge.mapfiles=true在maponly的任务结束时合并小文件sethive.merge.mapredfiles=falsetrue时在MapReduce的任务结束时合并小文件sethive.merge.size.per.task=256*1000*1000合并文件的大小setmapred.max.split.size=256000000每个Map最大分割大小setmapred.min.split.size.per.node=1一个节点上split的最少值sethive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat执行Map前进行小文件合并(五)数据倾斜3、复杂文件增加Map数当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。增加map数量根据公式computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M调整maxSize最大值,让maxSize最大值低于blocksize就可以增加map的个数。(五)数据倾斜3、复杂文件增加Map数执行查询:hive(default)>selectcount(*)fromemp;HadoopjobinformationforStage-1:numberofmappers:1;numberofreducers:1设置最大切片值为100个字节hive(default)>setmapreduce.input.fileinputformat.split.maxsize=100;hive(default)>selectcount(*)fromemp;HadoopjobinformationforStage-1:numberofmappers:6;numberofreducers:1(五)数据倾斜4、Reduce数MapReduce程序中,reducer个数的设定极大影响执行效率,但Hive的估计机制很弱,所以有必要手动确定reduce数量,其基于以下参数设定。设定reduce数量hive.exec.reducers.bytes.per.reducer(默认为256000000)hive.exec.reducers.max(默认为1009)mapreduce.job.reduces=-1(设置一个常量reducetask数量)(五)数据倾斜4、Reduce数N=min(参数2,总输入数据量/参数1)计算reducer数的公式调整reduce数量的方法1:调整每个Reduce处理的数据量,默认是256MBsethive.exec.reducers.bytes.per.reducer=256000000调整每个任务最大的reduce数,默认是1009sethive.exec.reducers.max=1009(五)数据倾斜4、Reduce数调整reduce数量的方法2:在hadoop的mapred-default.xml文件中修改,设置每个job的Reduce个数setmapreduce.job.reduces=15;(五)数据倾斜4、Reduce数调整reduce数量的方法2:在hadoop的mapred-default.xml文件中修改,设置每个job的Reduce个数setmapreduce.job.reduces=15;(五)数据倾斜4、Reduce数在设置reduce个数的时候也需要考虑这两个原则:1、处理大数据量利用合适的reduce数。2、使单个reduce任务处理数据量大小要合适。设定reduce数量过多的启动和初始化reduce也会消耗时间和资源多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题。(五)数据倾斜5、并行执行Hive会将一个查询转化成一个或者多个阶段(MR、抽样、合并、limit),默认情况下,Hive一次只会执行一个阶段。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。通过设置参数hive.exec.parallel值为true,就可以开启并发执行。设定并行执行sethive.exec.parallel=true;(打开任务并行执行)sethive.exec.parallel.thread.number=16;(同一个sql允许最大并行度,默认为8)(五)数据倾斜6、严格模式Hive提供了一个严格模式,可以防止用户执行那些可能意向不到的不好的影响的查询。开启严格模式需要修改hive.mapred.mode值为strict,默认为nonstrict。开启严格模式可以禁止3种类型的查询。设定严格模式对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。对于使用了orderby语句的查询,要求必须使用limit语句。限制笛卡尔积的查询。(五)数据倾斜7、JVM重用JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。设定JVM重用<property><name>mapreduce.job.jvm.numtasks</name>
<value>10</value><description>Howmanytaskstorunperjvm.Ifsetto-1,thereisnolimit.</description></property>(五)数据倾斜8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2011年上海高考语文真题试卷及答案
- 一二年级学新暑假学习新技能
- 贵州省遵义市桐梓县2026年标准员专业管理实务考试题库及答案
- 2026年认证基础CCAA专项突破模拟试卷
- 2026年安全管理人员考试题库和答案
- 2026年高中生研究性报告范文研究性学习报告范文
- 再生水利用施工工艺流程
- 非税收入管理规范(2025年)
- 2026年事业单位农业农村岗招聘考试题及答案
- 2026年卫生专业技术资格考试(实验室管理-相关专业知识主管检验技师)核心考点试题及答案
- 2026年中式烹调师高级技师考试题
- 慢性肾脏病的代谢紊乱与干预
- 雨课堂学堂在线学堂云《走进军事理论(空军工程)》单元测试考核答案
- (正式版)DB43∕T 1973-2020 《涉路工程安全技术规范》
- 护理基础操作标准化流程
- 塔顶钢架结构施工方案(3篇)
- 天主教管理工作制度汇编
- 社团党支部工作制度
- 美容科院感工作制度
- CBT在精神分裂症治疗中的应用
- 仲利国际融资租赁有限公司入职测评
评论
0/150
提交评论