데이터 사이언스
[Hadoop] MapReduce 최적화하기, 튜닝하기
메가구글
2023. 3. 28. 18:08
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