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,则表示成功。
從右側的面包屑中選擇”Cluster”,查看每個節點的狀態。看起來Nifi2節點變成了主要節點,而Nifi3節點變成了協調節點。