2. 목표
● 하둡 및 관련 기술들 개요 수준으로 알아보기
○ 깊게 파기 위한 사전 준비 (이런 게 있다…)
■ 용어/이름 정도는 알고 가자
○ 각 기술들의 정확한 동작 원리 등은 앞으로 파야 함
● 훑어볼 것들
○
○
○
○
○
Hadoop (HDFS, MR)
Pig / Hive
Flume / Sqoop
Oozie
HBASE
3. 시작은 Hadoop 부터
● 두 가지 목적
○ 정말 매우 큰 데이터를 저장할 수 있어야 하고
○ 그 데이터를 이용해서 연산을 수행할 수 있어야 함
● 이를 위한 두 가지
○ HDFS(Hadoop Distributed File System)
○ MapReduce (2버전에는 YARN)
4. HDFS: 분산 파일 시스템
접근할
데이터 노드 문의
네임노드
Heart Beat, 블록 정보 전송
하둡 클라이언트
파일 읽기/쓰기
파일(블록)-데이터노드 메타 정보
SPOF
데이터
노드
데이터
노드
데이터
노드
파일 쓰기 시에 데이터 노드 간 블록 복사
5. MapReduce 1: 병렬 연산 수행
잡(Job)
실행 요청
잡 클라이언트
복사
- 잡 파일
- 잡 스플릿 정보
잡트래커
잡 정보 조회
잡 파일 조회
HDFS
잡을 태스크로 분리
작은 규모는 네임노드 프로세
스와 동일 노드 위치
주기적 상태 보고
태스크 할당 받음
태스크
트래커
프로세스
생성
맵: 파일 읽기
리듀스: 결과 저장
태스크JVM
데이터노드 프로세스와
동일 노드
6. MapReduce 1 흐름
태스크JVM
맵 실행
맵 결과
맵 결과
태스크JVM
맵 실행
맵 결과
맵 결과
맵 결과
태스크JVM
맵 실행
맵 결과
맵 결과
병합
태스크JVM
리듀스 실행
7. HDFS/MR과 관련된 난관
● 맵리듀스 프로그램을 직접 하려면 머리 빠짐
● 외부 데이터를 하둡에 밀어넣기 위해 코드 만
들기 귀찮다.
● 데이터 처리 흐름을 직접 만들자니, 귀찮다.
● 서비스 어플리케이션의 데이터 보관소로 사
용하고 싶다.
8. HDFS/MR 관련 기술들
상황
기술
MR을 쉽게
Pig: 전용 스크립트로 데이터 처리
Hive: SQL을 이용한 데이터 처리
데이터 이동을 쉽게
Flume: 로그를 HDFS에 복사
Sqoop: RDB와 HDFS간의 데이터 복
사
데이터 처리 흐름을 쉽
게
Oozie
NoSQL처럼
HBASE
9. Pig
● 분석 위한 고수준 언어 지원 (Pig Latin)
○
○
○
○
○
HDFS 파일을 PigStorage()로 추상화해서 접근
AVG, COUNT, MAX, SUM, ...
JOIN, DISTINCT, GROUP, ORDER BY ...
FOREACH, CASE, FILTER, ...
LOAD, STORE로 HDFS 파일 접근
● 대용량 데이터셋 분석 플랫폼
○ 스크립트를 MR로 변환해서 하둡에서 실행
● 스크립트 실행 방식
○ grunt: 대화형 쉘에서 스크립트 입력
○ script: 스크립트 파일을 실행
10. Pig vs MR
MR
public class WordCount {
public static class Map extends MapReduceBase
implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
public static class Reduce extends MapReduceBase
implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) sum += values.next().get();
output.collect(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
Pig
A = load './input.txt';
B = foreach A generate flatten(TOKENIZE((chararray)$0)) as word;
C = group B by word;
D = foreach C generate COUNT(B), group;
store D into './wordcount';
}
11. Hive
● 마치 RDBS처럼
○ SQL과 매우 유사한 HQL
○ DB/테이블 제공
● 데이터 보관/쿼리 실행을 하둡에서
○ HDFS에 데이터 보관
○ HQL을 MR로 변환해서 실행
● 별도의 RDB에 DB/테이블 메타정보 저장
● 제약
○ 행 단위 수정/삭제 불가 (HDFS 파일의 제약)
○ 트랜잭션 X
13. Sqoop
● RDBMS와 HDFS/Hive/HBase 간 데이터 이
동을 처리해주는 도구
○ MR을 생성해서 하둡을 통해 실행
하둡 클래스터
Sqoop
(CLI 도구)
MR 태스크
데이터 복사
메타 정보 로딩
RDB
HDFS
Hive
HBase
14. Flume
● 로그를 하둡에 보관하기 위한 목적으로 사용
● 일반적인 구성
Agent
Agent
Agent
Agent
Agent
tail, syslog 등에서 로그 수집
하둡
클러스터
(HDFS,
HBASE)
15. Oozie
● Hadoop 관련 워크플로우 엔진
○ 워크플로우 정의 (XML)
■ 작업 (Hive, Pig, Sqoop 등을 이용한 작업 정의)
■ 작업 간 의존(실행 순서) 설정
○ 워크플로우 실행 및 모니터링
Oozie
클라이언트
Oozie
서버
CLI, Java API, Rest API
웹브라우저(읽기 전용)
RDB
하둡
클러스터
16. HBase
● 실시간 서비스 위한 하둡 기반 데이터 저장소
클러스터 코디네이터
ROOT 테이블 위치 조회
Zookeeper
Client
- 한 개 이상의 리전을 가짐
- 클라이언트의 읽기/쓰기 요
청 처리
- 리전은 메모리에 일정 크기
데이터 보관 (캐시 효과)
HMaster
Region
Server
Region
Server
하둡 클러스터 HDFS
리전 관리
Region
Server
- 커밋 로그 보관
- 데이터 보관
17. HBase
● 주요 특징
○
○
○
○
○
○
데이터를 HDFS에 저장
컬럼 기반 형태의 NoSQL DB
데이터 크기가 커지면 자동 분리(auto sharding)
높은 쓰기 처리량
rowkey 기반 접근
행 단위 Consistency 보장
■ 즉, 여러 행에 대한 트랜잭션 보장 없음