メモリ1GBという制限があり、タイトル通りの構成で転送したところ、ひたすら失敗することを確認したが、mysqlのログを確認してみるとどうやらlockされていたことがわかった。
ちなみに中々メモリ1GBで検証するのは大変だと思うので(クラウドならいけると思うけど)、Dockerでやりました。
で、個人的にはlockがなんなのかちゃんと理解してないのですが、なんでこうなったのかを色々調べていると、どうやらembulkが複数スレッドを起動して書き込んでいることがわかった。弱小マシンだと複数スレッドで書き込まれると1つのクエリ遅延中にさらにinsertされてlockされて死ぬっぽい(ちゃんと理解してい(ry
じゃあ、複数起動しないようにすればええんじゃないかということでググってたらこんなtweetが
embulk 0.8、min_output_tasks はあるけど max_output_tasks はないから input tasks > output tasks のコントロールはできないのか
— そのっつ (Naotoshi Seo) (@sonots) 2016年1月15日
そこから下記にたどり着き
結局ドキュメントをよみにいき
「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がよくわかっていないのでちゃんと勉強します。