Apache Pig:FLATTEN和reducers的并行执行

时间:2013-11-07 12:00:23

标签: hadoop apache-pig

我已经实现了Apache Pig脚本。当我执行脚本时,它会为特定步骤生成许多映射器,但该步骤只有一个reducer。由于这种情况(许多映射器,一个减速器),Hadoop集群几乎处于空闲状态,而单个减速器执行时。为了更好地使用集群资源,我希望还有许多并行运行的reducer。

即使我使用SET DEFAULT_PARALLEL命令在Pig脚本中设置并行性,我仍然只有1个reducer。

发出问题的代码部分如下:

SET DEFAULT_PARALLEL 5;
inputData = LOAD 'input_data.txt' AS (group_name:chararray, item:int);
inputDataGrouped = GROUP inputData BY (group_name);
-- The GeneratePairsUDF generates a bag containing pairs of integers, e.g. {(1, 5), (1, 8), ..., (8, 5)}
pairs = FOREACH inputDataGrouped GENERATE GeneratePairsUDF(inputData.item) AS pairs_bag;
pairsFlat = FOREACH pairs GENERATE FLATTEN(pairs_bag) AS (item1:int, item2:int);

'inputData'和'inputDataGrouped'别名在映射器中计算。

减速器中的'pair'和'pairsFlat'。

如果我通过使用FLATTEN命令删除行来更改脚本(pairsFlat = FOREACH对GENERATE FLATTEN(pairs_bag)AS(item1:int,item2:int);)然后执行会导致5个reducers(因此在并行执行)。

似乎FLATTEN命令是问题,并且避免创建许多减速器。

我怎样才能达到FLATTEN的相同结果,但让脚本并行执行(有很多减速器)?

修改

有两个FOREACH时的EXPLAIN计划(如上所述):

Map Plan
inputDataGrouped: Local Rearrange[tuple]{chararray}(false) - scope-32
|   |
|   Project[chararray][0] - scope-33
|
|---inputData: New For Each(false,false)[bag] - scope-29
    |   |
    |   Cast[chararray] - scope-24
    |   |
    |   |---Project[bytearray][0] - scope-23
    |   |
    |   Cast[int] - scope-27
    |   |
    |   |---Project[bytearray][1] - scope-26
    |
    |---inputData: Load(file:///input_data.txt:org.apache.pig.builtin.PigStorage) - scope-22--------


Reduce Plan
pairsFlat: Store(fakefile:org.apache.pig.builtin.PigStorage) - scope-42
|
|---pairsFlat: New For Each(true)[bag] - scope-41
    |   |
    |   Project[bag][0] - scope-39
    |
    |---pairs: New For Each(false)[bag] - scope-38
        |   |
        |   POUserFunc(GeneratePairsUDF)[bag] - scope-36
        |   |
        |   |---Project[bag][1] - scope-35
        |       |
        |       |---Project[bag][1] - scope-34
        |
        |---inputDataGrouped: Package[tuple]{chararray} - scope-31--------
Global sort: false

只有一个FOREACH与FLATTEN包装UDF时的EXPLAIN计划:

Map Plan
inputDataGrouped: Local Rearrange[tuple]{chararray}(false) - scope-29
|   |
|   Project[chararray][0] - scope-30
|
|---inputData: New For Each(false,false)[bag] - scope-26
    |   |
    |   Cast[chararray] - scope-21
    |   |
    |   |---Project[bytearray][0] - scope-20
    |   |
    |   Cast[int] - scope-24
    |   |
    |   |---Project[bytearray][1] - scope-23
    |
    |---inputData: Load(file:///input_data.txt:org.apache.pig.builtin.PigStorage) - scope-19--------


Reduce Plan
pairs: Store(fakefile:org.apache.pig.builtin.PigStorage) - scope-36
|
|---pairs: New For Each(true)[bag] - scope-35
    |   |
    |   POUserFunc(GeneratePairsUDF)[bag] - scope-33
    |   |
    |   |---Project[bag][1] - scope-32
    |       |
    |       |---Project[bag][1] - scope-31
    |
    |---inputDataGrouped: Package[tuple]{chararray} - scope-28--------
Global sort: false

4 个答案:

答案 0 :(得分:3)

如果pig对pig脚本中的每个步骤使用配置DEFAULT_PARALLEL值,则无法保证。尝试PARALLEL以及您感觉需要花费时间的特定加入/组步骤(在您的情况下为GROUP步骤)。

 inputDataGrouped = GROUP inputData BY (group_name) PARALLEL 67;

如果它仍然不起作用,那么您可能必须查看数据是否存在偏斜问题。

答案 1 :(得分:1)

我认为数据存在偏差。只有少数地图制作者产生指数级大的输出。查看数据中键的分布。类似数据包含少数具有大量记录的组。

答案 2 :(得分:1)

我试过"设置默认并行"和" PARALLEL 100"但没有运气。猪仍然使用1个减速器。

事实证明,我必须为每条记录生成1到100的随机数,并按随机数对这些记录进行分组。

我们在分组上浪费时间,但对我来说要快得多,因为现在我可以使用更多的减速器。

这是代码(SUBMITTER是我自己的UDF):

tmpRecord = FOREACH record GENERATE (int)(RANDOM()*100.0) as rnd, data;
groupTmpRecord = GROUP tmpRecord BY rnd;
result = FOREACH groupTmpRecord GENERATE FLATTEN(SUBMITTER(tmpRecord));

答案 3 :(得分:0)

要回答您的问题,我们必须首先了解猪执行的减压器数量 - 全局重排过程。因为根据我的理解,生成/投影不应该需要一个减速器。我不能对Flatten说同样的话。然而,我们从常识中知道,在展平期间,目标是从袋子中去除元组,反之亦然。要做到这一点,属于一个包的所有元组都应该在同一个减速器中可用。我可能错了。但是,有人可以在这里添加一些东西来获得这个用户的答案吗?