Transcript
Apache NiFi と他プロダクトのつなぎ方
2016/07/27 Apache NiFi 勉強会
〜データフローの自動化〜木村宗太郎( @kimutansk )
https://www.flickr.com/photos/neokratz/4913885458
自己紹介
• 木村 宗太郎( Sotaro Kimura )• ビッグデータ界隈に生息する何でも屋
• バックエンドからフロントエンド、技術検証から運用、ドキュメント書きまで色々
• ストリーム処理基盤を調べているうちにNiFi にたどり着き、色々試しています。
• Twitter 他 : @kimutansk
2
アジェンダ
1. NiFi と他プロダクトの連携手段2. 外部データストアを使用する方法3. Input ・ Output Port を使用する方法4. Flink との接続サンプル
3
アジェンダ
1. NiFi と他プロダクトの連携手段2. 外部データストアを使用する方法3. Input ・ Output Port を使用する方法4. Flink との接続サンプル
4
Apache NiFi 自体の説明は前発表にあるため、省きます。
5
1. NiFi と他プロダクトの連携手段
• NiFi を他プロダクトと連携させるには、大きく 2 つの方法がある。
1. 外部データストアを使用する方法2. Input ・ Output Port を使用する方法
6
2. 外部データストアを使用する方法
• データストアを介して他プロダクトと連携• NiFi はデータストアにデータを保存• 連携先プロダクトはデータストアから取得
センサーデータ
ログ
アプリ履歴
データ発生元 NiFi データストア 連携先プロダクト
データストアに一度保存してそこから取得
7
2. 外部データストアを使用する方法
• NiFi 、連携先共にコンポーネントが必要• NiFi 側の保持 Processor は下記のように
多彩• AMQP• JMS• Kafka• MQTT• Cassandra• Couchbase• Elasticsearch• etc...
8
2. 外部データストアを使用する方法
• 利点• 並列化で容易にスケールが可能• データストアの耐障害性を利用可能
• 欠点• 管理するプロセスが増大し、複雑化• NiFi 、連携先双方で対応コンポーネントが
必要
9
3. Input ・ Output Port を使用する方法
• NiFi の持つ Input ・ Output Port を介して他プロダクトと連携• NiFi から連携先プロダクトが直接取得
センサーデータ
ログ
アプリ履歴
データ発生元 NiFi 連携先プロダクト
10
3. Input ・ Output Port を使用する方法
• Input ・ Output Port とは?• NiFi プロセス同士が通信するための機構• Input Port に Push して NiFi にデータ投入• Output Port に Pull して NiFi からデータを
取得• 通信路の暗号化も可能(オプション)
11
3. Input ・ Output Port を使用する方法
• NiFi の画面上ではヘッダ部に存在
• NiFi プロセスで複数の Port を管理利用可能
ここからドラッグして使用
12
3. Input ・ Output Port を使用する方法
• NiFi プロセスで複数の Port を管理利用可能 接続先の NiFi 情報
Input Port 一覧 Output Port 一覧
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...
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
15
3. Input ・ Output Port を使用する方法
• 利点• NiFi と直接やり取りが可能で構成がシンプ
ル• Site-to-Site クライアントを用いることで
幅広いプロダクトで使用可能• 欠点
• 並列化への対応が不完全(?)• 耐障害性は NiFi の個々プロセスに依存
• あくまでデータフローを構築するための機構で、データを保持するための機構ではない。
16
4. Flink との接続サンプル
• 実際に接続した例で何ができるかを見る。• 具体的にどういう構成になるのか?• 下記のサンプルを基に説明• https://
github.com/bbende/nifi-streaming-examples
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 から集約
解析結果を取得 集約・転送を実施
18
4. Flink との接続サンプル
• Edge での Flow 定義
ログ読み込み
Core に送信
解析結果取得
19
4. Flink との接続サンプル
• Core での Flow 定義Edge の結果集約
Flink の結果待受
Edge からの待受
20
4. Flink との接続サンプル
• Flink アプリケーションの構成
NiFiSource
NiFiSink
LogLevelFlatMap
LogLevelWindowCounter
DictionaryBuilder
NiFiOutputPortからデータ取得
NiFiInputPortにデータ送信
ログメッセージから
ログレベル抽出
ログレベルをWindow カウント 統計結果集計
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");
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 アプリケーションでもほぼ同じコード量で同等の機能が実現可能。
まとめ
• NiFi と他プロダクトと連携する手段は2つ① 外部データストアを使用する方法② Input ・ Output Port を使用する方法• 利点欠点は両方ある
• Input ・ Output Port を利用するためのSiteToSiteClient が NiFi から提供• Flink や Apex のサンプルが存在
• Flink 、 Apex 共に、 SiteToSiteClientを使えば数十行のコードで NiFi と接続し、アプリケーション構築可能
23
Enjoy Apache NiFi !
https://www.flickr.com/photos/99408200@N05/11646500835
top related