Pig 调优实践经验总结

张贵宾

guibin.beijing@gmail.com

2012-01-17

本文会不断更新,欢迎大家补充。

1. pig.maxCombinedSplitSize 和 pig.splitCombination

在实际使用PIG处理数据时,会经常要处理大批量的小文件。在这种情况下,如果不对Pig脚本进行任何特别设置,默认情况下很有可能会遇到类似这样的“命名空间超过配额限制”的错误:

org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: org.apache.hadoop.hdfs.protocol.NSQuotaExceededException:
The NameSpace quota (directories and files) of directory /projects/user_grid is exceeded: quota=1000000 file count=1000001

或者如果你发现,你的Pig脚本运行结果会产生数量巨大的输出文件(通常在没有reduce时),比如几万甚至几十万个文件输出,则这条经验应该能解决你的问题。

出现这种问题的原因就是由于在处理数据过程中,Pig为每一个输入文件都创建了一个相应的mapper,每个mapper就会产生相应的一个输出文件。这种行为当然是正确的,也是Hadoop框架的设计所要求的,因为Hadoop框架会为每个data block创建一个mapper,如果一个文件小于dfs.block.size(默认为64M),则此文件会独占一个block,不与别的文件共享该data block。这种默认行为对于输入data block数量(或者文件数量)巨大的情况下,代价会非常昂贵,执行效率非常低。解决方案很自然就是将data block做适当的合并,然后为合并后的每个split创建一个mapper。

在Pig 0.80之后的版本,Pig提供了能够合并多个输入文件生成一个split的功能。当在Pig脚本中设置了

SET pig.splitCombination true;
SET pig.maxCombinedSplitSize 134217728; -- 134217728 = 128M

之 后,Pig在运行mapper之前,首先会把小于128M的小文件都合并成128M之后,再创建与之对应的mapper。如果没有设置maxCombinedSplitSize,则Pig会自动按照HDFS的block size合并小文件。如果需要将自动合并小文件的功能关闭,只需要 ‘SET pig.splitCombination false;’ 即可。根据目前我的经验,至少Pig 0.91版本默认 pig.splitCombination为false。 从实现原理上讲,当设置了pig.splitCombination为true之后,Pig将使用CombinedInputFormat来读取输入,使用CombinedInputSplit实例而非默认的InputSplit实例。CombinedInputFormat用来代替即将弃用的MultiFileInputFormat,会基于data block的locality特性批量合并小文件。在Pig内部,如果输入Input的locality(位置)信息不可用,那么此接口也能正常工作。因此combined input format将有多个通用的split合并而成,直到合并的size达到pig.maxCombinedSplitSize或者dfs.split.size。

然而由于在merge join table中排序的限制,split combination将不会用在任何有merge join的地方。但是在map阶段的cogroup和map阶段的group by,那些split会被合并,因为在map阶段的这些操作,仅仅要求被合并的数据保留重复的key,combine并没有影响到重复key这些要素。在合并过程中,在同一节点上的split尽可能的被合并,剩下未合并的split将不会考虑locality因素而拷贝到其他node上去合并。在每个结点上,将会采用贪婪的方法合并,最大的split会优先于小的split合并。

2. maxCombineSplitSize设置为多少效率最好?

本地执行job占全部job的比例越高,则执行速度越快。在Job tracker的监控web页面中,会有一个summary页面显示该job的各项数据,在Job Counter一栏中有Rack-local map tasks、Launched map tasks、Data-local map tasks三项数据,分别表示在同一个机柜中执行的map task数目,启动的map task数目,本地执行的map task数目。在这个summary页面的上方,还会显示successful map tasks,表示最终成功执行的map task数目。我们可以简单的用 data-local map tasks / successful map tasks = 本地执行的map tasks的比例作为指标来衡量在map阶段的效率。

我测试了一下,输入是10T的二进制日志数据,做一般字段的抽取,输出为table分割的文本,没有reduce操作,hadoop集群有2773个Map slot可用测试结果如下:

maxCombineSplitSize Data-local Map Tasks Successful Map Tasks Execution Duration Ratio
3600000000 2026 3284 3H 19' 30'' 2026/3807 = 0.532
4250000000 1580 2772 3H 28' 27'' 1580/2805 = 0.563
2000000000 4283 5620 2H 31' 59'' 4283/6396 = 0.6696
1000000000 8729 10964 2H 4' 39'' 8729/12386 = 0.7047
512000000 20200 23806 1H 57' 4'' 20200/23806 = 0.8489

单纯从map的速度而言,如果不是大多数文件size都大大小于dfs.block.size,如果输出的文件数目能够接受且不会产生异常的情况下,当然是每个block对应一个mapper的效率最高了。如果是文件数目过多(即便每个文件都大于dbf.block.size),整个过程中没有reduce操作,那么每个block对应一个mapper会导致输出大量文件,撑爆hdfs的name space。在实际中应该本着不会产生异常的情况下,使得本地执行job的比例尽量高的目标去设置maxCombineSplitSize。

3. mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution

在使用Pig处理大批量数据时,通常是T级别及以上的情况下,你会发现当pig job被提交后,起初执行速度还挺不错,但是到了90%之后,job的执行就如同蜗牛在爬行。打开job tracker的页面,点开running链接,看看正在执行的task是什么时候启动的,你就会发现,原来这些拖后腿的task原来大多数很早就被启动执行了。就是因为这些task导致整个job在后期执行非常缓慢。那么这种情况下,你需要打开mapred的speculative开关为true,Map-Reduce框架就会侦测执行缓慢的task,启动新的task做相同的事情,最终把拖后腿的task都kill掉,从而有效的提高了pig job的执行速度。

SET mapred.map.tasks.speculative.execution true;
SET mapred.reduce.tasks.speculative.execution true;

参考资料文献:

https://issues.apache.org/jira/browse/PIG-1518

Pig 调优实践经验总结相关推荐

  1. B站Up主上传质量调优实践

    Up主上传的大量优质视频内容使得bilibili(B站)深受年轻用户的喜爱.bilibili视频云高级研发经理 唐君行在LiveVideoStack线上交流分享中详细介绍了B站为提供更流畅.稳定用户体 ...

  2. Web2.0网站性能调优实践(引用王宗义)

    Web2.0网站性能调优实践 当前web2.0革命风起云涌,web2.0强调服务,而服务最基本的要求是速度快和稳定,离开这两个谈功能强大和易用性都没有任何意义.本文介绍一些关于笔者运营一个web2.0 ...

  3. Azure SQL性能调优实践

    Azure SQL性能调优实践 注:blog具备时效性,所有内容都是在当前时间为准,截止时间2017-6-5 首先,创建了一个测试数据库 MaxAadventureWorkTest 使用了 示例数据库 ...

  4. 【Elasticsearch】eBay上的Elasticsearch性能调优实践

    1.概述 翻译:eBay上的Elasticsearch性能调优实践 中文版:eBay上的Elasticsearch性能调优实践 Elasticsearch 是一个基于 Apache Lucene 的开 ...

  5. 查询性能显著提升,Apache Doris 向量化版本在小米 A/B 实验场景的调优实践

    导读: 长期以来,Apache Doris在小米集团都有着广泛的应用.随着小米互联网业务的快速发展,用户对Apache Doris的查询性能提出了更高的要求,Doris 向量化版本在小米内部上线已经迫 ...

  6. 深入理解JVM虚拟机10:JVM常用参数以及调优实践

    本文转自[JVM常用参数以及调优实践](https://blog.csdn.net/a724888/article/details/78367780) JVM常用参数选项 jvm 可配置的参数选项可以 ...

  7. 【转载】软件性能测试分析与调优实践之路-性能分析调优思想与调优技术总结

    本文主要阐述软件性能测试中的一些调优思想和技术,节选自作者新书<软件性能测试分析与调优实践之路>部分章节归纳. 一.  性能分析与调优思想 1.性能分析调优模型 性能测试除了为获取性能指标 ...

  8. 《软件性能测试、分析与调优实践之路》学习

    这是一本理论和实践相结合的同时面向研发和测试岗的关于性能分析诊断调优实践的图书,比起其他的很多性能测试的图书,本书中内容更侧重于介绍如何去发现性能问题.分析诊断性能问题以及对发现的性能问题进行调优.书 ...

  9. 软件性能测试分析与调优实践之路-性能分析调优思想与调优技术总结

    来源:https://www.cnblogs.com/laoqing/p/13660768.html 本文主要阐述软件性能测试中的一些调优思想和技术,节选自作者新书<软件性能测试分析与调优实践之 ...

最新文章

  1. python 中间一列左对齐_Python|fstring我喜欢Python的原因之一
  2. php+ok,php fscokopen实现数据异步调用代码
  3. 前端后端接口那些事吐槽
  4. 围绕央行系统升级所产生的常见问题
  5. 云米冰箱能控制扫地机器人_实现家电互联,从一台云米冰箱开始
  6. mysql配置后无法在dos里运行
  7. 《黑马程序员 MySQL数据库入门到精通,从MySQL安装到MySQL高级、MySQL优化全囊括》——学习笔记基础篇
  8. 默纳克万能协议服务器图片,默纳克万能MDKE6服务器使用说明.docx
  9. 软件的静态测试和动态测试【软件测试分类】
  10. 终极方案 | 梯子(V*n)导致的远程计算机或设备将不接受连接
  11. 2021-09-19
  12. MATLAB矩阵相关函数学习--中级函数
  13. 统计推断(一) Hypothesis Test
  14. 非线性回归分析及其Matlab实现
  15. 【机试题】2014大疆嵌入式笔试题(附超详细解答,下篇)
  16. python 自制搜狗翻译工具
  17. access 数据计算,常用函数
  18. 【亲测可用】revit2022安装教程
  19. 超详细带你入门开发一个超实用的浏览器插件
  20. 最新传智播客P2P金融项目网络借贷平台开发

热门文章

  1. h5中performance.timing轻松获取网页各个数据 如dom加载时间 渲染时长 加载完触发时间...
  2. 实施化化工厂人员定位系统势在必行,你不知道的化化工厂人员定位
  3. JAVA 中 Redis与ehcache对比与使用
  4. Java实验——设计一个数组模型,用于存储体育项目成绩男生体育项目有足球、长跑和铅球,女生体育项目有跳舞、体操、游泳。设计排序算法,将变量a、b、c中的数值按大小顺利进行互换(从大到小排列)。
  5. node php v2ex,一个仿V2EX的开源二次元论坛程序:Vmoex安装教程
  6. php常用函数wps,[WPSEC]——WP
  7. qt撤销与回退_Qt 的撤销回退事件 - osc_1i3ltp99的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 资深Android开发带你入门Framework,深夜思考
  9. 备战金九银十,腾讯 T4 梳理 2022 年最全 999 道 Java 岗必备面试题答案
  10. 案件被终本后,失信被执行人会从黑名单中移除吗?