Apache Nifi集群架构备忘录

首先

最近我了解到了Apache Nifi。

能够使用WebSocket,可以用于简单的MQ服务器,可以以可视化设计和调度数据流进行分布式执行。非常有趣。

虽然独立设置相对简单,但构建集群配置花费了很多时间,以下是设置等备忘录。

前提 tí) – prerequisite

    • Dockerでやる(何台もAWSにEC2立てる金がもったいないので、便宜上です。)

 

    • 3つのNifiノード(それぞれ、nifi1,nifi2,nifi3というホスト名)

 

    • 1つのZookeeperノード(zookeeperというホスト名)

 

    NiFiにある内蔵Zookeeperは利用しない

在实际运行环境中,应该准备多个Zookeeper节点,但由于这与本次目的无关,我们将不详细讨论。

操作步骤

创建Docker镜像

我们采取了结构比较随意的方式进行构建。为了使其更易于使用,也许应该通过环境变量等方式来进行参数调整,但我们会选择直接挂载配置文件的形式来进行进一步操作。

Apache Nifi 是什么?

Dockerfile (用于构建和部署容器化应用程序的文件)

FROM openjdk:11-jre

# nifiユーザの作成
RUN addgroup --system --gid 1001 nifi &&\
    adduser --system --home /home/nifi --shell /bin/bash --uid 1001 --gid 1001 nifi &&\
    cd /home/nifi
USER nifi
WORKDIR /home/nifi

# Apache Nifiのダウンロードと展開とパス通す
RUN wget ftp://ftp.riken.jp/net/apache/nifi/1.12.1/nifi-1.12.1-bin.tar.gz &&\
    tar -xf nifi-1.12.1-bin.tar.gz
ENV NIFI_HOME=/home/nifi/nifi-1.12.1
ENV PATH=$PATH:$NIFI_HOME/bin

EXPOSE 8080
CMD ["nifi.sh","run"]

建造

$ sudo docker build -t mynifi .

nifi.properties 的中文释义为:Nifi属性文件。

构建Docker镜像后,将nifi.properties文件传到主机并进行编辑。为每个节点准备一个副本。

$ docker run --rm mynifi cat /home/nifi/nifi-1.12.1/conf/nifi.properties > nifi1.properties
$ vi nifi1.properties

只提取改变的部分。

#(中略)
#ノードのホスト名と合わせる
nifi.remote.input.host=nifi1

#適当なポートを設定
nifi.remote.input.socket=8090

#ノードのホスト名と合わせる
nifi.web.http.host=nifi1

#trueに変更
nifi.cluster.is.node=true

#ノードのホスト名と合わせる
nifi.cluster.node.address=nifi1

# 適当なポートを設定
nifi.cluster.node.protocol.port=8091

# ノードのリーダー選挙時間。デフォ5分が長くて待つのが面倒だったので、ちょっと短くした。
nifi.cluster.flow.election.max.wait.time=1 min

# 複数Zookeeperを指定する時はカンマ区切りで並べる
nifi.zookeeper.connect.string=zookeeper1:2181

状态管理.xml

$ sudo docker run --rm mynifi cat /home/nifi/nifi-1.12.1/conf/state-management.xml > state-management.xml
$ vi state-management.xml

<!-- 中略 -->
<cluster-provider>
    <id>zk-provider</id>
    <class>org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider</class>
    <!-- Zookeeperの宛先を設定 -->
    <property name="Connect String">zookeeper1:2181</property>
    <property name="Root Node">/nifi</property>
    <property name="Session Timeout">10 seconds</property>
    <property name="Access Control">Open</property>
</cluster-provider>

Apache Zookeeper is an open-source centralized coordination service for distributed systems.

NiFi内置了Zookeeper,如果将nifi.state.management.embeded.zookeeper.start设置为true,则NiFi和Zookeeper将同时启动。但更接近实际运营的做法是使用外部的Zookeeper。

如果你在Apache Kafka或其他任何地方都有一个Zookeeper节点,我认为连接到那里也没有问题。

Dockerfile文件


FROM openjdk:11-jre

RUN mkdir /home/zookeeper && mkdir /var/lib/zookeeper
WORKDIR /home/zookeeper

RUN wget https://downloads.apache.org/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz &&\
    tar xzf apache-zookeeper-3.6.2-bin.tar.gz

ENV ZOOKEEPER_HOME=/home/zookeeper/apache-zookeeper-3.6.2-bin
ENV PATH=$PATH:$ZOOKEEPER_HOME/bin

COPY Start.sh /home/zookeeper/Start.sh
CMD ["./Start.sh"]

开始.sh

需要在Zookeeper的数据目录(/var/lib/zookeeper)中创建myid文件。可以通过环境变量在Docker容器运行时传递,并创建相应的shell脚本进行生成。

#!/bin/bash
echo $ZOOKEEPER_MYID > /var/lib/zookeeper/myid
zkServer.sh start-foreground

动物园.cfg

复制Zookeeper的conf目录中的zoo_sample.cfg文件,将其命名为zoo.cfg并进行编辑。

$ sudo docker build -t myzookeeper .
$ sudo docker run --rm myzookeeper cat /home/zookeeper/apache-zookeeper-3.6.2/conf/zoo_sample.cfg > zoo.cfg
$ vi zoo.cfg
# 最終行にでも以下を追記する。この1は先ほどのZOOKEEPER_MYIDと紐づく
server.1=zookeeper:2888:3888

创建 Docker-Compose

由于Docker镜像已准备好,因此创建Docker-Compose文件。

docker-compose.yaml文件

version: '3'
services:
  zookeeper:
    build: ./zookeeper
    image: "myzookeeper"
    container_name: "zookeeper"
    environment:
      ZOOKEEPER_MYID: 1
    volumes:
      - ./zookeeper/zoo.cfg:/home/zookeeper/apache-zookeeper-3.6.2-bin/conf/zoo.cfg

  nifi1:
    build: ./nifi
    image: "mynifi"
    container_name: "nifi1"
    ports:
      - 8080:8080
    volumes:
      - ./nifi/nifi1.properties:/home/nifi/nifi-1.12.1/conf/nifi.properties
      - ./nifi/state-management.xml:/home/nifi/nifi-1.12.1/conf/state-management.xml
  nifi2:
    build: ./nifi
    image: "mynifi"
    container_name: "nifi2"
    ports:
      - 8081:8080
    volumes:
      - ./nifi/nifi2.properties:/home/nifi/nifi-1.12.1/conf/nifi.properties
      - ./nifi/state-management.xml:/home/nifi/nifi-1.12.1/conf/state-management.xml    
  nifi3:
    build: ./nifi
    image: "mynifi"
    container_name: "nifi3"
    ports:
      - 8082:8080
    volumes:
      - ./nifi/nifi3.properties:/home/nifi/nifi-1.12.1/conf/nifi.properties
      - ./nifi/state-management.xml:/home/nifi/nifi-1.12.1/conf/state-management.xml  

输出已生成的目录结构

+ /project_root
  - docker-compose.yaml
  + /nifi
    - Dockerfile
    - nifi1.properties
    - nifi2.properties
    - nifi3.properteis
    - state-mnagement.xml
  + /zookeeper
    - Dockerfile
    - zoo.cfg
    - Start.sh

执行吧!

$ sudo docker-compose up -d

因为将进行约1分钟的领导人选举,所以请稍等一会儿,你可以使用docker exec命令,tail -f观察Apache NiFi的$NIFI_HOME/logs/nifi-app.log日志文件。

如果在浏览器中访问 http://localhost:8080/nifi,并且集群标记显示为 3/3,则表示成功。

ss1.png

從右側的面包屑中選擇”Cluster”,查看每個節點的狀態。看起來Nifi2節點變成了主要節點,而Nifi3節點變成了協調節點。

ss2.png
广告
将在 10 秒后关闭
bannerAds