Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2023-04-14 GMT+08:00

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

La siguiente figura muestra el principio básico de HA de instancia multiactiva de Spark JDBCServer.
Figura 1 Spark JDBCServer HA
  1. 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).

    Un ejemplo es el siguiente:

    [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]
  2. 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.
  3. Una vez que la conexión se realiza correctamente, el cliente envía sentencias de SQL a JDBCServer.
  4. 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.

Se deben seguir las siguientes reglas en la instancia multiactiva HA de Spark JDBCServer:
  • 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>;"

    • 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.

  • 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.