「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>分散処理:データ収集・格納系]]([[EAI/ETL]] --[[Apache Sqoop]] --[[Fluentd/Embulk]] --[[Logsatsh, Beats>Elasticsearch#r521f91b]] --[[Apache Flume]] --Apache NiFi --[[Apache Kafka]] *目次 [#e9d8b189] #contents *概要 [#xc28fc5d] -[[EAI/ETL]]系のデータフロー・オーケストレーション・ツール。 -システム間のデータフロー自動化を行うために構築された。 -NSA(アメリカ国家安全保障局)で開発されていたものが、~ 2014年にオープンソースソフトウェアとして公開された。 -2015年7月にApacheのTopレベルプロジェクトになった。 **特徴 [#d0903f10] -もともと、Niagrafilesという名前だった。~ (ナイアガラの滝のようにドーッと降りてくる大量の水を処理するという発想。) -ツールの仕様としては、[[ETL>EAI/ETL#eed58b6f]]ツールに近い(GUIを使ってデータとプロセスを定義する)。 -しかし、[[ETL>EAI/ETL#eed58b6f]]は本来、バッチ指向なので、イベント指向の[[EAI>EAI/ETL#g1a18cd1]]に近いと言える。 -[[ビッグデータの3V>ビッグデータ#wecdc89e]]のコンテキストでは、 --[[Apache Storm]]代替のエッジ・コンピューティング・ツール。 --「多様性」を重視している(カチッと整形されたデータではなくても様々なデータが処理可能)。 **関連PJ [#xf4453e7] ***Registry [#ndc9a784] フロー定義を「as a code」として管理するサブ・プロジェクト ***[[MiNiFi>#rd6d949e]] [#zdbf1caa] ***[[MiNiFi>#n14fb7eb]] [#zdbf1caa] 小さなフットプリントでデータフローを実行できるサブ・プロジェクト ***Apache Atlas [#y5836c29] 大量のデータがどこから来てどこに行くのか、コンプライアンスの観点で追跡するプロジェクト **設計コンセプト [#q7979995] ***FBP [#nc4ba6c2] -基本的な設計コンセプトはFlow Based Programming(FBP)と関連が強い。 -Flow Based Programming(FBP)の用語とのマッピングは下表のようになっている。 |#|NiFi 用語|FBP 用語|Description|h |1|FlowFile|Information Packet|システム間を移動する各オブジェクトのことを示している。&br;バイナリ形式でKeyValueの属性文字列を保持している。| |2|Processor|Information Packet|Enterprise Integration Patterns(EIP)においてルーティング、変換、システム仲介を行うもの。&br;与えられたFlowFileの属性、およびFlowFileの流れるストリームにアクセスする。&br;0から任意の数のFlowFile群を処理単位として認識し、その単位で処理やコミット、ロールバックを可能とする。| |3|Connection|Bounded Buffer|Processor間の実接続を示す。&br;キューとして動作し、様々な処理を異なるタイミングで差し込むことが可能。&br;これらのキューは動的な優先度付け機構、バックプレッシャー機構を有する。| |4|Controller|Scheduler|プロセス、スレッドの配置や接続関係について統括している。&br;Processor間のFlowFileのやり取りを容易にするBrokerとして動作する。| |5|Process Group|subnet|プロセスとConnectionの一群を指し、外部からメッセージを受け取るInputPortや出力するOutputPortを有する。&br;これらの組み合わせによってProcess Groupは新たなコンポーネントの生成も可能になっている。| ***SEDA [#b9a6d249] -この設計コンセプトはstaged event-driven architecture(SEDA)とも似ている。 -staged event-driven architecture(SEDA)から様々な設計アイディアをえている。 -参考 --SEDA: An Architecture for Well-Conditioned, Scalable Internet Services~ http://www.mdw.la/papers/seda-sosp01.pdf *用語 [#h2fa9150] **FlowFile [#qf2a86ae] ユーザデータ -ユーザが処理および配信のためにもたらすデータ -[[Content>#l4393b12]]と[[Attributes>#ea87a83b]]からなる。 ***Content [#l4393b12] 扱うデータの本体(バイナリ形式) ***Attirbutes [#ea87a83b] -ユーザーデータに関連付けられたKeyValueのメタ情報。 -以下の、3つの主要な利点がある。 > +[[Processor>#h3f2273c]]毎に独自のAttirbutesを持つ。~ 例えば、PutFile Processorであれば、ディレクトリとファイル名の属性を持つ。 +起源・出所など、データに関する非常に貴重なcontextを提供する。 +属性に基づいてフロー内でFlowFileのルーティングを決定できる。 -共通の属性 |#|属性名|説明|変更可否|h |1|filename|ファイル名|| |2|path|ディレクトリ名|| |3|fileSize|ファイルのバイト数|不可| |4|uuid|他のFlowFilesとFlowFileを区別する汎用一意識別子|不可| |5|entryDate|FlowFileが作成された日時(UTC)|不可| |6|lineageStartDate|先祖の連鎖の最古の日時(UTC)|不可| -属性の設定 --属性を抽出する[[Processor>#h3f2273c]]がある。 ---特定のデータフォーマットを理解し、 ---FlowFileのコンテンツから適切な情報を抽出し、 ---その情報を保持する属性を作成し、 ---データのルーティングや処理方法の決定を行う。 --ユーザー定義属性をする[[Processor>#h3f2273c]]がある。 ---フロー内の特定の場所にある各FlowFileに~ 独自のユーザー定義属性を追加することも一般的。 ---これには、UpdateAttribute Processorを使用する。 -属性の利用 --属性を使用した分岐 ---NiFiの最も強力な機能の1つに、属性に基づいてFlowFilesを分岐させる機能がある。 ---これには、RouteOnAttribute Processorに、Expression Languageの式を設定する。 ---Processorは構成によって、一致と不一致の[[Relationship>#ia9fb78a]]を公開する。 --Expression Language/プロパティ値での利用 ---属性値の参照:${ tag and the closing }(${uudi}など)~ 次のケースでは、属性名を引用符で囲む必要がある。~ ・必要属性名が文字以外の文字で始まる場合~ ・または数字、文字、ピリオド、アンダースコア以外の文字が含まれている場合 ---属性に対して多くの機能と比較を実行~ ・ファイル名に大小を区別しない「r」が含まれる。: ${filename:toLower():contains('r')} ・属性1と2が一致している。: ${attr1:equals(${attr2})} --参考 ---Apache NiFi Expression Language Guide~ https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html **Processor [#h3f2273c] -データフローを記述したグラフ(DAG)におけるノード(節点・頂点)に相当する。 -「[[FlowFile>#qf2a86ae]]にどんな処理を施すか」を表す、最も重要なビルディング・ブロック。 --FlowFilesの作成、送信、受信、変換、ルーティング、分割、マージ、および処理を担当する。 --組込Processorに加え、カスタムProcessorを開発して組込むことも可能。 ***詳細:[[Apache NiFi - Processor]] [#b633c1fc] **Connection [#t66efbdc] データフローを記述したグラフ(DAG)におけるエッジ(枝・辺)の属性に相当する。 ***Relationship [#ia9fb78a] -「[[Processor>#h3f2273c]]が行った処理に応じて,どの[[Processor>#h3f2273c]]にどの[[FlowFile>#qf2a86ae]]を届けるか」を表す。 -各[[Processor>#h3f2273c]]ごとにあらかじめ定義されている。 --original --failure --, etc. -RouteOnAttribute Processorに、Expression Languageの式を設定すると公開される。 --一致 --不一致 ***Selected Prioritizers [#nabc6850] キューから取り出す優先順位は、大方、 -FirstInFirstOutPrioritizer -OldestFlowFileFirstPrioritizer などを設定しておけば良いのでは。 *アーキテクチャ [#m5953e27] ホストOS上のJVM内で実行される。 **図 [#pe526785] https://nifi.apache.org/docs/nifi-docs/html/images/zero-master-node.png 引用:nifi.apache.org/docs/nifi-docs/html/images/zero-master-node.png **主要コンポーネント [#w87e5332] 以下は、JVM上の主なコンポーネント。 ***Web Server [#s943128c] HTTPベースのコマンドと制御APIをホストする。 ***Extensions [#f142e88c] -様々なタイプの拡張がある。 -JVM内で動作して実行される。 ***Flow Controller [#m40f0ef5] 操作の頭脳 -[[Extensions>#f142e88c]]の --スレッド実行 --リソース受け取りのスケジューリング --[[Processor>#h3f2273c]]間でのコンテキストの共有 ---HTTPContext ---データストアとの接続 ***[[FlowFile>#qf2a86ae]] Repository [#r97c04bb] -現在アクティブな[[FlowFile>#qf2a86ae]]の状態を追跡する場所。 -リポジトリの実装はプラガブル。 --デフォルトの場所は、...\nifi-n.n.n\flowfile_repository ***Content Repository [#tadfac1a] -[[FlowFile>#qf2a86ae]]の実際のコンテンツバイトが存在する場所。 -リポジトリの実装はプラガブル。 --ファイルシステムにデータのブロックを格納する。 --複数のファイルシステム格納場所を指定するできる。 --デフォルトの場所は、...\nifi-n.n.n\content_repository ***Provenance Repository [#hcf419cf] -すべてのProvenance イベント・データが格納される場所。 -リポジトリの構成はプラガブル。 --デフォルトの構成では、1つ以上の物理ディスク・ボリュームを使用 --各ロケーション内でイベントデータが索引付けされ、検索可能。 **クラスタリング [#b6e82382] -1.0以降、[[Apache ZooKeeper>#l352f230]]のクラスタ内で動作できる。 -各ノードは、データに対して同じタスクを実行する。 -しかし、それぞれ異なるデータセットで動作する。 ***[[ZooKeeper>Apache ZooKeeper]] [#l352f230] -コーディネータとして単一のノードを選択 -プライマリノードとして単一のノードを選択 ***コーディネータ [#l854ca98] -フェイルオーバーは[[ZooKeeper>#l352f230]]によって自動的に処理される。 -すべてのノードは、ハートビートとステータス情報をコーディネータに報告。 -コーディネータはノードの切断と接続を行う。 ***プライマリノード [#te48634e] -DataFlowマネージャとして、UIを介してクラスタとやりとりできる。 -変更は、クラスタ内のすべてのノードに複製され、複数のエントリポイントが可能になる。 *その他 [#nb94d8be] **カスタム・プロパティ [#s03bee7c] -属性の使用に加えて、~ nifi.propertiesファイルのnifi.variable.registry.propertiesフィールドで~ Expression Languageで使用するカスタムプロパティを定義することもできる。 --接続プロパティ --サーバープロパティ --およびサービスプロパティ -データフローの処理と構成の柔軟性が向上する。 **Template [#vc6f9fc4] -[[Processor>#h3f2273c]]を組み合わせをフローのビルディング・ブロックとして再利用できる。 -作成には、複数のコンポーネントを選択し、Operatorから[Create Template]ボタンを選択。 **監視 [#lfae3033] ***Status Bar [#t40b59d9] ***Component Statistics [#dbe47c1c] ***Bulletins [#t708eba3] **データの起源・出所 [#j4677a34] ***イベントの詳細 [#mcdf88d8] ***リネージュ・グラフ [#qd5a5cbf] *ユースケース [#s5d52955] [[公式文書>http://nifi.apache.org/docs.html]]に、 >SOA、APIベースのシステム結合、IoT、BigData、あとはMicroServices~ (These include things like; Service Oriented Architecture [soa],~ the rise of the API [api][api2], Internet of Things [iot], and Big Data [bigdata].) と書かれている。 **[[EAI/ETL]] [#p3f5a0cf] ツールの仕様としては、どちらにも適合する可能性がある。 ***[[ETL>EAI/ETL#eed58b6f]] [#j2f941ea] バッチ指向なので適合しない可能性がある(性能検証などが必要)。 ***[[EAI>EAI/ETL#g1a18cd1]] [#g62290e1] イベント指向なのでこちらのほうが適合し易い。 **WebAPI [#lf41d133] ***簡易WebAPI開発 [#fff464db] Remote Process GroupでHTTPなどのEndpointを定義してS2Sが可能。 ***複雑な業務プロセスを開発 [#bc4200e6] -[[ExecuteScript>Apache NiFi - ExecuteScript Processor]]の利用 -BRMSと組合せ **[[ビッグデータ]] [#i205c54a] ***[[Apache Storm]]代替 [#hc55a4d3] [[CEPも実は単純な事(SEP)しかシていないことが多い。>分散処理#m55c61c3]] **IoT [#b36e1bdf] ***エッジ [#l0c36bd2] -データマネージメント -データのエンリッチメント ***デバイス([[MiNiFi>#rd6d949e]]) [#n14fb7eb] 以下での利用が想定されている。 -IoTデバイス -エッジ・コンピューティング **その他 [#l743cfa8] -System Workflow代替 -[[API Gateway]]の変換部分の代替 *step by step的な [#q0c43621] **[[ファースト・ステップ>Apache NiFiファースト・ステップ]] [#j778449f] **[[セカンド・ステップ>Apache NiFiセカンド・ステップ]] [#jc556256] *参考 [#mae1cf05] -NiFi.rocks~ http://www.nifi.rocks -Fun with Apache NiFi~ http://funnifi.blogspot.com -Apache NiFiのコミッターに聞く~ 「OSSコミッター」になる秘訣 | Think IT(シンクイット)~ https://thinkit.co.jp/article/12605 -HortonworksのCTOが語る「Apache NiFi」~ IoT分野で重視される理由 - ZDNet Japan~ https://japan.zdnet.com/article/35070853/ **nifi.apache.org [#o1d28742] -Apache NiFi~ https://nifi.apache.org -Apache NiFi Documentation~ https://nifi.apache.org/docs.html --[[Processors>Apache NiFi - Processor#hbe455a1]] --Controller Services --Reporting Tasks --General ---[[Overview>#labb0a99]] ---[[Getting Started>#labb0a99]] ---[[User Guide>#labb0a99]] ---Expression Language Guide ---RecordPath Guide ---Admin Guide --Developer ---Rest Api~ https://nifi.apache.org/docs/nifi-docs/rest-api/index.html >NiFiインスタンスをリアルタイムでコマンドおよび制御するためのプログラムによるアクセスを提供する。 ---Developer Guide~ https://nifi.apache.org/developer-guide.html >Apache NiFi拡張の開発方法を理解し、コンポーネント開発の思考プロセスを説明するのに必要な情報を読者に提供する。 ---Apache NiFi In Depth~ https://nifi.apache.org/docs/nifi-docs/html/nifi-in-depth.html >高度なレベルのドキュメント。NiFiの実装と設計に関する決定を詳細に検討することを目的とする。 **SlideShare [#mb769bf7] -Apache NiFi の紹介 #streamctjp~ https://www.slideshare.net/techblogyahoo/apache-nifi-streamctjp -Apache NiFiと他プロダクトのつなぎ方~ https://www.slideshare.net/SotaroKimura/apache-nifi -Kafkaを活用するためのストリーム処理の基本~ https://www.slideshare.net/SotaroKimura/kafka-62558083 ***KojiKawamura [#q0e5f63a] https://www.slideshare.net/KojiKawamura/presentations -そのデータフロー NiFiで楽にしてあげましょう~ https://www.slideshare.net/KojiKawamura/nifi -Apache NiFi 1.0 in Nutshell~ https://www.slideshare.net/KojiKawamura/apache-nifi-10-in-nutshell -Kafka含むデータ処理フローを NiFiで構築するさまを実演する5分間~ https://www.slideshare.net/KojiKawamura/kafka-nifi5 -Apache NiFiで、楽して、つながる、広がる IoTプロジェクト~ https://www.slideshare.net/KojiKawamura/apache-nifi-iot -What will be new in Apache NiFi 1.2.0~ https://www.slideshare.net/KojiKawamura/whats-newnifi120 -Apache NiFi 流れるデータにもスキーマを~ https://www.slideshare.net/KojiKawamura/apache-nifi-78564874 **Qiita [#y8a4da49] ***kimutansk [#c3c57e14] https://qiita.com/kimutansk -Apache NiFiのそもそものコンセプトは?~ https://qiita.com/kimutansk/items/59c9dacf01bd342295c3 -ストリーム処理とは何か?+2016年の出来事~ https://qiita.com/kimutansk/items/60e48ec15e954fa95e1c **GitHub.com [#o742c18d] ***Apache [#re23a3cc] -apache/nifi~ https://github.com/apache/nifi ***Hortonworks [#i63bd7b0] -hortonworks-gallery > nifi-templates~ https://github.com/hortonworks-gallery/nifi-templates/tree/master/templates **step by step的な [#ce179366] ***nifi.apache.org [#labb0a99] -Apache NiFi Overview~ https://nifi.apache.org/docs/nifi-docs/html/overview.html -Getting Started with Apache NiFi~ https://nifi.apache.org/docs/nifi-docs/html/getting-started.html -Apache NiFi User Guide~ https://nifi.apache.org/docs/nifi-docs/html/user-guide.html ***hortonworks.com [#s9804cd5] -Hortonworks DataFlow~ https://docs.hortonworks.com/HDPDocuments/HDF3/HDF-3.1.1/bk_getting-started-with-apache-nifi/content/index.html ***ijokarumawak/hdf-tutorials-ja [#y8d62984] -[[Learning the Ropes of Apache NiFi>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/Learning-the-Ropes-of-Apache-NiFi]] --[[チュートリアル 0>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/Ropes-of-Apache-NiFi%3A-Tutorial-0]] --[[チュートリアル 1>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/Ropes-of-Apache-NiFi%3A-Tutorial-1]] --[[チュートリアル 2>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/Ropes-of-Apache-NiFi%3A-Tutorial-2]] --[[チュートリアル 3>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/Ropes-of-Apache-NiFi%3A-Tutorial-3]] -HDFハンズオン --[[HDFハンズオン 0: NiFi, Kafka, Stormを組み合わせて利用する>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-0:-NiFi,-Kafka,-Storm%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B]] --[[HDFハンズオン 1: データの取込>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-2:-%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%A4%89%E6%8F%9B]] --[[HDFハンズオン 2: データの変換>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-3:-Kafka%E3%81%B8%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E7%99%BB%E9%8C%B2]] --[[HDFハンズオン 3: Kafkaへメッセージ登録>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-4:-Storm%E3%81%A7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E5%88%86%E6%9E%90]] --[[HDFハンズオン 4: Stormでリアルタイム分析>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-5:-%E5%88%86%E6%9E%90%E7%B5%90%E6%9E%9C%E3%82%92%E4%BF%9D%E5%AD%98]] --[[HDFハンズオン 5: 分析結果を保存>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-5:-%E5%88%86%E6%9E%90%E7%B5%90%E6%9E%9C%E3%82%92%E4%BF%9D%E5%AD%98]] --[[HDFハンズオン 6: おまけ Zeppelinで可視化>https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/HDF%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-6:-%E3%81%8A%E3%81%BE%E3%81%91-Zeppelin%E3%81%A7%E5%8F%AF%E8%A6%96%E5%8C%96]] ***Qiita [#w19f3f8e] -kimutansk~ https://qiita.com/kimutansk --データフローオーケストレーションツールApache NiFiとは?~ https://qiita.com/kimutansk/items/a083fc963fbe31068cf8 --Apache NiFiで基本のデータフローを作成するには?~ https://qiita.com/kimutansk/items/b235fe6cdd0c04ab7e10 -lethe2211~ https://qiita.com/lethe2211 --Apache NiFiについて調べてみた~ https://qiita.com/lethe2211/items/a180373c5c25839bb470 --Apache NiFiのCustom Processorを作ってみた~ https://qiita.com/lethe2211/items/ed2c97070b229fdca447 -Apache NiFiでSQLを投げてみる~ https://qiita.com/grachro/items/2933606bf5c276a87572 **[[MiNiFi]] [#rd6d949e] **OSSコンソーシアム [#pd9a5490] ***開発基盤部会 Blog [#v296ae13] -Apache NiFiのファースト・ステップをしてみました。~ https://www.osscons.jp/joq3c6bgf-537/ -Apache NiFiのセカンド・ステップをしてみました。~ https://www.osscons.jp/jodqs94fu-537/