24
Apache NiFi と ととととととととととと 2016/07/27 Apache NiFi ととと とととととととととととと 木木木木木@kimutansk https://www.flickr.com/photos/neokratz/4913885458

Apache NiFiと他プロダクトのつなぎ方

  • Upload
    -

  • View
    1.745

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Apache NiFiと他プロダクトのつなぎ方

Apache NiFi と他プロダクトのつなぎ方

2016/07/27 Apache NiFi 勉強会

〜データフローの自動化〜木村宗太郎( @kimutansk )

https://www.flickr.com/photos/neokratz/4913885458

Page 2: Apache NiFiと他プロダクトのつなぎ方

自己紹介

• 木村 宗太郎( Sotaro Kimura )• ビッグデータ界隈に生息する何でも屋

• バックエンドからフロントエンド、技術検証から運用、ドキュメント書きまで色々

• ストリーム処理基盤を調べているうちにNiFi にたどり着き、色々試しています。

• Twitter 他 : @kimutansk

2

Page 3: Apache NiFiと他プロダクトのつなぎ方

アジェンダ

1. NiFi と他プロダクトの連携手段2. 外部データストアを使用する方法3. Input ・ Output Port を使用する方法4. Flink との接続サンプル

3

Page 4: Apache NiFiと他プロダクトのつなぎ方

アジェンダ

1. NiFi と他プロダクトの連携手段2. 外部データストアを使用する方法3. Input ・ Output Port を使用する方法4. Flink との接続サンプル

4

Apache NiFi 自体の説明は前発表にあるため、省きます。

Page 5: Apache NiFiと他プロダクトのつなぎ方

5

1. NiFi と他プロダクトの連携手段

• NiFi を他プロダクトと連携させるには、大きく 2 つの方法がある。

1. 外部データストアを使用する方法2. Input ・ Output Port を使用する方法

Page 6: Apache NiFiと他プロダクトのつなぎ方

6

2. 外部データストアを使用する方法

• データストアを介して他プロダクトと連携• NiFi はデータストアにデータを保存• 連携先プロダクトはデータストアから取得

センサーデータ

ログ

アプリ履歴

データ発生元 NiFi データストア 連携先プロダクト

データストアに一度保存してそこから取得

Page 7: Apache NiFiと他プロダクトのつなぎ方

7

2. 外部データストアを使用する方法

• NiFi 、連携先共にコンポーネントが必要• NiFi 側の保持 Processor は下記のように

多彩• AMQP• JMS• Kafka• MQTT• Cassandra• Couchbase• Elasticsearch• etc...

Page 8: Apache NiFiと他プロダクトのつなぎ方

8

2. 外部データストアを使用する方法

• 利点• 並列化で容易にスケールが可能• データストアの耐障害性を利用可能

• 欠点• 管理するプロセスが増大し、複雑化• NiFi 、連携先双方で対応コンポーネントが

必要

Page 9: Apache NiFiと他プロダクトのつなぎ方

9

3. Input ・ Output Port を使用する方法

• NiFi の持つ Input ・ Output Port を介して他プロダクトと連携• NiFi から連携先プロダクトが直接取得

センサーデータ

ログ

アプリ履歴

データ発生元 NiFi 連携先プロダクト

Page 10: Apache NiFiと他プロダクトのつなぎ方

10

3. Input ・ Output Port を使用する方法

• Input ・ Output Port とは?• NiFi プロセス同士が通信するための機構• Input Port に Push して NiFi にデータ投入• Output Port に Pull して NiFi からデータを

取得• 通信路の暗号化も可能(オプション)

Page 11: Apache NiFiと他プロダクトのつなぎ方

11

3. Input ・ Output Port を使用する方法

• NiFi の画面上ではヘッダ部に存在

• NiFi プロセスで複数の Port を管理利用可能

ここからドラッグして使用

Page 12: Apache NiFiと他プロダクトのつなぎ方

12

3. Input ・ Output Port を使用する方法

• NiFi プロセスで複数の Port を管理利用可能 接続先の NiFi 情報

Input Port 一覧 Output Port 一覧

Page 13: Apache NiFiと他プロダクトのつなぎ方

13

3. Input ・ Output Port を使用する方法

• 他プロダクトから用いるには?• Site-To-Site Client という

再利用可能なクライアントとして NiFi から提供• ※Java 製

• https://github.com/apache/nifi/tree/master/nifi-commons/nifi-site-to-site-client

• これを用いることで任意の Java プロセスがNiFi と直接通信する処理を容易に記述可能

• 使用した Example も色々ある• Apache Flink• Apache Apex• etc...

Page 14: Apache NiFiと他プロダクトのつなぎ方

14

3. Input ・ Output Port を使用する方法

• 下記のような構成で使用可能• 複数の NiFi プロセスから取得・投入可能

(?)• 取得側がクラスタの場合も対応可能だが、

ロードバランスの方式は考える必要あり?• ※ 現状 GitHub 上のコードでは 1Client : 1Host 接続の実装しか

ない・・・

Java Program

Site-To-Site Client

NiFi Process 1

Output Port

NiFi Process 2

Output Port

Page 15: Apache NiFiと他プロダクトのつなぎ方

15

3. Input ・ Output Port を使用する方法

• 利点• NiFi と直接やり取りが可能で構成がシンプ

ル• Site-to-Site クライアントを用いることで

幅広いプロダクトで使用可能• 欠点

• 並列化への対応が不完全(?)• 耐障害性は NiFi の個々プロセスに依存

• あくまでデータフローを構築するための機構で、データを保持するための機構ではない。

Page 16: Apache NiFiと他プロダクトのつなぎ方

16

4. Flink との接続サンプル

• 実際に接続した例で何ができるかを見る。• 具体的にどういう構成になるのか?• 下記のサンプルを基に説明• https://

github.com/bbende/nifi-streaming-examples

Page 17: Apache NiFiと他プロダクトのつなぎ方

NiFi Process 1NiFi Process 1

17

4. Flink との接続サンプル

• サンプルを構築した際の構成

Core NiFi

Input PortFlink

StSClient

StSClient

Output Port

Input Port

Http Endpoint

Edge NiFi

StS Client

Http Client ログ解析を行い、結果を返信

ログをEdge から集約

解析結果を取得 集約・転送を実施

Page 18: Apache NiFiと他プロダクトのつなぎ方

18

4. Flink との接続サンプル

• Edge での Flow 定義

ログ読み込み

Core に送信

解析結果取得

Page 19: Apache NiFiと他プロダクトのつなぎ方

19

4. Flink との接続サンプル

• Core での Flow 定義Edge の結果集約

Flink の結果待受

Edge からの待受

Page 20: Apache NiFiと他プロダクトのつなぎ方

20

4. Flink との接続サンプル

• Flink アプリケーションの構成

NiFiSource

NiFiSink

LogLevelFlatMap

LogLevelWindowCounter

DictionaryBuilder

NiFiOutputPortからデータ取得

NiFiInputPortにデータ送信

ログメッセージから

ログレベル抽出

ログレベルをWindow カウント 統計結果集計

Page 21: Apache NiFiと他プロダクトのつなぎ方

21

4. Flink との接続サンプル

• Flink アプリケーションの構築コード// NiFiDataPacket(NiFi 提供 ) を実行単位とする NiFi 用 Source 生成し、実行環境に設定SourceFunction<NiFiDataPacket> nifiSource = new NiFiSource(sourceConfig);DataStream<NiFiDataPacket> streamSource = env.addSource(nifiSource);

// ログレベル抽出 Mapper 生成LogLevelFlatMap logLevelFlatMap = new LogLevelFlatMap(props.getLogLevelAttribute());

// ログレベル WindowCounter 生成LogLevelWindowCounter windowCounter = new LogLevelWindowCounter();

// 統計結果集計 Builder 生成NiFiDataPacketBuilder<LogLevels> builder = new DictionaryBuilder(windowSize, rateThreshold);

// アプリケーション構築streamSource.flatMap(logLevelFlatMap) .timeWindowAll(Time.of(windowSize, TimeUnit.MILLISECONDS)) .apply(new LogLevelWindowCounter()).addSink(new NiFiSink<>(sinkConfig, builder));

// ストリーム処理アプリケーション起動env.execute("WindowLogLevelCount");

Page 22: Apache NiFiと他プロダクトのつなぎ方

22

4. Flink との接続サンプル

• Flink アプリケーションの構築コード// NiFiDataPacket(NiFi 提供 ) を実行単位とする NiFi 用 Source 生成し、実行環境に設定SourceFunction<NiFiDataPacket> nifiSource = new NiFiSource(sourceConfig);DataStream<NiFiDataPacket> streamSource = env.addSource(nifiSource);

// ログレベル抽出 Mapper 生成LogLevelFlatMap logLevelFlatMap = new LogLevelFlatMap(props.getLogLevelAttribute());

// ログレベル WindowCounter 生成LogLevelWindowCounter windowCounter = new LogLevelWindowCounter();

// 統計結果集計 Builder 生成NiFiDataPacketBuilder<LogLevels> builder = new DictionaryBuilder(windowSize, rateThreshold);

// アプリケーション構築streamSource.flatMap(logLevelFlatMap) .timeWindowAll(Time.of(windowSize, TimeUnit.MILLISECONDS)) .apply(new LogLevelWindowCounter()).addSink(new NiFiSink<>(sinkConfig, builder));

// ストリーム処理アプリケーション起動env.execute("WindowLogLevelCount");

Apex アプリケーションでもほぼ同じコード量で同等の機能が実現可能。

Page 23: Apache NiFiと他プロダクトのつなぎ方

まとめ

• NiFi と他プロダクトと連携する手段は2つ① 外部データストアを使用する方法② Input ・ Output Port を使用する方法• 利点欠点は両方ある

• Input ・ Output Port を利用するためのSiteToSiteClient が NiFi から提供• Flink や Apex のサンプルが存在

• Flink 、 Apex 共に、 SiteToSiteClientを使えば数十行のコードで NiFi と接続し、アプリケーション構築可能

23

Page 24: Apache NiFiと他プロダクトのつなぎ方

Enjoy Apache NiFi !

https://www.flickr.com/photos/99408200@N05/11646500835