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

R에서 lakeFS 사용하기

원문 보기 위키 갱신

R은 데이터 사이언스에서 널리 쓰이는 강력한 언어예요. lakeFS는 R과 두 가지 방식으로 연동돼요:

  • lakeFS에서 데이터를 읽고 쓰려면 aws.s3 라이브러리 같은 표준 S3 도구를 사용해요. lakeFS에는 S3 게이트웨이가 있어서 lakeFS 저장소를 S3 버킷처럼 보여줘요.

  • 브랜치와 커밋 같은 lakeFS 연산을 하려면 API를 사용해요. R에서는 httr 라이브러리로 접근할 수 있어요.

Examples

R과 lakeFS를 함께 사용하는 예제는 lakeFS-samples 저장소와 sample notebooks를 참고하세요.

출처: R에서 lakeFS 사용하기

본문

R로 lakeFS에서 읽고 쓰기

R에서 lakeFS에 저장된 데이터를 다루는 것은 lakeFS가 제공하는 S3 게이트웨이를 통해 S3 버킷을 다루는 것과 동일해요.

S3와 연동되는 어떤 라이브러리든 사용할 수 있어요. 여기서는 aws.s3 라이브러리를 사용해 볼게요.

install.packages(c("aws.s3"))
library(aws.s3)

설정

R S3 client documentation에 사용 가능한 설정 옵션의 전체 내용이 나와 있어요. lakeFS와 함께 사용할 때 좋은 방법은 엔드포인트와 인증 정보를 환경 변수로 설정하는 거예요:

Sys.setenv("AWS_ACCESS_KEY_ID" = "«redacted:AKIA…»",
           "AWS_SECRET_ACCESS_KEY" = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
           "AWS_S3_ENDPOINT" = "lakefs.mycorp.com:8000")

참고: 원래는 이 환경 변수를 R 스크립트 밖에서 설정하는 게 모범 사례예요. 여기서는 예제의 편의를 위해 스크립트 안에서 설정한 거예요.

이와 함께 region과 use_https는 aws.s3 함수를 호출할 때마다 지정해야 해요. 전역으로 설정할 수 없기 때문이에요. 예를 들면:

bucketlist(
    region = "",
    use_https = FALSE
    )
  • region은 항상 비워 두세요

  • use_https는 lakeFS 엔드포인트가 HTTPS를 사용하는지에 따라 TRUE 또는 FALSE로 설정해요

저장소 목록 조회

S3 게이트웨이는 저장소를 버킷으로 노출하기 때문에, aws.s3의 bucketlist 함수를 사용하면 lakeFS에서 사용 가능한 저장소 목록을 얻을 수 있어요:

bucketlist(
    region = "",
    use_https = FALSE
    )

R에서 lakeFS로 쓰기

aws.s3 라이브러리를 사용한다면 s3save, s3saveRDS, put_object 등 다양한 함수를 쓸 수 있어요. R 객체를 lakeFS에 쓰는 예제예요:

repo_name <- "example"
branch <- "development"

s3saveRDS(x=my_df,
          bucket = repo_name,
          object = paste0(branch,"/my_df.R"),
          region = "",
          use_https = FALSE)

R과 put_object 함수로 로컬 파일을 lakeFS에 업로드할 수도 있어요:

repo_name <- "example"
branch <- "development"
local_file <- "/tmp/never.gonna"

put_object(file = local_file,
           bucket = repo_name,
           object = paste0(branch,"/give/you/up"),
           region = "",
           use_https = FALSE)

R에서 lakeFS에서 읽기

R에서 lakeFS로 데이터를 쓰는 것과 마찬가지로, 데이터를 읽기 위한 함수들도 마련돼 있어요. s3load, s3readRDS, get_object 등이 있어요. lakeFS에서 R 객체를 읽는 예제예요:

repo_name <- "example"
branch <- "development"

my_df <- s3readRDS(bucket = repo_name,
                   object = paste0(branch,"/my_data.R"),
                   region = "",
                   use_https = FALSE)

객체 목록 조회

일반적으로 객체를 나열할 때는 항상 브랜치 프리픽스를 지정하는 게 좋아요. quickstart 저장소의 main 브랜치를 나열하는 예제예요:

get_bucket_df(bucket = "quickstart",
              prefix = "main/",
              region = "",
              use_https = FALSE)

lakeFS에서 객체를 나열할 때 특별한 케이스가 하나 있어요. 바로 저장소/버킷 수준이에요. 이 수준에서 나열하면 브랜치가 폴더 형태로 반환돼요. 브랜치 아래를 나열하지 않는 한 재귀적으로 나열되지 않아요. 자세한 내용은 #5441을 참고하세요.

Arrow 다루기

Arrow의 R library는 데이터 분석을 위한 강력한 지원을 포함해요. Parquet, Arrow, CSV, JSON 등 여러 파일 형식을 읽고 쓸 수 있고, S3에 연결하는 기능도 있어서 lakeFS와 완벽하게 통합돼요.

먼저 라이브러리를 설치하고 로드해요:

install.packages("arrow")
library(arrow)

그다음 S3FileSystem 객체를 만들어 lakeFS 인스턴스에 연결해요:

lakefs <- S3FileSystem$create(
    endpoint_override = "lakefs.mycorp.com:8000",
    scheme = "http"
    access_key = "«redacted:AKIA…»",
    secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    region = "",
)

이제 특정 lakeFS 저장소와 브랜치의 내용을 나열할 수 있어요:

lakefs$ls(path = "quickstart/main")

R로 lakeFS에서 Parquet을 읽으려면 read_parquet 함수를 사용해요:

lakes <- read_parquet(lakefs$path("quickstart/main/lakes.parquet"))

파일 쓰기도 비슷한 패턴이에요. 위에서 읽은 같은 파일을 Arrow 형식으로 다시 쓰는 예제예요:

write_feather(x = lakes,
              sink = lakefs$path("quickstart/main/lakes.arrow"))

R에서 lakeFS API로 lakeFS 연산 수행하기

데이터 읽고 쓰기 외에도 브랜치 생성, 데이터 커밋 등 lakeFS 연산을 R에서 수행하고 싶을 거예요.

이때는 httr 라이브러리에서 lakeFS API를 호출해요. 엔드포인트와 동작의 전체 세부 사항은 API 문서를 참고하세요. 아래는 사용법을 보여주는 몇 가지 예제예요.

lakeFS 서버 버전 확인

연결 상태 확인과 인증 테스트에 유용한 API 호출이에요.

library(httr)
lakefs_api_url <- "lakefs.mycorp.com:8000/api/v1"
lakefsAccessKey <- "«redacted:AKIA…»"
lakefsSecretKey <- "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

r=GET(url=paste0(lakefs_api_url, "/config/version"),
      authenticate(lakefsAccessKey, lakefsSecretKey))

반환된 객체 r을 API에 명시된 상태 코드와 비교해 연산의 결과를 판단할 수 있어요. 개념을 보여주는 예제 R 코드예요:

if (r$status_code == 200) {
    print(paste0("✅ lakeFS credentials and connectivity verified. ℹ️ lakeFS version ",content(r)$version))
} else {
    print("🛑 failed to get lakeFS version")
    print(content(r)$message)
}

저장소 생성

library(httr)
lakefs_api_url <- "lakefs.mycorp.com:8000/api/v1"
lakefsAccessKey <- "«redacted:AKIA…»"
lakefsSecretKey <- "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
repo_name <- "my_new_repo"

# Define the payload
body=list(name=repo_name,
          storage_namespace="s3://example-bucket/foo")

# Call the API
r=POST(url=paste0(lakefs_api_url, "/repositories"),
        authenticate(lakefsAccessKey, lakefsSecretKey),
        body=body, encode="json")

데이터 커밋

library(httr)
lakefs_api_url <- "lakefs.mycorp.com:8000/api/v1"
lakefsAccessKey <- "«redacted:AKIA…»"
lakefsSecretKey <- "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
repo_name <- "my_new_repo"
branch <- "example"

# Define the payload
body=list(message="add some data and charts",
          metadata=list(
              client="httr",
              author="rmoff"))

# Call the API
r=POST(url=paste0(lakefs_api_url, "/repositories/", repo_name, "/branches/", branch, "/commits"),
       authenticate(lakefsAccessKey, lakefsSecretKey),
       body=body, encode="json")

더 알아보기 (Learn more)

공식 문서의 원문은 https://docs.lakefs.io/reference/r/ 에서 확인할 수 있어요.