iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
AI & Data

Apache NiFi - 讓你輕鬆設計 Data Pipeline系列 第 15

Day15 NiFi - 與 RDB 對接設定

今天來介紹一下 NiFi 如何對 Relation Database 做整合操作,這邊我會以 MySQL 來做一個介紹。

Build MySQL Container

首先我們一樣透過 docker 來建立 mysql,這邊一樣給讀者們一個 docker-compose.yaml sample:

version: '3'

services:
    nifi:
        image: nifi-sample
        container_name: nifi-service
        restart: always
        ports:
            - 8443:8443/tcp
            - 8080:8080/tcp
        env_file: .env
        environment:
            SINGLE_USER_CREDENTIALS_USERNAME: ${NIFI_USERNAME}
            SINGLE_USER_CREDENTIALS_PASSWORD: ${NIFI_PASSWORD}
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_REGION: ${AWS_REGION}
        networks:
            - nifi-network

    nifi-registry:
        image: apache/nifi-registry:1.14.0
        container_name: nifi-registry-service
        restart: always
        ports:
            - 18080:18080/tcp
        networks:
            - nifi-network
    
    mysql:
        image: mysql:5.7
        container_name: nifi-rdb
        restart: always
        ports:
            - 3306:3306/tcp
        env_file: .env
        environment:
            MYSQL_ROOT_PASSWORD: ${DB_ADMIN_PASSWORD}
            MYSQL_DATABASE: ${DB_NAME}
        networks:
            - nifi-network
networks:
    nifi-network:

接著透過 docker-compose up -d 建立起來就沒有問題了。

MySQL JDBC

至於如何在 NiFi 中來對 MySQL 做對接了,其實NiFi 主要是提通的 General Processor 和 Controller Service Settings,也就是說對於外部的 RDB 或 Query Engine等服務,所採用的設定都是一樣的,唯一不一樣的是 JDBC Driver

因為 NiFi 本身是用 JAVA 所開發出來的,所以對於外部的資料庫時必須要透過 JDBC 的 Driver 才可以做資料對接,這是相對比較有一點小麻煩,因為我們必須先下載 JDBC Driver 到指定的 Container 的路徑下。

這邊給讀者們 MySQL JDBC Driver 下載的 link,請點此,再依據自己的 MySQL 版本下載對應的 JDBC,Driver namecom.mysql.jdbc.Driver

How to use?

接著我們到 Controller Service 來選擇 DBConnectionPool 來做對接的設定:

接著我們設定好其中必要的 Properties:

  • Database Connection URL:
    用來指定 JDBC URL,例如 jdbc:mysql://172.17.0.1:3306/nifi?user=[username]&password=[password]
  • Database Driver Class Name:
    用來指定 JDBC Class Name,例如 com.mysql.jdbc.Driver
  • Database Driver Location:
    用來指定 JDBC Driver JAR 檔的路徑,例如/tmp/mysql-connector-java-5.1.49.jar

接下來我們就可以來使用 Processor 對 MySQL 做整合了,今天會用 PutSQLQueryDatabaseTable 來做介紹:

PutSQL

這個 Processor 主要是讓我們可以對 Database 做 SQL 的操作,ex. INSERT, UPDATE, DELETE 等,所以他在設定上也是相對簡單,參考如下:

  • JDBC Connection Pool:
    指定好我們剛剛設定的 DBConnectionPool 的 Controller Service。
  • SQL Statement:
    這邊可以輸入 SQL 的操作,這邊以 INSERT 為例。

透過以上建制之後,我們就可以對 MySQL 做資料的操作了。

QueryDatabaseTable

這個 Processor 主要是用來從 DB 到讀取資料出來用的,但就無法做 Insert, update 等操作,我們來看一下他的設定:

  • Database Connectoin Pooling Service:
    一樣指定剛剛設定好的 Controller Service。
  • Database Type:
    這邊就是選擇 DB 類型,我們可以選擇 MySQL。此外他也有支援 Orable, MSSQL 等類型
  • Table Name:
    輸入你要拉資料的 table 名稱
  • Columns to Return
    回傳你要的 Column name,並以 , 做分隔
  • Additional WHERE clause
    要加入的條件篩選。

簡單來說,你可以想像成我們就常用的 SELECT..FROM..WHERE.. 的語法拆解到這個 Processor 的各個設定上。當然你也可以透過 PutSQL 做到一樣的效果。

小總結

透過今天簡單的小分享,想必大家應該知道如何從 NiFi 的角度出發來向 RDB table 的資料做操作,雖然今天是以 MySQL 為例,但其實其他的 RDB 也都是一樣的操作,差別在於 JDBC 那部份的設定而已,讀者們可以再去嘗試看看喔。

既然已經講完了關連式資料庫的整合,明天就會來講如何與 MongoDB 做整合,這部分就不用那麼麻煩了,因為 NiFi 就有內建好的 Processor 可以做使用,所以讀者們也不必太擔心。

Reference


上一篇
Day14 NiFi - NiFi Expression Language
下一篇
Day16 NiFi - 與 MongoDB 對接設定
系列文
Apache NiFi - 讓你輕鬆設計 Data Pipeline30

尚未有邦友留言

立即登入留言