Apache pig 清管器:强制UDF出现在减速器中或设置映射器的数量
我有一个pig脚本,它运行一个非常耗时的UDF。Pig似乎正在将UDF设置为作为映射作业而不是reduce作业运行。因此,将创建少量次优的映射程序来运行作业。我知道我可以使用Apache pig 清管器:强制UDF出现在减速器中或设置映射器的数量,apache-pig,Apache Pig,我有一个pig脚本,它运行一个非常耗时的UDF。Pig似乎正在将UDF设置为作为映射作业而不是reduce作业运行。因此,将创建少量次优的映射程序来运行作业。我知道我可以使用setDefaultParallel以及PigLatin中的PARALELL x命令设置清管器中使用的默认减速器数量,以设置给定线路的减速器数量。但是如何设置映射器的数量呢?我已经看到过一些关于通过定义我自己的InputSplit大小来增加映射器数量的帖子,但是我想将映射器的数量显式设置为主机数量*核心数量,文件大小不应该与
setDefaultParallel
以及PigLatin中的PARALELL x
命令设置清管器中使用的默认减速器数量,以设置给定线路的减速器数量。但是如何设置映射器的数量呢?我已经看到过一些关于通过定义我自己的InputSplit大小来增加映射器数量的帖子,但是我想将映射器的数量显式设置为主机数量*核心数量,文件大小不应该与之有任何关系
如果我不能控制映射器的数量,那么既然我可以控制这些映射器,是否有必要强制我的UDF作为一个减缩器出现
总输入大小
/输入分割大小
,但如果有大量小文件(由于HDFS的工作方式,不鼓励这样做),则可能会出现偏差。所以基本上,Pig不允许您这样做,因为Hadoop从定义上讲没有这个选项MAPREDUCE
命令从pig调用它。然而,这个解决方案听起来是错误的,你可能误解了什么。你可以看看是什么迫使一个reduce-for-Pig得到一个大主意--不同的
,限制
和顺序
总是这样做,而组
通常也会这样做。JOIN
通常会同时获得映射器和减缩器。如您所见,强制reduce的操作是利用Hadoop的一些固有特性的操作(比如ORDER
处于reduce中,因为reducer输入被排序)。没有简单的方法可以将UDF隐藏在其中,因为没有任何类型的UDF(评估、过滤、加载、存储)可以轻松地与减速器一起使用您可以使用“mapred.max.split.size”控制生成更多的映射程序。拆分适用于某些输入格式和压缩格式。例如,GZ输入是不可拆分的。
Pig允许合并较小的输入文件。以下是当前Pig版本的操作方式,这个技巧对我来说总是有效的,在使用不同的、限制的顺序后,在嵌套的FOREACH中生成始终作为减缩器运行, 例如 这些操作还会删除数据中的所有重复行
A = FOREACH (GROUP DATA BY some_unique_field/all fields){
LIMIT DATA.field 1;
GENERATE udf.func(fields);
}