Java 使用map reduce中的自定义分区器应遵循哪些逻辑来解决此问题

Java 使用map reduce中的自定义分区器应遵循哪些逻辑来解决此问题,java,hadoop,mapreduce,load-balancing,hadoop-partitioning,Java,Hadoop,Mapreduce,Load Balancing,Hadoop Partitioning,如果在一个文件中,密钥分配是99%的单词以“a”开头,1%的单词以“B”开头到“Z”,并且您必须计算以每个字母开头的单词数,您将如何有效地分配密钥?解决方案1:我认为应该使用组合器,而不是分区器。组合器将聚合以字母“A”开头的单词的局部和,然后将部分和(而不是数字1始终)发送到还原器 解决方案2:但是,如果您坚持为此使用自定义分区器,您只需在一个单独的减缩器中处理以字母“a”开头的单词,而不是处理所有其他单词,即,只为以字母“a”开头的单词指定一个减缩器 解决方案3:此外,如果您不介意“作弊”,

如果在一个文件中,密钥分配是99%的单词以“a”开头,1%的单词以“B”开头到“Z”,并且您必须计算以每个字母开头的单词数,您将如何有效地分配密钥?

解决方案1:我认为应该使用组合器,而不是分区器。组合器将聚合以字母“A”开头的单词的局部和,然后将部分和(而不是数字1始终)发送到还原器

解决方案2:但是,如果您坚持为此使用自定义分区器,您只需在一个单独的减缩器中处理以字母“a”开头的单词,而不是处理所有其他单词,即,只为以字母“a”开头的单词指定一个减缩器

解决方案3:此外,如果您不介意“作弊”,您可以为以字母“a”开头的单词定义一个计数器,并在映射阶段将其递增。然后,只需忽略这些单词(不需要通过网络发送),并对其他单词使用默认分区器。作业完成后,检索计数器的值


解决方案4:如果您不介意更多的“作弊”,请定义26个计数器,每个字母对应一个计数器,然后在映射阶段根据当前单词的第一个字母增加它们。您可以不使用减速机(将减速机的数量设置为0)。这将保存所有排序和洗牌。作业完成后,检索所有计数器的值。

关键是,如果我们采用这种情况,所有以“a”开头的值都将进入一个减缩器,它占整个数据的99%,这相当大。在这种情况下,我们将如何使用partitioner将键“a”分配给不同的减缩器以提高效率。如果您想汇总以同一个字母开头的单词数,我相信第一个字母构成中间键,即它们必须由同一个减缩器处理。我在解决方案2中描述的是如何避免加重此减速机的负担。除了我提供的方法之外,我看不到任何其他方法来汇总所有计数。如果您有其他解决方案,我将很高兴讨论如何将其均匀分布。你有没有想要优化的代码/想法(如果有,请将其添加到你的原始帖子中)?我还没有代码,因为我需要知道解决它的最佳逻辑。我有一个解决方案,如果我们在partitioner中决定,以“a”开头的不同长度的单词将分配给不同的约简器,那么我们可以在约简器之间均匀地分配数据。这是公平的解决方案吗?因为所有的重点都是一个reducer不应该拥有99%的数据,而其他reducer只有1%。虽然99%的数据构成以“a”开头的单词,但这不应该只分配给一个减缩器,而应该分配给多个减缩器。这将公平地分配负载(可能),但是,如何从不同的减缩器中获得以a开头的单词数?然后,你可以做你描述的事情,甚至可以根据第一个和第二个字母,或者第一个和第三个字母,或者第一个和最后一个字母进行划分。然而,使用额外的MR作业可能会带来不必要的开销。我很高兴我帮了忙。祝你好运