Creando un cluster de Apache Nifi en n instancias de AWS

Felipe Prieto
GDG IPN
Published in
7 min readApr 27, 2020

¡Que onda amigo! , si estas leyendo esto es probable que manejes la herramienta de Apache Nifi por cuestiones personales, o tal vez de trabajo. Esta herramienta es un ETL , el cual te va a permitir transformar la data que obtengas, para darle algún formato en específico. O uno que tú necesites para trabajar con ella. Es posible que llegue algún momento donde vas a tener grandes cantidades de información y será necesario distribuir la carga de trabajo. Esto puede sonar complicado porque puede que necesites más de un equipo, pero gracias a las tecnologías de la nube, esta será una tarea más fácil. Para este tutorial utilizaremos maquinas EC2 de AWS

Bueno, antes de empezar es necesario cumplir estos requerimientos antes de pensar en crear nuestro cluster.

  1. Crear las instancias que consideres necesarias para tu cluster, recomiendo que tengan el sistema operativo CentOS 7 y designar cual va a ser el nodo maestro.
  2. Determinar cuales serán nuestros nodos esclavos, ojo esto lo necesitaremos más adelante.
  3. Tener una copia de seguridad de nuestras instancias, este paso es opcional, pero te lo recomiendo, nunca esta de más tener un respaldo de nuestra información.

Ahora que sabes los requerimientos, es hora de que pongamos manos a la obra, lo primero que debemos hacer es encender nuestras instancias con las cuales estaremos trabajando. Una vez que encendieron, procedemos a dar click derecho sobre la instancia seleccionada, y nos vamos a la opción de “Connect”

Imagen 1: Conectarse a nuestra instancia

Enseguida nos desplegará un cuadro donde nos dará la cadena de conexión, con el respectivo usuario que se configuró.

Para podernos conectar, será necesario que nos vayamos a la ruta donde tenemos nuestro archivo “.pem” y le demos los respectivos permisos si estamos en linux, en el caso de windows, basta con irnos al directorio donde tenemos la llave y en la barra de dirección, cambiar la ruta por “cmd” para que se abra la consola.

Imagen 2: Archivo PEM que nos proporciona AWS para poder conectarnos a la instancia

Se abrirá la terminal y procedemos con la cadena de conexión que nos proporciona AWS.

Una vez que logramos conectarnos, nos vamos a la carpeta donde tenemos alojado “NIFI” y hay que asegurarse que la carpeta tenga sus respectivos permisos con nuestro usuario y el usuario “root” para poder ver los permisos escribimos: ls -la

Imagen 3: Permisos del usuario centos a nuestra carpeta de NIFI

Nuestro usuario “centos” ya tiene los permisos necesarios, pero si ese no fuera el caso, tenemos que escribir el siguiente comando: sudo chown centos:centos nifi también: sudo chown centos:centos nifi-1.11.3

El primer comando es para darle permisos a nuestra carpeta por así decirlo, ya la descomprimimos, y el siguiente es para la carpeta original que contiene los archivos.

Una vez que tenemos los permisos, para empezar a configurar nuestro cluster es necesario conectar nuestras máquinas en la ruta: /etc/hosts para lograr esto ponemos el siguiente comando: sudo nano /etc/hosts

Aquí pondremos la ip privada que nos asigna la instancia, ya que se encuentran conectadas entre si, posiblemente es necesario crear una subred para esto.

Imagen 4: La parte sombreada es la ip y “node-1” es el nombre que le hemos dado para que en la red se identifiquen

Esta configuración la haremos para cada máquina que deseemos agregar como nodo. Para esto es necesario configurar nuestro archivo de zookeper, Properties, esta configuración sera necesaria para cada instancia que deseemos agregar como nodo. Para eso vamos a la siguiente ruta: /nifi/conf y editamos el archivo: “zookeeper.properties”

Imagen 5: Configuración de zookeeper para la conexión entre nodos.

Agregando respectivamente los siguientes parámetros, que son nuestros nodos que configuramos, en este caso los números “1,2,3” son los respectivos ID que igual se también configuraremos.

Después de haber configurado esto, nos iremos a uno de los archivos más importantes, ya que aquí es donde más jugaremos con la configuración.

Escribimos: sudo nano /nifi/conf/nifi.properties y buscamos el encabezado #State Management# y el siguiente parámetro: nifi.state.management.embedded.zookeeper.start=false lo cambiamos a “true” como en la siguiente imagen.

Imagen 6: Configuración

Después procedemos a darle nombre a nuestro nodo, para esto buscamos el siguiente título: “# Site to Site properties “ y la siguiente línea: nifi.remote.input.host = (nombre del nodo) como en este caso es nuestro nodo maestro, asignamos el nombre de node-1

Imagen 7: Asignación de nombre a nuestro nodo

Para este caso “node -1” va a ser nuestro nodo maestro, de igual manera lo
debemos configurar en nuestras opciones para la web.

Después buscamos el encabezado “ #web properties # “ y la línea que se modificara será la siguiente: nifi.web.http.host = nombre de nuestro nodo

Imagen 8: Configuración de las propiedades de la web

Buscamos lo siguiente: # cluster node properties (only configure for cluster
nodes)
Y hacemos las siguientes configuraciones:
● nifi.cluster.is.node= true
nifi.cluster.node.address=* Aquí ponemos el nombre de nuestro nodo* (e.g.
nifi01.mintopsblog.local)
nifi.zookeeper.connect.string=* Aquí van todos los hostnames que nosotros configuramos.
nifi.cluster.node.protocol.port=8086 // En este caso puede ser un puerto
aleatorio que aquí es donde se escucharan entre nodos.

Imagen 9: Configuración de las propiedades del cluster

De igual manera buscamos lo siguiente:
# zookeeper properties, used for cluster management #
Y editamos la siguiente línea agregando nuestros respectivos nodos que editamos en las propiedades de zookeeper.
nifi.zookeeper.connect.string=node-1:2181,node-2:2181,node-3:2181

El archivo ./conf/zookeeper.properties tiene una propiedad
llamada dataDir. De forma predeterminada, este valor se establece en
./state/zookeeper. Si más de un nodo NiFi está ejecutando un ZK incorporado, es importante decirle al servidor cuál es.

Para esto se debe crear un nombre de archivo myid y colocarlo en el directorio de datos de ZK. El contenido de este archivo debe ser el índice del servidor según lo especificado previamente por el servidor.

Para nuestro nodo 1 ejecutamos lo siguiente:

mkdir ./state
mkdir ./state/zookeeper
echo 1 > ./state/zookeeper/myid

Esto debe hacerse para cada nodo que se desea agregar al cluster, pero para los
demás tenemos que cambiar el “id” ya sea que es el nodo 2 ,3 o n nodos.
Después vamos a lo siguiente: sudo nano /nifi/conf/ state-management.xml
Y editamos lo siguiente:

Imagen 10: Cadenas de conexión de nuestro nodo maestro

En la propiedad “Connect String” agregamos nuestros nodos los cuales se estarán
conectando.
OJO Para este punto hemos terminado de configurar nuestro nodo maestro, ahora procederemos a configurar los esclavos.

Configuración de los nodos esclavos

Nos vamos a nuestra carpeta donde tenemos instalado NIFI y escribimos lo
siguiente:
sudo nano /nifi/conf/nifi.properties
De igual manera configuramos como en el nodo 1, pero ahora es para el nodo 2

Imagen 11: Configuración del nodo 2

Buscamos los siguientes paramentros:
# cluster node properties (only configure for cluster nodes) #
nifi.cluster.is.node=true
nifi.cluster.node.address=node-2
nifi.cluster.node.protocol.port=8086

Debe tener el mismo puerto que los demás nodos, para que pueda hacer la
conexión entre ellos.

De igual manera para nuesta cadena de conexión debe quedar así:
# zookeeper properties, used for cluster management #
nifi.zookeeper.connect.string=node-1:2181,node-2:2181,node-3:2181

En esta cadena de conexión se tienen que agregar los n nodos que nosotros utilizaremos para el cluster.

Y procedemos a guardar nuestro archivo.
Para este nodo no es necesario que modifiquemos el archivo
state-management.xml solo es para el maestro, pero necesitamos crear nuestro id,
como el nodo 1, de la siguiente manera:
mkdir ./state
mkdir ./state/zookeeper
echo 2 > ./state/zookeeper/myid

No olvidemos activar en true la siguiente sentencia:
# Specifies whether or not this instance of NiFi should run an embedded
ZooKeeper server
nifi.state.management.embedded.zookeeper.start=true

Esto permite activar Zookeeper que es el encargado de poder realizar la conexión entre los nodos.

Y terminamos la configuración del nodo, nuestro siguiente nodo, debe tener la misma configuración que el nodo 2, excepto que no se edita el archivo,
state-management.

Una vez que tenemos configurado nuestros nodos, nos vamos a la carpeta raiz de
nifi y escribimos el siguiente comando:
sudo ./bin/nifi.sh start && tail -f ./logs/nifi-app.log

Lo que nos aparecerá en el log es que zookeeper esta tratando de encontrar el coordinador del clúster, si no lo encuentra, asignará un nodo para convertirse en el coordinador automaticamente. Después de eso, se realizará una “elección” para ver que nodo tiene el flujo correcto o el más reciente para que pueda convertirse en el nodo primario.

Imagen 12: Eligiendo un nodo para ser el primario.

Este procedimiento puede tardar un poco, ya que se están sincronizando, pero una vez que termina, podemos ir a la url que nos da el log, para poder acceder a la interfaz gráfica.

Verémos resultados similares a estos:

Imagen 13: Nodos que se encuentran conectados
Nodos conectados.

Espero que les sirva el tutorial :) casí no encontré información para poder realizar este cluster así que todo lo que escribo fue a base de error , estar probando y leer mucha documentación.

--

--