Apache Apex まとめ

Apache Apex について調査していたので、まとめます。

## Apache Apex とは
[ストリーム処理基盤 Apache Apex で Hello World \- Qiita](http://qiita.com/kohei_kimura/items/782068faf5fd4c49db4c) でも言及していますが、 Apex はストリーム処理とバッチ処理を統合する Hadoop YARN ネイティブの基盤で、以下のような特徴を持ちます。

- 高いスケーラビリティとパフォーマンス
- フォールトトレランスと状態管理
- Hadoop YARN & HDFS
- シンプルな API

オペレーター と呼ばれる処理単位を作って DAG (有向非巡回グラフ) を組んでストリーム処理アプリケーションを作成することができます。各 オペレーター は状態を持つことができ、データフローやコネクティビティ、フォールトトレランスは Apex 側が面倒みてくれるので、開発者は各 オペレーター が入力タプルをどう扱うか、そして出力をいつ(そしてどのポートに)送るかだけを実装すればいいようになっています。

> ![dag](https://apex.apache.org/docs/apex/images/operator/image02.png)
[Operators - Apache Apex Documentation](https://apex.apache.org/docs/apex/operator_development/#ports)

### Apex Malhar

Apex には Malhar というオペレーターを実装するためのライブラリがあり、入出力や集計などの処理を簡単に書けるようになっています。 Apex は自身の特徴としてコードの書きやすさや再利用性の高さを謳っており、 Malhar がその役割を担っています。

> ![malhar](https://apex.apache.org/docs/malhar/images/malhar-operators.png)
[Apache Apex Malhar Documentation](https://apex.apache.org/docs/malhar/)

### パーティショニング

Apex では、オペレーターごとにパーティションの設定を行い、オペレーターの並行処理性能を上げることができます。さらに、パーティション数の変更は、アプリケーションの実行中に行うことができます。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/ngazGfx1JBv3Zh" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ApacheApex/smart-partitioning-with-apache-apex-webinar" title="Smart Partitioning with Apache Apex (Webinar)" target="_blank">Smart Partitioning with Apache Apex (Webinar)</a> </strong> from <strong><a target="_blank" href="https://www.slideshare.net/ApacheApex">Apache Apex</a></strong> </div>

### ドキュメント

- [Apache Apex Documentation](https://apex.apache.org/docs/apex/)
- [Apache Apex Malhar Documentation](https://apex.apache.org/docs/malhar/)
- [Apache Apex Documentation](https://apex.apache.org/docs.html)
- [DataTorrent Documentation (Distribution 3.8.0 API)](https://www.datatorrent.com/docs/apidocs/)

参考: [Apache Apexとは何なのか？ - Qiita](http://qiita.com/kimutansk/items/bcf9a147eafc8c1adf5f)

## ユースケースと評判

GE が Predix Platform という製造業向けの IoT プラットフォームに Apex を採用しています。採用の理由として、

- 高いパフォーマンス
- 動的なパーティショニング
- 豊富なオペレーター用ライブラリ
- atleast-once, atmost-once, exactly-once のサポート
- デプロイと運用のしやすさ

などをあげています(スライド p19)。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/vQDEfNVhLkyX8V" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ApacheApex/ge-iot-predix-time-series-data-ingestion-service-using-apache-apex-hadoop" title="GE IOT Predix Time Series &amp; Data Ingestion Service using Apache Apex (Hadoop)" target="_blank">GE IOT Predix Time Series &amp; Data Ingestion Service using Apache Apex (Hadoop)</a> </strong> from <strong><a target="_blank" href="https://www.slideshare.net/ApacheApex">Apache Apex</a></strong> </div>

その他のユースケースについては [Powered by Apache Apex](https://apex.apache.org/powered-by-apex.html) にまとめられています。

## はじめかた

以下を順に見ていくといいと思います。

- [ストリーム処理基盤 Apache Apex で Hello World \- 駄文型](http://koheikimura.hatenablog.com/entry/2017/05/31/190000)
- [ストリーム処理で文章内にある単語の出現頻度をカウントする\(Apache Apex\) \- 駄文型](http://koheikimura.hatenablog.com/entry/2017/06/07/190000)
- [ストリーム処理で文章内にある単語の出現頻度をカウントする\(Apache Apex\) その2 \-コーディング編\- \- 駄文型](http://koheikimura.hatenablog.com/entry/2017/06/22/193000)

## コードの書きやすさ

アプリケーションを実装する場合は、オペレーターの抽象的な(論理的な？)処理のみに集中できるので、コードは書きやすい印象です。各オペレーターをどのように組んで DAG を組むかは、ある程度経験が必要になってきそうです。詳細は [ストリーム処理で文章内にある単語の出現頻度をカウントする\(Apache Apex\) その2 \-コーディング編\- \- 駄文型] に書いています。

Storm に似ているらしいです。

> - コードの組み方はStormに非常に似ている。

> [Apache Apexとは何なのか？ - Qiita](http://qiita.com/kimutansk/items/bcf9a147eafc8c1adf5f)


書きやすさと再利用性は Apex の｢オペレーターでダグを組んでストリーム処理アプリケーションを構築する｣という特徴から来ていると考えています。(ちゃんと設計すれば)各オペレーターは非常にシンプルな機能を持つ単一責務の処理単位になるので、再利用性の高いモジュールができあがります。

さまざまな Apex アプリケーションを作って多くのオペレーター実装していけば、オペレーターを再利用してダグの形を変えるだけで別のアプリケーションができあがる、というのが Apex の理想だと思います。

一方で、ダグの設計が難しそうです。一度ダグが決まってしまえば、あとは簡単です。このあたりは一般論なので、実務レベルでどうなのかまでは実際にアプリをどんどん書いていかないと課題などは見えてこないかと思います。

## 他のストリーム処理エンジンとの比較

他のストリーム処理エンジンを知らないので、評価はできません。資料を載せておきます。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/KXzhkpAicv15ZF" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/DataTorrent/apache-apex-next-gen-hadoop-vs-storm-comparison-and-migration-outline" title="Apache Apex (Next Gen Hadoop) vs. Storm - Comparison and Migration Outline" target="_blank">Apache Apex (Next Gen Hadoop) vs. Storm - Comparison and Migration Outline</a> </strong> from <strong><a target="_blank" href="https://www.slideshare.net/DataTorrent">DataTorrent</a></strong> </div>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/fKsPLPrei7tjsO" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ApacheApex/architectual-comparison-of-apache-apex-and-spark-streaming" title="Architectual Comparison of Apache Apex and Spark Streaming" target="_blank">Architectual Comparison of Apache Apex and Spark Streaming</a> </strong> from <strong><a target="_blank" href="https://www.slideshare.net/ApacheApex">Apache Apex</a></strong> </div>

## Kafka との接続

実際に試してはいませんが、 Malhar に Kafka のクラスが用意されており、簡単に接続可能なようです。

[Kafka Input - Apache Apex Malhar Documentation](https://apex.apache.org/docs/malhar/operators/kafkaInputOperator/)

## まとめ

- Hadoop YARN & HDFS
- 豊富なライブラリ
- コードは書きやすい印象
- Kafka とも接続しやすい
- パフォーマンスはめっちゃいいぞって DataTorrent が言ってる
- 実行中にパーティショニング