2013-04-24 103 views
1

嗨我写了一个mapreduce作业,它一般是解析XML文件。我能够解析一个XML文件并获得正确生成的所有键值对。我有6个不同的键和相应的值。所以我同时运行6个不同的减速器。Reducer输出同一个文件中两个不同键的值

现在我面临的问题是reducer将两个不同的键 - 值对放在同一个文件中,其余4个键值放在单个文件中。所以总之从Reducer输出中的6个文件中,我得到了4个带有单键值对的文件和1个带有两个键值对和1个没有任何文件的文件。

我试着在谷歌和各种论坛上做研究只是我得出的结论是我需要一个分区器来解决这个问题。我是新的hadoop,所以有人可以在这个问题上提出一些看法,并帮助我解决这个问题。

我正在使用伪节点集群并将Java用作编程语言。我无法在此共享代码,但仍尝试简要描述问题。

让我知道更多的信息是必要的,并提前致谢。

+0

嘿,我的答案下面有帮助吗? – 2013-05-26 18:13:51

回答

0

对于6个减速器,只有6个键不是最佳的hadoop利用率 - 尽管6个中的每一个都能够使用单独的减速器,但不能保证。

钥匙不能在减速器中分开,所以如果你的钥匙少于6个,只有你的减速器的一个子集有任何工作要做。你应该考虑重新思考你的关键任务(也许输入文件适合hadoop),并且可能使用一个系统,以便有足够的密钥可以在减速器中均匀分布。

编辑:我相信你可能会在MultipleOutputFormat,其方法generateFileNameForKeyValue(key, value, name),允许您生成一个文件写出每个密钥,而不是每个Reducer一个文件。

+0

是的,请您详细说明。我认为你以一种错误的方式来解释问题。我从映射器不同的键唯一地输出,但我希望他们每个键和其相应的值在一个单独的文件。为此,我有n个减速器。但问题是reducer输出两个不同的键,并在单个文件中有相应的值。如果你能答复你的答案,记住这个问题会很好。 – user1188611 2013-04-25 03:31:45

0

Hadoop的默认使用默认Hash partitioner - click here,这是一样的东西

public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> { 

    public void configure(JobConf job) {} 

    /** Use {@link Object#hashCode()} to partition. */ 
    public int getPartition(K2 key, V2 value, 
          int numReduceTasks) { 
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
    } 

} 

的key.hashCode()& Integer.MAX_VALUE的)%numReduceTasks将介于0返回一个数字numReduceTasks和你的情况的范围内因为,numRuduceTask = 6

捕获是在那一行本身 - 两个这样的语句可能会返回相同的数字。 而且,结果两个不同的键可以进入相同的缩减器。 对于EG-

("go".hashCode() & Integer.MAX_VALUE) % 6 

将返回4,

("hello".hashCode() & Integer.MAX_VALUE) % 6 

也将返回4.

所以,我建议这里要说的是,如果你想确保你所有的6个键都被6个不同的缩减器处理,你需要创建你自己的分区器来获得你想要的东西。

检出this link用于创建自定义分区程序,如果您有任何困惑,并且使用Job类指定自定义分区程序如下所示。

job.setPartitioner(<YourPartionerHere.class>);

希望这有助于。

相关问题