Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JobStreamerではじめるJavaBatchのクラウド分散実行

9,433 views

Published on

JJUG CCC 2015 Spring F-7のセッションです。

Published in: Software
  • Be the first to comment

JobStreamerではじめるJavaBatchのクラウド分散実行

  1. 1. JobStreamerではじめる JavaBatchのクラウド分散実行 kawasima 川島義隆 JJUG CCC 2015 Spring F-7 kawasima
  2. 2. https://github.com/kawasima/ http://twitter.com/kawasima/ http://www.slideshare.net/kawasima/ http://qiita.com/kawasima/ Javaな場でしゃべるのは 初めてなので、 お手柔らかにお願いします!
  3. 3. JavaBatchを 始めてみよう
  4. 4. JSR352 JavaBatchとは Job JobInstance Step Batchlet Chunk ItemReader ItemProcessor ItemWriter JobExecution StepExecution 実装するコンポーネント XMLで定義する ジョブ実行をあらわすコンポーネント *1 1 0..1 0..1
  5. 5. JSR352 JavaBatchのはじめ方 ①Batchlet または ItemReader / ItemProcessor / ItemWriterを実装する。 ②batch-jobs.xmlを書く。 ③起動するプログラムを書く。
  6. 6. Batchletを実装する @Named public class MyBatchlet extends AbstractBatchlet { @Inject JobContext jobContext; private Properties jobProperties; @Override public String process() throws Exception { jobProperties = jobContext.getProperties(); String value1 = jobProperties.getProperty("jobProp1"); // ... return "Processed"; } } 基本的にはこの1メソッド を実装するだけ まぁ簡単
  7. 7. batch-jobs.xml <job id="jasperReportsTest" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0"> <step id="step1"> <batchlet ref="jasperReportsBatchlet"> <properties> <property name="resource" value="movies-2012.csv"/> <property name="useFirstRowAsHeader" value="true"/> <!-- n as record/row delimiter --> <property name="recordDelimiter" value=" "/> <property name="charset" value="UTF-8"/> <property name="template" value="movies.jasper"/> <property name="outputType" value="pdf"/> <property name="outputFile" value="#{systemProperties['java.io.tmpdir']}/report.pdf"/> <property name="reportParameters" value="#{jobParameters['reportParameters']}"/> </properties> </batchlet> </step> </job> It's so easy!!!!...?
  8. 8. 起動プログラム ExcelにジョブのIDをかくじゃろ ( ^ω^) ⊃ ⊂ というストーリーがみえる これをこうして… ( ^ω^) ≡⊃⊂≡ こうじゃ ( ^ω^) ⊃ ⊂
  9. 9. JSR352 JavaBatchを始めると… ①Batchlet または ItemReader / ItemProcessor / ItemWriterを実装する。 ②batch-jobs.xmlを書く。 ③起動する。 ツライ… くやしい… でも…ジェネレータ作っちゃう!
  10. 10. ジョブの組み立てをもっと簡単に! ジョブの起動をもっと簡単に!
  11. 11. バッチコンテナの運用 ● 常駐コンテナで動かすことのメリット – 小さなジョブがたくさん動いても、JVM起動のオーバ ヘッドがない。 ● 常駐サーバで複数ジョブ動かすことへの漠然とし た不安 – サーバが死んだときのリカバリは? – 特定のジョブが別の重いジョブに影響を与えるのは避 けたい?
  12. 12. Disposable batch containers ジョブの実行環境は、リソース専有することな く、使い捨てできるとよい。 – 空いてるサーバに優先的にディスパッチ – 複数のバッチサーバがいて、1台死んでも簡単に フェイルオーバーできるといいなぁ でも、バッチアプリのデプロイが面倒そうだ
  13. 13. ジョブの実行環境をDistributedに! Deployの手間はゼロに!
  14. 14. ジョブスケジューラにまつわる思い出 • 動いちゃいけないのに、動いてしまった。 • 日付を間違えて登録して、起動しなかった。 • GUIから漂う昭和感。
  15. 15. ジョブがいつ動くかをもっと分かりやすく! できればもっとモダンに!
  16. 16. なので つくってみた https://github.com/job-streamer (EPLライセンス)
  17. 17. JobStreamerが変える世界 できるようになること 不要になるもの 管理コンソール上でのGUIによる ジョブ組み立て ジョブ XML REST APIによるジョブの起動 ジョブ起動用のJavaアプリ スケジュール実行 JP1のようなスケジューラ シンプルな分散実行 バッチサーバのフェイルオーバー設計 エージェントへを起動するだけでジョブが動く、 ノーデプロイ・ノーコンフィギュレーション環境 VagrantやDockerなどによるバッチサーバの設 定やデプロイの自動化 エージェントの稼働状況モニタリング ZABBIXなどによるバッチサーバの監視 リアルタイムなログ収集 fluentdなどによるログの収集 すべてがS式になる Emacs以外の環境
  18. 18. JobStreamerの構成 管理コンソール Jobの定義 Jobの実行ログ コントロールバス JavaBatchコンポーネント ● Batchlet ● ItemReader ● ItemProcessor ● ItemWriter Load class ● ジョブの登録/編集/削除 ● スケジューリング ● ジョブの実行 ● 実行結果の確認 ジョブの実行リクエスト ● Load class ● 実行状態の送信 ● サーバ負荷状態の送信 実行エージェント Datomic No deploy, no configuration
  19. 19. コントロールバス ● ジョブの登録やジョブのディスパッチなどを司 る。 – ジョブの登録/編集/削除 – ジョブのスケジューリング – ジョブのディスパッチ/実行結果・ログの収集 – エージェントのモニタリング ● REST APIですべての操作が可能。
  20. 20. 管理コンソール ● コントロールバスのWebインタフェース – ジョブのGUI組み立て – 実行ログの閲覧 – ジョブのタイムライン表示 ● Single page applicationでサクサク動く!
  21. 21. エージェント ● 実際にジョブが実行されるサーバ ● REST APIですべての操作が可能。 ● 実装はJBossのJberet – クラスローダをWebSocketClassLoaderに入れ替えて 使う。 ● Dockerfileもついてるので、docker runして使う ことも可能。
  22. 22. Datomic (おまけ) ● Jobの定義や実行ログなどは、すべてDatomic に格納される。 ● SPoFのコントローラバスからのみ繋ぐので、 Freeライセンスでも本番運用可能。 http://www.datomic.com/
  23. 23. Datomicとは... 今をときめくAppend-onlyなデータベース – ストレージ(としてのDB) は別に選択できる。 ● Dynamo DB ● Infinispan ● Mysql などなど
  24. 24. Why Datomic? Clojureから自然な形でクエリが書ける。 ※ クエリはDatalogという論理プログラミングの伝統的な記法
  25. 25. Demo
  26. 26. Jobの実行状況をみる(一覧)
  27. 27. Jobの実行状況をみる(タイムライン)
  28. 28. アプリケーションを登録する 専用のMavenプラグインがあります % mvn job-streamer:deploy
  29. 29. Jobを新規登録する
  30. 30. Jobの詳細をみる
  31. 31. Jobをスケジューリングする
  32. 32. 実行履歴とログをみる
  33. 33. エージェントをみる
  34. 34. エージェントをモニタリングする
  35. 35. 例) CSVをJPAでOracleにロードする
  36. 36. 例) シェルスクリプトを動かす シェルスクリプトをクラスパスに入れておき… こんなジョブを流す エージェントで実行され、STDINがログとして記録される
  37. 37. Architecture
  38. 38. WebSocketClassLoader クラスロードをWebSocket経由でリモートからよぶ。 リソースファイルもロード可能。 https://github.com/kawasima/websocket-classloader/ Maven Centralにおいてあるので、 お気軽にお試しください
  39. 39. WebSocketClassLoaderのしくみ WebSocketClassLoaderClassProvider WebSocket Handshake / Connect LoadClass request Class binary format Encoded by fressian JSR356準拠で動くので、dependenciesは0 (EEサーバ以外で動かすには、Undertowなどにデプロイする) JSR356のServerEndpointを 実装している。 JSR356のClientEndpointを 使ってloadClassリクエストを 送る。 ローカルキャッシュに最新の クラスがあればそっちを使う。
  40. 40. JberetでのClassLoaderの置き換え BatchSEEnvironmentクラスにて... こんな実装になっちゃっているので、 WebSocketClassLoaderを返すように置き換え ている。
  41. 41. Jobが実行されるまでの流れ
  42. 42. Full clojure ①サーバ実装 → liberator ②Javascript → Clojurescript →Om (React layer) ③ Stylesheet → garden ④ SQL → datalog すべてがS式に!
  43. 43. om ReactをClojurescriptから使うことができる。 Circle CIのUIはomで作られています。 (https://github.com/circleci/frontend) https://github.com/omcljs/om
  44. 44. liberator APIを宣言的に書くことができる。
  45. 45. liberatorのデシジョングラフ どこを、どう通ってレスポンスを返したか、 リクエストごとに表示される
  46. 46. サーバ間WebSocket(JSR356) Agentの状態の変化をリアルタイムにControl Busが受け取るために、WebSocketを使って通知 JSR356の仕様としてClientもあるので、実装は 非常に簡単。
  47. 47. ログのリアルタイム書き込み (WebSocketAppender) logbackのアペンダとしてセットし、ログを WebSocket経由でログサーバにリアルタイムで 送る。 https://github.com/kawasima/logback-websocket-appender/ これもMaven Centralにおいてあるので、よろしければ どうぞお使いください
  48. 48. RRD4J Agentのリソースモニタリングは、RRDToolの JavaクローンのRRD4Jを使うと簡単にPure Javaでグラフが書ける。 (https://github.com/rrd4j/rrd4j)
  49. 49. 今後の予定 ● SplitやDecisionなどのJSR352のフルサポート ● マルチプロジェクトのサポート ● 異常時の通知の仕組み実装 ● ファイル到着トリガやDBステータス変更トリ ガのサポート ● スケジュール登録機能の強化(ウィザードや営 業日カレンダーの登録など)
  50. 50. まとめ ● JavaBatchに対する不満もJobStreamerを使 えば解消するよ ● No deploy, No configurationなので、簡単に 分散実行できちゃうよ ● なによりJavaBatchを気軽に試せるよ
  51. 51. みなさまの(or User Developer)としての ご参加を心よりお待ちしております! github.com/job-streamer

×