かまたま日記3

プログラミングメイン、たまに日常

embulk-input-remoteプラグインを作った #embulk

EmbulkリモートホストからSCPでファイルを読み込むプラグインを作成しました。

特徴としてホスト一覧とファイルパスをコマンドで指定できるのですが、自分のサービスで使う場合入力元のファイルに日時が付いてたり、本番のホスト一覧をコマンドで解決したりするため固定文字列に出来なかったという背景があります。

Javaで作ったembulkのプラグインrubygemsに上げる方法を教えてくれた@hiroysatoさんありがとうございました!
良かったら使ってみたりバグ報告やプルリク下さい! (言ってみたかった…w)

embulk-input-remote | RubyGems.org | your community gem host

github.com

仕様

  • SCPで複数ホストからファイルをダウンロードできる
  • 認証は公開鍵とパスワード認証に対応
  • ディレクトリを指定すると、ディレクトリ配下にあるファイル全部ダウンロードする
  • ホスト指定とパス指定はコマンドを使う事も出来る
    • windows環境では動かない可能性大(未確認)
  • 大量ホスト、大量ファイルに対するパフォーマンスは未確認
    • zlib圧縮に対応しました(v0.1.3)
in: 
  type: remote
  # /some/path/hosts.txtが読み込まれる(カンマ区切り)
  hosts_command: cat /some/path/hosts.txt
  hosts_separator: ','
  # 2時間前のgzip化されたログを読み込む
  path_command: echo /usr/local/app/logs/application.log.`date -d"2 hours ago" "+%Y-%m-%d_%H"`.gz 

注意

Linuxでこのプラグインを動かすと、タスクがブロッキングされる場合があります。
原因はscpのライブラリで使われてるjava.security.SecureRandomなのですが、以下のどちらかの対応をする事で解決できます。

  • JVM OPTION "-Djava.security.egd" を設定する
$ export JAVA_TOOL_OPTIONS="-Djava.security.egd=file:/dev/./urandom"
$ embulk run config.yml
  • ${JAVA_HOME}/jre/lib/security/java.security を書き換える
# securerandom.source=file:/dev/random # before
securerandom.source=file:/dev/./urandom # after
  • 参考

http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom