[대용량데이터] 대용량 처리 컨셉 오버뷰
예전에는 여러대의 장비에서 데이터 필터링/서칭 등이 필요하면, 큰 하나의 파일을 n개로 나눠서 n개의 장비에 두고, 각 장비별로 filter/grep/join 등의 작업을 수행하는 방식이였다. (데이터가 있는 장비에서 필요한 작업은 데이터있는 장비에서 수행)
이런 경우. 장비에 장애가 났을때 원상태로 복원하는데까지 시간이 오래걸릴 수 밖에 없었다. 데이터 복사, 작업을 위한 데이터 정제. (MTTR 시간 지연)
현재는 계산 노드가 데이터를 갖고있는것이 아니라 각 노드가 무슨일을 하고 있는지 일을하는데 필요한 데이터를 그때그때 fetch하는 방식이다. 따라서 장애가 나더라도 장애난 노드의 역할을 다른 노드의 위임하는 방식으로 MTTR에 대한 이슈를 해결했다. 이를 내결함성(fault-tolerance)라고 말한다.
대용량데이터 오픈소스환경에서 데이터 처리를 한다는 말은 즉슨, 데이터를 어떻게 key/value로 만들거고 만들어진 key/value를 가지고, 어떻게 원하는 최종의 데이터 결과(key, value 형태)를 만들어낼 것인가에 대한 문제이다.
맵리듀스의 컨셉을 이해하면 데이터처리 중 계산 프로세스의 간명한 이해에 도달할수 있다. "1. 맵은 key/value의 집합이며, 그 출력은 key/value의 리스팅 형태가 될것이다." "2. 리듀스는 같은 key를 가지고있는 애들을 하나로 묶어주는 역할을 한다"
하둡의 전체구성을 살펴보면, "저장인프라(Hadoop Components: NameNode, DataNode) / 분산환경 계산수행(mapReduce Components: JobTracker/TaskTracker)" 두부분으로 나눌수 있다.
map/reduce에 각각 입력/출력을 어떻게 가져갈지에 대한 부분에 대한 고민은 개발자의 몫이다. 가볍게보면, 개발자가 개발을 할때는 분산의 개념은 캡슐화되버린다. 데이터를 어떻게 가져오고, 어떻게 처리해야하는지(e.g. 쿼리로 데이터 fetch: hive / parquet 데이터 활용) 가 심도있는 고민의 영역이 될수 있다.
map-side join? reduce-side join?
[HDFS 컴포넌트 : 분산데이터 저장 컴포넌트]
Name node: HDFS의 모든 메타데이터를 관리(전역 네임스페이스)
Data node: 실제 블록이 저장되는 노드(주기적으로 네임노드에게 heartbeat와 block reporting을 보냄)
[MapReduce 컴포넌트 : 계산 컴포넌트]
Job tracker: Hadoop에 등록된 job 스케줄링을 관리하고 모니터링
Task tracker: Job tracker에서 작업을 요청받아 map task, reduce task를 진행. Job tracker에게 작업의 수행상태를 알림.
작업은 여러개의 task로 이루어져 있다. 예로 들면 WordCount를 한다면 수행되어야 할 작업에는 Map Task/Reduce Task 등이 있을 수 있다. MapTask는 다시 토큰라이징하는 작업 입력이 1TB면, 여러 노드에서 도는 것이 당연히 속도가 빠르기때문에 여러 작업 관리가 필요하게 된다. 버전1에서는 이러한 모든 작업을 jobTracker에서 했으나 1000단위 이상의 클러스터 규모에서는 JobTracker를 스케일링하는 것만으로는 문제해결이 쉽지 않아 신규컨셉이 도출된 것이다.
jobTracker가 하던 Task 관리를 AM에게 위임하였고, 이때. AM은 사용자 혹은 클러스터 운영자가 관리하는게 아니라 작업 자체가 하나의 컨테이너의 task로 수행이 된다. 해서, 각각의 task들은 작업상황을 jobTracker에게 알렸지만, 지금은 각자의 job담당하는 AM에게 알리게 된다.
[InputFormat: 입력파일의 분할이나 읽는 방식]
TextInputFormat(reads lines of text files)
KeyValueTextInputFormat(Parses lines into key,val pairs)
SequenceFileInputFormat(A Hadoop-specific high-performance binary foramt)
[OutputFormat: 작업의 결과. 출력을 어떻게 보관할지를 정의]
TextOutputForamt(Writes "key val\n" strings to output file)
SequenceFileOutputFormat(Uses a binary format to pack (k, v) pairs)
MultipleTextOutputFormat(하나의 Task에서 여러개의 파일 출력)
NullOutputFormat(Discards output)
출처: https://12bme.tistory.com/451?category=737765 [길은 가면, 뒤에 있다.]
'Big Data > 빅데이터' 카테고리의 다른 글
[엘라스틱서치] Elasticsearch in action 정리(2) - 데이터 검색 (0) | 2020.08.03 |
---|---|
[데이터처리] 로그데이터 다루기(2) - 수집 미들웨어 Fluentd란? (0) | 2020.08.03 |
[데이터처리] 로그 데이터 다루기 (1) - 수집 미들웨어 Fluentd 중심 (0) | 2020.08.03 |
[엘라스틱서치] Elasticsearch in action 정리(1) (0) | 2020.08.03 |
[ELK] 엘라스틱서치 배우기 - 검색API (0) | 2020.08.03 |
[ELK] 엘라스틱서치 배우기 (0) | 2020.08.03 |
[ELK] 키바나 5.0 배우기 (0) | 2020.08.03 |
[R] 데이터 개념 이해하기 (0) | 2020.08.03 |