Pig 脚本生成数千张地图
Pig Script Generating Thousands of Maps
出于某种原因,此脚本在少量输入上产生了 60,000 个地图作业:
A1 = LOAD '$directory1' USING CustomLoader AS key:chararray;
A = FOREACH A1 GENERATE CustomParser(key) AS key:chararray;
B = LOAD '$filename1' USING PigStorage AS (key:chararray);
result = JOIN A BY key, B BY key USING 'replicated';
directory1有几个文件组成了大约10000行数据,filename1也有~10000行数据,它们本质上都是短字符串。目录和文件都存储在 HDFS 中。在 10 到 100 千字节的规模上,两者都不是特别大。但是,当我 运行 hadoop 中的脚本时,它会产生 60,000 个地图作业。这会导致许多其他问题 - 有时应用程序管理器 运行 内存不足,有时它在随机播放阶段挂起,以及其他各种内存不足错误。
它似乎不应该为如此小的输入创建如此多的拆分。我试过增加 max.CombinedSplitSize、mapred.min.split.size 和 dfs.block.size,但没有影响地图的数量(这是有道理的,因为我正在处理的是少量小文件) .我可能会继续增加投入到工作中的资源,但在某种程度上,这些价值是我无法控制的。
可能值得注意的是,此脚本在本地运行良好 - 只有当它 运行在实际的 hadoop 集群上运行并实际从 HDFS 读取时才会出现此问题。
有没有其他人遇到过类似的问题?如果遇到过,你做了什么来解决这个问题?
原来问题出在我的 CustomLoader 中(这是我没有预料到的)。加载程序开始定义自己的分割,并创建了大量的分割,这转化为大量的地图。这个自定义加载器明确地没有将拆分分组在一起(尽管我认为它们可能不会默认分组),所以即使许多拆分是空的或小的,它们每个都产生了自己的地图作业。由于自定义加载器是在我的所有配置更改后加载的,它覆盖了让我分组拆分的配置。
对于那些感兴趣的人,我在 subclassed InputFormat class 的 List<InputSplit> getSplits(final JobContext context)
方法中发现了拆分问题,该方法是从 InputFormat getInputFormat()
中返回的LoadFunc 的自定义 subclass。
出于某种原因,此脚本在少量输入上产生了 60,000 个地图作业:
A1 = LOAD '$directory1' USING CustomLoader AS key:chararray;
A = FOREACH A1 GENERATE CustomParser(key) AS key:chararray;
B = LOAD '$filename1' USING PigStorage AS (key:chararray);
result = JOIN A BY key, B BY key USING 'replicated';
directory1有几个文件组成了大约10000行数据,filename1也有~10000行数据,它们本质上都是短字符串。目录和文件都存储在 HDFS 中。在 10 到 100 千字节的规模上,两者都不是特别大。但是,当我 运行 hadoop 中的脚本时,它会产生 60,000 个地图作业。这会导致许多其他问题 - 有时应用程序管理器 运行 内存不足,有时它在随机播放阶段挂起,以及其他各种内存不足错误。
它似乎不应该为如此小的输入创建如此多的拆分。我试过增加 max.CombinedSplitSize、mapred.min.split.size 和 dfs.block.size,但没有影响地图的数量(这是有道理的,因为我正在处理的是少量小文件) .我可能会继续增加投入到工作中的资源,但在某种程度上,这些价值是我无法控制的。
可能值得注意的是,此脚本在本地运行良好 - 只有当它 运行在实际的 hadoop 集群上运行并实际从 HDFS 读取时才会出现此问题。
有没有其他人遇到过类似的问题?如果遇到过,你做了什么来解决这个问题?
原来问题出在我的 CustomLoader 中(这是我没有预料到的)。加载程序开始定义自己的分割,并创建了大量的分割,这转化为大量的地图。这个自定义加载器明确地没有将拆分分组在一起(尽管我认为它们可能不会默认分组),所以即使许多拆分是空的或小的,它们每个都产生了自己的地图作业。由于自定义加载器是在我的所有配置更改后加载的,它覆盖了让我分组拆分的配置。
对于那些感兴趣的人,我在 subclassed InputFormat class 的 List<InputSplit> getSplits(final JobContext context)
方法中发现了拆分问题,该方法是从 InputFormat getInputFormat()
中返回的LoadFunc 的自定义 subclass。