【问题标题】:Improving load balancing in hadoop改善 hadoop 中的负载平衡
【发布时间】:2012-07-19 00:33:30
【问题描述】:

我有以下字符串作为键。从下面的代码中,我看到所有的键都指向同一个减速器,尽管有很多减速器。最后,同一个减速器超载。我想,每个键(字符串),去一个不同的减速器。请帮我解决这个问题。谢谢!

String a = "71 1 2";
String b = "72 1 1";
String c = "70 1 3";

int hash_a = a.hashCode();
int hash_b = b.hashCode();
int hash_c = c.hashCode();

int part_a = hash_a % 10;
int part_b = hash_b % 10;
int part_c = hash_c % 10;

System.out.println("hash a: "+hash_a+" part_a: "+part_a);
System.out.println("hash b: "+hash_b+" part_b: "+part_b);
System.out.println("hash c: "+hash_c+" part_c: "+part_c);

Output:

hash a: 1620857277 part_a: 7
hash b: 1621780797 part_b: 7
hash c: 1619933757 part_c: 7

【问题讨论】:

  • 使用new Text("71 1 2").hashCode() 是否会给您带来更好的结果(抱歉,懒得启动 IDE 并检查)。 Text.hashCode()使用WritableComparator.hashBytes(byte[])的方法,或许能给你更好的答案
  • 忽略我的最后一个,看起来 WritableComparator 和 String hashCode 方法是可比的。
  • 嗨,克里斯!谢谢回复。我认为如果它们具有可比性,我们可以将其用于排序,但它们仍然达到相同的减少。我对么?比如说,排序“71 1 2”,然后是“71 1 3”,等等。但是如果分区器返回的分区号相同(使用模数),那么它们仍然到达同一个减速器。我对么?如果是这样,它是如何解决问题的?
  • 如果它们都产生相同的模数,那么是的,它不会有帮助。我想你需要调查@seedhead 的答案

标签: hadoop mapreduce


【解决方案1】:

一个选项是您定义一个自定义 partitioner 而不是使用默认的 HashPartitioner 以确保您的密钥在您的减速器中均匀分布。

【讨论】:

  • 你能告诉我在自定义分区器中使用什么逻辑吗?
  • 如果我们考虑方法:public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE ) % numReduceTasks;},我们仍然需要使用 %(modulus operator) 来获取分区号,即使它是自定义分区器。因此,如果两个不同的键仍然返回相同的分区编号,它们会到达相同的减速器。有没有办法让每个键,到达不同的减速器或至少均匀分布。从我的实现中,我看到一些减速器超载,而一些根本没有负载,尽管有不同的键。
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 2017-09-21
  • 2014-02-04
  • 2022-01-10
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2012-09-13
相关资源
最近更新 更多