Upgrade to Pro — share decks privately, control downloads, hide ads and more …

さよなら Storm

なごみそ
March 22, 2017
32

さよなら Storm

@Kawasaki.rb #046

なごみそ

March 22, 2017
Tweet

Transcript

  1. Multi-lang Protocol 他の言語にSpout/Boltの処理を移譲できる Shell Shell Bolt Bolt Python Python Shell

    Shell Spout Spout Ruby Ruby Multi-lang (標準入出力) Multi-lang (標準入出力) Stream
  2. Apache Storm が何回もシグナルを送る • Java のサブプロセス (multi-lang) 終了 → SIGTERM

    • Storm Worker の終了 → SIGTERM • Storm Supervisor の終了 → SIGKILL 正常終了でもエラーが…
  3. ふつうに殺したい 対処 • SIGTERM 契機で終了シークエンス移行 – 1回目の SIGTERM で exit

    – rescue SystemExit でもろもろやる – その前に SIGTERM を無視 するハンドラ登録 • 移譲先のプロセスの後始末が終わったら sync しまくる – Spout/Bolt に 俺は死んだアピール をする – そうすると だいたい エラーがでなくなる
  4. よく調べたら • Spout でエラーが発生して終了 • ApacheStorm は Spout が死んでいると判断 •

    ShellSpout が multi-lang 用の pipe を読ま なくなる – Spout が ShellSpout に multi-lang で エラー報告をしようとする – pipe が詰まる – Ruby のガベージコレクタの io_flush_buffer_sync で止まる – (ShellSpout は FD を握ったまま)
  5. ちなみに gdb でアタッチしてわかりました #0 0x00007f068e7707cd in write () from /lib64/libpthread.so.0

    #1 0x00007f068ebee9eb in io_flush_buffer_sync (arg=0x7f068feee180) at io.c:994 #2 0x00007f068ebf3647 in fptr_finalize (fptr=0x7f068feee180, noraise=1) at io.c:4172 #3 0x00007f068ebf3ca2 in rb_io_fptr_cleanup (fptr=0x7f068feee180) at io.c:4222 #4 rb_io_fptr_finalize (fptr=0x7f068feee180) at io.c:4262 #5 0x00007f068ebe1c45 in run_final () at gc.c:2064 #6 finalize_list () at gc.c:2080 #7 rb_objspace_call_finalizer () at gc.c:2212 #8 rb_gc_call_finalizer_at_exit () at gc.c:2146 #9 0x00007f068ebc7d1d in ruby_finalize_1 (ex=1) at eval.c:129 #10 ruby_cleanup (ex=1) at eval.c:230 #11 0x00007f068ebc7eed in ruby_run_node (n=<value optimized out>) at eval.c:310 #12 0x00007f068ebc2bdb in main (argc=5, argv=0x7ffff21cbe38) at main.c:36
  6. まとめ • Storm は multi-lang で Sput/Bolt 処理の 移譲ができる •

    デフォルトだと作りが雑すぎるのでちょっと した工夫が必要 • 工夫しても駄目だった....... • multi-lang は使っちゃ駄目 • 他にも色々問題が発生