Pig:控制映射器的数量

Posted

技术标签:

【中文标题】Pig:控制映射器的数量【英文标题】:Pig: Control number of mappers 【发布时间】:2014-06-16 07:13:56 【问题描述】:

我可以通过在导致 reducer 的语句中使用 PARALLEL 子句来控制 reducer 的数量。

我想控制映射器的数量。数据源已经创建,我无法减少数据源中的零件数量。是否可以控制我的 pig 语句生成的地图数量?我可以对生成的地图数量设置上限和上限吗?控制它是个好主意吗?

我尝试使用 pig.maxCombinedSplitSize、mapred.min.split.size、mapred.tasktracker.map.tasks.maximum 等,但它们似乎没有帮助。

有人可以帮我了解如何控制地图的数量并可能分享一个工作示例吗?

【问题讨论】:

您的数据的性质是什么?大小,每个投影的小文件数量? @alexeipab,我的输入数据是几个(7 到 8)GB,每个部分文件有几个(10 到 20)mbs 数据。这些参数有影响吗?我的问题相当笼统。我想了解控制映射器数量的不同方法。 【参考方案1】:

映射器的数量有一个简单的经验法则:映射器的数量与文件拆分的数量一样多。文件拆分取决于 HDFS 将文件拆分成的块的大小(64MB、128MB、256MB,具体取决于您的配置),请注意 FileInput 格式会考虑在内,但可以定义自己的行为。

拆分很重要,因为它们与集群中数据的物理位置相关联,Hadoop 将代码带入数据而不是数据带入代码。

当文件的大小小于块的大小(64MB、128MB、256MB)时就会出现问题,这意味着会有多少输入文件就有多少分片,效率不高,因为每个 Map任务通常启动时间。在这种情况下,最好的办法是使用 pig.maxCombinedSplitSize,因为它会尝试将多个小文件读入一个 Mapper,从而忽略拆分。但是,如果您将其设置得太大,您将面临将数据带入代码的风险,并且会遇到网络问题。如果您强制使用太少的 Mapper,您可能会受到网络限制,因为数据必须从其他数据节点流式传输。保持数字接近块大小或一半,你应该没问题。

其他解决方案可能是将小文件合并为一个大的可拆分文件,这将自动生成有效数量的映射器。

【讨论】:

感谢您的回答。正如我在问题中提到的,我尝试将 pig.maxCombinedSplitSize 设置为我的块大小(512MB),但这根本没有改变映射器的数量。当前生成的映射器数量约为 2500。除了 pig.maxCombinedSplitSize 之外,我还需要设置其他任何东西吗? 勾选这个 pig.splitCombination – 打开或关闭合并拆分文件(默认设置为“true”)。 谢谢!它有帮助。我不需要将 pig.maxCombinedSplitSize 设置为 true,因为 true 是默认值。我没有尝试为 pig.maxCombinedSplitSize 提供足够好的值来查看映射器的数量下降。作为一个实验,我尝试将其设置为 2GB,它显示了效果。我将值设置为数据块大小的一半。【参考方案2】:

您可以将属性 mapred.map.tasks 更改为您想要的数字。此属性包含默认地图任务/作业。而不是全局设置它,而是为您的会话设置属性,以便在您的工作完成后恢复默认值。

【讨论】:

以上是关于Pig:控制映射器的数量的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在Scalding中指定映射器的数量?

在猪中增加映射器

无法在 Sqoop 导出中自定义的映射器数量

在 DataStax Enterprise 中更改减速器/映射器的数量

运行 Sqoop 导入和导出时如何找到最佳映射器数量?

在映射器的单个输出上运行多个减速器