ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

embulkでs3→mysqlを試したときにlockがかかって死んだときのメモ

スポンサードリンク

メモリ1GBという制限があり、タイトル通りの構成で転送したところ、ひたすら失敗することを確認したが、mysqlのログを確認してみるとどうやらlockされていたことがわかった。

qiita.com

ちなみに中々メモリ1GBで検証するのは大変だと思うので(クラウドならいけると思うけど)、Dockerでやりました。

ichirin2501.hatenablog.com

で、個人的にはlockがなんなのかちゃんと理解してないのですが、なんでこうなったのかを色々調べていると、どうやらembulkが複数スレッドを起動して書き込んでいることがわかった。弱小マシンだと複数スレッドで書き込まれると1つのクエリ遅延中にさらにinsertされてlockされて死ぬっぽい(ちゃんと理解してい(ry

じゃあ、複数起動しないようにすればええんじゃないかということでググってたらこんなtweet

そこから下記にたどり着き

qiita.com

結局ドキュメントをよみにいき

www.embulk.org

「Local executor plugin」なるものにたどり着きました。

で、embulk config.ymlの設定にexec: {max_threads: 1}を追加

in:
    type: s3
    # 省略...
out:
    type: mysql
    # 省略...
exec:
    max_threads: 1

いざかまくら!!!で実行したところ、数十分かかってやっとこさlockもされずout of memoryも発生せず無事msyqlへinsertすることができましたとさ

lockがよくわかっていないのでちゃんと勉強します。