Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2023-05-19 GMT+08:00

Instância multi-ativa do Spark2x

Conhecimento de fundo

Com base nos JDBCServers existentes na comunidade, o HA de instâncias multi-ativas é usado para alcançar a alta disponibilidade. Neste modo, vários JDBCServers coexistem no cluster e o cliente pode conectar aleatoriamente qualquer JDBCServer para executar operações de serviço. Quando um ou vários JDBCServers param de funcionar, um cliente pode se conectar a outro JDBCServer normal.

Comparado com o HA ativo/em espera, o HA de instâncias multi-ativas elimina as seguintes restrições:

  • No HA ativo/em espera, quando a alternância ativa/em espera ocorre, o período indisponível não pode ser controlado pelo JDBCServer, mas depende dos recursos do serviço Yarn.
  • No Spark, o Thrift JDBC semelhante ao HiveServer2 fornece serviços e usuários acessam serviços por meio da Beeline e da API de JDBC. Portanto, a capacidade de processamento do cluster de JDBCServer depende da capacidade de ponto único do servidor primário, e a escalabilidade é insuficiente.

O modo HA de instância multi-ativa não só pode impedir a interrupção do serviço causada pela alternância, mas também permite a expansão do cluster para garantir a alta simultaneidade.

Implementação

A figura a seguir mostra o princípio básico do HA da instância multi-ativa do Spark JDBCServer.
Figura 1 Spark JDBCServer HA
  1. Depois que um JDBCServer é iniciado, ele se registra no ZooKeeper gravando as informações do nó em um diretório especificado. As informações do nó incluem o IP da instância do JDBCServer, o número da porta, a versão e o número de série (as informações de diferentes nós são separadas por vírgulas).

    Um exemplo é fornecido como segue:

    [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 se conectar ao JDBCServer, o cliente deve especificar o namespace, que é o diretório das instâncias do JDBCServer em ZooKeeper. Durante a conexão, uma instância do JDBCServer é selecionada aleatoriamente no namespace especificado. Para obter detalhes sobre o URL, consulte Conexão de URL.
  3. Após a conexão ser bem-sucedida, o cliente envia instruções SQL para o JDBCServer.
  4. JDBCServer executa instruções SQL recebidas e envia resultados para o cliente.

No modo HA de instâncias multi-ativas, todas as instâncias do JDBCServer são independentes e equivalentes. Quando uma instância do JDBCServer é interrompida durante a atualização, outras instâncias do JDBCServer podem aceitar a solicitação de conexão do cliente.

As seguintes regras devem ser seguidas no HA da instância multi-ativa do Spark JDBCServer:
  • Se uma instância JDBCServer sair de forma anormal, nenhuma outra instância assumirá as sessões e serviços em execução nessa instância anormal.
  • Quando o processo do JDBCServer é interrompido, os nós correspondentes são excluídos do ZooKeeper.
  • O cliente seleciona aleatoriamente o servidor, o que pode resultar em alocação de sessão desigual e, finalmente, resultar em desequilíbrio de carga de instância.
  • Depois que a instância entra no modo de manutenção (em que não são aceites novas solicitações de conexão do cliente), os serviços em execução na instância podem falhar quando o descomissionamento atingir o tempo limite.

Conexão de URL

Modo de instância multi-ativa

No modo de instância multi-ativa, o cliente lê o conteúdo do nó do ZooKeeper e se conecta ao JDBCServer. As cadeias de conexão são as seguintes:

  • Modo de segurança:
    • Se a autenticação Kinit estiver ativada, o JDBCURL será o seguinte:
      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 o URL do ZooKeeper. Use vírgulas (,) para separar vários URLs,

        Por exemplo, 192.168.81.37:2181,192.168.195.232:2181,192.168.169.84:2181.

      • sparkthriftserver2x indica o diretório em ZooKeeper onde uma instância aleatória do JDBCServer está conectada ao cliente.

      Por exemplo, quando utiliza o cliente de Beeline para conexão no modo de segurança, execute o seguinte 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>;"

    • Se a autenticação Keytab estiver ativada, o JDBCURL será o seguinte:
      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 o principal do usuário Kerberos, por exemplo, test@<System domain name>. <path_to_keytab> indica o caminho do arquivo Keytab correspondente a <principal_name>, por exemplo, /opt/auth/test/user.keytab.

  • Modo comum:
    jdbc:hive2://<zkNode1_IP>:<zkNode1_Port>,<zkNode2_IP>:<zkNode2_Port>,<zkNode3_IP>:<zkNode3_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;

    Por exemplo, quando utiliza o cliente de Beeline para conexão em modo comum, execute o seguinte 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 instância não multi-ativa

No modo de instância não multi-ativa, um cliente se conecta a um nó do JDBCServer especificado. Comparado com o modo de instância multi-ativa, a cadeia de conexão neste modo de de instância não multi-ativa não contém os parâmetros serviceDiscoveryMode e zooKeeperNamespace sobre ZooKeeper.

Por exemplo, quando você usa o cliente de Beeline para conectar o JDBCServer no modo de instância não multi-ativa, execute o seguinte 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 o URL do nó JDBCServer especificado.
  • CLIENT_HOME indica o caminho do cliente.

Exceto o método de conexão, as operações da API de JDBCServer no modo de instância multi-ativa e no modo de instância não-multi-ativa são as mesmas. Spark JDBCServer é outra implementação do HiveServer2 no Hive. Para detalhes sobre como usar o Spark JDBCServer, acesse o site oficial do Hive em https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients.