하둡 기본
<하둡의 노드>
1) 네임노드: 파일을 쪼개주는 역할, 쪼개진 파일이 어느 데이터 노드에 저장되어 있는지 기억하는(메타데이터) 서버
2) 데이터 노드: 실제 사용자가 업로드한 데이터를 쪼개서 저장하고 있는 서버
* hadoop은 자바를 기반으로 하기 때문에, java가 성능상 가장 용이하다.
<하둡 기본 명령어>
~$: hadoop fs -rm 파일명 (파일삭제)
~$: hadoop fs -rmr 폴더명 (폴더삭제)
~$: hadoop fs -ls (디렉토리 파일/폴더 정보보기)
~$: hadoop fs put 파일명 (hadoop root 폴더에 파일을 저장한다.)
~$: hadoop fs -rmr 폴더명 (폴더삭제)
data 분석: 문자의 갯수를 카운팅하는 예제 프로그램
~$: hadoop jar hadoop-examples-1.0.4.jar wordcount 파일명(hadoop fs에 기 push 한 파일) 폴더명(분석된 결과를 저장 할 폴더)
~$: hadoop fs -cat 파일경로(분석된 파일 결과가 저장된 경로)
셔플(shuffle) 튜닝: 셔플이란 map task -> reduce task
<map task>
1. 스플릿생성: 입력 data를 조각내고, 그 조각별로 map task 한개가 할당됨 (즉, data split 별로 map task 가 할당됨)
2. map: 버퍼안에 스플릿된 data가 기록됨
3. 스필: 버퍼가 80%정도 차게되면, 버퍼(메모리) 에서 로컬디스크로 데이터가 옮김
로컬디스크로 데이터를 복사하기 전에, 정렬작업(파티셔닝) 과정이 먼저 수행됨
(hadoop/conf/mapred_site.xml에 io.sort.mb 속성에 buffer의 크기가 지정되어 있음, 지정을 하지 않으면 100mb가 default 임)
(hadoop/conf/mapred_site.xml의 io.sort.spill.parent 속성에 지정되어 있고, 0.8이 default 임)
4. 병합: map task가 정렬되기 전에 하나의 파일로 병합
(io.sort.factor 속성에 따라 병합 할 스필 파일의 갯수가 결정됨, 10개가 default임)
<reduec task>
5. 복사: map task의 파티셔너가 네트웍을 통해서 병합된 파일을 reduce task의 버퍼(headp 메모리)에 복사함
(reduce task 의 최대사용 heap 메모리 사이즈는 mapred.xml 에 지정되어 있고, 사용하는 메모리의 70%가 default 임)
6. 정렬: merge
7. 리듀스
3번의 스필파일 갯수가 많아지면 로컬 디스크로 데이터 복사가 많아지고, 병합 작업이 오래걸리고, 네트웍을 통해 reduce task로 복사되야 하는 파일들이 많아 지기 때문에, 성능이 저하됨
- io.sort.mb 의 buffer 사이즈를 늘려주면, 스필파일의 수가 줄어 들 수 있음
- is.sort.factor 의 갯수를 늘려주면, 한번 병합 작업을 할때의 합칠 스필파일의 갯수가 늘어나기 때문에, 병합 작업의 횟수가 줄게 됨