0
Hadoop The Definitive Guide
Ch.9 Setting up a Hadoop Cluster
아꿈사
cecil
13년 9월 9일 월요일
이 장에서는...
1. 하둡 클러스터 설정 방법
- Map Reduce I
-YARN
2. 클라우드 서비스에서 하둡 사용
13년 9월 9일 월요일
클러스터 명세
하둡은 범용 하드웨어에서 구동 되도록 설계 되었음
- 범용이 저급을 의미하는 것은 아님
클러스터는 얼마나 커야 할까?
- 하둡은 클러스터 규모를 쉽게 증가 시킬 수 있음.
- “얼마나 빨리 클러스터가 커질...
네트워크 위상
네트워크 위상 설정을 통해 하둡의 성능을 높일 수 있음
- 블록 복제본을 배치할 때 네트워크 위치를 사용
- 기본값은 모든 노드를 단일 네트워크에 맵핑
- topology.script.file.name 속성...
클러스터 설정 및 설치
1. 자바 설치
- java 1.6 이상 버전 필요
2. 하둡 사용자 생성
- 다른 서비스와 하둡 설치를 분리 시키기 위해 별도 계정 생성
- 편의를 위해 사용자의 홈 디렉토리를 NFS 마운트 드...
하둡 환경 설정
13년 9월 9일 월요일
MapReduce - I
13년 9월 9일 월요일
하둡 설정 파일
파일명 형식 설명
hadoop-env.sh bash 스크립트 하둡을 구동하는 스크립트에서 사용되는 환경 변수
core-site.xml 하둡 설정 XML
HDFS와 맵 리듀스에 공통적으로 사용되는 IO 설...
환경 설정 파일 관리
하둡은 환경 설정 정보를 위한 단일, 전역 위치는 없다
대신, 클러스터 내의 각 하둡 노드는 고유한 설정 파일을 가짐
이 설정 파일들의 동기화는 관리자의 책임
13년 9월 9일 월요일
한 셋의 설정 파일을 공유할 경우
- 운영적인 측면에서 큰 장점이 있음
- rsync
그룹별로 별도의 설정 파일 사용할 경우
- 하드웨어 스펙에 대해 유연성을 가짐
- 별도의 설정 관리 프로그램 필요
- Ex) Chef...
하둡 제어 스크립트
기본 설정 파일
- masters: 보조 네임노드를 어디에서 실행할지 결정
- slaves: 데이터 노드 및 태스크 트래커의 실행 위치를 지정
start-dfs.sh
- 스크립트를 실행한 곳은 네임 ...
하둡 개발환경 설정
메모리
- 기본적으로 하둡은 데몬당 1,000MB의 메모리를 할당
- hadoop-env.sh의 HADOOP_HEAPSIZE 의해 결정
맵/리듀스 태스크
- 맵: mapred.tasktracker.m...
자바
- 자바 라이브러리 위치는 hadoop-env.sh에 정의됨
- 설정하지 않을 경우 default JAVA_HOME이 사용됨
시스템 로그 파일
- hadoop-env.sh HADOOP_LOG_DIR로 설정
- lo...
중요한 하둡 데몬 속성
<?xml version="1.0"?> <!-- core-site.xml -->
<configuration>
	 <property>
	 	 <name>fs.default.name</name>
	 ...
<?xml version="1.0"?> <!-- hdfs-site.xml -->
<configuration>
	 <property>
	 	 <!-- 에디트 로그, 파일 시스템 이미지 저장 경로 -->
	 	 <name>...
<?xml version="1.0"?> <!-- mapred-site.xml -->
<configuration>
	 <property>
	 	 <!-- 호스트명과 잡 트래커의 RPC 서버가 실행되는 포트 번호를 정의 -...
하둡 데몬 주소와 포트 번호
속성명 기본값 설명
fs.default.name file:// 네임노드의 RPC 서버 주소와 포트
dfs.datanode.ipc.address 0.0.0.0:50020 데이터 노드의 RPC 서...
기타 하둡 속성
클러스터 멤버
- 향후 노드 추가 및 삭제를 쉽게 하기 위해, 인가된 컴퓨터 리스트를 지정
- dfs.hosts의 mapred.hosts 속성으로 지정
버퍼 크기
- 하둡은 입출력 동작을 위해 4KB 버...
휴지통
- 삭제된 파일은 trash 디렉토리로 이동
- core-site.xml의 fs.trash.interval 속성을 이용하여 보관 주기 설정 가능
잡 스케쥴러
- 다중 사용자의 맵리듀스 환경에서는 FIFO 이외 다...
사용자 계정 생성
사용자 계정 생성
- hadoop fs -mkdir /user/username
- hadoop fs -chown username:username /user/username
디렉토리 크기 제한
- had...
MapReduce - II
(YARN)
13년 9월 9일 월요일
MapReduce I과의 차이
리소스 매니저와 노드 매니저가 실행됨
실행 스크립트: start-yarn.sh
- 현재 실행되고 있는 장비에서 리소스 매니저를 실행
- slaves 파일에 나열된 장비에서 노드 매니저를 실...
얀 데몬 설정 파일
<!-- mapred-site.xml -->
<?xml version="1.0"?>
<configuration>
	 <property>
	 	 <name>mapred.child.java.opts</n...
얀의 메모리 설정
특정 노드에서 동작하는 태스크의 수는 필요한 메모리의 양의 총합에 의해 결정
맵과 리듀스 두가지 슬롯을 구분하지 않고 처리
- MapReduce I에서는 맵/리듀스 태스크가 각각의 슬롯으로 고정됨
노드...
얀 데몬 주소와 포트
속성명 기본값 설명
yarn.resourcemanager.address 0.0.0.0:8032 리소스 관리자의 RPC 서버 주소와 포트
yarn.resourcemanager.admin.address...
기타 하둡 설정
13년 9월 9일 월요일
하둡 보안
하둡 초기 버전의 보안에 대한 가정
- 공동 사용자가 맵 리듀스 클러스터를 안전한 환경에서 사용
- 불의의 사고로 인한 데이터 유실을 막기 위한 용도로 설계
커버로스 인증 지원
- 하둡이 사용자 인증을 위한 ...
하둡 클라우드
아마존 EC2의 하둡
- 아파치 윌 프로젝트(http://whirr.apache.org)
: 하둡을 EC2나 다른 클라우드 서비스에서 구동하기 쉽도록 해주는 자바 API와
스크립트를 제공
13년 9월 9일...
References
1. Tom White (2013). 하둡 완벽가이드. (심탁
길, 김현우, 옮김). 서울: 한빛미디어. (원서출판
2012)
13년 9월 9일 월요일
Upcoming SlideShare
Loading in...5
×

하둡완벽가이드 Ch9

2,489

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,489
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
72
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "하둡완벽가이드 Ch9"

  1. 1. Hadoop The Definitive Guide Ch.9 Setting up a Hadoop Cluster 아꿈사 cecil 13년 9월 9일 월요일
  2. 2. 이 장에서는... 1. 하둡 클러스터 설정 방법 - Map Reduce I -YARN 2. 클라우드 서비스에서 하둡 사용 13년 9월 9일 월요일
  3. 3. 클러스터 명세 하둡은 범용 하드웨어에서 구동 되도록 설계 되었음 - 범용이 저급을 의미하는 것은 아님 클러스터는 얼마나 커야 할까? - 하둡은 클러스터 규모를 쉽게 증가 시킬 수 있음. - “얼마나 빨리 클러스터가 커질 것인가?”의 질문이 더 합당 저장 용량 관점 13년 9월 9일 월요일
  4. 4. 네트워크 위상 네트워크 위상 설정을 통해 하둡의 성능을 높일 수 있음 - 블록 복제본을 배치할 때 네트워크 위치를 사용 - 기본값은 모든 노드를 단일 네트워크에 맵핑 - topology.script.file.name 속성으로 스크립트 위치 지정 Rack awareness 13년 9월 9일 월요일
  5. 5. 클러스터 설정 및 설치 1. 자바 설치 - java 1.6 이상 버전 필요 2. 하둡 사용자 생성 - 다른 서비스와 하둡 설치를 분리 시키기 위해 별도 계정 생성 - 편의를 위해 사용자의 홈 디렉토리를 NFS 마운트 드라이브에 설정 3. 하둡 설치 - NFS 드라이브를 홈 디렉토리로 사용할 경우 별도의 위치에 설치 4. ssh 설정 - 제어 스크립트 실행을 위해 ssh 키를 복사 (Management Server -> Slave Server) 13년 9월 9일 월요일
  6. 6. 하둡 환경 설정 13년 9월 9일 월요일
  7. 7. MapReduce - I 13년 9월 9일 월요일
  8. 8. 하둡 설정 파일 파일명 형식 설명 hadoop-env.sh bash 스크립트 하둡을 구동하는 스크립트에서 사용되는 환경 변수 core-site.xml 하둡 설정 XML HDFS와 맵 리듀스에 공통적으로 사용되는 IO 설정 같은 하둡 코어를 위한 환경 설정 구성 hdfs-site.xml 하둡 설정 XML 네임노드, 보조 네임노드, 데이터 노드 등과 같은 HDFS 데몬 을 위한 환결 설정 구성 mapred-site.xml 하둡 설정 XML 잡 트래커와 태스크 트래크 같은 맵 리듀스 데몬을 위한 환경 설정 masters 일반 텍스트 보조 네임노드를 구동시킬 컴퓨터의 목록(행당 하나) slaves 일반 텍스트 데이터 노드와 태스크 트래커를 구동시킬 컴퓨터 목록 (행당 하나) hadoop- metric.properties 자바 속성 매트릭스가 하둡에서 어떻게 표시되는지를 제어하는 속성 log4j.properties 자바 속성 시스템 로그 파일을 위한 속성. 네임노드의 감시로그 13년 9월 9일 월요일
  9. 9. 환경 설정 파일 관리 하둡은 환경 설정 정보를 위한 단일, 전역 위치는 없다 대신, 클러스터 내의 각 하둡 노드는 고유한 설정 파일을 가짐 이 설정 파일들의 동기화는 관리자의 책임 13년 9월 9일 월요일
  10. 10. 한 셋의 설정 파일을 공유할 경우 - 운영적인 측면에서 큰 장점이 있음 - rsync 그룹별로 별도의 설정 파일 사용할 경우 - 하드웨어 스펙에 대해 유연성을 가짐 - 별도의 설정 관리 프로그램 필요 - Ex) Chef, Puppet, cfengine, bcfg2 13년 9월 9일 월요일
  11. 11. 하둡 제어 스크립트 기본 설정 파일 - masters: 보조 네임노드를 어디에서 실행할지 결정 - slaves: 데이터 노드 및 태스크 트래커의 실행 위치를 지정 start-dfs.sh - 스크립트를 실행한 곳은 네임 노드 데몬 시작 - 클러스터 내의 모든 HDFS 데몬을 시작 start-mapred.sh - 스크립트를 실행한 곳은 잡 트래커 데몬 시작 - 클러스터 내의 모든 맵 리두스 데몬을 시작 hadoop-daemon.sh - 다른 스크립트에서 하둡 데몬에게 명령을 내리기 위해 사용 - 하둡 데몬을 직접 제어해야할 경우에만 사용 13년 9월 9일 월요일
  12. 12. 하둡 개발환경 설정 메모리 - 기본적으로 하둡은 데몬당 1,000MB의 메모리를 할당 - hadoop-env.sh의 HADOOP_HEAPSIZE 의해 결정 맵/리듀스 태스크 - 맵: mapred.tasktracker.map.tasks.maximum - 리듀스: mapred.task.tracker.reduce.tasks.maximum - 기본값: 2 태스크 수행시 JVM에 할당되는 메모리 - mapred.child.java.opts - 기본값: -Xmx200m 13년 9월 9일 월요일
  13. 13. 자바 - 자바 라이브러리 위치는 hadoop-env.sh에 정의됨 - 설정하지 않을 경우 default JAVA_HOME이 사용됨 시스템 로그 파일 - hadoop-env.sh HADOOP_LOG_DIR로 설정 - log4j 파일: 대부분의 어플리케이션 로그가 기록됨(.log) - 표준 출력 / 에러 로그: 적은 양의 로그가 기록됨(.out) SSH 설정 - 제어 스크립트는 필요에 맞는 여러 옵션 설정이 가능 - hadoop-env.sh의 HADOOP_SSH_OPTS로 설정 13년 9월 9일 월요일
  14. 14. 중요한 하둡 데몬 속성 <?xml version="1.0"?> <!-- core-site.xml --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://namenode/</value> <final>true</final> </property> </configuration> HDFS를 구동하기 위한 네임노드 설정 13년 9월 9일 월요일
  15. 15. <?xml version="1.0"?> <!-- hdfs-site.xml --> <configuration> <property> <!-- 에디트 로그, 파일 시스템 이미지 저장 경로 --> <name>dfs.name.dir</name> <value>/disk1/hdfs/name,/remote/hdfs/name</value> <final>true</final> </property> <property> <!-- 데이터 노드가 블록을 저장할 디렉토리, 성능을 위해 다수 디렉토리에 라운르로빈 가능 --> <name>dfs.data.dir</name> <value>/disk1/hdfs/data,/disk2/hdfs/data</value> <final>true</final> </property> <property> <!-- 보조 네임 노드에서 체크 포인트가 저장되는 디렉토리, 장애 대비용으로 2개 설정 --> <name>fs.checkpoint.dir</name> <value>/disk1/hdfs/namesecondary,/disk2/hdfs/namesecondary</value> <final>true</final> </property> </configuration> HDFS의 저장 디렉토리는 별도로 지정하지 않으면 임시 디렉토리에 저장됨 - 속성: hadoop.tmp.dir, 기본값: /tmp/hadoop-{user.name} - 이 속성을 변경하지 않으면 시스템이 언제든지 임시 디렉토리를 지울 수 있음 13년 9월 9일 월요일
  16. 16. <?xml version="1.0"?> <!-- mapred-site.xml --> <configuration> <property> <!-- 호스트명과 잡 트래커의 RPC 서버가 실행되는 포트 번호를 정의 --> <name>mapred.job.tracker</name> <value>jobtracker:8021</value> <final>true</final> </property> <property> <!-- 맵 리듀스가 잡 과정에서 발생하는 중간 데이터를 저장하는 디렉토리--> <name>mapred.local.dir</name> <value>/disk1/mapred/local,/disk2/mapred/local</value> <final>true</final> </property> <property> <!-- 잡이 실행될때 공유 파일이 저장되는 디렉토리 fs.default.name 속성값의 상대 경로--> <name>mapred.system.dir</name> <value>/tmp/hadoop/mapred/system</value> <final>true</final> </property> <property> <!-- 태스크 트래커에서 동시에 실행할 수 있는 맵 태스크 수 --> <name>mapred.tasktracker.map.tasks.maximum</name> <value>7</value> <final>true</final> </property> <property> <!-- 태스크 트래커에서 동시에 실행할 수 있는 리듀스 태스크 수 --> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>7</value> <final>true</final> </property> <property> <!-- 태스크 트래커에서 자식 프로세스를 실행할때 사용하는 JVM 옵션 --> <name>mapred.child.java.opts</name> <value>-Xmx400m</value> <!-- Not marked as final so jobs can include JVM debugging options --> </property> </configuration> 13년 9월 9일 월요일
  17. 17. 하둡 데몬 주소와 포트 번호 속성명 기본값 설명 fs.default.name file:// 네임노드의 RPC 서버 주소와 포트 dfs.datanode.ipc.address 0.0.0.0:50020 데이터 노드의 RPC 서버 주소와 포트 mapred.job.tracker Local 잡 트래커의 RPC 서버 주소와 포트 mapred.task.tracker.report.address 127.0.0.1:0 태스크 트래커의 RPC 서버 주소와 포트. 태스크 트래커와 자식 JVM과 통신하기 위해 사용 mapred.job.tracker.http.address 0.0.0.0:50030 잡 트래커의 HTTP 서버 주소와 포트 번호 mapred.task.tracker.http.address 0.0.0.0:50060 태스크 트래커의 HTTP 서버 주소와 포트 번호 dfs.http.address 0.0.0.0:50070 네임노드의 HTTP 서버 주소와 포트 번호 dfs.datanode.http.address 0.0.0.0:50075 데이터 노드의 HTTP 서버 주소와 포트 번호 dfs.secondary.http.address 0.0.0.0:50090 보조 네임노드의 HTTP 서버 주소와 포트 번호 - 네트워크 주소를 0.0.0.0으로 하면 하둡은 모든 주소를 해당 컴퓨터에 바인딩 - 포트 번호 0은 서버가 사용되지 않는 포트 중 아무거나 선택할 수 있게 함 13년 9월 9일 월요일
  18. 18. 기타 하둡 속성 클러스터 멤버 - 향후 노드 추가 및 삭제를 쉽게 하기 위해, 인가된 컴퓨터 리스트를 지정 - dfs.hosts의 mapred.hosts 속성으로 지정 버퍼 크기 - 하둡은 입출력 동작을 위해 4KB 버퍼를 사용 - core-site.xml, io.file.buffer.size 속성을 통해 설정 HDFS 블록 크기 - 기본적인 블록 크기는 64M - 크기를 증가시켜 네임노드의 메모리 부담을 줄이면서 매퍼가 더 큰 데이터를 처리하도록 설정 가능 - hdfs-site.xml의 dfs.block.size 속성을 통하여 설정 예약된 저장 공간 - 기본적으로 데이터 노드는 지정된 디렉토리의 가용한 모든 공간을 사용함 - dfs.datanode.du.reserved 속성을 이용하여 byte 단위로 크기를 설정 13년 9월 9일 월요일
  19. 19. 휴지통 - 삭제된 파일은 trash 디렉토리로 이동 - core-site.xml의 fs.trash.interval 속성을 이용하여 보관 주기 설정 가능 잡 스케쥴러 - 다중 사용자의 맵리듀스 환경에서는 FIFO 이외 다른 스케쥴러 설정 가능 리듀스 느린 시작 - 기본 설정은 잡 내에서 5% 맵 태스크가 완료후 리듀스 태스크를 스케쥴링 - 리듀스 슬롯을 점유하고 있기 때문에 mapred.reduce.slowstart.completed.maps 속성을 통해 큰 값으로 설정 태스크 메모리 제한 - 공유 클러스터에서 일부 태스크로 인해 노드가 다운되어서는 안됨 - 태스크 트래커가 구동 중인 컴퓨터에서 “out of memory” 발생시 장애 발생 - ulimit를 사용한 방법 * 리눅스의 ulimit 명령을 사용하여 메모리 사용 제한 * 하둡의 mapred.child.ulimit 속성으로 제한 - 태스크 메모리 모니터링 사용 * 클러스터에서 태스크에 대한 가상 메모리 제한의 허용 범위를 관리자가 설정 * 사용자는 잡에 대한 최대 메모리 요구량을 잡 설정에서 지정 13년 9월 9일 월요일
  20. 20. 사용자 계정 생성 사용자 계정 생성 - hadoop fs -mkdir /user/username - hadoop fs -chown username:username /user/username 디렉토리 크기 제한 - hadoop dfsadmin -setSpaceQuota 1t /user/username 13년 9월 9일 월요일
  21. 21. MapReduce - II (YARN) 13년 9월 9일 월요일
  22. 22. MapReduce I과의 차이 리소스 매니저와 노드 매니저가 실행됨 실행 스크립트: start-yarn.sh - 현재 실행되고 있는 장비에서 리소스 매니저를 실행 - slaves 파일에 나열된 장비에서 노드 매니저를 실행 추가 제공 기능 - 잡 히스토리 서버: 과거 수행했던 잡에 대한 정보 제공 - 웹 앱 프록시 서버: 얀 사용을 위한 UI를 제공 13년 9월 9일 월요일
  23. 23. 얀 데몬 설정 파일 <!-- mapred-site.xml --> <?xml version="1.0"?> <configuration> <property> <name>mapred.child.java.opts</name> <value>-Xmx400m</value> <!-- Not marked as final so jobs can include JVM debugging options --> </property> </configuration> <!-- yarn-site.xml --> <?xml version="1.0"?> <configuration> <property> <!-- 리소스 관리자 주소를 지정 --> <name>yarn.resourcemanager.address</name> <value>resourcemanager:8040</value> </property> <property> <!-- 임시 데이터를 저장할 로컬 디렉토리 --> <name>yarn.nodemanager.local-dirs</name> <value>/disk1/nm-local-dir,/disk2/nm-local-dir</value> <final>true</final> </property> <property> <!-- 태스크 트래커를 대신할 셔플 핸들러 설정 --> <name>yarn.nodemanager.aux-services</name> <value>mapreduce.shuffle</value> </property> <property> <!-- 노드 관리자가 수행할 컨테이너에 할당되는 메모리량 --> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> </property> </configuration> 13년 9월 9일 월요일
  24. 24. 얀의 메모리 설정 특정 노드에서 동작하는 태스크의 수는 필요한 메모리의 양의 총합에 의해 결정 맵과 리듀스 두가지 슬롯을 구분하지 않고 처리 - MapReduce I에서는 맵/리듀스 태스크가 각각의 슬롯으로 고정됨 노드 관리자의 컨테이너 전용 메모리 설정 - 기본값 8192MB (yarn.nodemanager.resource.memory-mb) 개별 잡을 위한 메모리 설정 - mapred.child.java.opts로 맵/리듀스 태스크의 JVM 힙 사이즈를 결정 - mapred.*.memory.mb 로 태스크에 필요한 메모리 사이즈 지정 - ex) mapred.child.java.opts = 800M, mapreduce.map.memory.mb = 1,024M 노드 관리자는 태스크에 1,024M를 할당. JVM 생성시 최대 힙 크기 800M 할당 만약, Heap + 스트리밍/파이프에 사용된 메모리 + Permgen 등 1024를 넘을 경우 노드 매니저에 의해 종료되고, 실패 처리 됨. 13년 9월 9일 월요일
  25. 25. 얀 데몬 주소와 포트 속성명 기본값 설명 yarn.resourcemanager.address 0.0.0.0:8032 리소스 관리자의 RPC 서버 주소와 포트 yarn.resourcemanager.admin.address 0.0.0.0:8033 리소스 관리자의 admin RPC 서버 주소와 포트 yarn.resourcemanager.scheduler.address 0.0.0.0:8030 리소스 관리자 스케쥴러의 RPC 서버 주소와 포트 yarn.resourcemanager.resoucetracker.address 0.0.0.0:8031 리소스 관리자 리소스 트래커의 RPC 서버 주소와 포트 yarn.nodemanager.address 0.0.0.0:0 노드 관리자의 RPC 서버 주소와 포트 yarn.nodemanager.localizer.address 0.0.0.0:8040 노드 관리자의 로컬라이저의 RPC 서버 주소와 포트 mapreduce.jobhistory.address 0.0.0.0:10020 잡 히스토리 서버의 RPC 서버 주소와 포트 yarn.resoucemanager.webapp.address 0.0.0.0:8088 리소스 매니저의 HTTP 서버 주소와 포트 yarn.nodemanager.webapp.address 0.0.0.0:8042 노드 관리자의 HTTP 서버 주소와 포트 yarn.web-proxy.address 웹 앱 프록시 서버의 HTTP 서버 주소와 포트 mapreduce.jobhistory.webapp.address 0.0.0.0:19888 잡 히스토리 서버의 HTTP 서버 주소와 포트 mapreduce.shuffle.port 8088 셔플 핸들러의 HTTP 포트 13년 9월 9일 월요일
  26. 26. 기타 하둡 설정 13년 9월 9일 월요일
  27. 27. 하둡 보안 하둡 초기 버전의 보안에 대한 가정 - 공동 사용자가 맵 리듀스 클러스터를 안전한 환경에서 사용 - 불의의 사고로 인한 데이터 유실을 막기 위한 용도로 설계 커버로스 인증 지원 - 하둡이 사용자 인증을 위한 자격 증명을 직접하지 않아도 되도록 디자인 - 아파치 하둡 릴리즈 0.20.20x 시리즈에 처음 추가 됨 HDFS의 읽기 동작은 여러번의 네임노드 호출과 하나 이상의 데이터 노드를 호출 - 각 호출 마다 인증하는 대신 위임 토큰 사용 13년 9월 9일 월요일
  28. 28. 하둡 클라우드 아마존 EC2의 하둡 - 아파치 윌 프로젝트(http://whirr.apache.org) : 하둡을 EC2나 다른 클라우드 서비스에서 구동하기 쉽도록 해주는 자바 API와 스크립트를 제공 13년 9월 9일 월요일
  29. 29. References 1. Tom White (2013). 하둡 완벽가이드. (심탁 길, 김현우, 옮김). 서울: 한빛미디어. (원서출판 2012) 13년 9월 9일 월요일
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×