我可以通过在导致reducers的语句中使用PARALLEL子句来控制reducers的数量。
我想控制地图制作者的数量。数据源已经创建,我无法减少数据源中的部件数量。是否可以控制我的猪声明产生的地图数量?我可以在产生的地图数量上设置上限和上限吗?控制它是一个好主意吗?
我尝试使用pig.maxCombinedSplitSize,mapred.min.split.size,mapred.tasktracker.map.tasks.maximum等,但它们似乎无济于事。
有人可以帮我理解如何控制地图的数量,并可能分享一个有效的例子吗?
答案 0 :(得分:7)
对于映射器的数量有一个简单的经验法则:有多个映射器和文件拆分一样多。文件拆分取决于HDFS拆分文件的块大小(64MB,128MB,256MB,具体取决于您的配置),请注意FileInput格式会考虑,但可以定义自己的行为。
拆分非常重要,因为它们与集群中数据的物理位置相关联,Hadoop为数据提供代码而不向代码提供数据。
当文件的大小小于块的大小(64MB,128MB,256MB)时出现问题,这意味着将有与输入文件一样多的分割,这不是有效的,因为每个Map任务通常是启动时间。在这种情况下,最好的办法是使用pig.maxCombinedSplitSize,因为它会尝试将多个小文件读入一个Mapper,忽略分割。但是如果你把它做得太大,就会冒着将数据带入代码的风险,并且会遇到网络问题。如果强制使用太少的Mapper,则可能存在网络限制,因为必须从其他数据节点流式传输数据。保持数字接近块大小或一半,你应该没问题。
其他解决方案可能是将小文件合并为一个大的可拆分文件,这将自动生成有效数量的Mapper。
答案 1 :(得分:0)
您可以将属性mapred.map.tasks更改为您想要的数字。该属性包含默认的地图任务/作业。而不是全局设置它为您的会话设置属性,因此一旦您的工作完成,将恢复默认值。