OLAP Quickstart

OLAP Quickstart (OLAP 빠른 시작)

OLAP(OnLine Analysis Processing)는 데이터 분석 분야의 핵심 기술로, 대규모 데이터셋에 대해 수 초 이내의 지연 시간으로 복잡한 쿼리를 수행하는 데 일반적으로 사용됩니다. 이제 Flink는 스트리밍과 배치 컴퓨팅을 지원할 뿐만 아니라, 사용자가 이를 OLAP 컴퓨팅 서비스로 배포하는 것도 지원합니다. 이 페이지에서는 로컬 Flink OLAP 서비스를 빠르게 설정하는 방법을 보여주고, 프로덕션에서 Flink OLAP 서비스를 배포하는 데 도움이 되는 몇 가지 모범 사례도 소개합니다.

출처: 문서

본문

아키텍처 소개 (Architecture Introduction)

이 장에서는 Flink OLAP 서비스의 전체 아키텍처와 이를 사용할 때의 장점을 소개합니다.

아키텍처 (Architecture)

Flink OLAP 서비스는 Client, Flink SQL Gateway, Flink Session Cluster의 세 부분으로 구성됩니다.

  • Client: Flink SQL Gateway와 상호작용할 수 있는 어떤 클라이언트든 가능합니다. 예를 들어 SQL Client, Flink JDBC Driver 등이 있습니다.
  • Flink SQL Gateway: SQL Gateway는 SQL 쿼리를 파싱하고, 메타데이터를 조회하고, 테이블 통계를 분석하고, 플랜을 최적화하며, JobGraph를 클러스터에 제출하는 쉬운 방법을 제공합니다.
  • Flink Session Cluster: OLAP 쿼리는 session cluster에서 실행되며, 주로 클러스터 시작의 오버헤드를 피하기 위함입니다.

Flink OLAP 아키텍처 예시

장점 (Advantage)

  • 대규모 병렬 처리 (Massively Parallel Processing) — Flink OLAP은 자연스럽게 대규모 병렬 처리 시스템으로 실행되어, 플래너가 다양한 데이터 크기에서 쿼리의 지연 요구사항을 충족하도록 작업 병렬도를 쉽게 조정할 수 있게 합니다.
  • 탄력적 리소스 관리 (Elastic Resource Management) — Flink의 리소스 관리는 min/max 스케일링을 지원하므로, session cluster가 워크로드에 따라 리소스를 동적으로 할당할 수 있습니다.
  • 커넥터 재사용 (Reuse Connectors) — Flink OLAP은 Flink 생태계의 풍부한 Connectors를 재사용할 수 있습니다.
  • 통합 엔진 (Unified Engine) — Streaming/Batch/OLAP를 위한 통합 컴퓨팅 엔진입니다.

로컬 모드 배포 (Deploying in Local Mode)

이 장에서는 Flink OLAP 서비스를 로컬에서 구축하는 방법을 배웁니다.

Flink 다운로드

로컬 설치와 동일합니다. Flink는 Linux, Mac OS X, Cygwin(Windows용) 등 모든 UNIX 계열 환경에서 실행됩니다. 사용자는 Java 11이 설치되어 있어야 합니다. 설치된 Java 버전을 확인하려면 터미널에 다음을 입력하세요.

java -version

그 다음 Flink의 최신 바이너리 릴리스를 다운로드하고 아카이브를 추출합니다.

tar -xzf flink-*.tgz

로컬 클러스터 시작

로컬 클러스터를 시작하려면 Flink와 함께 제공되는 bash 스크립트를 실행합니다.

./bin/start-cluster.sh

http://localhost:8081의 웹 UI로 이동해 Flink 대시보드를 보고 클러스터가 실행 중인지 확인할 수 있습니다.

SQL Client CLI 시작

임베디드 게이트웨이로 CLI를 시작하려면 다음을 호출합니다.

./bin/sql-client.sh

쿼리 실행

CLI에서 쿼리를 실행하고 결과를 가져올 수 있습니다.

SET 'sql-client.execution.result-mode' = 'tableau';

CREATE TABLE Orders (
    order_number BIGINT,
    price        DECIMAL(32,2),
    buyer        ROW<first_name STRING, last_name STRING>,
    order_time   TIMESTAMP(3)
) WITH (
  'connector' = 'datagen',
  'number-of-rows' = '100000'
);

SELECT buyer, SUM(price) AS total_cost
FROM Orders
GROUP BY  buyer
ORDER BY  total_cost LIMIT 3;

그 다음 http://localhost:8081의 웹 UI에서 작업 세부 정보를 찾을 수 있습니다.

프로덕션 배포 (Deploying in Production)

이 섹션은 프로덕션 준비가 된 Flink OLAP 서비스를 설정하는 방법을 안내합니다.

클라이언트 (Client)

Flink JDBC Driver

SQL Gateway에 쿼리를 제출할 때는 Flink JDBC Driver를 사용해야 합니다. 저수준 연결 관리를 제공하기 때문입니다. 프로덕션에서 사용할 때는 Gateway에서 세션을 빈번하게 만들고 닫는 것을 피하기 위해 JDBC 연결을 재사용하는 데 주의해야 하며, 이를 통해 E2E 쿼리 지연을 줄일 수 있습니다. 자세한 내용은 Flink JDBC Driver를 참조하세요.

클러스터 배포 (Cluster Deployment)

프로덕션에서는 Flink Session Cluster와 Flink SQL Gateway를 사용해 OLAP 서비스를 구축해야 합니다.

Session Cluster

Flink Session Cluster는 session mode를 사용해 Native Kubernetes에 배포할 수 있습니다. Kubernetes는 컴퓨터 애플리케이션 배포, 확장, 관리를 자동화하는 인기 있는 컨테이너 오케스트레이션 시스템입니다. Native Kubernetes에 배포함으로써 Flink Session Cluster는 TaskManager를 동적으로 할당하고 해제할 수 있습니다. 자세한 내용은 Native Kubernetes를 참조하세요. 또한 session cluster에서 slotmanager.number-of-slots.min 옵션을 구성할 수 있습니다. 이는 쿼리의 콜드 스타트(cold start) 시간을 크게 줄이는 데 도움이 됩니다. 자세한 내용은 FLIP-362를 참조하세요.

SQL Gateway

Flink SQL Gateway는 상태 없는(stateless) 마이크로서비스로 배포하고 서비스 디스커버리 컴포넌트에 인스턴스를 등록해야 합니다. 이 방식으로 클라이언트는 인스턴스 간에 쿼리를 쉽게 부하 분산할 수 있습니다. 자세한 내용은 SQL Gateway Overview를 참조하세요.

데이터소스 구성 (Datasource Configurations)

카탈로그 (Catalogs)

OLAP 시나리오에서는 Catalogs에서 제공하는 FileCatalogStore를 클러스터가 사용하는 카탈로그로 구성해야 합니다. 장기 실행 서비스로서 Flink OLAP 클러스터의 카탈로그 정보는 자주 변경되지 않으며, 콜드 스타트 비용을 줄이기 위해 세션 간 재사용되어야 합니다. 자세한 내용은 Catalog Store를 참조하세요.

커넥터 (Connectors)

Session Cluster와 SQL Gateway 모두 테이블 통계를 분석하고 구성된 데이터소스에서 데이터를 읽기 위해 커넥터에 의존합니다. 커넥터를 추가하는 방법은 Connectors를 참조하세요.

권장 클러스터 구성 (Recommended Cluster Configurations)

OLAP 시나리오에서는 적절한 구성이 전체적인 사용성과 쿼리 성능을 크게 향상시키는 데 도움이 됩니다. 다음은 권장되는 몇 가지 프로덕션 구성입니다.

SQL & Table 옵션
파라미터 기본값 권장값
table.optimizer.join-reorder-enabled false true
pipeline.object-reuse false true
sql-gateway.session.plan-cache.enabled false true
런타임 옵션 (Runtime Options)
파라미터 기본값 권장값
execution.runtime-mode STREAMING BATCH
execution.batch-shuffle-mode ALL_EXCHANGES_BLOCKING ALL_EXCHANGES_PIPELINED
env.java.opts.all {기본값} {기본값} -XX:PerMethodRecompilationCutoff=10000 -XX:PerBytecodeRecompilationCutoff=10000-XX:ReservedCodeCacheSize=512M -XX:+UseZGC
JDK 버전 11 17

JDK17과 함께 ZGC를 사용하면 metaspace 가비지 컬렉션 문제를 최적화하는 데 크게 도움이 됩니다. 자세한 정보는 FLINK-32746에서 확인할 수 있습니다. 또한 ZGC는 메모리에서 가비지 객체를 수집할 때 거의 0에 가까운 애플리케이션 일시 중지 시간을 제공할 수 있습니다. 추가로 OLAP 쿼리는 실행 플랜에 PipelinedBlocking 엣지가 모두 나타날 수 있으므로 BATCH 모드로 실행되어야 합니다. 배치 스케줄러는 쿼리를 스테이지로 스케줄링할 수 있어 이런 시나리오에서 스케줄링 교착 상태를 피할 수 있습니다.

스케줄링 옵션 (Scheduling Options)
파라미터 기본값 권장값
jobmanager.scheduler Default Default
jobmanager.execution.failover-strategy region full
restart-strategy.type (none) disable
jobstore.type File Memory
jobstore.max-capacity Integer.MAX_VALUE 500
네트워크 옵션 (Network Options)
파라미터 기본값 권장값
rest.server.numThreads 4 32
web.refresh-interval 3000 300000
pekko.framesize 10485760b 104857600b
ResourceManager 옵션
파라미터 기본값 권장값
kubernetes.jobmanager.replicas 1 2
kubernetes.jobmanager.cpu.amount 1.0 16.0
jobmanager.memory.process.size (none) 32g
jobmanager.memory.jvm-overhead.max 1g 3g
kubernetes.taskmanager.cpu.amount (none) 16
taskmanager.numberOfTaskSlots 1 32
taskmanager.memory.process.size (none) 65536m
taskmanager.memory.managed.size (none) 16384m
slotmanager.number-of-slots.min 0 {taskManagerNumber * numberOfTaskSlots}

slotmanager.number-of-slots.min을 OLAP 쿼리를 제공하는 예약 리소스 풀로서 적절한 값으로 구성할 수 있습니다. OLAP 시나리오에서는 더 많은 연산을 로컬에 배치하고 네트워크/역직렬화/직렬화 오버헤드를 줄일 수 있으므로 TaskManager를 큰 리소스 사양으로 구성해야 합니다. 한편 OLAP의 단일 계산 지점으로서 JobManager도 큰 리소스 사양을 선호합니다.

향후 작업 (Future Work)

Flink OLAP은 이제 Apache Flink Roadmap의 일부이며, 커뮤니티가 사용성과 쿼리 성능 양쪽 모두에서 Flink OLAP을 개선하기 위해 계속 노력할 것임을 의미합니다. 관련 작업은 아래 티켓에서 추적됩니다.

더 알아보기 (Learn more)