iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
AI & Data

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

Day4 讓我們來 Build 出自己的 NiFi 服務吧

Docker & Docker Compose installation

今天我們就來快速地建立起自己的 NiFi 服務吧!我會利用 Docker 的方式來做環境的建置,如果不熟悉 Docker 的讀者們,可以先參考以下幾個連結,來幫助自己安裝好 Docker 和 Docker Compose。

Docker Installation

這邊提供常用的 MacOS, WindowsUbuntu 的 Docker 安裝連結,讀者可依自己的 OS 點選對應的連結來做參考:

Docker Compose Installation

  • Docker Compose installation
    底下可以看到有 MacOS, WindowsLinux,讀者們記得也是要依照自己的 OS 選擇對應的安裝方式喔。

一旦我們安裝好 Docker 和 docker-compose 的服務之後,就可以透過指令的方式來做好安裝了,這邊一開始我會先提供最基本的 Dockerfile 和 docker-compose.yaml 給各位讀者,往後隨著介紹越來越多時,我們在把需要的東西一步一步加入進來。

開始建立 NiFi 服務

我們一開始可以先建立一個 For NiFi 的 Folder,我這邊是建立一個名為nifi_project 的 Folder, 那底下 Structure 可以參考如下:

- nifi_project/
    |-- .env
    |-- requirements.txt
    |-- Dockerfile
    |-- docker-compose.yaml

.env sample

NIFI_USERNAME=your_name
NIFI_PASSWORD=your_password
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
AWS_REGION=aws_region

這邊我們先建立一些要給 NiFi 用的環境變數於 .env 這個檔案內,而後續 docker-compose.yaml 就可以加入這個設定來啟動服務的 container。這裡簡單說明一下用到 Key:
(1) NIFI_USERNAME
(2) NIFI_PASSWORD
(3) AWS_ACCESS_KEY_ID
(4) AWS_SECRET_ACCESS_KEY
(5) AWS_REGION
(1) 和 (2) 是當 NiFi 啟動之後需要登入的帳號密碼,可以依自己需求做設定; 而 (3), (4)和(5) 是因為後續會示範與 AWS 做對接,所以需要設定 AWS 相關的 key,如果還沒有的話可以先註解掉沒關係,後續再加即可。

requirements.txt example

底下這裡是 pip3 要安裝的 lib,我把獨立寫成 requirements.txt,而讀者們也可以依據自己的需求去做增減。

asn1crypto==0.24.0
awscli==1.20.16
boto3==1.18.16
botocore==1.21.16
cachetools==4.2.2
certifi==2021.5.30
charset-normalizer==2.0.4
colorama==0.4.3
cryptography==2.6.1
docutils==0.15.2
entrypoints==0.3
google-api-core==1.31.1
google-api-python-client==2.15.0
google-auth==1.34.0
google-auth-httplib2==0.1.0
googleapis-common-protos==1.53.0
httplib2==0.19.1
idna==3.2
jmespath==0.10.0
keyring==17.1.1
keyrings.alt==3.1.1
packaging==21.0
protobuf==3.17.3
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycrypto==2.6.1
PyGObject==3.30.4
pyparsing==2.4.7
python-dateutil==2.8.2
pytz==2021.1
pyxdg==0.25
PyYAML==5.4.1
requests==2.26.0
rsa==4.7.2
s3transfer==0.5.0
SecretStorage==2.3.1
six==1.13.0
uritemplate==3.0.1
urllib3==1.26.6

Dockerfile Sample

這邊是我自己簡單寫的 Dockerfile,也可以依自己需求去做增減,這邊未來也會有用 python script 來做實作的範例,所以我先事前安裝起來,但必須要建立於官方的 image,可以參考 Docker Hub - Apache NiFi

FROM apache/nifi:1.14.0

USER root

ADD requirements.txt /tmp/project/

RUN apt-get update && \
    apt-get install -y vim && \
    apt-get install -y python3 python3-pip && \
    pip3 install --no-cache-dir -r /tmp/project/requirements.txt && \
    rm -rf \
        /tmp/* \
        /var/lib/apt/lists/*

接著就可以在當前目錄(nifi_project/) 透過以下指令來 Build image:

docker build -t nifi-sample .

建立完之後,就可以透過 docker images | grep nifi-sample 來確認是否有 image 存在。

docker-compose.yaml sample

Build 完 image 之後,我們就可以透過 docker-compose.yaml 來建立 NiFi 和 Nifi-registry 的服務,範例如下:

version: '3'

services:
    nifi:
        image: nifi-sample
        container_name: nifi-service
        restart: always
        ports:
            - 8443:8443/tcp
            - 8080:8080/tcp
        env_file: .env
        volumes:
            - "./aws_athena_jdbc.jar:/tmp/aws_athena_jdbc.jar"
            - "./aws_redshift_jdbc.jar:/tmp/aws_redshift_jdbc.jar"
            - "./mysql-connector-java-8.0.26.jar:/tmp/mysql-connector-java-8.0.26.jar"
        environment:
            - SINGLE_USER_CREDENTIALS_USERNAME=${NIFI_USERNAME}
            - SINGLE_USER_CREDENTIALS_PASSWORD=${nifipassword}
            - 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
networks:
    nifi-network:

其中 aws_athena_jdbc.jar, aws_redshift_jdbc.jarmysql-connector-java-8.0.26.jar 是我們後續在介紹時會用到,各位讀者可以從我的 Github 來下載下來使用。
接著透過 docker-compose up -d 的指令啟動 container,應該就會看到下面這個畫面:

最後透過 docker ps 來確定 container 是否有成功啟動,畫面如下:

如果沒問題,就可以透過下面這兩個 link 連到 NiFi 和 Nifi Registry 囉

  • NiFi
    link: https://localhost:8443/nifi
    點選 link 之後,就會進入到 login 畫面:

    接著輸入剛剛在 .env 設定的帳號密碼即可 login,login 後的畫面如下:

    圖上面有我對主畫面的 icon 簡單說明,未來會在一步一步地做詳細介紹。

  • NiFi-Registry
    link: http://localhost:18080/nifi-registry
    點選 link 之後,就會進入到 NiFi-Registry 的主畫面:

如此一來,兩個服務就啟動起來了!是不是很簡單呢?

額外補充

或許有人想說,為什麼只有 NiFi 要用 HTTPS 做連線?原因是這樣的,這與我所使用的版本有關,我在前面的範例是採用最新 release version - 1.14.0,是今年7月 release 出來的,根據官方最新 release 的版本( Apache NiFi-1.14.0 )有說明到:
由於傳統預設的HTTP 協定,會讓使用者任意存取所有的 NiFi node,若沒有自行設定成 security 機制的話可能就會有安全性的疑慮。所以在新的 version 中,NiFi直接將 security 視為 default 的機制, NiFi 自己會自己做 self-signed certificate, Single User Login Identity ProviderSingle User Authorizer 幾種機制,因此必須在建立服務時指定好預設的帳號密碼。詳細地機制說明可以參考此連結

那如果讀者們改 NiFi docker image 成 1.13.0 或是更之前的版本,你可以發現就能直接透過 http://localhost:8080/nifi 直接進入到主畫面做操作,也不需要 login 機制。

這時候你可能會想那以前是不是安全性很不好,其實也不是,以往的版本則是要再額外設定 NiFi 的 Config,或是額外搭配像是 Google Oauth 來做一個身份驗證來保障安全性,只是通常會用於 Production 或 Staging 的環境,若是自己本地的開發環境就還好,只是現在新版本直接預設要用 HTTPS 做處理這樣,那未來如果要搭配像是 Google Oauth 之類的來做身份驗證,當然還是要額外做設定。

只是我希望能用最新版本的方式來介紹,好讓各位讀者可以直接跟到最新的操作。這樣未來讀者們假設真的有興趣想再進去專研或是用到企業本身的話,這當中的銜接也不會差異太多。

小總結

最後,我也會把上述這些 File 放到 Github上,有需要也可以自行拉下來做使用; 同時我也有提供 NiFi Clustering for docker在我的 Github上,有興趣者也可以拉下來試試看,明天我們就可以在服務上開始做操作了喔!

Reference


上一篇
Day3 Pipeline 如何做版本控制 - NiFi Registry
下一篇
Day5 NiFi - FlowFiles
系列文
Apache NiFi - 讓你輕鬆設計 Data Pipeline30

尚未有邦友留言

立即登入留言