쿼리엔진
데이터 마트 구축의 파이프라인
위의 예제는 Hive와 Presto를 사용한 간단한 데이터 파이프라인입니다.
우선 분산 스토리지에 저장된 CSV, 텍스트 데이터 등을 Hive를 통하여 구조화하고 열 지향 스토리지 형식으로 저장합니다.
이때 Hive에서 만든 테이블의 정보는 Hive 메타 스토어에 저장됩니다. SQL-on-Hadoop의 쿼리엔진에서도 공통의 테이블 정보를 참고합니다.
그리고 열 지향 스토리지에서 Presto의 쿼리를 이용하여 구조화된 데이터를 결합, 집계하는 과정을 거쳐 비정규화 테이블로 만들어 데이터 마트로 내보냅니다.
Hive에 의한 구조화 데이터 작성
Hive를 비롯한 대부분의 SQL-on-Hadoop의 쿼리 엔진은 MPP 데이터베이스처럼 데이터를 내부로 가져오지 않아도 텍스트 파일, CSV 파일을 그대로 가져와 집계할 수 있습니다.
하지만 파일을 그대로 집계하는 것은 비효율적입니다. 쿼리를 실행시킬 때마다 매번 텍스트를 읽어 들이기 때문에 빠르지는 않습니다.
열 지향 스토리지로의 변환
계속해서 텍스트를 읽어 들이는 것이 아니라 ORC 형식의 테이블을 생성하여 텍스트 파일에서 읽어드린 데이터를 저장하여 사용합니다. ORC 형식으로 변환하는데에는 시간이 걸리지만 변환 후에 쿼리하는데에는 텍스를 읽어서 쿼리하는 방식보다 훨씬 빠르게 작동합니다.
하지만 ORC 형식으로 변환하는데 시간이 걸리기 때문에 Hive는 이런 배치형 쿼리에 더 적합합니다.
대화형 쿼리 엔진 Presto의 구조
Hive와 같은 배치형 쿼리 엔진은 대량 출력을 수반하는 대용량 처리에 적합하지만 작은 쿼리를 여러번 실행하는 데이터 처리에는 적합하지 않습니다.
Presto는 '대화형 쿼리 엔진'이란 쿼리 실행의 지연을 감소시키는 것을 목적으로 개발되었습니다.
Presto 또한 Hadoop과 함께 사용할 수 있습니다.
Presto의 특징은 '플러그인 가능한 스토리지 설계' 입니다.
일반적인 MPP 데이터베이스는 스토리지(저장소)와 컴퓨팅 노드가 밀접하게 결합되어 있어서 처음에 데이터를 로드하지 않으면 집계를 시작할 수 없습니다. 하지만 Presto의 경우 전용 스토리지를 가지고 있지 않고 Hive 처럼 다양한 데이터 소스에서 직접 데이터를 읽어드립니다.
Hive 메타 스토어에 등록된 테이블을 가져올 수 있고, 물론 CSV와 같은 텍스트 데이터를 가져올 수 있습니다. 하지만 Presto는 스토리지가 열 지향 데이터 구조, ORC 형식의 로드에 최적화 되어있습니다.
CPU 처리의 최적화
Presto는 SQL의 실행에 특화된 시스템으로, 쿼리를 분석하여 최적의 실행 계획을 생성하고, 그것을 자바의 바이트 코드로 변환합니다. 변환된 바이트 코드는 Presto의 워커 노드에 배포되고, 그것은 런타임 시스템에 의해 기계 코드로 컴파일 됩니다.
Presto는 CPU 이용 효율이 높으므로 메모리와 CPU 리소스만 충분하다면 데이터의 읽기 속도가 쿼리 실행 시간을 결정하게 됩니다.
Presto 클러스터는 Presto만을 위하여 항상 대기하고 있으며, 쿼리 실행에 컴퓨터의 모든 리소스를 사용합니다. 리소스가 부족하면 나중에 실행된 쿼리는 앞의 쿼리가 끝날 때 까지 기다려야 하고 지연이 발생할 수 있기 때문에 Presto 의 클러스터는 항상 여유가 있는 상태여야 합니다.
또한 Presto 쿼리는 실행이 시작되면 중간에 끼어들 수 없습니다. 너무 큰 쿼리를 실행하게 되면 그 쿼리에 대부분의 리소스를 사용하기 때문에 다른 쿼리를 실행할 수 없게 될 우려가 있습니다.
인 메모리 처리에 의한 고속화
Presto의 쿼리 실행과정에서 Hive와 달리 디스크에 쓰기를 하지 않습니다. 모든 데이터 처리는 메모리에서 실시하고 메모리가 부족하면 여유가 생길 때까지 기다리거나 오류로 실패합니다. 프로젝트를 진행할 때 메모리 관리에 실패하여 노드들이 죽어 오류로 실패한 경험이 있습니다. 주의해서 사용해야 합니다. 설정 변경으로 메모리 할당을 늘리거나 쿼리를 다시 작성해야 하는데 저는 메모리 할당도 늘리고 쿼리도 다시 작성하여 진행했습니다.
몇 시간 이나 걸리는 대규모 배치 처리와 거대한 테이블끼리의 결합은 Hive를 사용하고 디스크를 활용해야 합니다. 하지만 그 외의 단시간 걸리는 쿼리는 Presto와 같은 대화형 쿼리 엔진을 이용하는 것이 좋습니다.
'데이터 엔지니어링' 카테고리의 다른 글
[빅데이터를 지탱하는 기술] 빅데이터의 축적 # 1 (0) | 2023.05.26 |
---|---|
[빅데이터를 지탱하는 기술] 대규모 분산 처리의 프레임워크 # 5 (0) | 2023.05.24 |
[빅데이터를 지탱하는 기술] 대규모 분산 처리의 프레임워크 # 3 (1) | 2023.05.22 |
[빅데이터를 지탱하는 기술] 대규모 분산 처리의 프레임워크 # 2 (0) | 2023.05.19 |
[빅데이터를 지탱하는 기술] 대규모 분산 처리의 프레임워크 # 1 (0) | 2023.05.18 |