reducer输出同一文件中两个不同键的值

eanckbw9  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(371)

嗨,我已经写了一个mapreduce的工作,这是一般解析xml文件。我能够解析一个xml文件并正确生成所有的键值对。所以我并联运行6个不同的减速器。
现在我面临的问题是reducer将两个不同的键值对放在同一个文件中,剩余的4个键值放在单个文件中。简而言之,在reducer输出的6个文件中,我得到了4个带有单个键值对的文件,1个带有两个键值对的文件,1个没有任何键值对的文件。
我试着在google和各种论坛上做研究,唯一的结论是我需要一个分区器来解决这个问题。我是新的hadoop,所以有人可以把一些光在这个问题上,并帮助我解决这个问题。
我正在研究一个伪节点集群,并使用java作为编程语言。我不能在这里分享代码,但仍然试图简单地描述这个问题。
让我知道更多的信息是需要的,并提前感谢。

ql3eal8s

ql3eal8s1#

对于6个减速机只有6个键并不是hadoop的最佳利用——虽然6个减速机中的每一个都可以使用单独的减速机,但这并不能保证。
键不能在减速机上分开,所以如果你有少于6个键,那么只有减速机的一个子集有工作要做。您应该考虑重新考虑您的密钥分配(也许输入文件适合hadoop),也许可以使用这样一个系统,即有足够的密钥在reducer中均匀分布。
编辑:我相信你想要的是 MultipleOutputFormat ,该方法 generateFileNameForKeyValue(key, value, name) ,允许您为每个键生成一个要写入的文件,而不是每个键只生成一个文件 Reducer .

monwx1rj

monwx1rj2#

默认情况下,hadoop使用默认的哈希分区器-单击此处,类似

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\u value)%numreducetasks将返回一个介于0到numreducetasks之间的数字,在您的示例中,范围是0到5,因为numreducetask=6
捕获就在那一行本身——两个这样的语句可能返回相同的数字。因此,两个不同的键可以连接到同一个减速器。例如-

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

我会还给你4分,

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

也会还给你4。
所以,我在这里建议的是,如果您想确保所有6个键都由6个不同的reducer处理,那么您需要创建自己的partitioner来获得所需的内容。
如果您有任何混淆,并且使用job类指定了如下所示的自定义分区器,请查看此链接以创建自定义分区器。 job.setPartitioner(<YourPartionerHere.class>); 希望这有帮助。

相关问题