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/ 에서 확인할 수 있어요.