Introduction
I will run Apache Nifi multi node cluster on docker. I will use external Zookeeper for it.
Multi Node Cluster
I will use docker-compose to launch a 3 node Apache Nifi cluster. There will be a separate node for zookeeper.
I am using custom Docker file so that I don't download the 1.5GB+ zip file multiple times and slow down the container launch. I have manually downloaded Nifi and Nifi-toolkit zip file for 1.14.0 version.
FROM openjdk:8-jre ARG UID=1000 ARG GID=1000 ARG NIFI_VERSION=1.14.0 ENV NIFI_BASE_DIR=/opt/nifi ENV NIFI_HOME ${NIFI_BASE_DIR}/nifi-current ENV NIFI_TOOLKIT_HOME ${NIFI_BASE_DIR}/nifi-toolkit-current ENV NIFI_PID_DIR=${NIFI_HOME}/run ENV NIFI_LOG_DIR=${NIFI_HOME}/logs ADD sh/ ${NIFI_BASE_DIR}/scripts/ RUN chmod -R +x ${NIFI_BASE_DIR}/scripts/*.sh # Setup NiFi user and create necessary directories RUN groupadd -g ${GID} nifi || groupmod -n nifi `getent group ${GID} | cut -d: -f1` \ && useradd --shell /bin/bash -u ${UID} -g ${GID} -m nifi \ && mkdir -p ${NIFI_BASE_DIR} \ && chown -R nifi:nifi ${NIFI_BASE_DIR} \ && apt-get update \ && apt-get install -y jq xmlstarlet procps nano vim iputils-ping USER nifi # Download, validate, and expand Apache NiFi Toolkit binary. ADD nifi-toolkit-${NIFI_VERSION}-bin.zip ${NIFI_BASE_DIR}/ RUN unzip ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip -d ${NIFI_BASE_DIR} \ && rm ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip \ && mv ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION} ${NIFI_TOOLKIT_HOME} \ && ln -s ${NIFI_TOOLKIT_HOME} ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION} # Download, validate, and expand Apache NiFi binary. ADD nifi-${NIFI_VERSION}-bin.zip ${NIFI_BASE_DIR}/ RUN unzip ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip -d ${NIFI_BASE_DIR} \ && rm ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip \ && mv ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION} ${NIFI_HOME} \ && mkdir -p ${NIFI_HOME}/conf \ && mkdir -p ${NIFI_HOME}/database_repository \ && mkdir -p ${NIFI_HOME}/flowfile_repository \ && mkdir -p ${NIFI_HOME}/content_repository \ && mkdir -p ${NIFI_HOME}/provenance_repository \ && mkdir -p ${NIFI_HOME}/state \ && mkdir -p ${NIFI_LOG_DIR} \ && ln -s ${NIFI_HOME} ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION} VOLUME ${NIFI_LOG_DIR} \ ${NIFI_HOME}/conf \ ${NIFI_HOME}/database_repository \ ${NIFI_HOME}/flowfile_repository \ ${NIFI_HOME}/content_repository \ ${NIFI_HOME}/provenance_repository \ ${NIFI_HOME}/state # Clear nifi-env.sh in favour of configuring all environment variables in the Dockerfile RUN echo "#!/bin/sh\n" > $NIFI_HOME/bin/nifi-env.sh # Web HTTP(s) & Socket Site-to-Site Ports EXPOSE 8080 8443 10000 8000 WORKDIR ${NIFI_HOME} ENTRYPOINT ["../scripts/start.sh"]
You can create a local image using below command:
$ docker build -t my_nifi -f Dockerfile_manual .
This will generate the image in few seconds.
Th Let's now create a docker-compose :
version: "3" services: zk01: hostname: zk01 container_name: zk01 image: 'bitnami/zookeeper:3.7' ports: - '2181' - '2888' - '3888' environment: - ALLOW_ANONYMOUS_LOGIN=yes - ZOO_SERVER_ID=1 - ZOO_SERVERS=0.0.0.0:2888:3888 networks: - nifinet nifi01: image: my_nifi:latest container_name: nifi01 hostname: nifi01 ports: - 6980:8080 volumes: - /Users/aagarwal/dev/docker/java_cluster/nifi_conf1:/opt/nifi/nifi-current/conf networks: - nifinet environment: - NIFI_WEB_HTTP_PORT=8080 - NIFI_CLUSTER_IS_NODE=true - NIFI_CLUSTER_NODE_PROTOCOL_PORT=8082 - NIFI_ZK_CONNECT_STRING=zk01:2181 - NIFI_ELECTION_MAX_WAIT=1 min - NIFI_SENSITIVE_PROPS_KEY=testpassword nifi02: image: my_nifi:latest container_name: nifi02 hostname: nifi02 ports: - 6979:8080 volumes: - /Users/aagarwal/dev/docker/java_cluster/nifi_conf2:/opt/nifi/nifi-current/conf networks: - nifinet environment: - NIFI_WEB_HTTP_PORT=8080 - NIFI_CLUSTER_IS_NODE=true - NIFI_CLUSTER_NODE_PROTOCOL_PORT=8082 - NIFI_ZK_CONNECT_STRING=zk01:2181 - NIFI_ELECTION_MAX_WAIT=1 min - NIFI_SENSITIVE_PROPS_KEY=testpassword nifi03: image: my_nifi:latest container_name: nifi03 hostname: nifi03 ports: - 6978:8080 volumes: - /Users/aagarwal/dev/docker/java_cluster/nifi_conf3:/opt/nifi/nifi-current/conf networks: - nifinet environment: - NIFI_WEB_HTTP_PORT=8080 - NIFI_CLUSTER_IS_NODE=true - NIFI_CLUSTER_NODE_PROTOCOL_PORT=8082 - NIFI_ZK_CONNECT_STRING=zk01:2181 - NIFI_ELECTION_MAX_WAIT=1 min - NIFI_SENSITIVE_PROPS_KEY=testpassword networks: nifinet: driver: bridge
Use below command to create the cluster:
$ docker-compose -f docker-compose.yaml up
This will launch the 1 node for zookeeper and 3 nodes for Nifi.
Open the browser http://localhost:6979/nifi :