Apache Nifi 클러스터로 구성된 메모

11731 단어 ZooKeeperNiFi
개시하다
최근에 아파치 니피를 알게 됐어요.
웹소켓을 사용하면 간단한 MQ 서버에서... 데이터 흐름을 직관적으로 설계하고 스케줄링하며 분산을 실행할 수 있다.재미있었어
스탠드는 간단하지만 클러스터 구성을 만드는 데 시간이 많이 걸려 설정 등의 메모를 작성했다.
전제 조건
  • Docker로 만들기(AWS에 EC2를 만드는 것은 너무 낭비입니다. 편의를 위해서입니다.)
  • 3개의 Nifi 노드(각각nifi1, nifi2, nifi3의 호스트 이름)
  • Zookeeper 노드 하나(호스트 이름 zookeeper)
  • NiFi 내장된 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
    Docker 이미지를 구축한 후 nifi.properties를 HOST 측에 가져와 편집하다.각 노드의 몫을 준비하다.
    $ 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
    
    state-management.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
    NiFi에는 내장된 Zookeeper가 있는데 nifi.state.management.embeded.zookeeper.start=true라면 NiFi와 동시에 Zookeeper를 시작할 수 있지만 실제 활용에 가까운 이미지로 외부의 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"]
    
    Start.sh
    Zookeeper는 Zookeeper의 데이터 디렉토리(/var/lib/zokeeper)에서 myid 파일을 만들어야 합니다.Docker 컨테이너를 실행할 때 환경 변수를 통해 전달되며 셸 스크립트를 미리 만들어 생성합니다.
    #!/bin/bash
    echo $ZOOKEEPER_MYID > /var/lib/zookeeper/myid
    zkServer.sh start-foreground
    
    zoo.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$NIFI_HOME/logs/nifi-app.log에서 아파치 니피tail -f를 조망할 수도 있다.
    브라우저를 통해 액세스http://localhost:8080/nifi.집단 표지가 3/3이 되면 성공합니다.

    오른쪽 빵 부스러기에서 Cluster를 선택하여 각 노드의 상태를 관찰합니다.Nifi2 노드는 주로 Nifi 3 노드로 구성됩니다.

    좋은 웹페이지 즐겨찾기