Hadoop Pig CPU密集型任务-小数据文件-多个映射器?

Hadoop Pig CPU密集型任务-小数据文件-多个映射器?,hadoop,apache-pig,Hadoop,Apache Pig,我在寻找如何提高养猪工作绩效的建议 输入是一个文件(MB),但是对于文件中的每一行,都会执行一个非常CPU密集的任务 因此,理想的做法是在我的AmazonEMR集群中的多个映射器(和机器)上拆分此文件 但是我找不到一种方法来实现这一点,因为Hadoop自然只会以64(或者是128?)MB的间隔进行拆分,所以我只有一个映射器 我已经研究了NLineInputFormat(),但这是针对旧API的,也不确定它如何与Pig一起工作 为了使事情进一步复杂化,我使用CSVExcelStorage pigg

我在寻找如何提高养猪工作绩效的建议

输入是一个文件(MB),但是对于文件中的每一行,都会执行一个非常CPU密集的任务

因此,理想的做法是在我的AmazonEMR集群中的多个映射器(和机器)上拆分此文件

但是我找不到一种方法来实现这一点,因为Hadoop自然只会以64(或者是128?)MB的间隔进行拆分,所以我只有一个映射器

我已经研究了NLineInputFormat(),但这是针对旧API的,也不确定它如何与Pig一起工作

为了使事情进一步复杂化,我使用CSVExcelStorage piggybank loadfunc加载

谢谢


邓肯(Duncan)

试着让你的输入分割尽可能小。设置此属性:

SET mapred.max.split.size  1000; -- or whatever

该数字以字节为单位进行拆分。如果您有一个30 MB的文件,并且需要3000个映射器(例如),请尝试将最大分割大小设置为
10000

尝试使输入分割尽可能小。设置此属性:

SET mapred.max.split.size  1000; -- or whatever

该数字以字节为单位进行拆分。如果您有一个30 MB的文件,并且需要3000个映射器(例如),请尝试将最大分割大小设置为
10000

,这不是一个详细的解决方案,只是一个一般的想法

您可以通过在reduce阶段(而不是map阶段)执行UDF并使用PIG的并行特性来解决这个问题,PIG的并行特性允许您控制reducer的数量。为了给您一个提示,您可以使用以下命令设置脚本的默认还原数(例如设置为40):

设置默认_平行40

强制UDF在reducer中运行的一种方法是执行一个组,然后通过每个组调用UDF

例如

ag=a组x平行40; b=FOREACH ag生成您的自定义项(a)

组需要一个排序阶段,因此组后面的FOREACH将在reducer中运行

如果你没有一把好钥匙可供选择,你可以试试a组ALL,它可能会起作用。此外,您需要将UDF更改为接收数据包,而不是元组或标量,因为每个组都作为包传递。它的实现可能有点棘手,但一旦完成,它就非常简单和优雅

如果脚本中已有组,则可以使用该组并保存额外的map reduce作业。还有一些子句也会迫使你考虑一个减少阶段。
David

这不是一个详细的解决方案,只是一个总体想法

您可以通过在reduce阶段(而不是map阶段)执行UDF并使用PIG的并行特性来解决这个问题,PIG的并行特性允许您控制reducer的数量。为了给您一个提示,您可以使用以下命令设置脚本的默认还原数(例如设置为40):

设置默认_平行40

强制UDF在reducer中运行的一种方法是执行一个组,然后通过每个组调用UDF

例如

ag=a组x平行40; b=FOREACH ag生成您的自定义项(a)

组需要一个排序阶段,因此组后面的FOREACH将在reducer中运行

如果你没有一把好钥匙可供选择,你可以试试a组ALL,它可能会起作用。此外,您需要将UDF更改为接收数据包,而不是元组或标量,因为每个组都作为包传递。它的实现可能有点棘手,但一旦完成,它就非常简单和优雅

如果脚本中已有组,则可以使用该组并保存额外的map reduce作业。还有一些子句也会迫使你考虑一个减少阶段。 大卫解决了

这需要设置更多的参数。我并不是说你需要设置所有这些,但我没有时间做尝试和错误,看看什么是最低要求的设置。很高兴在这个问题上得到纠正

将以下内容放在pig脚本的顶部:

SET mapred.max.split.size 131072; -- 128KB
SET mapred.min.split.size 131072;
SET default_parallel 2;
SET pig.noSplitCombination true; 
SET mapred.max.jobs.per.node 1;
我已经将我的块设置为128KB,因为我的输入非常小

此外,设置dfs块大小。在Amazon EMR中,通过设置以下Boostrap操作来执行此操作:

--hdfs-key-value dfs.block.size=131072
通过查看输出,我们可以看出这是有效的:

作业统计信息(以秒为单位的时间): JobId映射减少MaxMapTime MinMapTIme AvgMatime MedianOptime MaxReduceTime MinReduceTime AvgReduceTime MedianReducetime别名功能输出 job_201309111450_0001140 15 9 11 12 0 0 0 0 0 0 A,已清理,仅nostop MAP_s3n://mybucket/out42

因此,我们可以看到使用了14个制图器。另外,生成了14个部件(在我的情况下),总运行时间与单个记录的时间相同(在我的情况下为4分钟)。

已解决

这需要设置更多的参数。我并不是说你需要设置所有这些,但我没有时间做尝试和错误,看看什么是最低要求的设置。很高兴在这个问题上得到纠正

将以下内容放在pig脚本的顶部:

SET mapred.max.split.size 131072; -- 128KB
SET mapred.min.split.size 131072;
SET default_parallel 2;
SET pig.noSplitCombination true; 
SET mapred.max.jobs.per.node 1;
我已经将我的块设置为128KB,因为我的输入非常小

此外,设置dfs块大小。在Amazon EMR中,通过设置以下Boostrap操作来执行此操作:

--hdfs-key-value dfs.block.size=131072
通过查看输出,我们可以看出这是有效的:

作业统计信息(以秒为单位的时间): JobId映射减少MaxMapTime MinMapTIme AvgMatime MedianOptime MaxReduceTime MinReduceTime AvgReduceTime MedianReducetime别名功能输出 job_201309111450_0001140 15 9 11 12 0 0 0 0 0 0 A,已清理,仅nostop MAP_s3n://mybucket/out42


因此,我们可以看到使用了14个制图器。另外,生成了14个部件(在我的情况下),总运行时间与单个记录的时间相同(在我的情况下为4分钟)。

谢谢。一个愚蠢的问题——这是猪的剧本吗?配置?我使用的是AmazonEMR,只有我认为可以通过引导操作进行配置