开发和优化高效的Hadoop & Hive 程序

更新时间:2023-05-08 10:36:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

开发和优化高效的MapReduce & Hive 程序
数据平台和产品
明风 2011/08
主题数据平台的历程 数据平台的历程云梯与数据平台 MR与Hive
MapReduce的调优 MapReduce的调优
开发Tips Combiner,Partitioner,Comparator 关键参数的调节 影响云梯JOB的不良特征
Hive的调优 Hive的调优
适用场合 Hive开发技巧 高级特性的应用 数据倾斜的原因和特征 数据倾斜的解决方法 Hive的局限性
整体调优之道
业务优先级与调度 小文件合并与压缩 参数自动调优
海量数据处理的思路 海量数据处理的思路瀑布型数据流 化整为零,合理调度 极限计算……
2
Taobao Confidential
数据平台业务组成BI线 量子统 计 数据魔 方
广告线
搜索线
3
Taobao Confidential
数据平台的历程2010年3月份700台云梯 1000-作业(数据平台,搜索算法) 每天5T左右的原始数据 50%的MR,50%的Hive
目前1500台机器 4000个作业(数据 平台) 每天15T原始数据 10%的MR,90%的Hive4 Taobao Confidential
各条业务线的演变情况BI线 搜索线 广告线 数据魔方 量子统计?RAC和MR并存 ?RAC迁云梯,直接从Oracle SQL切换为Hive SQL ?MR改造为Hive,目前只有少数的剩余MR ?从搜索算法组接手,大量的MR,少数的Hive,后来基本全部切换为 Hive
?云梯最早的用户,经历多次重构,目前除了日志前期处理的少量MR,全 部为Hive
?1:9的MR和Hive比例 ?MR用于品牌库和型号库的处理
?1:9的MR和Hive比例 ?MR用于最后对数据进行分库分表
5
Taobao Confidential
Hadoop的场合复杂的数据挖掘算法Mahout
动态维度和动态SQL业务逻辑完全一致,表名和字段名不同
Hive尚未实现得很好的特性全局排序 …………
涉及到Hadoop底层文件操作的 工具程序合并小文件 极限存储6 Taobao Confidential
Hadoop的调优从业务逻辑和数据结 构进行优化?需要业务开发人员熟悉 Hadoop 和Hive,可以影响 一个业务线的整体效率
从应用程序角度进行 优化?优点:不会影响其它作业, 优点: 优点 如果是关键路径上的作业, 能有显著作用 ?不足:影响范围有限,但 不足: 不足 是可以非常频繁的优化, 只要保证数据正确性
对Hadoop参数和存储 Hadoop参数和存储 进行调优?优点:影响一批作业,效 优点: 优点 果显著 ?缺点:对大部分作业有优 缺点: 缺点 化的参数,可能对小部分 有反作用
从系统实现角度进行 优化?优点:影响全部的作业, 优点: 优点 效果非凡 ?缺点:需要非常谨慎,不 缺点: 缺点 能太频繁
7
Taobao Confidential
MR程序的基本常识重用Text 等Writable类型
不要用: output.collect(new output.collect(new Text(….), new Text(…)) 而是用: 而是用: key.set(…); key.set(…); value.set(); value.s

et(); output.collect(key, output.collect(key, value):使用StringBuilder
不要使用Formatter 不要使用Formatter 不要使用StringBuffer 不要使用StringBuffer 不要介意使用 + 通过DistributedCache加载文件 通过DistributedCache加载文件 DistributedCache 适用场合: 适用场合:配置文件,词典 用法: 用法: 最佳用法: 最佳用法::
8
Taobao Confidential
高效MR的三个调节器Combiner Partitioner Comparator 充分利用3者,实现高效灵活的排序
9
Taobao Confidential
Input和Output充分利用标准的Hadoop类特性,产生灵活 的Map – Reduce结果
10
Taobao Confidential
MR中慎做之事静态变量Map或者Reduce中的static,不能用于整体计数 单个计数,存在风险参数:
大对象Map,List,倒排表…… 尽量做为Map和Reduce的成员变量
大循环1亿的数据,每条循环3000次,3000亿的操作,类似于笛卡尔积
递归一定要加深度控制 Reporter. progress()
超长正则表达式正则匹配很消耗性能,长度超过100的正则很危险 在Map外对正则表达式进行编译,map中不编译
11
Taobao Confidential
MR中的慎做之事创建本地文件
New File() 变相的将hdfs的数据,转移到TaskTracker,云梯表示压力山大 write, create mkdir
大量创建云梯目录和文件
大量打印日志
System.out.println System.err.println 可以打印,不要超过10g 可以用,但是不要超过100个
创建过多的自定义Counter 创建过多的自定义Counter
配置过大的内存 "mapred.child.java.opts","-Xmx2000m“ 不要超过3G,超过4G会被云梯Kill12 Taobao Confidential
Map数 数Map数过大 Map数过大Map only的作业,输出文件太小,产生大量小文件 初始化和创建Map的开销比执行还大
Map数太小 Map数太小 单个Map时间过长,频繁推测执行 数据膨胀,内存不足 最佳方法 最佳方法 参数:mapred.map.tasks 从源头就一直保证数据出于合理大小: dfs.block.size=256m/512m
注意点: 注意点:压缩的Text File,是不可分割的,一个1G的file,只会起一个Map,尽量使用 SequenceFile SequenceFile是可以切分的,所以Map数只会受文件大小影响,和文件数目没有必然联系 基于Splitable的文件格式,map数可以调大,但是不能调小13 Taobao Confidential
Reduce数 ReduceReduce数过大 Reduce数过大
大量的小文件 耗费大量不必要的资源 数据倾斜——不能通过修改参数改变
Reduce数过低 Reduce数过低
最佳方法 参数:mapred.reduce.tasks 临时方案:-1 AutoReduce注意点 注意点: Key的分布,某种程度上,决定了Reduce数目
14
Taobao Confidential
中间参数Map端参数 Reduce端参数
? io.sort.mb ? 9e28b8a5f524ccbff1218431bine ? io.sort.factor ? io.sort.spill.percent ? io.sort.record.percent ? 9e28b8a5f524ccbff1218431press.map.output ? 9e28b8a5f524ccbff1218431pressio n.codec
?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.percent
9e28b8a5f524ccbff1218431/archives/147015 Taobao Confidential
Hive的特点1. 数据以HDFS文件的形式存储,从而可以很方便的使用外部 文件 2. 元数据存储独立于数据存储之外,从而解耦合元数据和数据, 同样的数据,不同的用户可以有不同的元数据 3. 查询计划被分解为多个MapReduce Job,并按照依赖关系依 次执行,复用了MapReduce的执行架构 4. 灵活的存储格式,通过ObjectInspector将对数据列的访问与 数据的具体存储格式解耦合,同一行数据在同一个数据处理流 中可以以不同的格式出现 5. 基于规则的查询优化器,依次使用规则转换逻辑计划16 Taobao Confidential
Hive的两个疑虑Hive很难用,很麻烦数据用^A分隔,列数固定 Create table,尽量用外部表 Add partition,添加分区
Hive很简单,性能不如自己写MRFacebook的不停优化和提升 经典场景的优化
17
Taobao Confidential
Hive的优点和长处95%的Facebook任务由Hive写成,开发周期通常十分 钟 Hive的所有执行,最终是转换为MapReduce Hive的长处,在于数据统计― ― ―
pv,uv,ipv的计算 group by,join ………………
精力放在数据逻辑上,优化数据结构和性能,而不再关 注前人已经发明的轮子,不同同事之间的成果,可以方 便的服用18 Taobao Confidential
Hive的调优基础知识Udf/udaf/udtf
进阶用法Multi-Insert & Multi-Group by
数据倾斜大小悬殊表关联
分区裁剪
Dynamic Partitioning
大量相同特殊值(Join)
大量相同特殊值(Count 笛卡尔积 Left semi join Distinct)
Map join
Multi-Count Distinct
Group By 维度过小
Union All
19
Taobao Confidential
数据平台的公用udf包UDF―
时间相关时间格式化: 字符串时间转化: 时间加/减: 时间间隔: date_format str_to_date date_add/date_sub date_diff
URL相关 URL相关
URL获取商品ID: 加密解密/编码转换 URL解码:
get_auctionid codechinese url_decode
其他
解析(key:value): 排行函数: IP格式转换:
get_key_value convert_ip20
row_numberTaobao Confidential
Hive的基础技巧分区裁剪( Pruning) 分区裁剪(Partition Pruning)Where中的分区条件,会提前生效 不必特意做子查询,直接Join和GroupBy
笛卡尔积 卡尔积尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能使用 1个reducer来完成笛卡尔积 On中不支持udf函数
Map Join
SELECT关键字后面添加/*+ MAPJOIN(tablelist) */,tablelist中的表将会读入内 存, 必须是小表,不要超过1G
Union All
先做union all再做join或group by等操作可以有效减少MR过程 尽管是多个Select,最终只有一

个mr
21
Taobao Confidential
Hive进阶用法Multi-Insert & Multi-Group byMulti-Group By一定会和Multi-Insert一起使用,从一份基础表中,按照不同纬度,一次组合出不同的数据
FROM from_statementINSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1)] select_statement1 group by key1 INSERT OVERWRITE TABLE tablename2 [PARTITION(partcol2=val2 )] select_statement2 group by key2
动态分区(Dynamic Partitioning) 在insert的过程中,根据某个字段的值进行分区,在该字段上值相同的记录会被存到一个分区中 适合用于中间表的存储,尤其是日志表,进行多级分区,下游表将会减少数据读取量 Automatic merge
当文件大小比阈值小时,hive会启动一个mr进行合并hive.merge.mapfiles = true 是否和并 Map 输出文件,默认为 True hive.merge.mapredfiles = false 是否合并 Reduce 输出文件,默认为 False hive.merge.size.per.task = 256*1000*1000 合并文件的大小 Multi-Count Distinct 必须设置参数:set hive.groupby.skewindata=true; select pid, count(distinct acookie), count(distinct ip), count(distinct wangwangid) from ods_p4ppv_ad_d where dt=20110505 group by pid;
22
Taobao Confidential
数据倾斜的原因和症状操作Join group by Count Distinct
原因key分布不均导致的 人为的建表疏忽 业务数据特点
症状任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个) reduce子任务未完成。 查看未完成的子任务,可以看到本地读写数据量积累非常大,通常超过10GB可以认定为发生数 据倾斜。
倾斜度平均记录数超过50w且最大记录数是超过平均记录数的4倍。 最长时长比平均时长超过4分钟,且最大时长超过平均时长的2倍。
23
Taobao Confidential
数据倾斜解决方法万能膏药hive.groupby.skewindata=true
24
Taobao Confidential
数据倾斜——大小表关联原因Hive在进行join时,按照join的key进行分发,而在join左边的表的数据 会首先读入内存,如果左边表的key相对分散,读入内存的数据会比较 小,join任务执行会比较快;而如果左边的表key比较集中,而这张表的 数据量很大,那么数据倾斜就会比较严重,而如果这张表是小表,则还 是应该把这张表放在join左边。
思路将key相对分散,并且数据量小的表放在join的左边,这样可以有 效减少内存溢出错误发生的几率 再进一步,可以使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.
方法Small_table join big_table25 Taobao Confidential
数据倾斜——大表和大表关联原因日志中有一部分的userid是空或者是0的情况,导致在用user_id进行hash 分桶的时候,会将日志中userid为0或者空的数据分到一起,导致了过大的 斜率。
思路把空值的key变成一个

字符串加上随机数,把倾斜的数据分到不同的 reduce上,由于null值关联不上,处理后并不影响最终结果
方法on case when (x.uid = '-' or x.uid = '0') then concat('dp_hive_search',rand()) else x.uid end = 9e28b8a5f524ccbff1218431er_id;
26
Taobao Confidential
——count 数据倾斜——count distinct大量相同特殊值倾斜原因 倾斜原因做count distinct时,该字段存在大量值为NULL或空的记录
解决思路count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以 不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union
解决方法 解决方法 count(distinct query) as query_num修正为
cast(count(distinct query)+1 as bigint) as query_num ... where query is not null and query <> ''
27
Taobao Confidential
关键参数的调节原因 错误发生的子任务 描述 类型 map aggregation使 用哈希表存储group by/distinct key和他 们的aggregation结 果。 map aggregate结果字段 过多,或group by/distinct key的散 度过大,可能导致 内存占用过多。 修复设定 减小 hive.map.aggr.hash. percentmemory设定 (默认为0.5,即使 用50%的child堆内 存)。
map aggregation
join
reduce
join需要cache所有 相同join key的非驱 动表的记录
map join
map
map join需要cache 全部小表的所有数 据28
检查是否把大表设 定为驱动表(大表 写在join的最右边)。 如果已经设定正确 的驱动表,减小 hive.join.emit.interv al设定(默认为 1000,即每1000行 的join结果集输出一 次)。 检查小表是否足够 小。如果小表超过 1G,考虑不要使用 map join。Taobao Confidential
系统整体调优
基于Sequence File 的存储优化
Auto Reduce的参数 优化
Jar包上传优化
29
Taobao Confidential
基于业务优先级的调度算法
30
Taobao Confidential
基于SequenceFile SequenceFile的存储优化—— ——生命周期 管理 SequenceFile ——
定期删除3天,7天,1月,3个月 天网调度每天扫描执行
定期合并小文件 定期合并小文件 合并小HDFS文件合并工具 HDFS9e28b8a5f524ccbff1218431/projects/apsara/wiki/YTH
天网调度,每周日中午执行 不适用于Text File
极限存储——(图海讲座) 极限存储——(图海讲座) ——新版本的完整生命周期正在开发31 Taobao Confidential
基于SequenceFile SequenceFile的存储优化—— ——中间文件压缩 SequenceFile ——压缩格式的格式和压缩算法的选择需要反复的对比和验证 压缩比,CPU消耗,性能——最佳组合
Snappy压缩优化 Snappy压缩优化 压缩 效果
采用snappy压缩算法对于云梯job中间结果进行优化
可以减低中间过程的IO,网络通讯 反作用:CPU的压力增加尝试过lzo压缩算法,结果导致老机器不

堪负荷down机 9e28b8a5f524ccbff1218431press.map.output true 9e28b8a5f524ccbff1218431pression.codec 9e28b8a5f524ccbff1218431press.SnappyCodec
32
Taobao Confidential
AutoReduce——动态判断Reduce数目对SQL进行hash抽样,在数据库中查找 SQL进行hash抽样, 进行hash抽样
Pre-hook
根据返回大小,除以128m/256m,决定reduce数目
Hive SQL 在云梯运行
7天结果大 小平均值
Post-hook将今天的结果大小更新到数据库
33
Taobao Confidential
Jar包上传优化司空见惯的写法,hive也是如此 司空见惯的写法,hive也是如此 对整个云梯的影响每天运行的1w多个job 共用到36个jar文件 jar文件被上传上万次(共近20GB) 分发达上百万次(共近9TB)hadoop jar -libjars /home/taobao/…/json.jar /home/taobao/…/_analysis.jar
优化方案通过对客户端进行设计,可以使这些jar包在hdfs上进行缓存,从而减少不 必要的上传和分发,优化作业运行。 基于md5验证缓存jar文件和本地jar文件是否匹配,不匹配时正常上传分 发 同一个jar文件只需上传和分发一次,后续所有job可以节省此jar文件上传 和分发的开销 适用于hive和mr,对上层应用完全透明34 Taobao Confidential
优化效果指标 Single slave iops slave read slave write slave network_in slave network_out Job LOCAL_READ Total Job LOCAL_WRITE Total NameNode total ops num getFileInfo ops num 6月13日 13日 660.50 12.19MB/s 17.29MB/s 10.27MB/s 10.31MB/s 313.51TB 459.02TB 445,830,000 268,080,000 6月14日 14日 571.09 12.26MB/s 14.41MB/s 9.04MB/s 9.10MB/s 226.71TB 316.98TB 386,410,000 225,080,000 变化 -13.54% +0.58% -16.70% -11.97% -11.70% -27.69% -30.94% -13.33% -16.04%天网id 天网id 18038 20087 15302 24492 19016 25164 25310 19055 中间输出降低数(Bytes) 中间输出降低数(Bytes) -4,105,392,790,786 -1,889,124,706,821 -1,205,795,273,946 -702,647,269,473 -517,058,742,208 -334,438,557,188 -283,328,850,730 -262,378,587,294
35
Taobao Confidential
海量数据处理思路
瀑布型数据流 化整为零 无缝调度 极限计算
36
Taobao Confidential
相关资源旺旺群:阿里Hadoop云梯集群(32058365) Hive同好会(463921467) ETL(3751697)
数据平台博客9e28b8a5f524ccbff1218431
新浪微博明风Andy37 Taobao Confidential

本文来源:https://www.bwwdw.com/article/br2e.html

Top