Apache pig 清管器:强制UDF出现在减速器中或设置映射器的数量

Apache pig 清管器:强制UDF出现在减速器中或设置映射器的数量,apache-pig,Apache Pig,我有一个pig脚本,它运行一个非常耗时的UDF。Pig似乎正在将UDF设置为作为映射作业而不是reduce作业运行。因此,将创建少量次优的映射程序来运行作业。我知道我可以使用setDefaultParallel以及PigLatin中的PARALELL x命令设置清管器中使用的默认减速器数量,以设置给定线路的减速器数量。但是如何设置映射器的数量呢?我已经看到过一些关于通过定义我自己的InputSplit大小来增加映射器数量的帖子,但是我想将映射器的数量显式设置为主机数量*核心数量,文件大小不应该与

我有一个pig脚本,它运行一个非常耗时的UDF。Pig似乎正在将UDF设置为作为映射作业而不是reduce作业运行。因此,将创建少量次优的映射程序来运行作业。我知道我可以使用
setDefaultParallel
以及PigLatin中的
PARALELL x
命令设置清管器中使用的默认减速器数量,以设置给定线路的减速器数量。但是如何设置映射器的数量呢?我已经看到过一些关于通过定义我自己的InputSplit大小来增加映射器数量的帖子,但是我想将映射器的数量显式设置为主机数量*核心数量,文件大小不应该与之有任何关系

如果我不能控制映射器的数量,那么既然我可以控制这些映射器,是否有必要强制我的UDF作为一个减缩器出现

  • 不,您可以显式地指定映射器的数量,因为Hadoop不是这样工作的。创建的映射器的数量大致为
    总输入大小
    /
    输入分割大小
    ,但如果有大量小文件(由于HDFS的工作方式,不鼓励这样做),则可能会出现偏差。所以基本上,Pig不允许您这样做,因为Hadoop从定义上讲没有这个选项
  • 不,反正不是和猪一起。也因为“它不是那样工作的”。Pig为您编译和优化内容,输出是一个MR作业流。当下一个版本的Pig发布时,任何迫使UDF进入减速器的黑客行为都可以很容易地改变。如果您觉得在reducer中确实需要UDF,您可以创建一个定制的MR job jar,在其中实现一个drop-through映射器,然后在reducer中完成您的工作。您可以使用
    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);
    }