話題の記事

データレイクをGitライクに使いたい!lakeFSを使ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

lakeFSは、ざっくり言うとデータレイクをGitのようなリポジトリぽく取り扱うソフトウェア/サービスです。Gitライクなので、ブランチの作成、バージョン管理、ロールバックなどをCLIまたはGUIにて実行できます。

現在、クラウドストレージをデータレイクとして使う場合にはAWS S3/Google Cloud Storage/Azure Blob Storageなど複数の選択肢があるかと思いますが、lakeFSをインターフェースとして入れることで、実際のストレージがどこにあるかを意識することなくデータレイクを取り扱えるため、マルチクラウドなデータ分析基盤においてより力を発揮します。

lakeFSにはローカル環境に導入するオープンソース版と、SaaSとして提供されるlakeFS Cloudがあります。

今回はオープンソース版でクイックスタートをやってみます。環境はMacBook Pro(macOS Big Sur)です。

やってみた

クイックスタート環境のセットアップ

前提条件としてDockerがインストールされていることとします。

% docker --version
Docker version 20.10.17, build 100c701

以下コマンドを実行することで、実行環境に必要なDockerコンテナが一式起動します。データベースもコンテナ内に持つので、終了後全てのデータは破棄されます。

% curl https://compose.lakefs.io | docker-compose -f - up

Webブラウザでhttp://127.0.0.1:8000/setupにアクセスすると以下画面が表示されます。管理者となるユーザー名を設定します。

以下画面が表示されます。まず[Download Configuration]をクリックし、lakectlに必要なConfigurationファイルをダウンロードします。ダウンロードしたファイル(.lakectl.yaml)はホームディレクトリ直下に配置します。次にAccess Key IDとSecret Access Keyをメモし、[Go To Login]をクリックします。

ログイン画面が表示されるので、Access Key IDとSecret Access Keyを入力し、[Login]をクリックします。

ログインされます。

リポジトリを作ってみる

[Create Repository]をクリックします。

[Create A New Repository]画面が表示されますので、Repository ID、Storage Namespace(local://を付与します)を入力します。Default Branchはmainのままとします。[Create Repository]をクリックします。

リポジトリが作成されます。

リポジトリにオブジェクトを登録してみる

GUIから簡単にオブジェクトのアップロードが出来るのですが、lakeFSはS3互換のAPIが使えるため、AWS CLIを使用して操作できます。面白いので今回はそれでやってみます。

まずAWS CLIの設定から行います。

 % aws configure --profile local
AWS Access Key ID [None]: XXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]:
Default output format [None]:

lakeFSクイックスタート環境のリポジトリの確認を行います。

% aws --endpoint-url=http://localhost:8000 --profile local s3 ls
2022-07-06 16:33:04 quickstart

PC上の「smokeymonkey.txt」というファイルをアップロードします。

% aws --endpoint-url=http://localhost:8000 --profile local s3 cp ./smokeymonkey.txt s3://quickstart/main/
upload: ./smokeymonkey.txt to s3://quickstart/main/smokeymonkey.txt

アップロードされていることを確認します。

% aws --endpoint-url=http://localhost:8000 --profile local s3 ls quickstart/main/
2022-07-06 16:40:11         10 smokeymonkey.txt

当然GUIでも確認できます。

lakectlコマンドをインストールする

コマンドラインでlakeFSを操作するために、lakectlコマンドをインストールします。最新のリリースから、自環境に合わせてダウンロードします。今回はlakeFS_0.68.0_Darwin_x86_64.tar.gzをダウンロードしました。

ダウンロードしたファイルを展開します。

% tar xvzf lakeFS_0.68.0_Darwin_x86_64.tar.gz
x CHANGELOG.md
x LICENSE
x README.md
x lakefs
x lakectl

展開されたファイルのうちlakectlを、/usr/local/binに移動します。

% mv lakectl /usr/local/bin

% ls -alF /usr/local/bin/lakectl
-rwxr-xr-x@ 1 sasaki.daisuke  staff  44360704  6 21 18:59 /usr/local/bin/lakectl*

% which lakectl
/usr/local/bin/lakectl

lakectlの初期設定を行います。事前に.lakectl.yamlを配置しているため、特に設定の必要がないはずなので、確認のみです。

% lakectl config
Config file /Users/smokeymonkey/.lakectl.yaml will be used
✔ Access key ID: XXXXXXXXXX
Secret access key: ****************************************
Server endpoint URL: http://127.0.0.1:8000/api/v1

なお、この「開発元を検証できないため開けません。」が表示された場合は...

Macの[セキュリティとプライバシー]から[このまま許可]をクリックします。

lakectlコマンドを使ってみる

まずはリポジトリのブランチを確認します。この時点ではmainのみです。

% lakectl branch list lakefs://quickstart
+--------+------------------------------------------------------------------+
| BRANCH | COMMIT ID                                                        |
+--------+------------------------------------------------------------------+
| main   | 9acf87df77c11e2b5f2e87d09627e4399619253c1f45f29f3186ad6925eb8d89 |
+--------+------------------------------------------------------------------+

先程ファイルを1つアップロードしているので、mianブランチをコミットします。

% lakectl commit lakefs://quickstart/main -m 'added my first file!'
Branch: lakefs://quickstart/main
Commit for branch "main" completed.

ID: 4b2255fc3d7e7ad4481dd2049b340650ee526171162e2b3639ec6c8c8cb9ea8c
Message: added my first file!
Timestamp: 2022-07-06 17:00:19 +0900 JST
Parents: 9acf87df77c11e2b5f2e87d09627e4399619253c1f45f29f3186ad6925eb8d89

ログを確認します。コミットされたログがあります。

% lakectl log lakefs://quickstart/main

ID:            4b2255fc3d7e7ad4481dd2049b340650ee526171162e2b3639ec6c8c8cb9ea8c
Author:        smokeymonkey
Date:          2022-07-06 17:00:19 +0900 JST

	added my first file!


ID:            9acf87df77c11e2b5f2e87d09627e4399619253c1f45f29f3186ad6925eb8d89
Date:          2022-07-06 16:33:04 +0900 JST

	Repository created

new-branchという名前の新しいブランチを作成します。

% lakectl branch create lakefs://quickstart/new-branch -s lakefs://quickstart/main
Source ref: lakefs://quickstart/main
created branch 'new-branch' 4b2255fc3d7e7ad4481dd2049b340650ee526171162e2b3639ec6c8c8cb9ea8c

% lakectl branch list lakefs://quickstart
+------------+------------------------------------------------------------------+
| BRANCH     | COMMIT ID                                                        |
+------------+------------------------------------------------------------------+
| main       | 4b2255fc3d7e7ad4481dd2049b340650ee526171162e2b3639ec6c8c8cb9ea8c |
| new-branch | 4b2255fc3d7e7ad4481dd2049b340650ee526171162e2b3639ec6c8c8cb9ea8c |
+------------+------------------------------------------------------------------+

new-branchにもう1つファイルをアップロードしてみます。

% aws --endpoint-url=http://localhost:8000 --profile local s3 cp ./smokeymonkey-new.txt s3://quickstart/new-branch/
upload: ./smokeymonkey-new.txt to s3://quickstart/new-branch/smokeymonkey-new.txt

% aws --endpoint-url=http://localhost:8000 --profile local s3 ls quickstart/new-branch/
2022-07-06 17:08:12         10 smokeymonkey-new.txt
2022-07-06 16:40:11         10 smokeymonkey.txt

new-branchをコミットします。

% lakectl commit lakefs://quickstart/new-branch -m 'added nw file'
Branch: lakefs://quickstart/new-branch
Commit for branch "new-branch" completed.

ID: 3fa915b69ac999299dbd5b235cce8a4e9eb0c91c2254b89c67532e9aceae748f
Message: added nw file
Timestamp: 2022-07-06 17:10:09 +0900 JST
Parents: 4b2255fc3d7e7ad4481dd2049b340650ee526171162e2b3639ec6c8c8cb9ea8c

new-branchをmainにマージします。

% lakectl merge lakefs://quickstart/new-branch lakefs://quickstart/main
Source: lakefs://quickstart/new-branch
Destination: lakefs://quickstart/main
Merged "new-branch" into "main" to get "51d2156d87040ff0dc731a2e737b34ad366b53d94bbb478bd2a5c609408b7669".%

mainにも新しいファイルが追加されていることを確認します。

% aws --endpoint-url=http://localhost:8000 --profile local s3 ls quickstart/main/
2022-07-06 17:08:12         10 smokeymonkey-new.txt
2022-07-06 16:40:11         10 smokeymonkey.txt

ここでrevertし、マージを無かったことにします。

% lakectl branch revert lakefs://quickstart/main 3fa915b69ac999299dbd5b235cce8a4e9eb0c91c2254b89c67532e9aceae748f
Branch: lakefs://quickstart/main
Are you sure you want to revert the effect of commits 3fa915b69ac999299dbd5b235cce8a4e9eb0c91c2254b89c67532e9aceae748f: y
commit 3fa915b69ac999299dbd5b235cce8a4e9eb0c91c2254b89c67532e9aceae748f successfully reverted

mainにもマージされていた新しいファイルが無いことを確認します。

% aws --endpoint-url=http://localhost:8000 --profile local s3 ls quickstart/main/
2022-07-06 16:40:11         10 smokeymonkey.txt

さいごに

データレイクをgitライクに操作出来ることで操作にかかる負担が少なくなるし、冒頭に記載したとおりデータレイクの実体がどのサービスなのかを意識することなく、統一した操作を行うことができます。とても実用的なサービスだと感じました。