Instancia multiactiva de Spark2x
Fondo
Basado en JDBCServers existentes en la comunidad, HA de instancia multiactiva se utiliza para lograr la alta disponibilidad. En este modo, varios JDBCServers coexisten en el clúster y el cliente puede conectar aleatoriamente cualquier JDBCServer para realizar operaciones de servicio. Cuando uno o varios JDBCServers dejan de funcionar, un cliente puede conectarse a otro JDBCServer normal.
En comparación con el HA activo/en espera, el HA de instancia multiactivo elimina las siguientes restricciones:
- En HA activo/en espera, cuando se produce la conmutación activa/en espera, el período no disponible no puede ser controlado por JDBCServer, sino determinado por los recursos de servicio de Yarn.
- En Spark, el Thrift JDBC similar a HiveServer2 proporciona servicios y los usuarios acceden a los servicios a través de Beeline y JDBC API. Por lo tanto, la capacidad de procesamiento del clúster de JDBCServer depende de la capacidad de punto único del servidor primario, y la escalabilidad es insuficiente.
El HA de instancia multiactiva no solo evita la interrupción del servicio causada por la conmutación, sino que también permite el escalamiento horizontal del clúster para asegurar una alta concurrencia.
Implementación
- Después de iniciar JDBCServer, se registra con ZooKeeper escribiendo información de nodo en un directorio especificado. La información del nodo incluye la IP de la instancia de JDBCServer, el número de puerto, la versión y el número de serie (la información de los diferentes nodos está separada por comas).
[serverUri=192.168.169.84:22550 ;version=8.1.0.1;sequence=0000001244,serverUri=192.168.195.232:22550 ;version=8.1.0.1;sequence=0000001242,serverUri=192.168.81.37:22550 ;version=8.1.0.1;sequence=0000001243]
- Para conectarse a JDBCServer, el cliente debe especificar el espacio de nombres, que es el directorio de las instancias de JDBCServer en ZooKeeper. Durante la conexión, se selecciona aleatoriamente una instancia de JDBCServer del espacio de nombres especificado. Para obtener más información sobre la URL, consulte Conexión de URL.
- Una vez que la conexión se realiza correctamente, el cliente envía sentencias de SQL a JDBCServer.
- JDBCServer ejecuta sentencias de SQL recibidas y envía los resultados al cliente.
En el modo HA de instancia multiactiva, todas las instancias de JDBCServer son independientes y equivalentes. Cuando una instancia se interrumpe durante la actualización, otras instancias de JDBCServer pueden aceptar la solicitud de conexión del cliente.
- Si una instancia de JDBCServer sale de forma anormal, ninguna otra instancia se hará cargo de las sesiones y servicios que se ejecutan en esta instancia anormal.
- Cuando se detiene el proceso de JDBCServer, los nodos correspondientes se eliminan de ZooKeeper.
- El cliente selecciona aleatoriamente el servidor, lo que puede dar como resultado una asignación de sesión desigual, y finalmente dar como resultado un desequilibrio de carga de instancia.
- Después de que la instancia entra en el modo de mantenimiento (en el que no se acepta ninguna nueva solicitud de conexión del cliente), los servicios que aún se ejecutan en la instancia pueden fallar cuando se agota el tiempo de desmantelamiento.
Conexión de URL
Modo de instancia multiactiva
En el modo de instancia multiactiva, el cliente lee el contenido del nodo ZooKeeper y se conecta a JDBCServer. Las cadenas de conexión son las siguientes:
- Modo de seguridad:
- Si la autenticación de Kinit está habilitada, JDBCURL es la siguiente:
jdbc:hive2://<zkNode1_IP>:<zkNode1_Port>,<zkNode2_IP>:<zkNode2_Port>,<zkNode3_IP>:<zkNode3_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;saslQop=auth-conf;auth=KERBEROS;principal=spark2x/hadoop.<System domain name>@<System domain name>;
- <zkNode_IP>:<zkNode_Port> indica la URL del ZooKeeper. Utilice comas (,) para separar varias URL,
Por ejemplo, 192.168.81.37:2181,192.168.195.232:2181,192.168.169.84:2181.
- sparkthriftserver2x indica el directorio de ZooKeeper donde una instancia JDBCServer aleatoria está conectada al cliente.
Por ejemplo, cuando utiliza el cliente Beeline para la conexión en modo de seguridad, ejecute el siguiente comando:
sh CLIENT_HOME/spark/bin/beeline -u "jdbc:hive2://<zkNode1_IP>:<zkNode1_Port>,<zkNode2_IP>:<zkNode2_Port>,<zkNode3_IP>:<zkNode3_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;saslQop=auth-conf;auth=KERBEROS;principal=spark2x/hadoop.<System domain name>@<System domain name>;"
- <zkNode_IP>:<zkNode_Port> indica la URL del ZooKeeper. Utilice comas (,) para separar varias URL,
- Si la autenticación de Keytab está habilitada, JDBCURL es la siguiente:
jdbc:hive2://<zkNode1_IP>:<zkNode1_Port>,<zkNode2_IP>:<zkNode2_Port>,<zkNode3_IP>:<zkNode3_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;saslQop=auth-conf;auth=KERBEROS;principal=spark2x/hadoop.<System domain name>@<System domain name>;user.principal=<principal_name>;user.keytab=<path_to_keytab>
<principal_name> indica el principal del usuario de Kerberos, por ejemplo, test@<System domain name>. <path_to_keytab> indica la ruta del archivo Keytab correspondiente a <principal_name> como, por ejemplo, /opt/auth/test/user.keytab.
- Si la autenticación de Kinit está habilitada, JDBCURL es la siguiente:
- Modo común:
jdbc:hive2://<zkNode1_IP>:<zkNode1_Port>,<zkNode2_IP>:<zkNode2_Port>,<zkNode3_IP>:<zkNode3_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;
Por ejemplo, cuando utiliza el cliente de Beeline para la conexión en modo común, ejecute el siguiente comando:
sh CLIENT_HOME/spark/bin/beeline -u "jdbc:hive2://<zkNode1_IP>:<zkNode1_Port>,<zkNode2_IP>:<zkNode2_Port>,<zkNode3_IP>:<zkNode3_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;"
Modo de instancia no multiactiva
En el modo de instancia no multiactiva, un cliente se conecta a un nodo de JDBCServer especificado. En comparación con el modo de instancia multiactiva, la cadena de conexión en el modo de instancia no multiactiva no contiene los parámetros serviceDiscoveryMode y zooKeeperNamespace sobre ZooKeeper.
Por ejemplo, cuando utiliza el cliente de Beeline para conectar JDBCServer en modo de instancia no multiactivo, ejecute el siguiente comando:
sh CLIENT_HOME/spark/bin/beeline -u "jdbc:hive2://<server_IP>:<server_Port>/;user.principal=spark2x/hadoop.<System domain name>@<System domain name>;saslQop=auth-conf;auth=KERBEROS;principal=spark2x/hadoop.<System domain name>@<System domain name>;"
- <server_IP>:<server_Port> indica la dirección URL del nodo de JDBCServer especificado.
- CLIENT_HOME indica la ruta del cliente.
Excepto el método de conexión, las operaciones de la API de JDBCServer en modo de instancia multiactiva y modo de instancia no multiactiva son las mismas. Spark JDBCServer es otra implementación de HiveServer2 en Hive. Para obtener más información sobre cómo usar Spark JDBCServer, visite el sitio web oficial de Hive en https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients.