Lightning Engine 사용
Lightning Engine은 Managed Service for Apache Spark에서 Apache Spark를 위한 고성능 실행 환경으로, Spark 코드를 변경하지 않고도 컴퓨팅 집약적인 워크로드를 가속화하고 런타임 비용을 줄입니다. Spark DataFrame API, Spark Dataset API 또는 Spark SQL 쿼리를 사용하는 컴퓨팅 집약적인 워크로드를 실행하는 데이터 엔지니어 및 분석 실무자를 위해 설계되었습니다.
이점
Lightning Engine의 이점은 다음과 같습니다.
가속화된 데이터 작업: 메타데이터 처리, 쓰기 워크로드, 벡터화된 I/O를 포함한 클라우드 스토리지 상호작용 최적화를 통해 성능을 크게 향상하고 비용을 절감할 수 있습니다.
지능형 쿼리 실행: 스캔되는 데이터를 동적으로 줄이고, 데이터 처리를 최적화하고, 더 빠르고 비용 효율적인 쿼리를 위해 더 효율적인 실행 계획을 생성하는 고급 최적화 도구 개선사항을 활용합니다.
간소화된 AI 및 ML 워크로드: GPU 기반 워크로드의 클러스터 시작 시간을 줄이고 AI에 최적화된 이미지를 사용하여 안전한 환경에서 배포를 간소화합니다.
Lightning Engine은 상당한 성능 향상을 제공하지만 구체적인 영향은 워크로드에 따라 다릅니다.
표준 엔진과 비교
Lightning Engine은 Managed Service for Apache Spark 클러스터에서 Spark 작업을 실행하는 데 사용되는 표준 엔진의 대안입니다. 다음 표에서는 Lightning Engine과 표준 엔진 활성화 속성, 워크로드 적용 가능성, 주요 이점을 비교합니다.
| 기능 | 표준 엔진 | Lightning Engine |
|---|---|---|
| CLI 플래그 | --engine=default 또는 플래그 설정 해제 |
--engine=lightning |
| 권장 용도 | 범용 작업, 개발, 테스트 | 상당한 가속이 필요한 엔터프라이즈 규모 워크로드 |
| 주요 이점 | 기준 성능 | 최적화된 클라우드 스토리지 상호작용, 지능형 쿼리 실행 |
Lightning Engine 요구사항
Lightning Engine 기능에는 다음 요구사항이 적용됩니다.
- 이미지 버전: Lightning Engine은 Managed Service for Apache Spark 이미지 버전
2.3.3이상2.3하위 부 이미지 버전 출시 또는3.0.2이상3.0하위 부 이미지 버전 출시 (debian13및ubuntu24이미지)와 함께 사용해야 합니다. - 지원되는 작업: Spark, PySpark, SparkSQL, SparkR이 지원됩니다. 표준 엔진은 Lightning Engine 클러스터에 제출된 다른 작업 유형에서 실행됩니다.
네이티브 쿼리 실행
네이티브 쿼리 실행 (NQE)은 특정 작업에 대한 더 높은 수준의 가속화를 제공하는 Lightning Engine의 선택적 구성요소입니다. 이는 Apache Gluten 및 Velox를 기반으로 하는 네이티브 엔진으로, Google 하드웨어에 최적화되어 JVM 외부에서 Spark 쿼리의 일부를 실행하여 성능을 향상합니다.
- NQE는 다음과 같은 경우에 권장됩니다.
- Spark DataFrame API 및 Spark 데이터 세트 API를 활용하는 컴퓨팅 집약적인 태스크와 Parquet, ORC, Apache Iceberg, Delta Lake 파일 및 테이블에서 데이터를 읽는 Spark SQL 쿼리 출력 파일 형식은 성능에 영향을 미치지 않습니다.
- NQE는 다음과 같은 경우에 권장되지 않습니다.
- 탄력적 분산 데이터 세트 (RDD), 사용자 정의 함수 (UDF), 대부분의 Spark 머신러닝 (ML) 라이브러리, 스토리지 액세스로 인한 지연이 있는 I/O 바인딩 작업에 크게 의존하는 작업
ARM에서 네이티브 쿼리 실행
Managed Service for Apache Spark는 2.3-ubuntu22-arm 이미지를 사용하여 C4A ARM VM의 Google Axion 프로세서에 특별히 최적화된 ARM 아키텍처의 Lightning Engine 내에서 네이티브 쿼리 실행을 지원합니다 (Managed Service for Apache Spark에서 지원되는 ARM 머신 유형 참조). Google Axion C4A 인스턴스는 ARM Neoverse V2 코어를 기반으로 빌드된 ARM 기반 VM으로, 가격 대비 성능이 크게 향상되었습니다.
Google Axion ARM 인스턴스에서 NQE를 실행하면 하드웨어 수준의 가격 대비 성능과 코어당 높은 메모리 대역폭이 소프트웨어 수준의 네이티브 벡터화된 쿼리 가속과 결합되어 쿼리 런타임과 총소유비용 (TCO)이 크게 줄어듭니다.
ARM의 주요 이점은 다음과 같습니다.
- 오픈소스 Spark보다 2.5~4배 빠른 속도: 분석 워크로드에서 오픈소스 Apache Spark에 비해 2.5~4배의 성능 향상을 제공합니다.
- 비용 최적화: 유사한 x86 인스턴스에 비해 최대 65% 더 우수한 가격 대비 성능을 제공하는 Google Axion C4A 인스턴스의 가격 대비 성능 이점을 극대화합니다.
- 전체 연산자 및 형식 패리티: x86 NQE 연산자와의 전체 패리티로, Cloud Storage Parquet, Apache Iceberg, Delta Lake 테이블 형식에 대한 기본 가속을 제공합니다.
- 코드 변경 없음: Spark 애플리케이션 코드를 수정하지 않고 표준 구성 플래그를 사용하여 ARM 클러스터에서 원활하게 활성화할 수 있습니다.
네이티브 쿼리 실행 요구사항
네이티브 쿼리 실행 기능에는 다음 요구사항이 적용됩니다.
실행 엔진: NQE는 클러스터 생성 시 Lightning 엔진이 사용 설정된 클러스터에서만 사용할 수 있습니다.
지원되는 작업: Spark, PySpark, Spark SQL, SparkR이 지원됩니다. Lightning Engine 클러스터에 제출된 다른 작업 유형에서는 표준 엔진이 NQE 없이 실행됩니다.
GPU 및 가속기 없음: GPU 가속기에서 제출된 NQE 지원 작업은 실패합니다 (하지만 NQE 없이 Lightning Engine을 활용할 수 있음).
데이터 유형: 다음 데이터 유형의 입력은 지원되지 않습니다.
- 바이트: ORC 및 Parquet
- 구조체, 배열, 맵: Parquet
아키텍처 및 운영체제 요구사항
NQE 요구사항은 프로세서 아키텍처에 따라 다릅니다.
| 아키텍처 | 지원되는 머신 유형 | 지원되는 운영체제 및 이미지 |
|---|---|---|
| x86 | Intel 및 AMD 머신 계열 | Debian-12 및 Ubuntu-22 (이미지 버전 2.3.3 및 이후 2.3 출시 버전), Debian-13 및 Ubuntu-24 (이미지 버전 3.0.2 및 이후 3.0 출시 버전) |
| ARM | C4A 머신 시리즈 (Google Axion ARM VM) | 2.3-ubuntu22-arm 이미지 (버전 2.3.3 이상 2.3 출시 버전) |
가격 책정
가격 책정 정보는 Managed Service for Apache Spark 가격 책정을 참조하세요.
Lightning Engine 클러스터 만들기
이 섹션에서는 클러스터에 제출된 Spark 작업에서 Lightning Engine을 사용 설정하는 Managed Service for Apache Spark 클러스터를 만드는 방법을 보여줍니다.
클러스터를 만들 때 클러스터에서 네이티브 쿼리 실행 (NQE)을 사용 설정하거나 나중에 클러스터에 제출된 특정 Spark 작업에 NQE를 사용 설정할 수 있습니다.
시작하기 전에
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
필요한 역할
Managed Service for Apache Spark 클러스터를 만들고 클러스터에 작업을 제출하려면 특정 Identity and Access Management (IAM) 역할이 필요합니다. 조직 정책에 따라 클라우드 프로젝트 소유자 또는 서비스 관리자가 이미 이러한 역할을 사용자 또는 서비스 계정에 부여했을 수 있습니다. 역할 부여를 확인하려면 역할을 부여해야 하나요?를 참조하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
사용자 역할
Managed Service for Apache Spark 클러스터를 만드는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.
- 프로젝트에 대한 Dataproc 편집자 (
roles/dataproc.editor) - Compute Engine 기본 서비스 계정의 서비스 계정 사용자 (
roles/iam.serviceAccountUser)
서비스 계정 역할
Compute Engine 기본 서비스 계정에 Managed Service for Apache Spark 클러스터를 만드는 데 필요한 권한이 있는지 확인하려면 관리자에게 프로젝트의 Compute Engine 기본 서비스 계정에 Dataproc 작업자 (roles/dataproc.worker) IAM 역할을 부여해 달라고 요청하세요.
클러스터 만들기
다음 예시에서는 Google Cloud 콘솔, Google Cloud CLI, Dataproc API, Python용 Cloud 클라이언트 라이브러리 또는 Terraform을 사용하여 Lightning Engine 클러스터를 만드는 방법을 보여줍니다. Go, Java, Node.js Cloud 클라이언트 라이브러리를 사용하여 Lightning Engine이 사용 설정된 클러스터를 만들 수도 있습니다.
콘솔
- 클러스터 만들기 페이지를 엽니다.
- 추가 구성을 클릭하여 해당 섹션을 펼칩니다.
- 맞춤설정 및 기타를 수정합니다.
- 패널이 열리면 Lightning Engine 사용 설정 체크박스가 선택되어 있는지 확인합니다.
- 선택사항: Spark 작업에 기본적으로 네이티브 실행 런타임을 사용 설정하려면 네이티브 실행 사용 설정 체크박스를 선택합니다.
- 저장을 클릭합니다.
- 필요에 따라 다른 클러스터 설정을 구성합니다.
- 클러스터 만들기를 클릭합니다.
ARM 클러스터 만들기:
Google Axion 및 네이티브 쿼리 실행을 사용하여 ARM 클러스터를 만들려면 다음 안내를 따르세요.
- 작업자 구성에서 C4A 머신 시리즈를 선택하고 ARM 머신 유형을 선택합니다.
- 이미지에서
2.3-ubuntu22-arm이미지를 선택합니다. - 추가 구성 > 맞춤설정 및 기타에서 Lightning Engine 사용 설정 및 네이티브 실행 사용 설정이 선택되어 있는지 확인합니다.
- 클러스터 만들기를 클릭합니다.
gcloud
Lightning Engine이 사용 설정된 클러스터를 만들려면
--engine=lightning플래그와 함께gcloud dataproc clusters create명령어를 실행합니다. 자세한 내용은 gcloud CLI를 사용하여 클러스터 만들기를 참조하세요.gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3선택사항: Spark 작업에 기본적으로 네이티브 실행 런타임을 사용 설정하려면
spark:spark.dataproc.lightningEngine.runtime=native속성을 포함합니다.gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3 \ --properties='spark:spark.dataproc.lightningEngine.runtime=native'NQE를 사용하여 ARM 클러스터 만들기: Google Axion C4A ARM 노드와 NQE가 사용 설정된 Managed Service for Apache Spark 클러스터를 만들려면 다음 안내를 따르세요.
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --image-version=2.3-ubuntu22-arm \ --master-machine-type=c4a-standard-16 \ --worker-machine-type=c4a-standard-16 \ --engine=lightning \ --properties='spark:spark.dataproc.lightningEngine.runtime=native'
API
Lightning Engine이 사용 설정된 클러스터를 만들려면 clusters.create 요청을 전송합니다. 자세한 내용은 REST API로 클러스터 만들기를 참조하세요.
요청 본문에서
engine필드를LIGHTNING로 설정합니다.{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3" } } }선택사항: 모든 작업에 기본적으로 네이티브 실행 런타임을 사용 설정하려면
spark:spark.dataproc.lightningEngine.runtime속성을 포함합니다.{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } }
Python
Lightning Engine이 사용 설정된 클러스터를 만들려면
create_cluster메서드를 사용하고 클러스터 구성의engine필드를LIGHTNING로 설정합니다. 자세한 내용은 Python으로 클러스터 만들기를 참조하세요.from google.cloud import dataproc_v1 def create_lightning_cluster(project_id, region, cluster_name): client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"} cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options) cluster = { "project_id": project_id, "cluster_name": cluster_name, "config": { "engine": "LIGHTNING", "software_config": { "image_version": "2.3-debian12", }, } } operation = cluster_client.create_cluster( project_id=project_id, region=region, cluster=cluster ) result = operation.result() print(f"Cluster created successfully: {result.cluster_name}")선택사항: Spark 작업에 기본적으로 네이티브 실행 런타임을 사용 설정하려면
spark:spark.dataproc.lightningEngine.runtime속성을 포함합니다.from google.cloud import dataproc_v1 def create_lightning_native_cluster(project_id, region, cluster_name): client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"} cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options) cluster = { "project_id": project_id, "cluster_name": cluster_name, "config": { "engine": "LIGHTNING", "software_config": { "image_version": "2.3-debian12", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } } operation = cluster_client.create_cluster( project_id=project_id, region=region, cluster=cluster ) result = operation.result() print(f"Cluster created successfully: {result.cluster_name}")
Terraform
google_dataproc_cluster리소스 구성에서engine인수를LIGHTNING로 설정합니다.- 자세한 내용과 고급 옵션은
google_dataproc_cluster리소스에 대한 공식 Terraform 문서를 참조하세요.
클러스터 엔진 확인
콘솔
- Google Cloud 콘솔에서 클러스터 세부정보 페이지로 이동합니다.
- 엔진 필드에
Lightning Engine값이 표시되는지 확인합니다. - 네이티브 쿼리 실행을 사용 설정한 경우
native가 네이티브 실행 필드에 나열되어 있는지 확인합니다.
gcloud
엔진과 NQE (사용 설정된 경우)를 확인하려면
gcloud dataproc clusters describe명령어를 실행합니다.gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGION출력에서
engine및lightningEngine.runtime속성을 확인합니다.clusterName: lightning-engine-cluster engine: lightningEngine lightningEngine.runtime: native
Lightning Engine으로 작업 제출
클러스터를 만들 때 Lightning Engine을 사용 설정한 경우 클러스터에 Spark 작업을 제출하면 기본적으로 작업에서 Lightning Engine이 사용 설정됩니다.
작업에 네이티브 쿼리 실행 사용 설정
Lightning Engine 클러스터를 만들 때 네이티브 쿼리 실행 (NQE)을 사용 설정한 경우 특정 작업에서 NQE를 사용 중지하지 않는 한 모든 Spark 작업이 NQE가 사용 설정된 상태로 실행됩니다.
Lightning Engine 클러스터를 만들 때 NQE를 사용 설정하지 않은 경우 다음 예시와 같이 작업을 제출할 때 작업에 NQE를 사용 설정할 수 있습니다.
gcloud
Spark 작업을 제출할 때 네이티브 쿼리 실행을 사용 설정하려면 spark.dataproc.lightningEngine.runtime=native 속성을 포함합니다.
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=native \
-- ...
API
Spark 작업을 제출할 때 네이티브 쿼리 실행을 사용 설정하려면 요청에 spark.dataproc.lightningEngine.runtime 속성을 포함합니다.
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"native"
}
}
}
}
작업에 네이티브 쿼리 실행 사용 중지
Lightning Engine 클러스터를 만들 때 네이티브 쿼리 실행 (NQE)을 사용 설정한 경우 특정 작업에서 NQE를 사용 중지하지 않는 한 모든 Spark 작업이 NQE가 사용 설정된 상태로 실행됩니다.
다음 예시와 같이 작업을 제출할 때 특정 Spark 작업에 대해 NQE를 사용 중지할 수 있습니다.
gcloud
Lightning Engine 클러스터에 Spark 작업을 제출할 때 네이티브 쿼리 실행을 사용 중지하려면 spark.dataproc.lightningEngine.runtime=default 속성을 포함합니다.
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=default \
-- ...
API
Lightning Engine 클러스터에 Spark 작업을 제출할 때 네이티브 쿼리 실행을 사용 중지하려면 spark.dataproc.lightningEngine.runtime=default 속성을 포함합니다.
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"default"
}
}
}
}
작업의 네이티브 쿼리 실행 확인
Lightning Engine 클러스터에 작업을 제출한 후 작업에 네이티브 쿼리 실행이 사용 설정되어 있는지 확인할 수 있습니다.
콘솔
- Google Cloud 콘솔에서 작업 페이지로 이동합니다.
- 작업 ID를 클릭하여 작업 세부정보 페이지를 엽니다.
native가 네이티브 실행 필드에 나열되어 있는지 확인합니다.
gcloud
gcloud dataproc jobs describe명령어를 실행합니다.gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGION속성 섹션에서
lightningEngine.runtime의 출력을 확인합니다.lightningEngine.runtime: native
구성 매개변수
다음 표에는 Lightning Engine 및 네이티브 쿼리 실행의 기본 구성 매개변수가 요약되어 있습니다.
| 파라미터 이름 | 설명 | 적용 가능한 엔진 | 기본값 | 기본값 (Lightning Engine) | 사용자 재정의 가능 (작업 수준) | 범위 |
|---|---|---|---|---|---|---|
--engine |
클러스터 생성 중에 엔진을 선택하는 클러스터 수준 설정입니다. | 클러스터 전체 | default |
lightning |
아니요 | 클러스터 |
spark:spark.dataproc.lightningEngine.runtime |
클러스터 생성 중에 Lightning 엔진 런타임을 선택하는 클러스터 수준 설정입니다. | Lightning만 | default |
default |
아니요 | 클러스터 |
spark.dataproc.lightningEngine.runtime |
Lightning Engine 내에서 네이티브 쿼리 실행 (NQE)을 사용 설정하거나 사용 중지합니다. | Lightning만 | default |
default |
예. native 또는 default로 설정할 수 있습니다. |
작업 |
제한사항
다음 시나리오에서 네이티브 쿼리 실행을 사용 설정하면 예외, Spark 비호환성 또는 워크로드가 기본 Spark 엔진으로 대체될 수 있습니다.
대체 값
다음 시나리오에서 네이티브 쿼리 실행은 워크로드가 Spark 실행 엔진으로 대체될 수 있습니다.
- ANSI: ANSI 모드가 사용 설정된 경우 실행이 Spark로 대체됩니다.
- 대소문자 구분 모드: 기본 쿼리 실행은 Spark 기본 대소문자를 구분하지 않음 모드만 지원합니다. 대소문자 구분 모드가 사용 설정된 경우 잘못된 결과가 발생할 수 있습니다.
- 파티션을 나눈 테이블 스캔: 네이티브 쿼리 실행은 경로에 파티션 정보가 포함된 경우에만 파티션을 나눈 테이블 스캔을 지원합니다. 그렇지 않으면 워크로드가 Spark 실행 엔진으로 대체됩니다.
호환되지 않는 동작
다음과 같은 경우에 네이티브 쿼리 실행을 사용하면 호환되지 않는 동작이나 잘못된 결과가 발생할 수 있습니다.
- JSON 함수: 네이티브 쿼리 실행은 작은따옴표가 아닌 큰따옴표로 묶인 문자열을 지원합니다. 작은따옴표를 사용하면 잘못된 결과가 발생합니다.
get_json_object함수와 함께 경로에*를 사용하면NULL가 반환됩니다. - Parquet 읽기 구성:
- 네이티브 쿼리 실행은
spark.files.ignoreCorruptFiles를true로 설정한 경우에도 기본false값으로 설정된 것으로 처리합니다. - 네이티브 쿼리 실행은
spark.sql.parquet.datetimeRebaseModeInRead를 무시하고 Parquet 파일 콘텐츠만 반환합니다. 기존 하이브리드 달력과 선발 그레고리력의 차이는 고려되지 않습니다. Spark 결과는 다를 수 있습니다.
- 네이티브 쿼리 실행은
- NaN: 지원되지 않습니다. 예를 들어 숫자 비교에서
NaN를 사용하면 예기치 않은 결과가 발생할 수 있습니다. - Spark 열 읽기: Spark 열 벡터가 네이티브 쿼리 실행과 호환되지 않으므로 심각한 오류가 발생할 수 있습니다.
- 유출: 셔플 파티션을 큰 숫자로 설정하면 디스크 유출 기능이
OutOfMemoryException를 트리거할 수 있습니다. 이 경우 파티션 수를 줄이면 이 예외를 제거할 수 있습니다.