지금있는 회사는 impala sql을 이용해서 데이터를 추출한다. hive sql은 배치돌 때만 사용하고, Impala 추로 애드훅분석으로 데이터 추출할 때 많이 사용한다. 그 이유에 대해 알아보고자 한다. 😊
MapReduce는 빅데이터 처리의 기본적인 원리를 이해하는 데 필수적이기 때문에, 일단 개념부터 알아봅시다 !
MapReduce
- MapReduce는 데이터를 처리하고 분석하는 방법입니다.
- 아주 큰 데이터를 빠르게 처리하기 위해 만들어진 기술이에요.
- 한 마디로, "데이터를 각자 나눠서(Map) 처리한 뒤, 모두 모아서(Reduce) 결과를 낸다"고 이해하면 됩니다.
어떻게 동작할까?
- Map(맵):
- 데이터를 여러 조각으로 나눠서 각 Data Node(서버)가 각각 계산을 진행합니다.
- 예: "서울", "부산", "대구"라는 데이터가 있다면, 각 단어가 몇 번 나오는지 나눠서 세는 작업.
- "서울" → 1
- "부산" → 1
- "대구" → 1
- Reduce(리듀스):
- 각 Node에서 계산된 결과를 모아서 최종 값을 합칩니다.
- 예: "서울", "서울", "부산"이라는 데이터를 모두 모아서:
- "서울" → 2
- "부산" → 1
MapReduce는 왜 쓰일까?
- 데이터가 너무 크거나(빅데이터), 계산이 복잡할 때도 여러 대의 서버가 나눠서 처리하면 훨씬 빠르게 계산할 수 있어요.
- 예를 들어, 몇 테라바이트(TB)나 페타바이트(PB)에 달하는 데이터를 단일 컴퓨터에서 처리하려면 불가능하지만, 서버 여러 대가 나눠서 처리하면 효율적입니다.
MapReduce는 어떻게 실행할까?
- MapReduce는 Java로 만들어졌어요.
- 프로그래머가 Map과 Reduce 과정을 코딩하고, 이를 .jar 파일로 묶어서 실행합니다.
- 하지만 매번 이렇게 코딩하는 건 너무 어렵고 비효율적이죠.
그래서 나온 해결책: HiveQL
- HiveQL은 MapReduce를 더 쉽게 사용하기 위한 도구예요.
- SQL 문법으로 작성하면 내부적으로 MapReduce가 실행되도록 만들어줍니다.
- 예를 들어, 아래처럼 SQL처럼 쿼리를 작성하기만 하면 HiveQL이 내부에서 MapReduce 작업을 대신 실행합니다.
SELECT word, COUNT(*)
FROM words
GROUP BY word;
실행동작
HADOOP 쪽에 JOB Tracker가 Map/Reudce task를 실행시키는걸 볼 수 있다. 과정은 아래와 같다.
1. 쿼리가 들어오면 해당 sql문을 map-reduce로 컴파일한다.
2. 데이터가 어디에 있는지 메타스토어에서 정보를 뽑아온다.
3. 해당 정보를 기반으로 Job Tracker가 Task Tracker에게 data가 있는 node에서 작업을 수행하게하고(map) 해당 값들을 모아서 결과를 내라고 전한다(reduce).
3-1. Map Task는 전체 node 수보다 훨씬 많이 생성된다. 하나의 data chuck 당 하나의 Map이 보편적이다.
3-2. 자원 분배는 YARN 에서 담당한다.
4. Map Task는 HDFS로 부터 데이터를 읽고 결과값을 Local Disk에 Write 한다. 그러면 Reduce Task가 Map Output을 읽고결과값을 HDFS에 Write 한다.
Impala
하지만 Impala는 이러한 Map Reduce 프레임워크를 사용하지 않고 자체 분산 쿼리 엔진을 사용한다. 이 때 query의 대상이 되는 데이터를 메모리에 저장한다. Disk에 저장해서 사용하는 Map Reduce와는 여기서도 속도 차이가 발생한다
Impala의 쿼리 수행 프로세스를 보면,,
1. 쿼리가 들어오면 코디네이터 노드가 쿼리 계획을 짠다.
2. 짜여진 계획을 관련있는 데이터가 있는 각각의 impalad에 넘기고 이를 처리한다. 이때 쿼리는 노드에서 병렬로 수행한다.
3. 해당 노드의 데이터만으로 쿼리를 완료할 수 없다면 다른 노드와 데이터를 교환하기도 한다.
4. 코디네이터가 데이터를 모으고 결과를 낸다.
impalad 라고 부르는 Impala Daemon은 각각의 Data Node에 하나씩 떠있다.
이들이 데이터를 읽어서 메모리에 올리고, 쿼리를 수행한다. impalad는 데이터를 바로 읽어올 수 있도록 meta 정보를 가지고 있고, 자체 쿼리 엔진으로 쿼리를 처리한다. 다른 impalad와 함께 병렬로 처리하기 때문에 더욱 빠른 속도를 낼 수 있다.
Hive와 Impala: 차이점 쉽게 설명하기
1. 데이터 위치를 어떻게 찾을까?
- Hive:
- 데이터를 처리하기 전에 항상 Name Node(데이터 저장소 관리자)에서 데이터가 어디 있는지 확인하고 시작합니다.
- Impala:
- 데이터를 어디에 저장했는지 스스로 기억합니다.
- 그래서 Name Node에 매번 확인하지 않고 바로 작업 계획을 세울 수 있어 더 빠릅니다.
참고:
- 메타데이터 변경 문제:
- Impala는 데이터 위치를 기억하기 때문에 데이터가 바뀌면 이를 모를 수도 있습니다.
- 이를 해결하려고 Impala에는 invalidate metadata라는 명령어가 따로 있습니다.
(이 명령어를 실행하면 변경된 데이터를 다시 인식합니다.)
- 쿼리 성능 개선:
- Impala에서는 **compute stats**라는 명령어로 테이블의 통계정보를 미리 저장해두면 쿼리가 더 빨라질 수 있습니다.
- 예를 들어, 메모리 부족으로 쿼리가 실패했던 상황도 compute stats를 사용하면 해결된 경우가 많습니다.
2. 데이터를 어디서 처리할까?
- Hive:
- 데이터를 디스크(하드)에 저장한 상태로 처리합니다.
- 디스크에서 데이터를 읽고 쓰기 때문에 속도가 느릴 수 있습니다.
- Impala:
- 데이터를 메모리(RAM)에 올려서 처리합니다.
- 메모리는 디스크보다 훨씬 빠르기 때문에 작업 속도가 더 빠릅니다.
참고:
- Hive는 YARN이라는 자원 관리 시스템이 있어서, 메모리가 부족하면 작업을 대기열(queue)에 넣어 순서를 기다립니다.
- Impala는 YARN을 사용하지 않기 때문에 메모리가 부족하면 작업이 중단(터짐)될 수 있습니다.
3. 병렬처리 방식의 차이
- Hive:
- 데이터를 여러 조각으로 나누어 각각의 조각을 Map Task에서 처리합니다.
- Map Task가 끝난 후, 결과값을 모아서 Reduce Task가 최종 결과를 만듭니다.
- 이 과정에서 데이터를 주고받고 정렬(sorting)하면서 디스크 입출력(Disk IO)과 네트워크 사용(Network IO)이 많아집니다.
- 결과적으로 작업 시간이 길어질 수 있습니다.
- Impala:
- 각각의 서버(노드)에서 데이터를 처리하고 결과를 바로 모아 최종 결과를 만듭니다.
- 노드 수에 따라 작업이 분산되기 때문에 Hive보다 더 빠르게 처리할 수 있습니다.
- 특히, 네트워크 사용(Network IO)이 적어서 대화형 SQL 쿼리에 적합합니다.
결론: Impala vs Hive, 상황에 따라 다르다
Impala가 항상 더 좋은 건 아닙니다. Impala는 대화형 쿼리에 최적화되어 있어 빠른 결과를 보여주지만, Hive가 더 적합한 경우도 있습니다.
언제 Hive가 더 나을까?
- ETL 작업(Extract, Transform, Load):
데이터를 추출, 변환, 적재하는 작업에서는 Hive가 효율적일 수 있습니다. - 집계 작업(Counting, Summing):
Mapper에서 일을 적절히 나누어 처리하기 때문에 속도가 빠른 경우도 있습니다.
언제 Impala가 더 나을까?
- Impala는 다음과 같은 속도 개선 기술 덕분에 대화형 쿼리와 실시간 분석에 강점이 있습니다:
- 메모리 캐싱: 데이터를 메모리에 올려 처리해 빠릅니다.
- Network IO 줄이기: 네트워크를 적게 사용해 병목현상이 줄어듭니다.
- 빠른 쿼리 계획: Name Node를 매번 확인하지 않고 자체적으로 계획을 세웁니다.
- 대화형 SQL 쿼리사용해야 할 때
'데이터엔지니어 > 빅데이터' 카테고리의 다른 글
Iceberg 에 대해 알아보자 (2) | 2024.12.30 |
---|---|
[하둡, 하이브로 시작하기] 빅데이터 기본 개념/처리 단계/빅데이터 에코시스템 (2) | 2024.12.19 |