Hadoop Apache Pig:简化程序的扁平化和并行执行

Hadoop Apache Pig:简化程序的扁平化和并行执行,hadoop,apache-pig,Hadoop,Apache Pig,我已经实现了一个apachepig脚本。当我执行脚本时,它会为特定步骤生成许多映射器,但该步骤只有一个缩减器。由于这种情况(多个映射器,一个reducer),Hadoop集群在执行单个reducer时几乎处于空闲状态。为了更好地利用集群的资源,我还希望有许多并行运行的还原程序 即使我使用SETDEFAULT_PARALLEL命令在Pig脚本中设置了并行性,我仍然会导致只有1个减速机 出现问题的代码部分如下所示: SET DEFAULT_PARALLEL 5; inputData = LOAD '

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

即使我使用SETDEFAULT_PARALLEL命令在Pig脚本中设置了并行性,我仍然会导致只有1个减速机

出现问题的代码部分如下所示:

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”别名在映射器中计算

减速器中的“成对”和“成对扁平”

如果我通过使用flatte命令(pairsFlat=FOREACH pairs GENERATE flatte(pairs_-bag)AS(item1:int,item2:int);)删除行来更改脚本,那么执行将导致5个减缩器(从而并行执行)

看来“展平”命令就是问题所在,它避免了创建许多减速器

我如何才能达到相同的扁平化结果,但让脚本并行执行(使用许多简化程序)

编辑:

当有两个FOREACH(如上所述)时,说明计划:

解释只有一个FOREACH与扁平包装UDF时的计划:

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

我认为数据有偏差。只有少数映射程序产生指数级的大输出。查看数据中键的分布。Like数据包含少数具有大量记录的组。

如果pig脚本中的每个步骤都使用配置默认并行值,则无法确定。尝试并行执行您觉得需要时间的特定加入/小组步骤(在您的案例小组步骤中)

如果它仍然不起作用,那么您可能必须查看您的数据以了解偏斜问题。

我尝试了“设置默认并行”和“并行100”,但没有成功。清管器仍然使用1个减速机

事实证明,我必须为每条记录生成一个从1到100的随机数,并根据该随机数对这些记录进行分组

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

以下是代码(提交者是我自己的UDF):


要回答您的问题,我们必须首先知道pig执行了多少还原程序来完成全局重新排列过程。因为根据我的理解,生成/投影不需要单个减速器。我不能对Flatte说同样的话。然而,我们从常识中知道,在展平过程中,目标是将元组从包中去嵌套,反之亦然。要做到这一点,属于一个包的所有元组都应该在同一个reducer中可用。我可能错了。但是有人可以在这里添加一些东西来获得这个用户的答案吗

当您只有一个时,减速器需要多长时间才能完成?2个FOREACH别名是否可以与包裹UDF的扁平化组合?否则,请查看并使用
解释
以了解combiner是如何使用的。@WinnieNicklaus:谢谢您的评论。计算减速机需要几天时间。问题是服务器几乎一直处于空闲状态,因为这个单一的reducer只需要查看它的资源…@libjack:谢谢你的反馈。我也尝试只使用一个FOREACH,但不幸的是结果是一样的,只有一个减速器。解释的输出对于两个版本都是相似的(参见编辑的问题)。如果你查看你的作业统计,有多少个reduce输入键?也许您的所有数据都解析为一个reduce输入键?对于我来说,这是在类似问题中描述的情况下的解决方案。我仍然有点困惑,尽管为语句显式地设置并行级别会导致不同的行为,而在脚本开始时只设置一次default_PARALLEL。Pig文档似乎建议在整个脚本中使用默认的_parallel(除非通过使用“parallel”关键字在语句级别覆盖)。
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
 inputDataGrouped = GROUP inputData BY (group_name) PARALLEL 67;
tmpRecord = FOREACH record GENERATE (int)(RANDOM()*100.0) as rnd, data;
groupTmpRecord = GROUP tmpRecord BY rnd;
result = FOREACH groupTmpRecord GENERATE FLATTEN(SUBMITTER(tmpRecord));