Hive优化以及执行原理数据平台杨新彦2014-01-131.整体架构优化2.MR阶段优化3.JOB优化4.SQL作业优化5.平台优化为什么要用hive3简单SELECTword,count(1)FROM(selectexplode(split(line,’\s’))ASwordFROMarticle)wGROUPBYwordORDERBYword开发量大Hive架构&执行流程Luna离线数据平台Hive执行流程&操作符操作符描述TableScanOperator扫描hive表数据ReduceSinkOperator创建将发送到Reduce端的key,reduce对JoinOperatorJoin两份数据SelectOperator选择输出列FileSinkOperator建立结果数据,输出至文件FilterOperator过滤输入数据GroupByOperatorGroupBy语句MapJoinOperator/*+mapjoin(t)*/LimitOperatorLimit语句UnionOperatorUnion语句逻辑执行计划7强大Hive==RDBMS?TRUE:FALSE8HIVERDBMS查询语言HQLSQL数据存储HDFSRAWDevices事物NOACID索引Yes(待测试)YES执行MRExcutor扩展性BIGBIG大20nodes数据规模大小执行延迟高低业务数据分析数据分析OR线上硬件配置一般高查询慢?建索引?NO!9建索引1.整体架构优化2.MR阶段优化3.JOB优化4.SQL作业优化5.平台优化Datawarehouse优化表分区、动态分区•查询维度、业务需求•日期分区•类型分区压缩、分布式缓存优化•原始日志BZ2压缩•MR中间输出LZO压缩•中间表SEQUENCEFILE、RCFILE格式MR阶段优化•MAP阶段优化•REDUCE阶段优化•SHUFFLE阶段优化MAP阶段优化•mapred.map.tasks无效•num_map_tasks切割大小影响参数–mapred.max.split.size默认:256M–mapred.min.split.size默认:1B–dfs.block.size默认:128M•切割算法–splitSize=max[minSize,min(maxSize,blockSize)]–minSize=${mapred.min.split.size}–maxSize=${mapred.max.split.size}•列裁剪hive.optimize.cp=true•map端聚合hive.map.aggr=true•Map端谓语下推hive.optimize.ppd=true调整map、reduce参数Map数maxSizeReduce数perReducer时间248256M551G2288s441128M551G1860s396128M272200M1166s46764M272200M1169sREDUCE阶段优化•mapred.reduce.tasks直接设置•num_reduce_tasks大小影响参数–hive.exec.reducers.max默认:999–hive.exec.reducers.bytes.per.reducer默认:1G•切割算法–numRTasks=min[maxReducers,input.size/perReducer]•maxReducers=${hive.exec.reducers.max}•perReducer={hive.exec.reducers.bytes.per.reducer}Shuffle阶段优化•压缩中间数据–减少磁盘操作–减少网络传输数据量•配置方法–mapred.compress.map.output设为true–mapred.compress.output.compression.codec•org.apache.hadoop.io.compress.LzoCodec•org.apache.hadoop.io.compress.SnappyCodecShuffle参数Map端参数•io.sort.mb•io.sort.spill.percent•min.num.spill.for.combine•io.sort.factor•io.sort.record.percentReduce端参数•mapred.reduce.parallel.copies•mapred.reduce.copy.backoff•io.sort.factor•mapred.job.shuffle.input.buffer.percent•mapred.job.shuffle.input.buffer.percent•mapred.job.reduce.input.buffer.percentJOB优化•执行模式•JOIN算法•数据倾斜执行模式•本地模式(小数据量)–hive.exec.mode.local.auto=true–hive.exec.mode.local.auto.inputbytes.max(128MBbydefault)–hive.exec.mode.local.auto.tasks.max(4bydefault)–num_reduce_tasks=1•伪分布式模式–单机测试使用•分布式模式–正常jobJOIN算法•Commonjoin•Mapjoin•BucketmapjoinMapjoin•hive.auto.convert.join=true(defaultfalse)•hive.mapjoin.smalltable.filesize=600M(default25M)•Select/*+MAPJOIN(a)+*/..ajoinb强制指定mapjoinBucketMapJoin•sethive.optimize.bucketmapjoin=true•mapjoin一起工作•所有要join的表必须分桶,大表的桶的个数是小表的整数倍•做了bucket的列必须等于join的列数据倾斜•countdistinct•commonjoincountdistinct数据倾斜•Selectcount(distinctid)fromacorn_3g.iplogwherelog_datelike‘2013-12%’;–耗时:1600S•Selectcount(1)from(selectdistinctidfromacorn_3g.iplogwherelog_datelike‘2013-12%’andid0)tmp;–耗时:260scommonjoin倾斜•selectm.uidasuser_id,m.from_id,m.app_id,m.is_auto,u.stagefromacorn_3g.mcs_accessmjoinuseruonm.uid=u.idwherem.log_date='2013-12-12’;–耗时:最起码2个小时•selectm.uid,m.from_id,m.app_id,m.is_auto,u.stagefromuserujoin(selectm.uid,m.from_id,m.app_id,m.is_autofromacorn_3g.mcs_accessmwherelog_date='2013-12-12'anduid0groupbym.uid,m.from_id,m.app_id,m.is_auto)monm.uid=u.id–耗时:600sSQL作业优化作业并行执行MR迭代次数推测业务sql优化Sql并行执行•hive.exec.parallel=true(defaultfalse)•hive.exec.parallel.thread.number=8(default8)•hive并行执行sqlMR迭代次数推测•Sql语句之我见–聚合函数•max、min、avg、count、distinct–连接•Join、leftouterjoin、rightouterjoin。。•多表连接迭代推测–Select…fromajoinbona.id=b.id–Selectcol1,..count(col2)fromajoinbon..–Selectcol1,..count(distinctcol2)fromajoinbon..–公式:逢join、distinct加1,遇mapjoin减1业务优化•多条件用户id筛选–筛选8个省份,每省特定条件用户ID20,000个•周wau、周wau保留率–最近半年400G数据–2千万*180天行记录Hive之吐槽•加强公用UDF函数•异常JOB探测,培训优化•Hivetez,脱胎换骨•Sparkshark,业界良心,大趋势异常job探测•Reduce:最长时长比平均时长超过10分钟,且最长时长超过平均时长2倍•平均记录数超过50W且最大记录是平均记录数四倍。•归纳分析,通知业务部门,培训优化。Spark•ApacheSparkisanopensourceclustercomputingsystemthataimstomakedataanalyticsfast—bothfasttorunandfasttowrite.•Torunprogramsfaster,Sparkoffersageneralexecutionmodelthatcanoptimizearbitraryoperatorgraphs,andsupportsin-memorycomputing,whichletsitquerydatafasterthandisk-basedengineslikeHadoop.Spark生态环境迭代计算SPARK流数据处理SparkStreaming机器学习GraphX、MLlib离线数据平台参考文献•数据平台Hive相关实践•数据平台Spark相关探索•Hive官方文档•Spark官方文档•阿里数据平台