2012-07-19 2 views
0

다음과 같은 문자열을 키로 사용합니다. 아래의 코딩에서 많은 감속기가 있지만 모든 키가 같은 감속기로 이동하는 것을 볼 수 있습니다. 결국 동일한 감속기가 과부하됩니다. 나는 각각의 열쇠 (String)가 다른 감속기에 가기를 원한다. Pls이 문제를 도와주세요. 감사!hadoop의로드 밸런싱 개선

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 
+0

새로운 텍스트 ("71 1 2"). hashCode()'를 사용하면 더 나은 결과를 얻을 수 있습니다. (IDE를 실행하고 확인하는 게 너무 미안합니다.) 'Text.hashCode()'는 WritableComparator.hashBytes (byte []) 메쏘드를 사용하고 더 좋은 대답을 줄 수 있습니다. –

+0

WritableComparator와 String hashCode 메쏘드가 비슷하다는 것을 마지막으로 무시하십시오. –

+0

안녕하세요 Chris! 답장을 보내 주셔서 감사합니다. 필자는 필적할만한 것이라면 정렬을 위해 사용할 수 있다고 생각하지만 여전히 똑같은 수준으로 감소한다고 생각합니다. 나 맞아? 말하자면, "71 1 2"를 정렬 한 다음 "71 1 3"이옵니다. 그러나 분할자가 리턴 한 파티션 num이 동일한 경우 (modulus 사용), 여전히 동일한 감속기에 도달합니다. 나 맞아? 그렇다면 어떻게 문제를 해결할 수 있습니까? –

답변

1

하나의 옵션은 당신이 당신의 키가 감속기에 고르게 분산되도록 기본 HashPartitioner을 사용하는 대신 사용자 정의 partitioner을 정의합니다.

+0

커스텀 파티셔너에서 어떤 논리를 사용할 지 말해 줄 수 있습니까? –

+0

우리가이 방법을 고려한다면 : public int getPartition (K key, V value, int numReduceTasks) { return (key.hashCode() & amp amp amp; amp; Integer.MAX_VALUE) % numReduceTasks;}, 파티션 번호를 얻는 데는 % (모듈러스 연산자)를 사용하는 것이 여전히 중요합니다. 여전히 서로 다른 두 개의 키가 동일한 파티션 num을 반환하더라도 동일한 감속기에 도달합니다. 각 열쇠를 만들거나 다른 감속기에 도달하거나 최소한 atleast가 퍼지는 방법이 있습니까? 필자의 구현에서 볼 때 일부 감속기에는 과부하가 걸리는 반면 전혀 부하가없는 반면 다른 키를 사용한다는 점을 알 수 있습니다. –