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;
参考资料文献:
相关推荐
根据给定的文件信息,我们可以深入探讨Apache Pig的性能优化及其在大数据处理中的角色与优势。首先,让我们从Apache Pig的基本...对于Apache Pig的使用者而言,深入理解其内部机制和最佳实践是提升数据分析效率的关键。
7. 性能调优:通过对源码的深入研究,可以了解Pig的性能瓶颈以及如何进行优化。例如,调整并行度、使用更高效的排序算法、优化数据分区策略等。 总之,Pig的源码包提供了丰富的学习资源,无论是对初学者还是资深...
《Apache Pig 0.17.0 安装与配置指南》 Apache Pig 是一个用于大数据分析的平台,它提供了一种高级语言 Pig Latin 来处理大规模...通过不断的实践和学习,你将能更好地掌握Pig的潜力,为大数据分析带来强大的动力。
总的来说,研究"PIG微服务前后端源码"能够提供一个全方位的学习机会,涵盖了微服务架构设计、前端开发实践和后端服务实现的深度知识。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技能水平。
Apache Pig是一个开源的平台,它为用户提供了一种高级查询语言,即Pig Latin,用于处理大规模数据集。Pig Latin抽象了MapReduce编程模型,从而使得数据分析师能够轻松地编写数据转换脚本,而无需深入Java编程。Pig...
### Apache Pig的基础概念及用法总结 #### 一、引言 Apache Pig是一种高级的数据流语言,用于在Hadoop平台上处理大规模数据集。它通过提供一种抽象层,简化了复杂的大规模数据处理任务,使用户能够更加专注于数据...
在Hadoop平台上,Pig是一种高级脚本语言,用于处理和分析大数据。Pig允许用户执行复杂的转换和数据查询,这些操作原本需要使用Java MapReduce编程,而Pig通过提供一套数据流语言和执行框架,简化了这一过程。 Pig...
《Hadoop系统搭建及项目实践》课件09分布式数据分析工具 Pig.pdf《Hadoop系统搭建及项目实践》课件09分布式数据分析工具 Pig.pdf《Hadoop系统搭建及项目实践》课件09分布式数据分析工具 Pig.pdf《Hadoop系统搭建及...
《深入理解Pig 0.15源码:大数据处理框架的奥秘》 Pig是Apache Hadoop项目中的一个高级数据流语言和执行框架,主要用于处理大规模数据集。Pig 0.15版是Pig发展过程中的一个重要里程碑,它的源码为我们提供了深入...
《Pig工具包在Hadoop云计算中的应用与详解》 Pig是Apache Hadoop生态系统中的一个强大工具,专为大规模数据处理而设计。"pig-0.7.0.tar.gz"是一个包含Pig 0.7.0版本的压缩包,它的出现为我们提供了一个高效的、基于...
本指南将深入探讨Pig编程的核心概念,结合从GitHub下载的"programmingpig-master"源码,为学习者提供一个实践和理解Pig的平台。 一、Pig Latin:Pig的数据流语言 Pig Latin是一种声明式语言,允许用户编写复杂的...
书中的内容可能包括Pig性能调优技巧,如并行度调整、数据本地化、使用嵌套数据类型等。 7. **Pig UDF开发**:用户定义函数(UDF)允许开发者扩展Pig的功能。书中可能会讲解如何创建Java或Python的UDF,以及如何在...
总结,"pig-0.9.2.tar.gz"是一个重要的数据处理工具,它通过Pig Latin语言简化了Map-Reduce的开发,使得非Java开发者也能轻松应对大数据挑战。通过深入理解和熟练使用Pig,我们可以更高效地挖掘和利用大规模数据,...
#### 七、总结 Pig作为一款强大的大数据处理工具,通过其丰富的命令和灵活的数据处理机制,为用户提供了一个高效的数据处理平台。无论是数据清洗、转换还是复杂的查询需求,Pig都能够轻松应对。通过掌握Pig的基本...
总结起来,`pig.jar`和`pigunit.jar`是Pig平台的核心组成部分,分别负责Pig Latin的执行和测试。Java编程在这里扮演了扩展Pig功能的角色,允许开发者用Java实现自定义逻辑。通过Ant进行编译管理,整个流程变得更加...
总结,Pig-0.9.1作为Hadoop生态中的重要组件,提供了高效的数据处理能力。通过理解Pig Latin语言和正确配置,用户可以充分利用Hadoop的分布式计算能力,实现复杂的数据分析任务。在实际应用中,还需要根据具体需求和...
本课程“Hadoop大数据开发与性能调优实战培训课程-Hadoop组件详解”旨在深入探讨Hadoop的主要组件及其优化策略,帮助开发者和数据工程师提升在大数据环境中的实践能力。 首先,我们要了解Hadoop的基础架构,它主要...
《Pig编程指南》是一本...这本书不仅适合初学者,也对有经验的Pig用户有所启发,帮助他们提高在大数据环境下的编程技能。通过阅读和实践书中的内容,读者可以深入理解Pig的工作原理,进而运用Pig解决实际的大数据问题。
同时,官方文档详尽地介绍了 Pig 的使用方法、API 和最佳实践,为初学者和高级用户提供有力的指导。 总的来说,Pig-0.12.0-cdh5.5.0.tar.gz 文件是大数据开发者和分析师在 CDH 平台上进行数据处理的重要资源。通过...