본문 바로가기
WIKI 기술 지식 베이스

lakeFS와 Apache Spark 함께 사용하기

원문 보기 위키 갱신

Spark에서 lakeFS를 쓰는 권장 방법은 lakeFS Iceberg REST Catalog예요. lakeFS Enterprise에 내장된 표준 준수 카탈로그로, Spark가 버전 관리되는 Iceberg 테이블을 읽고 쓰는 동안 lakeFS는 데이터 경로에서 완전히 분리돼요. Iceberg 테이블을 다룬다면 여기서 시작하세요. 다른 데이터 형식이나 카탈로그를 못 쓰는 환경에서는 lakeFS Hadoop FileSystem과 S3 호환 API를 통해 연동할 수 있어요.

출처: 문서

본문

Spark에서 lakeFS를 사용하는 권장 방법은 lakeFS Iceberg REST Catalog예요. lakeFS Enterprise에 내장된 표준 준수 카탈로그로, Spark가 버전 관리되는 Iceberg 테이블을 읽고 쿼리하게 하면서 lakeFS는 데이터 경로 바깥에 완전히 남아 있어요. 데이터는 Spark 실행기(executor)가 기반 오브젝트 스토어에 직접 읽고 써요. Iceberg 테이블을 다룬다면 여기서 시작하세요.

lakeFS는 다른 데이터 형식에서도, 그리고 Iceberg 카탈로그를 쓸 수 없는 환경에서도 lakeFS Hadoop FileSystem과 S3 호환 API를 통해 Spark를 지원해요. 그 방법들은 Advanced: alternative access methods 아래에서 다뤄요.

Iceberg REST Catalog

lakeFS Enterprise는 표준 Iceberg REST Catalog로 동작할 수 있어요. Spark가 버전 관리되는 Iceberg 테이블을 관리하고 쿼리하는 동안 lakeFS는 데이터 경로 바깥에 완전히 남아 있죠. 데이터는 Spark 실행기가 기반 오브젝트 스토어에 직접 읽고 써요.

Example

// Configure Spark to use the lakeFS REST catalog
spark.sql("USE my_repo.main.inventory")

// List available tables
spark.sql("SHOW TABLES").show()

// Query data with branch isolation
spark.sql("SELECT * FROM books").show()

// Switch to a feature branch
spark.sql("USE my_repo.new_branch.inventory")
spark.sql("SELECT * FROM books").show()

카탈로그 설정과 세부 내용은 Iceberg 통합 가이드를 참고하세요.

고급: 대체 접근 방법

위의 lakeFS Iceberg REST Catalog가 권장 경로예요. 여러분의 구성에 맞지 않을 때 — 예컨대 비-Iceberg 형식을 다루거나 카탈로그를 사용할 수 없는 Spark 환경일 때 — 아래 방법들은 모든 데이터 형식에서 Spark가 lakeFS와 동작하게 해줘요. 표는 이들 간의 트레이드오프를 정리한 거예요.

방법 메타데이터 작업 데이터 작업 지원 데이터 형식 호환성
Iceberg REST Catalog ✅ 테이블 수준 작업만 ✅ 기반 스토리지로 직접 I/O Apache Iceberg 테이블 ✅ Apache Iceberg REST Catalog에 연결할 수 있는 모든 Spark 환경(대부분)
lakeFS FileSystem ⚠️ 오브젝트 수준 작업에 lakeFS API 호출 필요 ✅ 기반 스토리지로 직접 I/O 전체 ⚠️ 사용자 제공 jar 파일을 로드할 수 있는 Spark 환경(일부)
S3 호환 API N/A 🚩 모든 데이터 작업이 lakeFS를 경유 전체 ✅ S3 호환 API에 연결할 수 있는 모든 Spark 환경(대부분)

lakeFS Hadoop FileSystem

이 모드에서 Spark는 기반 오브젝트 스토어에서 오브젝트를 직접 읽고 써서 lakeFS 서버의 부담을 줄여요. lakeFS 서버에는 메타데이터 작업으로만 접근하고, 이 방식은 대부분의 다른 데이터 형식에서 동작해요.

아래에서 lakeFS Hadoop FileSystem을 설정한 뒤에는 lakefs://example-repo/ref/path/to/data 형태의 URI로 lakeFS의 데이터와 상호작용할 수 있어요.

lakeFS EnterpriselakeFS Community

io.lakefs:hadoop-lakefs-enterprise:1.0.0

io.lakefs:hadoop-lakefs-assembly:0.18.0

설치

Spark 4 호환성

lakeFS Hadoop FileSystem은 Spark 4와 호환돼요. 다만 Spark 4부터는 Hadoop 3.4.x로의 업그레이드 과정에서 번들 AWS SDK v1(aws-java-sdk-bundle)이 제거됐어요(Spark 4 릴리스 노트 참고). lakeFS Hadoop FileSystem 클라이언트는 AWS SDK v1에 의존하므로, Spark 4로 실행할 때는 aws-java-sdk-bundle을 classpath에 명시적으로 포함해야 해요.

lakeFS EnterpriselakeFS Community

Spark StandaloneDatabricksCloudera Spark

spark-submit 명령에 패키지를 추가하세요:

--packages io.lakefs:hadoop-lakefs-enterprise:1.0.0

또는 assembly JAR을 바로 사용하세요: https://treeverse-clients-us-east.s3.amazonaws.com/hadoop/hadoop-lakefs-enterprise-assembly-1.0.0.jar

클러스터 설정의 Libraries 탭에서 다음 Maven 패키지를 추가하세요:

io.lakefs:hadoop-lakefs-enterprise:1.0.0

설치되면 대략 이런 모습이에요:

pyspark 또는 spark-submit 명령에 패키지를 추가하세요:

--packages io.lakefs:hadoop-lakefs-enterprise:1.0.0

lakeFS가 사용하는 S3 버킷에 접근하는 설정을 pyspark나 spark-submit 명령에 추가하거나, Cloudera 클러스터 수준에서 이 설정을 추가하세요(아래 참고):

--conf spark.yarn.access.hadoopFileSystems=s3a://bucket-name

Cloudera 클러스터 수준에서 lakeFS가 사용하는 S3 버킷 접근 설정을 추가하세요:

  • CDP(Cloudera Data Platform) 웹 인터페이스에 로그인해요.

  • CDP 홈 화면에서 Management Console 아이콘을 클릭해요.

  • Management Console에서 탐색 창의 Data Hub Clusters를 선택해요.

  • 설정하려는 클러스터를 선택하고 Services 아래의 CM-UI 링크를 클릭해요:

  • Cloudera Manager 웹 인터페이스에서 탐색 창의 Clusters를 클릭하고 spark_on_yarn 옵션을 클릭해요:

  • Configuration 탭을 클릭하고 검색 상자에서 spark.yarn.access.hadoopFileSystems을 검색해요:

  • lakeFS가 사용하는 S3 버킷 s3a://bucket-name을 spark.yarn.access.hadoopFileSystems 목록에 추가해요:

Spark StandaloneDatabricksCloudera Spark

spark-submit 명령에 패키지를 추가하세요:

--packages io.lakefs:hadoop-lakefs-assembly:0.18.0

클러스터 설정의 Libraries 탭에서 다음 Maven 패키지를 추가하세요:

io.lakefs:hadoop-lakefs-assembly:0.18.0

설치되면 대략 이런 모습이에요:

pyspark 또는 spark-submit 명령에 패키지를 추가하세요:

--packages io.lakefs:hadoop-lakefs-assembly:0.18.0

lakeFS가 사용하는 S3 버킷에 접근하는 설정을 pyspark나 spark-submit 명령에 추가하거나, Cloudera 클러스터 수준에서 이 설정을 추가하세요(아래 참고):

--conf spark.yarn.access.hadoopFileSystems=s3a://bucket-name

Cloudera 클러스터 수준에서 lakeFS가 사용하는 S3 버킷 접근 설정을 추가하세요:

  • CDP(Cloudera Data Platform) 웹 인터페이스에 로그인해요.

  • CDP 홈 화면에서 Management Console 아이콘을 클릭해요.

  • Management Console에서 탐색 창의 Data Hub Clusters를 선택해요.

  • 설정하려는 클러스터를 선택하고 Services 아래의 CM-UI 링크를 클릭해요:

  • Cloudera Manager 웹 인터페이스에서 탐색 창의 Clusters를 클릭하고 spark_on_yarn 옵션을 클릭해요:

  • Configuration 탭을 클릭하고 검색 상자에서 spark.yarn.access.hadoopFileSystems을 검색해요:

  • lakeFS가 사용하는 S3 버킷 s3a://bucket-name을 spark.yarn.access.hadoopFileSystems 목록에 추가해요:

설정

fs.lakefs.* Hadoop 설정을 여러분의 lakeFS 설치를 가리키도록 지정하세요:

  • fs.lakefs.impl: io.lakefs.LakeFSFileSystem

  • fs.lakefs.access.key: lakeFS 액세스 키

  • fs.lakefs.secret.key: lakeFS 시크릿 키

  • fs.lakefs.endpoint: lakeFS API URL (예: https://example-org.us-east-1.lakefscloud.io/api/v1)

정적 자격 증명 대신 임시 토큰을 사용하도록 lakeFS 클라이언트를 설정해요:

  • fs.lakefs.auth.provider: 기본값은 basic_auth이며, 기본 인증에 fs.lakefs.access.key와 fs.lakefs.secret.key를 사용해요.

  • 임시 AWS 자격 증명을 사용하려면 io.lakefs.auth.TemporaryAWSCredentialsLakeFSTokenProvider로 설정할 수 있어요. 자세한 내용은 이곳에서 읽을 수 있어요.

io.lakefs.auth.TemporaryAWSCredentialsLakeFSTokenProvider를 인증 프로바이더로 사용할 때는 다음 설정이 관련 있어요:

  • fs.lakefs.token.aws.access.key: AWS assumed role 액세스 키

  • fs.lakefs.token.aws.secret.key: AWS assumed role 시크릿 키

  • fs.lakefs.token.aws.session.token: AWS assumed role 임시 세션 토큰

  • fs.lakefs.token.aws.sts.endpoint: presigned-url 생성에 쓰이는 AWS STS 리전 엔드포인트(예: https://sts.us-west-2.amazonaws.com)

  • fs.lakefs.token.aws.sts.duration_seconds: 선택 사항, 초기 신원 토큰의 지속 시간(초)(기본값 60)

  • fs.lakefs.token.duration_seconds: 선택 사항, lakeFS 토큰의 지속 시간(초)(기본값은 lakeFS 설정의 auth.login_duration에 따름)

  • fs.lakefs.token.sts.additional_headers: 선택 사항, presigned sts 요청 생성 시 붙일 header:value의 쉼표 구분 목록. 기본값은 X-Lakefs-Server-ID:fs.lakefs.endpoint예요.

API 재시도 설정:

lakeFS Hadoop 클라이언트는 일시적 실패(HTTP 408, 429, 500-504, 연결 오류)에 대해 jitter를 섞은 지수 백오프로 API 요청을 자동 재시도해요. 다음 선택적 속성이 재시도 동작을 제어해요:

  • fs.lakefs.api.retry.max-retries: 최대 재시도 횟수(기본값: 5). 재시도를 비활성화하려면 0으로 설정.

  • fs.lakefs.api.retry.initial-backoff.ms: 초기 백오프 지속 시간(밀리초)(기본값: 1000)

  • fs.lakefs.api.retry.max-backoff.ms: 최대 백오프 지속 시간(밀리초)(기본값: 20000)

  • fs.lakefs.api.retry.jitter-factor: 백오프에 적용할 지터 계수, 0과 1 사이(기본값: 0.25)

S3A FileSystem을 여러분의 S3 스토리지에 접근하도록 설정하세요. 예컨대 fs.s3a.* 설정을 사용해요(이것은 여러분의 lakeFS 자격 증명이 아닙니다):

  • fs.s3a.access.key: AWS S3 액세스 키

  • fs.s3a.secret.key: AWS S3 시크릿 키

설정 예제가 몇 가지 있어요:

lakeFS EnterpriselakeFS Community

CLIScalaPySparkXML ConfigurationDatabricks

spark-shell --conf spark.hadoop.fs.s3a.access.key='«redacted:AKIA…»' \
            --conf spark.hadoop.fs.s3a.secret.key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' \
            --conf spark.hadoop.fs.s3a.endpoint='https://s3.eu-central-1.amazonaws.com' \
            --conf spark.hadoop.fs.lakefs.impl=io.lakefs.LakeFSFileSystem \
            --conf spark.hadoop.fs.lakefs.access.key=AKIAlakefs12345EXAMPLE \
            --conf spark.hadoop.fs.lakefs.secret.key=abc/lakefs/1234567bPxRfiCYEXAMPLEKEY \
            --conf spark.hadoop.fs.lakefs.endpoint=https://example-org.us-east-1.lakefscloud.io/api/v1 \
            --packages io.lakefs:hadoop-lakefs-enterprise:1.0.0 \
            io.example.ExampleClass
spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "«redacted:AKIA…»")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint", "https://s3.eu-central-1.amazonaws.com")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "«redacted:AKIA…»")
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "https://s3.eu-central-1.amazonaws.com")
sc._jsc.hadoopConfiguration().set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
sc._jsc.hadoopConfiguration().set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
sc._jsc.hadoopConfiguration().set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")

--packages나 --jars로 실행해 lakeFS FileSystem을 Spark에 로드하고, 그다음 설정 파일(예: $SPARK_HOME/conf/hdfs-site.xml)에 이 설정들을 추가하세요:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.s3a.access.key</name>
        <value>«redacted:AKIA…»</value>
    </property>
    <property>
        <name>fs.s3a.secret.key</name>
        <value>wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.s3a.endpoint</name>
        <value>https://s3.eu-central-1.amazonaws.com</value>
    </property>
    <property>
        <name>fs.lakefs.impl</name>
        <value>io.lakefs.LakeFSFileSystem</value>
    </property>
    <property>
        <name>fs.lakefs.access.key</name>
        <value>AKIAlakefs12345EXAMPLE</value>
    </property>
    <property>
        <name>fs.lakefs.secret.key</name>
        <value>abc/lakefs/1234567bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.lakefs.endpoint</name>
        <value>https://example-org.us-east-1.lakefscloud.io/api/v1</value>
    </property>
</configuration>

클러스터 설정의 Configuration ➡️ Advanced options 아래에 다음을 추가하세요:

spark.hadoop.fs.lakefs.impl io.lakefs.LakeFSFileSystem
spark.hadoop.fs.lakefs.access.key AKIAlakefs12345EXAMPLE
spark.hadoop.fs.lakefs.secret.key abc/lakefs/1234567bPxRfiCYEXAMPLEKEY
spark.hadoop.fs.s3a.access.key «redacted:AKIA…»
spark.hadoop.fs.s3a.secret.key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
spark.hadoop.fs.s3a.impl shaded.databricks.org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.lakefs.endpoint https://example-org.us-east-1.lakefscloud.io/api/v1

또는 lakeFS Hadoop File System, Python 클라이언트, lakeFS SPARK 클라이언트를 다루는 단계별 Databricks 통합 튜토리얼을 따라가 보세요.

CLIScalaPySparkXML ConfigurationDatabricks

spark-shell --conf spark.hadoop.fs.s3a.access.key='«redacted:AKIA…»' \
            --conf spark.hadoop.fs.s3a.secret.key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' \
            --conf spark.hadoop.fs.s3a.endpoint='https://s3.eu-central-1.amazonaws.com' \
            --conf spark.hadoop.fs.lakefs.impl=io.lakefs.LakeFSFileSystem \
            --conf spark.hadoop.fs.lakefs.access.key=AKIAlakefs12345EXAMPLE \
            --conf spark.hadoop.fs.lakefs.secret.key=abc/lakefs/1234567bPxRfiCYEXAMPLEKEY \
            --conf spark.hadoop.fs.lakefs.endpoint=https://example-org.us-east-1.lakefscloud.io/api/v1 \
            --packages io.lakefs:hadoop-lakefs-assembly:0.18.0 \
            io.example.ExampleClass
spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "«redacted:AKIA…»")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint", "https://s3.eu-central-1.amazonaws.com")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "«redacted:AKIA…»")
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "https://s3.eu-central-1.amazonaws.com")
sc._jsc.hadoopConfiguration().set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
sc._jsc.hadoopConfiguration().set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
sc._jsc.hadoopConfiguration().set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")

--packages나 --jars로 실행해 lakeFS FileSystem을 Spark에 로드하고, 그다음 설정 파일(예: $SPARK_HOME/conf/hdfs-site.xml)에 이 설정들을 추가하세요:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.s3a.access.key</name>
        <value>«redacted:AKIA…»</value>
    </property>
    <property>
        <name>fs.s3a.secret.key</name>
        <value>wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.s3a.endpoint</name>
        <value>https://s3.eu-central-1.amazonaws.com</value>
    </property>
    <property>
        <name>fs.lakefs.impl</name>
        <value>io.lakefs.LakeFSFileSystem</value>
    </property>
    <property>
        <name>fs.lakefs.access.key</name>
        <value>AKIAlakefs12345EXAMPLE</value>
    </property>
    <property>
        <name>fs.lakefs.secret.key</name>
        <value>abc/lakefs/1234567bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.lakefs.endpoint</name>
        <value>https://example-org.us-east-1.lakefscloud.io/api/v1</value>
    </property>
</configuration>

클러스터 설정의 Configuration ➡️ Advanced options 아래에 다음을 추가하세요:

spark.hadoop.fs.lakefs.impl io.lakefs.LakeFSFileSystem
spark.hadoop.fs.lakefs.access.key AKIAlakefs12345EXAMPLE
spark.hadoop.fs.lakefs.secret.key abc/lakefs/1234567bPxRfiCYEXAMPLEKEY
spark.hadoop.fs.s3a.access.key «redacted:AKIA…»
spark.hadoop.fs.s3a.secret.key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
spark.hadoop.fs.s3a.impl shaded.databricks.org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.lakefs.endpoint https://example-org.us-east-1.lakefscloud.io/api/v1

또는 lakeFS Hadoop File System, Python 클라이언트, lakeFS SPARK 클라이언트를 다루는 단계별 Databricks 통합 튜토리얼을 따라가 보세요.

Note

버킷이 us-east-1이 아닌 리전에 있다면 fs.s3a.endpoint를 올바른 리전으로 설정해야 할 수도 있어요. Amazon이 사용할 수 있는 S3 엔드포인트를 제공해요.

TemporaryAWSCredentialsLakeFSTokenProvider 사용하기

초기 설정이 필요해요 — AWS Auth가 lakeFS와 함께 설정되어 있어야 해요. TemporaryAWSCredentialsLakeFSTokenProvider는 호출자가 AWS 자격 증명(예: Assumed Role의 Key, Secret, Token)을 lakeFS 클라이언트의 입력으로 제공하기를 기대해요.

Warning

sts.endpoint를 유효한 sts 리전 서비스 엔드포인트로 설정하고, 인증에 처음 사용되는 리전과 반드시 같아야 해요. 유일한 예외는 STS의 기본 리전인 us-east-1이에요.

Warning

현재 프로바이더를 사용하면 lakeFS 토큰이 만료되어도 갱신되지 않아서, 사용자가 다시 인증해야 해요.

boto3와 AWS 세션 자격 증명으로 TemporaryAWSCredentialsLakeFSTokenProvider를 쓰는 PySpark 예제:

import boto3

session = boto3.session.Session()

# AWS credentials used s3a to access lakeFS bucket
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "«redacted:AKIA…»")
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "https://s3.us-west-2.amazonaws.com")
sc._jsc.hadoopConfiguration().set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
sc._jsc.hadoopConfiguration().set("fs.lakefs.endpoint", "https://example-org.us-west-2.lakefscloud.io/api/v1")
sc._jsc.hadoopConfiguration().set("spark.hadoop.fs.s3a.path.style.access", "true")
sc._jsc.hadoopConfiguration().set("fs.lakefs.auth.provider", "io.lakefs.auth.TemporaryAWSCredentialsLakeFSTokenProvider")
# AWS tempporary session credentials to use with lakeFS
sc._jsc.hadoopConfiguration().set("fs.lakefs.token.aws.access.key", session.get_credentials().access_key)
sc._jsc.hadoopConfiguration().set("fs.lakefs.token.aws.secret.key", session.get_credentials().secret_key)
sc._jsc.hadoopConfiguration().set("fs.lakefs.token.aws.session.token", session.get_credentials().token)
sc._jsc.hadoopConfiguration().set("fs.lakefs.token.aws.sts.endpoint", "https://sts.us-west-2.amazonaws.com")

사용 방법

Hadoop FileSystem 경로는 lakefs:// 프로토콜을 사용하고, 경로는 lakefs://<repository>/<ref>/path/to/object 형태예요. <ref>는 lakeFS의 브랜치, 태그, 커밋 ID가 될 수 있어요. lakeFS에서 Parquet 파일을 Spark DataFrame으로 읽는 예제예요:

val repo = "example-repo"
val branch = "main"
val df = spark.read.parquet(s"lakefs://${repo}/${branch}/example-path/example-file.parquet")

결과를 lakeFS 경로로 다시 쓰는 방법은 다음과 같아요:

df.write.partitionBy("example-column").parquet(s"lakefs://${repo}/${branch}/output-path/")

이제 데이터가 lakeFS에 브랜치의 새 변경 사항으로 만들어졌어요. 이 변경을 커밋하거나 되돌릴 수 있어요.

Presigned 모드의 Hadoop FileSystem

이 모드에서는 lakeFS 서버가 여러분의 스토리지에 대한 인증을 책임져요. 클라이언트는 여전히 데이터 작업을 스토리지에서 직접 수행하되, lakeFS 서버가 제공하는 pre-signed 스토리지 URL을 사용해요.

이 모드를 사용하면 클라이언트에 스토리지 접근 설정이 필요 없어요.

Info

FileSystem 버전 0.1.13부터 사용할 수 있어요

lakeFS EnterpriselakeFS Community

Enterprise FileSystem은 전체 파일을 메모리에 버퍼링하지 않고 큰 쓰기를 부분 단위로 스토리지에 바로 스트리밍해요. Azure Blob Storage에서는 필수이고 모든 백엔드에서 권장돼요.

CLIScalaPySparkXML ConfigurationDatabricks

spark-shell --conf spark.hadoop.fs.lakefs.access.mode=presigned \
            --conf spark.hadoop.fs.lakefs.impl=io.lakefs.LakeFSFileSystem \
            --conf spark.hadoop.fs.lakefs.access.key=AKIAlakefs12345EXAMPLE \
            --conf spark.hadoop.fs.lakefs.secret.key=abc/lakefs/1234567bPxRfiCYEXAMPLEKEY \
            --conf spark.hadoop.fs.lakefs.endpoint=https://example-org.us-east-1.lakefscloud.io/api/v1 \
            --packages io.lakefs:hadoop-lakefs-enterprise:1.0.0
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.access.mode", "presigned")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")
sc._jsc.hadoopConfiguration().set("fs.lakefs.access.mode", "presigned")
sc._jsc.hadoopConfiguration().set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
sc._jsc.hadoopConfiguration().set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
sc._jsc.hadoopConfiguration().set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")

--packages나 --jars로 실행해 lakeFS FileSystem을 Spark에 로드하고, 그다음 설정 파일(예: $SPARK_HOME/conf/hdfs-site.xml)에 이 설정들을 추가하세요:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.lakefs.access.mode</name>
        <value>presigned</value>
    </property>
    <property>
        <name>fs.lakefs.impl</name>
        <value>io.lakefs.LakeFSFileSystem</value>
    </property>
    <property>
        <name>fs.lakefs.access.key</name>
        <value>AKIAlakefs12345EXAMPLE</value>
    </property>
    <property>
        <name>fs.lakefs.secret.key</name>
        <value>abc/lakefs/1234567bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.lakefs.endpoint</name>
        <value>https://example-org.us-east-1.lakefscloud.io/api/v1</value>
    </property>
</configuration>

클러스터 설정의 Configuration ➡️ Advanced options 아래에 다음을 추가하세요:

spark.hadoop.fs.lakefs.access.mode presigned
spark.hadoop.fs.lakefs.impl io.lakefs.LakeFSFileSystem
spark.hadoop.fs.lakefs.access.key AKIAlakefs12345EXAMPLE
spark.hadoop.fs.lakefs.secret.key abc/lakefs/1234567bPxRfiCYEXAMPLEKEY
spark.hadoop.fs.lakefs.endpoint https://example-org.us-east-1.lakefscloud.io/api/v1

Info

Presigned multipart upload는 버전 1.0.0부터 사용할 수 있어요. Presigned 모드 자체는 더 이른 버전에서도 쓸 수 있어요.

고급 설정

속성 기본값 설명
fs.lakefs.multipart.size 67108864 (64 MB) presigned multipart upload의 파트 크기(바이트). 빠른 네트워크에서 처리량을 높이려면 늘리고, 실행기(executor) 메모리가 부족하면 줄이세요.

CLIScalaPySparkXML ConfigurationDatabricks

spark-shell --conf spark.hadoop.fs.lakefs.access.mode=presigned \
            --conf spark.hadoop.fs.lakefs.impl=io.lakefs.LakeFSFileSystem \
            --conf spark.hadoop.fs.lakefs.access.key=AKIAlakefs12345EXAMPLE \
            --conf spark.hadoop.fs.lakefs.secret.key=abc/lakefs/1234567bPxRfiCYEXAMPLEKEY \
            --conf spark.hadoop.fs.lakefs.endpoint=https://example-org.us-east-1.lakefscloud.io/api/v1 \
            --packages io.lakefs:hadoop-lakefs-assembly:0.18.0
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.access.mode", "presigned")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")
sc._jsc.hadoopConfiguration().set("fs.lakefs.access.mode", "presigned")
sc._jsc.hadoopConfiguration().set("fs.lakefs.impl", "io.lakefs.LakeFSFileSystem")
sc._jsc.hadoopConfiguration().set("fs.lakefs.access.key", "AKIAlakefs12345EXAMPLE")
sc._jsc.hadoopConfiguration().set("fs.lakefs.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
sc._jsc.hadoopConfiguration().set("fs.lakefs.endpoint", "https://example-org.us-east-1.lakefscloud.io/api/v1")

--packages나 --jars로 실행해 lakeFS FileSystem을 Spark에 로드하고, 그다음 설정 파일(예: $SPARK_HOME/conf/hdfs-site.xml)에 이 설정들을 추가하세요:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.lakefs.access.mode</name>
        <value>presigned</value>
    </property>
    <property>
        <name>fs.lakefs.impl</name>
        <value>io.lakefs.LakeFSFileSystem</value>
    </property>
    <property>
        <name>fs.lakefs.access.key</name>
        <value>AKIAlakefs12345EXAMPLE</value>
    </property>
    <property>
        <name>fs.lakefs.secret.key</name>
        <value>abc/lakefs/1234567bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.lakefs.endpoint</name>
        <value>https://example-org.us-east-1.lakefscloud.io/api/v1</value>
    </property>
</configuration>

클러스터 설정의 Configuration ➡️ Advanced options 아래에 다음을 추가하세요:

spark.hadoop.fs.lakefs.access.mode presigned
spark.hadoop.fs.lakefs.impl io.lakefs.LakeFSFileSystem
spark.hadoop.fs.lakefs.access.key AKIAlakefs12345EXAMPLE
spark.hadoop.fs.lakefs.secret.key abc/lakefs/1234567bPxRfiCYEXAMPLEKEY
spark.hadoop.fs.lakefs.endpoint https://example-org.us-east-1.lakefscloud.io/api/v1

S3 호환 API

lakeFS에는 S3 호환 엔드포인트가 있어서 Spark를 가리키기만 하면 빠르게 시작할 수 있어요.

데이터에 S3 스타일 URI로 접근하게 돼요. 예: s3a://example-repo/example-branch/example-table.

데이터가 어디에 호스팅되든 S3 호환 API를 사용할 수 있어요.

설정

Spark가 lakeFS와 동작하도록, S3A Hadoop 설정을 lakeFS 엔드포인트와 자격 증명으로 지정해요:

설정 방법은 다음과 같아요:

CLIScalaXML ConfigurationEMR

spark-shell --conf spark.hadoop.fs.s3a.access.key='AKIAlakefs12345EXAMPLE' \
            --conf spark.hadoop.fs.s3a.secret.key='abc/lakefs/1234567bPxRfiCYEXAMPLEKEY' \
            --conf spark.hadoop.fs.s3a.path.style.access=true \
            --conf spark.hadoop.fs.s3a.endpoint='https://example-org.us-east-1.lakefscloud.io' ...
spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "AKIAlakefs12345EXAMPLE")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint", "https://example-org.us-east-1.lakefscloud.io")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true")

설정 파일(예: $SPARK_HOME/conf/hdfs-site.xml)에 이 설정들을 추가하세요:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.s3a.access.key</name>
        <value>AKIAlakefs12345EXAMPLE</value>
    </property>
    <property>
            <name>fs.s3a.secret.key</name>
            <value>abc/lakefs/1234567bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.s3a.endpoint</name>
        <value>https://example-org.us-east-1.lakefscloud.io</value>
    </property>
    <property>
        <name>fs.s3a.path.style.access</name>
        <value>true</value>
    </property>
</configuration>

클러스터 생성 시 아래 설정을 사용하세요. 사용 사례에 맞지 않는 앱 설정은 지우셔도 돼요:

[
{
    "Classification": "spark-defaults",
    "Properties": {
    "spark.sql.catalogImplementation": "hive"
    }
},
{
    "Classification": "core-site",
    "Properties": {
        "fs.s3.access.key": "«redacted:AKIA…»",
        "fs.s3.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.path.style.access": "true",
        "fs.s3a.access.key": "«redacted:AKIA…»",
        "fs.s3a.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.path.style.access": "true"
    }
},
{
    "Classification": "emrfs-site",
    "Properties": {
        "fs.s3.access.key": "«redacted:AKIA…»",
        "fs.s3.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.path.style.access": "true",
        "fs.s3a.access.key": "«redacted:AKIA…»",
        "fs.s3a.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.path.style.access": "true"
    }
},
{
    "Classification": "presto-connector-hive",
    "Properties": {
        "hive.s3.aws-access-key": "«redacted:AKIA…»",
        "hive.s3.aws-secret-key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "hive.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "hive.s3.path-style-access": "true",
        "hive.s3-file-system-type": "PRESTO"
    }
},
{
    "Classification": "hive-site",
    "Properties": {
        "fs.s3.access.key": "«redacted:AKIA…»",
        "fs.s3.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.path.style.access": "true",
        "fs.s3a.access.key": "«redacted:AKIA…»",
        "fs.s3a.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.path.style.access": "true"
    }
},
{
    "Classification": "hdfs-site",
    "Properties": {
        "fs.s3.access.key": "«redacted:AKIA…»",
        "fs.s3.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.path.style.access": "true",
        "fs.s3a.access.key": "«redacted:AKIA…»",
        "fs.s3a.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.path.style.access": "true"
    }
},
{
    "Classification": "mapred-site",
    "Properties": {
        "fs.s3.access.key": "«redacted:AKIA…»",
        "fs.s3.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.path.style.access": "true",
        "fs.s3a.access.key": "«redacted:AKIA…»",
        "fs.s3a.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.path.style.access": "true"
    }
}
]

또는 스텝을 추가할 때 이 설정 값을 넘길 수도 있어요.

예를 들면:

aws emr add-steps --cluster-id j-197B3AEGQ9XE4 \
--steps="Type=Spark,Name=SparkApplication,ActionOnFailure=CONTINUE, \
Args=[--conf,spark.hadoop.fs.s3a.access.key=«redacted:AKIA…», \
--conf,spark.hadoop.fs.s3a.secret.key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, \
--conf,spark.hadoop.fs.s3a.endpoint=https://example-org.us-east-1.lakefscloud.io, \
--conf,spark.hadoop.fs.s3a.path.style.access=true, \
s3a://<lakefs-repo>/<lakefs-branch>/path/to/jar]"

버킷별 설정

위 설정은 lakeFS를 유일한 S3 엔드포인트로 사용해요. lakeFS를 S3와 병행하려면, 특정 버킷 이름에만 lakeFS를 쓰도록 Spark를 설정할 수 있어요. 예컨대 example-repo만 lakeFS를 쓰도록 하려면 다음 설정을 지정하세요:

CLIScalaXML ConfigurationEMR

spark-shell --conf spark.hadoop.fs.s3a.bucket.example-repo.access.key='AKIAlakefs12345EXAMPLE' \
            --conf spark.hadoop.fs.s3a.bucket.example-repo.secret.key='abc/lakefs/1234567bPxRfiCYEXAMPLEKEY' \
            --conf spark.hadoop.fs.s3a.bucket.example-repo.endpoint='https://example-org.us-east-1.lakefscloud.io' \
            --conf spark.hadoop.fs.s3a.path.style.access=true
spark.sparkContext.hadoopConfiguration.set("fs.s3a.bucket.example-repo.access.key", "AKIAlakefs12345EXAMPLE")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.bucket.example-repo.secret.key", "abc/lakefs/1234567bPxRfiCYEXAMPLEKEY")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.bucket.example-repo.endpoint", "https://example-org.us-east-1.lakefscloud.io")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true")

설정 파일(예: $SPARK_HOME/conf/hdfs-site.xml)에 이 설정들을 추가하세요:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.s3a.bucket.example-repo.access.key</name>
        <value>AKIAlakefs12345EXAMPLE</value>
    </property>
    <property>
        <name>fs.s3a.bucket.example-repo.secret.key</name>
        <value>abc/lakefs/1234567bPxRfiCYEXAMPLEKEY</value>
    </property>
    <property>
        <name>fs.s3a.bucket.example-repo.endpoint</name>
        <value>https://example-org.us-east-1.lakefscloud.io</value>
    </property>
    <property>
        <name>fs.s3a.path.style.access</name>
        <value>true</value>
    </property>
</configuration>

클러스터 생성 시 아래 설정을 사용하세요. 사용 사례에 맞지 않는 앱 설정은 지우셔도 돼요:

[
{
    "Classification": "spark-defaults",
    "Properties": {
    "spark.sql.catalogImplementation": "hive"
    }
},
{
    "Classification": "core-site",
    "Properties": {
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.bucket.example-repo.path.style.access": "true",
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3a.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.bucket.example-repo.path.style.access": "true"
    }
},
{
    "Classification": "emrfs-site",
    "Properties": {
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.bucket.example-repo.path.style.access": "true",
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3a.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.bucket.example-repo.path.style.access": "true"
    }
},
{
    "Classification": "presto-connector-hive",
    "Properties": {
        "hive.s3.aws-access-key": "«redacted:AKIA…»",
        "hive.s3.aws-secret-key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "hive.s3.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "hive.s3.path-style-access": "true",
        "hive.s3-file-system-type": "PRESTO"
    }
},
{
    "Classification": "hive-site",
    "Properties": {
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.bucket.example-repo.path.style.access": "true",
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3a.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.bucket.example-repo.path.style.access": "true"
    }
},
{
    "Classification": "hdfs-site",
    "Properties": {
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.bucket.example-repo.path.style.access": "true",
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3a.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.bucket.example-repo.path.style.access": "true"
    }
},
{
    "Classification": "mapred-site",
    "Properties": {
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3.bucket.example-repo.path.style.access": "true",
        "fs.s3a.bucket.example-repo.access.key": "«redacted:AKIA…»",
        "fs.s3a.bucket.example-repo.secret.key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "fs.s3a.bucket.example-repo.endpoint": "https://example-org.us-east-1.lakefscloud.io",
        "fs.s3a.bucket.example-repo.path.style.access": "true"
    }
}
]

또는 스텝을 추가할 때 이 설정 값을 넘길 수도 있어요.

예를 들면:

aws emr add-steps --cluster-id j-197B3AEGQ9XE4 \
--steps="Type=Spark,Name=SparkApplication,ActionOnFailure=CONTINUE, \
Args=[--conf,spark.hadoop.fs.s3a.bucket.example-repo.access.key=«redacted:AKIA…», \
--conf,spark.hadoop.fs.s3a.bucket.example-repo.secret.key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, \
--conf,spark.hadoop.fs.s3a.bucket.example-repo.endpoint=https://example-org.us-east-1.lakefscloud.io, \
--conf,spark.hadoop.fs.s3a.path.style.access=true, \
s3a://<lakefs-repo>/<lakefs-branch>/path/to/jar]"

이 설정이 적용되면 버킷으로 example-repo를 둔 S3A 경로의 읽기는 lakeFS를 사용하고, 그 외 모든 버킷은 AWS S3를 사용해요.

사용 방법

lakeFS에서 Parquet 파일을 Spark DataFrame으로 읽는 예제예요:

val repo = "example-repo"
val branch = "main"
val df = spark.read.parquet(s"s3a://${repo}/${branch}/example-path/example-file.parquet")

결과를 lakeFS 경로로 다시 쓰는 방법은 다음과 같아요:

df.write.partitionBy("example-column").parquet(s"s3a://${repo}/${branch}/output-path/")

이제 데이터가 lakeFS에 브랜치의 새 변경 사항으로 만들어졌어요. 이 변경을 커밋하거나 되돌릴 수 있어요.

S3 호환 API로 Azure Databricks 설정하기

Azure Databricks를 사용한다면, 여러분의 Azure 계정과 S3A FileSystem으로 lakeFS S3 호환 API를 활용할 수 있어요. Databricks 클러스터에 hadoop-aws 패키지(hadoop-azure 패키지와 같은 버전)를 설치해야 해요.

FileSystem 설정을 다음과 같이 정의하세요:

spark.hadoop.fs.lakefs.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.lakefs.access.key=‘AKIAlakefs12345EXAMPLE’                   // The access key to your lakeFS server
spark.hadoop.fs.lakefs.secret.key=‘abc/lakefs/1234567bPxRfiCYEXAMPLEKEY’     // The secret key to your lakeFS server
spark.hadoop.fs.lakefs.path.style.access=true
spark.hadoop.fs.lakefs.endpoint=‘https://example-org.us-east-1.lakefscloud.io’                 // The endpoint of your lakeFS server

Databricks에서 클라우드 오브젝트 스토리지 마운트에 대한 자세한 내용은 링크를 참고하세요.

S3 호환 API로 Databricks SQL Warehouse 설정하기

SQL 웨어하우스는 Databricks SQL 안의 데이터 오브젝트에 SQL 명령을 실행하게 해주는 컴퓨팅 리소스예요.

Databricks SQL 웨어하우스를 사용한다면 S3A FileSystem으로 lakeFS S3 호환 API를 활용할 수 있어요.

SQL 웨어하우스 설정을 다음과 같이 정의하세요:

  • 오른쪽 위에서 Admin Settings, 이어서 Compute, 그리고 SQL warehouses를 선택해요.

  • Data Access Properties 아래에, 접근하려는 각 lakeFS 저장소마다 다음 키-값 쌍을 추가해요:

spark.hadoop.fs.s3a.impl shaded.databricks.org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.bucket.example-repo.access.key «redacted:AKIA…» // The access key to your lakeFS server
spark.hadoop.fs.s3a.bucket.example-repo.secret.key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY // The secret key to your lakeFS server
spark.hadoop.fs.s3a.bucket.example-repo.endpoint https://example-org.us-east-1.lakefscloud.io // The endpoint of your lakeFS server
spark.hadoop.fs.s3a.bucket.example-repo.path.style.access true
  • SQL Warehouse가 재시작되면 변경이 자동으로 적용돼요.

  • 이제 SQL Warehouse에서 lakeFS S3 호환 API를 사용할 수 있어요. 예:

SELECT * FROM delta.`s3a://example-repo/main/datasets/delta-table/` LIMIT 100

Cloudera

Cloudera Spark에서 lakeFS 데이터에 접근하는 방법은 Apache Spark에서 S3 데이터에 접근하는 것과 같아요. lakeFS Hadoop FileSystem을 사용하면 돼요. lakeFS와 Cloudera Data Platform(CDP), Cloudera Spark의 통합에 대한 Cloudera 인증은 Cloudera 파트너 목록에서 확인할 수 있어요.

더 알아보기 (Learn more)

공식 문서의 자세한 내용은 https://docs.lakefs.io/integrations/spark/에서 확인하실 수 있어요.