Ropes of Apache NiFi: Tutorial 2 - ijokarumawak/hdf-tutorials-ja GitHub Wiki

チュートリアル 2: 地理情報でデータフローをエンリッチメント

はじめに

このセクションでは、車両フィルタリングデータフローに地理的な位置情報エンリッチメントを施します。 複数のシステム間での自動化、管理された情報のフロー、そしてデータフローのモニタリングや調査用のNiFiの機能について、深い理解を得ることができるでしょう。 この改良を追加するには、Google Places Nearby APIをNiFiから利用し、車両の移動に応じて周辺情報を表示します。 NiFiでは他のテクノロジーをデータ処理に簡単に利用することができるので、外部APIの利用も実現可能なデザインパターンです。

このチュートリアルでは、地理的位置情報エンリッチメントセクションをデータフローに追加します:

Lab2-NiFi-Learn-Ropes.xmlテンプレートファイルを利用しても良いですし、スクラッチでデータフローを作成する場合は、チュートリアルに進みましょう。

事前準備

  • 「チュートリアル 0: NiFiのダウンロード、インストール、起動」を完了していること
  • 「チュートリアル 1: シンプルなNiFiデータフロー構築」を完了していること

OUTLINE

  • Google Places API
  • Step 1: NiFiでHTTP URLを作成するためのAPIキーの取得
  • Step 2: 地理的位置情報エンリッチメントデータフローセクションの作成
  • Step 3: NiFiデータフローの実行
  • まとめ
  • さらに理解を深めるために

Google Places API

Google Places API Web ServiceはHTTPリクエストを利用し、施設、地理的位置情報、著名なPoint of Interestといった場所に関する情報を返します。Places APIには6種類のリクエストがあります: Place Searches, Place Details, Place Add, Place Photos, Place Autocomplete, Query Autocomplete。これらのリクエストの詳細はIntroducing the APIをご覧ください。

すべてのリクエストはHTTPリクエストでアクセスし、JSONかXMLのレスポンスが返ります。

Places APIを利用する上で必要となるコンポーネントは何でしょう?

Step 1: NiFiでHTTP URLを作成するためのAPIキーの取得

これから作成するデータフローでは、変化する車両のロケーション付近の情報を検索し、データをエンリッチメントするのがミッションです。 このデータから2つのパラメータを取得します: 近辺施設の名称とSan Francisco Muni Transit Agencyです。 よってNiFiからNearby Search HTTPリクエストを利用します。

NiFiで必要なNearby Searchリクエストは下記形式のHTTP URLです:

https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters

outputjsonxmlの2つの形式が指定できます。チュートリアルではjsonを利用します。

Nearby Searchリクエストを実行するために必要なパラメータを取得しましょう。

  1. クォータ管理でこのアプリケーションを特定するため、そしてアプリケーションから追加したPlacesが直ちにアプリケーション(NiFi)から利用できるよういするために、APIキーを取得しましょう。

  2. 標準のGoogle Places APIを利用します。青いGet A Keyボタンをクリックし、API Web Serviceをアクティベートします。

  3. Select a project where your application will be registeredと記載されたウィンドウが表示されます、Create a new projectを選択します。このアプリケーション用のプロジェクトを作成します。 Continueをクリックします。 数秒待つと、新しい画面がロードされます。

  4. 名前フィールドにServer key 1とある画面が表示されます、青いCreateボタンをクリックします。

  5. 以下の表に示すように、ユニークなAPIキーが表に表示されます:

表1: APIキーテーブルの例

名前 作成日 タイプ キー
Server Key 1 June 14, 2016 Server AIzaSyDY3asGAq-ArtPl6J2v7kcO_YSRYrjTFug

HTTPリクエスト用APIキーが用意できました。 他にも必要なパラメータとして: locationがあります。チュートリアル1のおかげで、longitude、latitudeはすでに抽出済です。そしてradiusですが、距離であり、50,000メートルを超えることはありません。 そして任意のパラメータであるtypeを、検索対象の場所の種別を指定するために利用します。

  1. 後ほど、InvokeHTTPのプロパティ値として利用できるように、以下のパラメータでHTTP URLを作成してみましょう。
  • API Key = AIzaSyDY3asGAq-ArtPl6J2v7kcO_YSRYrjTFug
  • Latitude = ${Latitude}
  • Longitude = ${Longitude}
  • radius = 500
  • type = neighborhood
https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${Latitude},${Longitude}&radius=500&type=neighborhood&key=AIzaSyDY3asGAq-ArtPl6J2v7kcO_YSRYrjTFug

注: 上記URL内のAPIキーはご自身のものに置換してください。

Step 2: 地理的位置情報エンリッチメントデータフローセクションの作成

地理的位置情報エンリッチメントをデータフローに追加するには、6つのプロセッサが必要です。 各プロセッサはエンリッチしたデータを宛先に転送する際に重要な役割を担います:

  • InvokeHTTP HTTPリクエストを実行し、Google Places APIから車両ロケーション付近の場所データを取得します。
  • EvaluateJsonPath neighborhoods_nearbyとcityデータ要素をJSONから抽出します。
  • RouteOnAttribute neighborhoods_nearbyとcityが空でないフローファイルをルーティングします。
  • AttributesToJSON JSONコンテンツを結合し、フローファイルをマージします。
  • PutFile エンリッチしたフローファイルの地理的位置情報コンテンツをローカルファイルシステムに保存します。

2.1 学習の目的: データフローに地理的エンリッチメントの追加

  • 地理的エンリッチメントAPIデータの取込、フィルタ、保存に利用するプロセッサを追加/設定/接続する
  • 問題が発生したら解決する
  • データフローを実行する

InvokeHTTP

  1. InvokeHTTPプロセッサをNiFiのグラフに追加します。チュートリアル1のRouteOnAttributeInvokeHTTPに接続します。 Create Connectionウィンドウが表示されたら、Filter Attributesがチェックされていることを確認し、されていなければチェックして、Addをクリックします。

  2. InvokeHTTPのプロパティ設定タブで表1に示すプロパティを設定します。

表1: 設定するInvokeHTTPプロパティの値

プロパティ
Remote URL https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${Latitude},${Longitude}&radius=500&type=neighborhood&key=AIzaSyDY3asGAq-ArtPl6J2v7kcO_YSRYrjTFug
  • Remote URL 先程作成したGoogle Places APIを利用するHTTP URLに接続し、取得したデータをデータフローにフィードします。 locationパラメータには2つのNiFiエクスプレッションを利用している点に注意してください。 これは、このプロセッサに新しくフローファイルが渡ってくるたびに、これら2つの値は変化するためです。

  1. Settingsタブを表示し、InvokeHTTPからGoogleNearbySearchAPIに名称を変更しましょう。 Auto terminate relationshipsにあるFailure、No Retry、Original、Retryをチェックします。 Applyボタンをクリックします。

EvaluateJsonPath

  1. EvaluateJSONPathプロセッサをNiFiのグラフに追加します。InvokeHTTPEvaluateJsonPathに接続します。 Create Connectionウィンドウが表示されたら、Responseがチェックされていることを確認し、Applyをクリックします。

  2. EvaluateJsonPathのプロパティ設定タブで表2に示すプロパティを設定します。 注: cityneighborhoods_nearbyNew propertyボタンをクリックして追加し、それぞれの値をプロパティタブで入力します。

表2: 設定するEvaluateJsonPathプロパティの値

プロパティ
Destination flowfile-attribute
Return Type json
city $.results[0].vicinity
neighborhoods_nearby $.results[*].name
  • Destination JSON Path式の結果をフローファイルの属性に保存します。
  • 2つのユーザ定義属性 それぞれ次のプロセッサのNiFiエクスプレッション言語のフィルタ条件で利用する値を保持します。

  1. Settingsタブを表示します。 Auto terminate relationshipsにあるunmatched, failureをチェックします。 Applyボタンをクリックします。

RouteOnAttribute

  1. RouteOnAttributeプロセッサをNiFiのグラフに追加します。EvaluateJsonPathRouteOnAttributeに接続します。 Create Connectionウィンドウが表示されたら、matchedがチェックされていることを確認し、Applyをクリックします。

  2. RouteOnAttributeのプロパティ設定タブでNew propertyボタンをクリックし、RouteNearbyNeighborhoodsを追加し、表3に示すNiFiエクスプレッションの値を設定します。

表3: 新しいRouteOnAttributeプロパティの値を追加

プロパティ
RouteNearbyNeighborhoods ${city:isEmpty():not():and(${neighborhoods_nearby:isEmpty():not()})}
  • RouteNearbyNeighborhoods JSONパス式で取得したフローファイルの属性値を利用し、いずれかの属性値が空のフローファイルをフィルタアウトします。そうでなければ、フローファイルを後続のプロセッサへ渡します。

  1. Settingsタブを表示し、名前をROuteOnAttributeからRouteNearbyNeighborhoodsに変更します。 Auto terminate relationshipsにあるunmatchedをチェックします。 Applyボタンをクリックします。

AttributesToJson

  1. AttributesToJsonプロセッサをNiFiのグラフに追加します。RouteOnAttributeAttributesToJsonに接続します。 Create Connectionウィンドウが表示されたら、RouteNearbyNeighborhoodsがチェックされていることを確認し、Applyをクリックします。

  2. AttributesToJSONのプロパティ設定タブで表4に示すプロパティを設定します。

表4: 設定するAttributesToJSONプロパティの値

プロパティ
Attributes List Vehicle_ID, city, Latitude, Longitude, neighborhoods_nearby, Last_Time
Destination flowfile-content

  1. Settingsタブを表示します。 Auto terminate relationshipsにあるfailureをチェックします。 Applyボタンをクリックします。

MergeContent

  1. MergeContentプロセッサをNiFiのグラフに追加します。AttributesToJsonMergeContentに接続します。 Create Connectionウィンドウが表示されたら、successがチェックされていることを確認し、Applyをクリックします。

  2. MergeContentプロパティ設定タブで表5に示すプロパティを設定します。 Demarcatorプロパティには、,を入力した後、shift+enterを入力します。

表5: 設定するMergeContentプロパティの値

プロパティ
Minimum Number of Entries 10
Maximum Number of Entries 15
Delimiter Strategy Text
Header [
Footer ]
Demarcator , {press-shift+enter}

  1. Settingsタブを表示します。 Auto terminate relationshipsにあるfailure,originalをチェックします。 Applyボタンをクリックします。

PutFile

  1. PutFileプロセッサをNiFiのグラフに追加します。MergeContentPutFileに接続します。 Create Connectionウィンドウが表示されたら、mergedがチェックされていることを確認し、Applyをクリックします。

  2. PutFileのプロパティ設定タブで表6に示すプロパティを設定します。

表6: 設定するPutFileプロパティの値

プロパティ
Directory /tmp/nifi/output/nearby_neighborhoods_search

  1. Settingsタブを表示します。 Auto terminate relationshipsにあるsuccessをチェックします。 Applyボタンをクリックします。 プロセッサを自身に接続し、Create Connectionウィンドウが表示されたら、failureをチェックします。

Step 3: NiFiデータフローの実行

地理的位置情報エンリッチメントデータフローセクションを前チュートリアルのデータフローに追加しました。 データフローを実行し、期待する結果が得られているか、出力ディレクトリを確認してみましょう。

  1. actionsツールバーにある、スタートボタンをクリックします。以下のような画面になります:

  1. 期待するディレクトリにデータが書き込まれたかチェックします、ターミナルを開いてください。 Sandboxを利用している場合はSandboxにSSHで接続します、そうでない場合はローカルマシン上の出力ディレクトリに移動します。 PutFileプロセッサで指定したディレクトリに移動します。 ファイルを一覧表示し、直近で作成したファイルの一つを開き、地理的付近情報エンリッチメントデータの出力を確認します。 チュートリアルの出力ディレクトリは:/tmp/nifi/output/nearby_neighborhoods_searchになっています。
cd /tmp/nifi/output/nearby_neighborhoods_search
ls
vi 38997303004413

まとめ

おめでとうございます! データフローの地理的エンリッチメントセクションでは、InvokeHTTPを利用し、Google Places Search APIを利用した近隣の地理的位置情報にアクセスする方法を学習しました。 URL内の緯度軽度が新しいフローファイルがプロセッサに渡るたびに変わるように、NiFiエクスプレッションの変数をInvokeHTTPのRemoteURLプロパティに追加しました。 EvaluateXPathに似た、JSONエクスプレッションを利用してJSONの要素(neighborhoods_nearby, city)を抽出する、EvaluateJsonPathの利用方法を学びました。 これで、外部APIを利用してNiFiのデータフローをさらに拡張できるようになりました。

さらに理解を深めるために


前へ | 次へ