2013-10-29 6 views
0

내 Hadoop 프로그램의 매핑 단계는 많은 수의 고유 키를 생성합니다 (한 데이터 세트의 경우 200K 키, 다른 데이터 세트의 경우 900K). 각 키는 60 자의 숫자가 포함 된 문자열 값입니다. My Hadoop 프로그램의 정렬/셔플 단계가 너무 오래 걸립니다. 그런 엄청난 수의 키에 대해 정렬/셔플 링 단계를 더 효율적으로 만들 수있는 방법이 있습니까?Hadoop 프로그램에서 많은 수의 매퍼 키를 처리하는 방법은 무엇입니까?

+0

실제로 당신의 키에'String' 값을 사용하고 있습니까? Comparable 을 구현하는 숫자 형을 사용 해본 적이 있습니까? – bstempi

+0

예, 텍스트를 매퍼의 키 유형으로 사용하고 있습니다. 나는 그것을 IntWritable로 바꿀 수 있는데,이 경우에는 "Comparable''을 구현해야합니까? IntWritable이 바이트 단위로 비교를한다고 믿기 때문에 그렇습니까? –

+0

Comparable을 구현할 필요가 없으므로 키를 좀 더 "compact"유형으로 변경할 수 있다면 괜찮습니다. 'VIntWritable' 또는'VLongWritable'을 고려해보십시오. 둘 다 정수에 메모리 할당 공간을 저장합니다. –

답변

0

감속기로 전송 된 "지도 위상"출력을 결합하여 네트워크 과열을 줄이기 위해 결합기를 사용해야합니다.

WritableComparator에 관해서는 당신이 옳습니다. 구현 단계에서 두 객체를 비교하는 방법은 한 번 (객체의 출력 (매퍼에서 출력), Hadoop을 순서대로) 주고 받고 순서를 정하고 비 직렬화해야하므로 "비 직렬화 단계"를 피하고 바이트 단위로 비교하는 것이 훨씬 낫습니다.

http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hadoop/hadoop-core/0.20.2-737/org/apache/hadoop/io/WritableComparator.java#WritableComparator.compare%28byte%5B%5D%2Cint%2Cint%2Cbyte%5B%5D%2Cint%2Cint%29

편집

: 제대로 나는 GrepCode에서 말하는 겁니다 방법을 그것을 할 매우 어려울 수 있기 때문에

당신은, WritableComparable에서 방법 compare를 오버라이드 (override)에 조심해야

MapReduce의 성능을 향상시키는 데 유용한 정보를 얻으 려합니다.

http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performance/

+1

조합 키는 많은 고유 키가 있고 그룹이 작을 때별로 도움이되지 않습니다. –

+0

이미 결합기가 있습니다. –

+0

키를 텍스트에서 IntWritable 도움말과 같은 다른 데이터 유형으로 변경합니까? –

0

맞춤 키 유형을 만들어야합니다.

  • 숫자 (이진) 키를 가짐으로써, 당신은 속도 증가
  • 을 허용, 텍스트 대신 바이트를 비교하는 Comparable<BinaryComparable>을 구현할 수 있습니다 당신은 키 쓰기 등을 할 수 있습니다 : 여기에는 몇 가지 이유가 있습니다 이진 형식은 키를 전송하고 읽을 때 시간을 절약합니다. 핵심 클래스를 작성한다면 BytesWritable을 확장 할 수 있습니다. 이는 이미 첫 번째 글 머리에서 언급 한 인터페이스를 구현합니다.

조정해야 할 작업 매개 변수가 있습니다. 예를 들어 작업 내에서 io.sort 옵션을 조정하는 것이 좋습니다. 고유 한 값이 많기 때문에 Hadoop은 메모리에서 모두 정렬 할 수는 없으므로 디스크로 스필되어야합니다. 이 경우 데이터를 다시 읽고 다시 정렬해야 셔플이 느려집니다. 유출 기록이 있기 때문에 로그를 통해 누출이 발생했는지 알 수 있습니다. 튜닝에 관한 팁은 http://www.slideshare.net/cloudera/mr-perf

관련 문제