💬

Momento Bulk Writer を試してみる

2023/11/21に公開

今日は、Momento Bulk Writerを試してみたいと思います。

Momento Bulk Writer とは


RedisのバックアップデータであるRDBファイルをJSONに変換して、Momentoに一気にアップロードするツールです。
RDBファイルをJSONに変換するツールとJSONをMomentoにインポートするツールで分かれていますので、JSONさえ作ることが出来れば大量のデータを一気にMomentoにアップロードすることが可能です。

今日はRedisのバックアップファイルであるRDBファイルを使ってみます。

さっそくやってみる

必要なもの:
・RDBファイル
・Linux
環境的にはWindowsやMacでも使えるツールが準備されていますが、WSLなどが必要となるので結局Linuxでの作業が一番簡単なようです。また、RDBファイルはRedis環境が無いと作成できませんので、この記事ではRDBファイルの作成方法は割愛します。
実のところ私も今回初めてRedisを直接触りました。
https://zenn.dev/toshidot59/articles/5ac4ccc05740de
https://www.sraoss.co.jp/tech-blog/redis/redis-persistdata/
を参考にすれば行けると思います。

1.Bulk Writer のインストール

https://github.com/momentohq/momento-bulk-writer
から必要モジュールをダウンロードします。

wget https://github.com/momentohq/momento-bulk-writer/releases/download/v0.1.0/momento-bulk-writer-linux-x64-0.1.0.tgz
tar xzvf momento-bulk-writer-linux-x86-0.1.0.tgz
cd ./momento-bulk-writer-linux-x86

2.RDB ファイルの準備

次にRedisのバックアップファイルであるRDBファイルを必要な場所に配置します。

mkdir redis
cp xxxxx(rdbファイル) ./redis/

3.RDBファイルのJSON変換

 ./extract-rdb-and-validate.sh -s 1 -t 1 ./redis .
=== EXTRACT RDB WITH THE FOLLOWING SETTINGS ===
data_path = /home/ec2-user/momento-bulk-writer-linux-x64/redis
output_path = /home/ec2-user/momento-bulk-writer-linux-x64/extract

==== EXTRACT RDB TO JSONL
\[    5 B|    2 B/s]
Finished extract extract-rdb. Inspect the data at /home/ec2-user/momento-bulk-writer-linux-x64/extract
=== VALIDATE WITH THE FOLLOWING SETTINGS ===
max_item_size = 1
max_ttl = 1
momento_etl_path = bin/MomentoEtl
data_path = ./extract
output_path = .

==== AGGREGATE JSONL
Aggregating jsonl files from ./extract into ./aggregate/merged.jsonl

==== VALIDATE
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Filtering items larger than 1MiB
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Filtering items with TTL greater than 1 days
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Filtering items that have already expired
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Filtering items with no TTL set
07:04:35 info: Momento.Etl.Cli.Validate.Command[0]
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Reading data from ./aggregate/merged.jsonl
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Writing valid to ./validate-strict/valid.jsonl
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Writing errors to ./validate-strict/error
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Finished
07:04:35 info: Momento.Etl.Cli.Validate.Command[0]
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] ==== STATS ====
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Total: 1
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] OK: 0
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] Error: 1
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] ----
07:04:35 info: Momento.Etl.Cli.Validate.Command[0] no_ttl: 1
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Filtering items larger than 1MiB
07:04:36 info: Momento.Etl.Cli.Validate.Command[0]
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Reading data from ./aggregate/merged.jsonl
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Writing valid to ./validate-lax/valid.jsonl
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Writing errors to ./validate-lax/error
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Finished
07:04:36 info: Momento.Etl.Cli.Validate.Command[0]
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] ==== STATS ====
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Total: 1
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] OK: 1
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] Error: 0
07:04:36 info: Momento.Etl.Cli.Validate.Command[0] ----
Finished transform and validate. Inspect the validated data at ./validate-lax and ./validate-strict

もしかしたらコマンドの途中で、エラーがでるかもしれません。その場合Javaの8以上をインストールしかつlibicuを以下のコマンドでインストールしてみて下さい。

sudo yum install java-11-amazon-corretto
sudo yum -y install libicu.x86_64

validate-laxvalidate-strict、2つのフォルダができています。
validate-lax:
移行できないデータと移行できるデータが分かれてJSONとして出力されます。移行できない原因の要因としては
1.最大ファイルサイズを超えている
2.データ型がMomentoでサポートされていない
validate-strict
移行できるできないにかかわらずMomentoでのデータ受け入れに問題の可能性のあるデータが全て出力されます。主な要因は以下の通りです。
1.最大ファイルサイズを超えている
2.最大TTLより大きいTTLがセットされている
3.TTLが存在していない
4.データ型がMomentoでサポートされていない

つまり、データをそのまま移行させて良いかどうかはvalidate-strictを見てまずは判断します。移行させて問題ない場合、2及び3はMomentoの最大TTL、デフォルトTTLで上書きされます。それでも移行できないものがvalidate-laxerrorとして出力されます。
移行可能なものはvalidate-laxvalid.jsonlとして出力されます。
valid.jsonlは純粋なJSONとしてデータが含まれています。

valid.jsonl
{"key":"hash","value":{"f1":"v1","f2":"v2"},"db":0,"type":"hash"}

Momentoへのデータインポート

./load.sh -a $AUTH_TOKEN -c $CACHE -t 1 -n 10 ./validate-lax/valid.jsonl

$AUTH_TOKENおよび$CACHEは環境変数であらかじめセットしておきます。
実行すると無事データがインポートされます。

=== LOADING WITH THE FOLLOWING SETTINGS ===
auth_token = **** [censored]
cache_name = demo-cache
default_ttl = 1
num_concurrent_requests = 10
momento_etl_path = bin/MomentoEtl
log_path = load.log
reset_expired_items = 0
data_path = ./validate-lax/valid.jsonl

07:21:13 info: Momento.Etl.Cli.Program[0] Loading to demo-cache with a default TTL of 1.00:00:00 and clipping excessive TTLs to the cache limit.
07:21:13 info: Momento.Etl.Cli.Load.Command[0] Extracting ./validate-lax/valid.jsonl and loading into Momento with a max concurrency of 10
07:21:14 info: Momento.Etl.Cli.Load.Command[0] Finished
Done loading

どれぐらいはやいのか。

お恥ずかしい話初めて今回Redisを触ったため検証に十分必要なデータ量を作りさせませんでした。
JSONさえ作れればインポートの時間速度ははかれるはずですので次回の記事への宿題とします。

Discussion