하둡이란 무엇인가?
Apache Hadoop은 기가바이트에서 페타바이트에 이르는 대규모 데이터셋을 효율적으로 저장하고 처리하는데 사용되는 오픈소스 프레임워크이다.
Hadoop은 하나의 대형 컴퓨터를 사용하여 데이터를 저장하고 처리하는 대신, 여러 컴퓨터를 클러스터링하여 대용량 데이터셋을 보다 빠르게 병렬로 분석할 수 있도록 한다.
Hadoop은 4개의 주요 모듈로 구성되어 있다.
- HDFS(Hadoop Distributed File System) - 표준 또는 저가 하드웨어에서 실행되는 분산 파일 시스템이다.
HDFS는 기존 파일 시스템보다 우수한 데이터 처리량을 제공하며, 높은 내결함성과 대용량 데이터셋을 제공한다. - YARN(Yet Anather Resource Negotiator) - 클러스터 노드 및 리소스 사용을 관리하고 모니터링하며, 작업 및 태스크를 예약한다. 작업을 스케줄링하고 리소스를 관리하는 프레임워크이다.
- MapReduce - 프로그램이 데이터를 병렬 계산 할 수 있도록 지원하는 프레임워크이다. Map task는 입력 데이터를 가져와서 key-value 쌍으로 계산할 수 있는 데이터 세트로 변환한다. Reduce task는 Map task의 결과를 집계하고 원하는 결과를 제공한다.
- Hadoop Common - 모든 모듈에서 사용할 수 있는 공통 Java 라이브러리를 제공한다.
하둡의 특징들
- 대용량 데이터 처리 능력 - 수 페타바이트 또는 엑사바이트 데이터와 같이 매우 큰 데이터를 다루기 위해 설계됐다. 하둡 파일의 사이즈는 수 기가바이트에서 테라바이트에 이르고, 하둡 클러스터를 이용해 이런 파일을 백만 개 이상 저장할 수 있다.
- 장애 허용(Fault tolerance) - 하둡은 하드웨어 장애가 발생할 수 있다는 것을 전제로 모든 것이 설계됐다. 하둡은 다수의 서버를 사용해 원하는 일을 동시 처리하는데 이때 스토리지나 서버에 문제가 발생하더라도 영향을 받지 않고 작업을 이어갈 수 있다.
이유는 하둡의 데이터는 기본적으로 세 번 복제되어 각각의 블록이 3개의 다른 노드에 저장되기 때문이다. - 높은 장애 대응력(faut reliant) - TARN이나 HDFS는 1개 이상의 디스크가 작동하지 않거나 멈춰도 작업을 계속 수행할 수 있다. 그 이유는 하둡이 데이터를 복제하기 때문이다.
- 간단한 데이터 일관성 모델(Simple data consistency model) - WORM모델(write-once-read-many)을 사용하여 어떤 시점에서든 단 하나의 작업자만 쓰기가 가능하다. 따라서 데이터 변경이 가능한 데이터베이스에서 발생할 수 있는 데이터 일관성 문제가 발생하지 않는다. HDFS에 작성한 파일은 내용을 수정할 수 없다.
하둡 작동 방식
Hadoop을 사용하면 클러스터 서버의 모든 스토리지 및 처리 용량을 더 쉽게 사용하고 방대한 양의 데이터에 대해 분산 프로세스를 실행할 수 있다. Hadoop은 다른 서비스와 어플리케이션을 구축할 수 있는 기본 구성 요소를 제공한다.
다양한 형식의 데이터를 수집하는 어플리케이션은 Namenode에 연결하는 API를 사용하여 데이터를 Hadoop 클러스터에 저장할 수 있다. NameNode는 DataNode에 복제된 각 파일에 대한 파일 디렉터리 구조 및 각 파일의 "chunk"를 추적(tracks)한다.
데이터 쿼리 작업을 실행하려면 DataNod에 분산된 HDFS의 데이터에 대해 실행되는 많은 맵-리듀스 작업으로 이루어진 MapReduce job을 제공한다. Map tasks는 제공된 입력 파일에 대해 각 노드에서 실행되는데 데이터를 키/값 쌍 형태로 만드는 작업을 하고, Reduce tasks는 Map 단계에서 만든 값을 받은 후 특정 알고리즘을 적용해 최종 출력을 집계하고 결과를 제공한다.
*참고 : MapReduce의 대안
맵리듀스는 배치 프로세싱 시스템으로 interactive한 분석에는 적합하지 않다. Impala나 Tez기반 Hive는 interactive한 SQL 쿼리 기능을 제공한다.
함께 사용되는 응용 프로그램들
Hadoop 에코시스템은 좋은 확장성으로 수년에 걸쳐 크게 성장했다.
오늘날 Hadoop 에코시스템에는 빅데이터를 수집, 저장, 처리, 분석 및 관리하는데 도움이 되는 많은 도구와 애플리케이션이 포함되어 있다.
- Spark - 빅데이터 워크로드에 일반적으로 사용되는 오픈소스 분산 처리 시스템이다.
Apache spark는 빠른 성능을 위해 메모리 내 캐싱 및 실행을 최적화하며, batch processing, streaming analytics, machine learning, graph databases 그리고 ad-hoc queries를 지원한다. - Presto(Trino) - 분산 SQL 쿼리 엔진으로 low-latency, ad-hoc analysis of data에 최적화 되어있다.
- Hive - 사용자는 SQL 인터페이스를 사용하여 Hadoop MapReduce를 활용할 수 있으며, (요즘은 tez, spark 엔진 사용)
데이터 웨어하우스로 작업하는 것을 가능하게 하는 빌트인 기능들을 제공한다.
HDFS 데이터 쿼리를 처리하게 한다. 작은 쿼리를 실행할 때도 동작을 위해 맵리듀스를 실행하기 때문에 약간의 오버헤드 시간이 필요하다. 온라인 트랜잭션 프로세싱이나 실시간 쿼리나 업데이트 같은 작업을 하이브로 하는 것은 현실적이지 못하다. - HBase - Amazon S3 또는 HDFS 위에서 실행되는 오픈 소스 non-relational 데이터베이스이다.
HBase는 수십억 개의 행과 수백만 개의 열이 있는 테이블에 대해 랜덤하고 일관성있는 실시간 접근을 위해 구축된 대규모 확장 가능한 분산 빅데이터 저장소이다. - Zeppelin - 대화형 데이터 탐색을 가능하게 하는 interactive(대화형) notebook이다.
클러스터 리소스 할당 (YARN 스케줄링 방법)
1. Fair 스케줄러 : 장기간에 걸쳐 모든 어플리케이션이 리소스를 균등하게 배분받게 한다.
클러스터에서 동작하는 job이 하나뿐이면 모든 클러스터의 리소스들을 하나의 job이 사용한다.
(정확하게 말하면, 이 job은 잠재적으로 모든 리소스를 사용할 수 있다)
새로운 job이 동작하면, 리소스들은 첫 번째 job에서 릴리즈되어 새로운 job으로 할당된다.
이는 각각의 동작 중인 job이 대략 동일한 양의 리소스들을 할당받을 때까지 계속된다.
이 스케줄러의 의도는 다수의 잡이 동시에 실행되도록 하는 것이다. job1이 시작되면 클러스터에 있는 모든 리소스를 소비하게 한다.
이때, job 2,3이 시작되면 클러스터는 새로운 job들이 job1 뒤에서 기다리게 하지 않고 새로운 job들에게 리소스를 공평하게 나눠준다. job1은 시작때보다 적은 리소스로 동작한다. 페어 스케줄링은 근본적으로 각각의 잡이 공평하게 또는 동일한 양의 리소스들을 얻는다는 것을 의미한다.
페어 스케줄러의 리소스 분할 알고리즘은 긴 수행 시간이 필요한 job에게 리소스 할당을 하면서도 단기간에 끝나는 job을 빨리 끝날 수 있도록 조정한다. 또 어플리케이션의 우선순위와 연동돼 각 job에서 리소스를 할당할 때 가중치로 활용한다.
2. Capacity 스케줄러 : Fair 스케줄러에 대한 대안이다. (우리 프로젝트는 이거씀, Hadoop 2이상 기본 스케줄러)
클러스터 리소스들의 체계적인 공유를 가능하게 하는 잡 큐들을 사용하면서 클러스터의 용량을 관리하기 위해 고안됐다.
다수의 큐로 구성하여 계층화 할 수 있으며 하나의 큐는 다른 큐의 자식일 수 있다. -트리구조
각 큐는 할당된 capacity가 있어서 각 사용자가 클러스터를 개별적으로 사용하는 효과가 있다.
여러 개의 Queue를 사용하는 방식이라고 생각하면 쉬운데, Queue A , B가 동시에 존재하고 실행시간이 어느정도 긴 대형 애플리케이션은 Queue A에, 실행시간이 짧은 작은 애플리케이션은 Queue B에서 실행하도록 한다.
자원이 미리 예약되어 있기 때문에 전체 클러스터의 효율성이 떨어지고 대형 Job은 FIFO(First In First Out)보다 실행 시간이 길다.
큐의 역할에 따라 용량을 잘 배분하고, 최대 사용 가능 용량(maximum-capacity)과 사용자 제한(user-limit-factor)을 이용하여 사용할 수 있는 자원의 용량을 제한해 주어야 한다.
- 설정한 큐의 목록과 현재 사용중인 용량 확인
Reference : https://wikidocs.net/35456
# Capacity: 설정된 용량
# MaximumCapacity: 최대 사용할 수 있는 용량, 기본값 100
# CurrentCapacity: 현재 사용중인 용량
$ mapred queue -list
======================
Queue Name : prod
Queue State : running
Scheduling Info : Capacity: 20.0, MaximumCapacity: 100.0, CurrentCapacity: 0.0
======================
Queue Name : dev
Queue State : running
Scheduling Info : Capacity: 60.0, MaximumCapacity: 75.0, CurrentCapacity: 0.0
======================
Queue Name : eng
Queue State : running
Scheduling Info : Capacity: 50.0, MaximumCapacity: 100.0, CurrentCapacity: 0.0
======================
Queue Name : science
Queue State : running
Scheduling Info : Capacity: 50.0, MaximumCapacity: 100.0, CurrentCapacity: 0.0
..
우리는 ETL용, 조회서비스용, 파일서비스용으로 Queue를 분리해서 사용한다.
하둡 아키텍처
HDFS 클러스터는 master-worker 패턴으로 마스터인 하나의 네임노드와 워커인 여러 개의 데이터노드로 구성되어 있다.
HDFS 서비스
- 네임노드 - 마스터 노드에서 동작하면서 HDFS 파일 시스템 디렉토리 트리와 파일의 위치와 같은 HDFS 스토리지에 완련된 메타 데이터를 유지한다.
클라이언트가 HDFS를 읽거나 쓰려고 할 때, HDFS는 네임노드에 접속하고 네임노드는 HDFS내에 있는 파일 위치와 같은 정보를 제공한다. - 스탠바이 네임노드
- 데이터노드 - HDFS 데이터 블록들을 파일시스템에 저장하는 워커 노드에 실행되는 서비스이다.
네임노드와의 커넥션을 계속 유지하고 파일 시스템에서 일어나는 변화를 네임 노드에 업데이트한다.
YARN 서비스
- 리소스매니저(Resource Manager) - 클러스터에 하나만 실행되는 서비스로, 마스터 노드 중 하나에서 실행된다.
클러스터의 리소스를 나눠주는 역할을 하며 워커 노드에 타스크를 스케줄링 하는 일도 담당한다. - 애플리케이션마스터(Application Master) - 클러스터에서 실행되는 애플리케이션마다 하나씩 실행된다.
애플리케이션마스터는 클러스터에 있는 애플리케이션의 실행을 조율하고 애플리케이션을 위한 리소스들에 대해 리소스매니저와 협상하면서 리소스를 조절한다. - 노드매니저(Node Manager) - 모든 워커 노드에서 동작하는 서비스로 노드 매니저 서비스는 타스크를 워커 노드에서 실행하고 관리한다. 노드매니저는 리소스매니저와 긴밀한 관계를 유지하고 노드 상태 및 자신들이 동작시키고 있는 태스크 상태를 업데이트한다.
HDFS 아키텍처
마스터 노드와 데이터 노드
하나 이상의 노드가 마스터 노드의 역할을 한다. 마스터 노드에는 HDFS 메타데이터를 관리하는 네임노드 또는 job이나 task를 관리하는 리소스매니저같은 하둡의 핵심 서비스가 실행된다.
하둡 클러스터에 있는 나머지는 워커 노드(=data node)이다. 이 노드들이 실제로 데이터 블록들을 저장한다.
워커 노드들은 노드매니저(YARN)을 실행한다.
워커 노드들은 실제로 HDFS 파일 시스템에 데이터를 저장한다. 네임노드는 클러스터의 HDFS 파일 시스템에 대한 메타데이터를 저장하고 업데이트한다.
- 네임노드가 HDFS에 있는 파일에 데이터블록을 갖고 있는 데이터노드를 알고 있다고는 하지만 블록의 정확한 위치를 갖고 있지는 않다. 네임노드는 데이터노드가 보내오는 데이터를 가지고 메타데이터를 저장할 뿐이다. 네임노드는 이 정보들을 빠르게 액세스할 수 있도록 메모리에 저장한다.
- 데이터노드는 주기적으로 블록 정보와 하트 비트를 전송하는 방식으로 네임노드와 정보를 유지한다.
References
빅데이터 전문가의 하둡관리. SAM R. ALAPATI
https://aws.amazon.com/ko/emr/details/hadoop/what-is-hadoop/
'데이터 엔지니어링' 카테고리의 다른 글
ElasticSearch 구성 요소 - Shard, Replicas, Analyzer (0) | 2022.08.04 |
---|---|
Hadoop이란? (2) NameNode, Yarn (0) | 2022.08.03 |
Impala의 Architecture와 Components에 대한 정리 (0) | 2022.07.31 |
DataLake vs DataWarehouse vs DataMart (0) | 2022.07.30 |
[번역] Kafka Throughput&Latency Best Practices 공식문서 (0) | 2022.07.29 |
댓글