Apache Nifi から CData JDBC Driver 利用で Salesforce などのSaasデータを利用してみる

# はじめに

[Apache Nifi](https://nifi.apache.org/)は、OSSのデータフローオーケストレーションツールです。Nifiでは、JDBCドライバで各種データソースに接続することが可能です。本記事では、 CData JDBC Driverを利用して、NifiからSalesforceなどのSaasデータソースからデータを取得するデータフローを作成してみます。

# 前提ソフトウェア

- [Apache Nifi](https://nifi.apache.org/download.html)
- [CData JDBC Driver for Salesforce](http://www.cdata.com/jp/drivers/salesforce/jdbc/) ※３０日間の無料試用版あり
- JDK(java version "1.8.0_151"を利用)
- [Salesforce](https://www.salesforce.com)　※評価環境、開発者ライセンスの環境あり

本手順は、MacOS（High Sierra）で作成していますが、Windows、Linuxなどの他のOSでも動作します。

# 参考記事

- [データフローオーケストレーションツールApache NiFiとは？ @kimutansk ](https://qiita.com/kimutansk/items/a083fc963fbe31068cf8)
- [Apache NiFiで基本のデータフローを作成するには？ @kimutansk ](https://qiita.com/kimutansk/items/b235fe6cdd0c04ab7e10)
- [Apache NiFiでSQLを投げてみる @grachro  ](https://qiita.com/grachro/items/2933606bf5c276a87572)

# ゴール

Nifiで、Salesforceの取引先（Account）のデータをローカルファイルに出力するデータフローを作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/86ccaf53-9c22-c1ef-07c7-8046dc29d81e.png)

# 手順

## CData JDBC Driver for Salesforce のインストール

[CData JDBC Driver for Salesforce](http://www.cdata.com/jp/drivers/salesforce/jdbc/)　をダウンロードして、ZIPファイル内のsetup.jarを実行します。インストーラーを起動してソフトウェア使用許諾契約書を確認してデフォルトのままインストールします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/064547f7-85c8-777f-f05d-391a40e67464.png)

（注意） オンラインアクティベーションのためインターネットへの接続が必要となります

## Salesforce側の設定

[CData JDBC Driver for Salesforce 2017J 製品マニュアル - 接続の確立](http://cdn.cdata.com/help/GFC/jdbc/pg_connectionj.htm)を参考にSalesforceのセキュリティトークンを取得してください。

## Nifiを起動する

```bash
$ sudo /Library/nifi-1.5.0/bin/nifi.sh start
```

(注意)JAVA_HOMEが見つからない旨のメッセージが出た場合は、{nifi home}/bin/nifi-env.sh の下記部分をコメントアウトしてJDKパスを設定してください。

```bash
# The java implementation to use.
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home
```

## Nifiにブラウザからアクセス

下記のURLにブラウザからアクセスする。

http://localhost:8080/nifi/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/d737e052-248b-35d2-7b5a-7cbfdc7634ee.png)

## DBConnectionPortを作成

NiFi Flow Configuration > CONTROLLER SERVICES を開き、DBCPConnectionPool 1.5.0を選択して追加する。
PROPERTIESタブを開き、下記の値を設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/bcc5e94a-c94a-58bd-5959-6c1f1a575c8d.png)

*設定値サンプル*

- Database Connection URL = jdbc:salesforce:User=\*\*\*\*@cdata.com;Password=\*\*\*\*\*;SecurityToken=\*\*\*\*\*;
- Database Driver Class Name = cdata.jdbc.salesforce.SalesforceDriver
- Database Driver Location(s) = /Applications/CData/CData JDBC Driver for Salesforce 2017J/lib/cdata.jdbc.salesforce.jar

（注意）「Database Driver Location(s)」は環境に合わせたパスを設定ください。

任意の名称（例では、CDataSalesforce）を付与する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/44cb325d-4554-b6fc-1cc9-4a2cffad4246.png)

## ExecuteSQLとPutFileプロセッサの配置、および、設定

ExecuteSQLとPutFileプロセッサを配置して、ExecuteSQLからPutFileへフローを接続します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/81a74049-4870-7069-e243-96cbcb803a28.png)

各プロセッサを開き、以下の通り、プロパティ値を設定して保存します。

*ExecuteSQL*

- Database Connection Pooling Service : CDataSalesforce (上記手順で作成したDBConnectionPortの名称)
- SQL select query ：select * from Account

*Connection*

- For Relationships : failure, success

*FilePut*

- Directory : /wrk/data/nifi/
- Automatically Terminate Relationships : failure, success 

## ExecuteSQLとPutFileプロセッサの実行

ExecuteSQLとPutFileプロセッサそれぞれを選択した状態で、Operate内のStart（再生ボタン）をクリックします。プロセッサのにStart（緑の再生ボタン）アイコンが表示されることを確認てPutFile内のRead/Write内のByte数が変更したらStop（停止ボタン）をクリックします。

## 実行結果の確認

FilePutのDirectoryで指定したパスに移動してファイルが作成されていることを確認。

```bash
~ $ cd /wrk/data/nifi
/wrk/data/nifi $ ls -l
total 35520
-rw-r--r--  1 root  wheel  15964  2 22 15:57 24979156157239
-rw-r--r--  1 root  wheel  15964  2 22 15:57 24979616506772
-rw-r--r--  1 root  wheel  15964  2 22 15:57 24979752251311
-rw-r--r--  1 root  wheel  15964  2 22 15:57 24979844826554
-rw-r--r--  1 root  wheel  15964  2 22 15:57 24979929797593
~ (省略) ~
-rw-r--r--  1 root  wheel  15964  2 22 15:58 25202512179594
```
エディタ等でファイルを開くと、Salesforceの取引先の一覧がCSVフォーマットで出力されていることを確認出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/bcac0cb3-83c9-08fa-1714-316199ecc79a.png)

*Salesforceの取引先一覧*

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/4decf376-42b6-16e0-79ff-3d29a081fda0.png)

(注意)一部の文字化けはエンコーディングの問題のようです。

# おわりに

今回は、SaaSデータとして、Salesforceのデータを取得してみましたが、[CData JDBC Drivers製品](http://www.cdata.com/jp/jdbc/) を利用することで、９０を超えるSaasやNoSQL、Applicationのデータを同じ手順で利用することが出来ます。全製品、３０日間の無料評価版もあるので是非お試しください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/66c75d3b-e517-9b6e-d667-9ad54eaa1391.png)