UberがJVM Profilerという分散型のプロファイラをこの6月にオープンソースにした。彼らはApache Sparkで直面したリソース割り当ての問題を解決しようとJVM Profilerを開発した。Apache Sparkは大きなデータストリームを処理する人気のフレームワークであるが、そういったデータストリームはまさにUberが多数持っているものだ。
Uberは何千ものマシンで実行している、何万というアプリケーション間での、無数のプロセスにわたってメトリクスの相互関係を示す機能を欲していた。彼らの分散環境では、多くのSparkアプリケーションを同じサーバ上で実行しており、各アプリケーションには何千ものexecutorがある。彼らの既存のツールではサーバレベルのメトリクスを見れるだけで、個々のアプリケーションのメトリクスをモニターできなかった。各プロセスのメトリクスを収集し各アプリケーションのプロセスにわたってメトリクスの相互関係を示せるソリューションが必要だった。
JVM Profilerは3つの機能から成る。パフォーマンスやリソース利用のメトリクス収集を簡略化し、さらなる解析のためその結果を他のシステム (たとえばApache Kafka) へ公開する。
- Javaエージェント: 分散方式でのJVMプロセスのメトリクスを収集できる。
- 高度なプロファイリング機能: 任意のメソッドと引数をコードの変更なくトレースできる。これによりSparkアプリケーションで遅いメソッド呼び出しを認識でき、またHDFSファイルパスにあるホットなファイルを認識できるようになる。
- データ解析レポート: KafkaのトピックやApache Hiveのテーブルを用いてより早くデータを解析できる。
JVM Profilerはシンプルで拡張可能な設計であるため、プロファイラの実装を追加したりより多くのメトリクスを収集したりできる。メトリクス公開用の独自レポーターも作成できる。
UberのJVM Profilerに関するブログ投稿に独自レポーターを追加する方法だけでなく、それを使ってアプリケーションをトレースする方法も詳しく載っている。
UberはJVM Profilerを彼らの中で最大のSparkアプリケーションの1つに使っており、各executorのメモリ割り当てを7GBから5GBまで減らし、2GBを削減できた。このアプリケーション単体で合計2TBのメモリを節約できた。
JVM ProfilerはGitHubのhttps://github.com/uber-common/jvm-profilerにある。プルリクエストも受け付けている!
Rate this Article
- Editor Review
- Chief Editor Action