본문 바로가기

데이터 사이언스

[Hadoop] MapReduce 최적화하기, 튜닝하기

1. MapReduce 최적화하기

  • Job이 실행되기 전에 최적화하기
    • 데이터 전처리하기 (데이터를 변형하여 원하는 형태로 사용)
    • ex) 특수문자 제거하기, 영어가 아닌 문자 제거하기
  • 데이터를 로드할 때 최적화하기
    • 압축비율 바꾸기
  • Job 부분의 map 부분 최적화하기
    • 코드를 어떻게 잘 짜는지
  • Job 부분의 shuffle 최적화하기
  • Job 부분의 reduce 최적화하기
  • Job이 끝나고 난 뒤에 최적화 하기

 

 

2. 실행전에 고려해볼만한 최적화

  • 파일 사이즈(File size)
  • 압축(Compression)
  • 암호화(Encryption)

 

 

3. 물리적 MapReduce 최적화

  • cluster configuration paremeter를 확인하여 다음을 확인한다.
    • 사용되지 않는 자원이 있는가?
    • 과도하게 사용되는 자원이 있는가?
  • cluster-monitoring 도구를 사용하는가?

 

4. Mapper 작업 최적화

  • 작업을 작게 나눈다. (sub-divide taks)
    • chain jobs(큰 프로그램을 작은 모듈로 세분화하고, 이를 순차적으로 실행되게 함.)
    • 1개의 map 작업당 실행시간은 1~3분
  • 사용 목적에 맞게 파티션을 한다. (Custom partitioner) default는 hash partitioner
  • 데이터의 크기를 줄인다. (이상한 데이터들은 스킵한다)
  • Logging, counters
  • 최적의 spill ratio를 관리, 최적화한다. (spill ratio : mapper의 기계의 메모리가 과부화가 왔을때 디스코로 넘겨진 비율)
  • Local Reducer를 사용한다.
  • Map-only Job을 쓴다. (ex : 사진 처리, 음악파일의 경우 전처리가 필요하고 Reducer를 안써도 된다)

 

5. Reducer 작업 최적화

  • 작업을 작게 나눈다.(chaining jobs)
  • logging/debugging
  • 임계치 설정(set threshold) : Job이 긴 경우 중지, Job 멈추기 등등
  • 특정 경우 Reducer 사용하지 않기(Map-only jobs : 사진, 음악파일, 음성파일들)
  • Local Reducer 사용하기(Combiners)
    • Map 노드에서 실행되며, Reducer에게 전달되는 데이터의 크기를 줄여준다.
    • 예를 들어 단어를 세는 프로그래밍이 있을때 the라는 단어가 20번 나왔을 때 (the,1)을 20번 보내는것이 아니라
    • (the,20)이렇게 한번에 보낸다.

 

6. MapReduce Job 최적화

  • 노드를 더 추가하기
  • 분산 캐시(Distributed cache)
  • 이상한 레코드(record) 무시하기
  • 작은 작업으로 쪼개기(subdividing tasks)
  • Logging / Profiling
  • 디버깅, 단위 테스트
  • Java 처리 최적화하기
  • String 작업 최적화하기
    • string concatenation보다 StringBuffer.append를 사용한다.
    • text parsing보다 LongWritable, BytesWritable이 더 빠르다

 

 

7. 입력 파일 압축 (Input File compression)

  • 사용하는 기업마다 추구하는 파일형식이 다르다.
  • 각 기업이 선호하는 압축방식을 이용한다.
  • ex) Cloudera의 LZO 버전은 'splittable'이다.

 

 

 

 

참고자료(reference)

linkedin/ Learning Hadoop/ Lynn Langit