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

Solução HA do Spark

Princípios e solução de implementação de HA de instância multi-ativa de Spark

Com base no JDBCServer existente na comunidade, o modo de instância multi-ativa é usado para obter HA. 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 modo HA ativo/em espera, o modo de instância multi-ativa tem as seguintes vantagens:

  • 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 de 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 melhorar 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. Quando um JDBCServer é iniciado, ele se registra no ZooKeeper escrevendo as informações do nó em um diretório especificado. As informações do nó incluem o endereço IP da instância, o número da porta, a versão e o número de série.
  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.
  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 retorna resultados para o cliente.

Se o HA da instância multi-ativa do Spark JDBCServer estiver ativada, todas as instâncias do JDBCServer serã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 regras abaixo devem ser seguidas no HA da instância multi-ativa do Spark JDBCServer.
  • Se uma instância do JDBCServer sair anormalmente, nenhuma outra instância assumirá as sessões e os serviços em execução na 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 desigual de sessão causada por distribuição aleatória de resultados de políticas e, finalmente, resultar em desequilíbrio de carga de instâncias.
  • Depois que a instância entra no modo de manutenção (em que não são aceites novas solicitações de conexão dos clientes) , os serviços em execução na instância podem falhar quando o tempo limite do descomissionamento.
  • 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 estão listadas abaixo.

      • 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=spark/hadoop.<System domain name>@<System domain name>;
        • No JDBCURL acima, <zkNode_IP>:<zkNode_Port> indica o URL do ZooKeeper. Use vírgulas (,) para separar vários URLs,

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

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

        Por exemplo, quando você usa o cliente de Beeline para conectar o JDBCServer, 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=spark/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=spark/hadoop.<System domain name>@<System domain name>;user.principal=<principal_name>;user.keytab=<path_to_keytab>

        No URL acima, <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, no modo normal, para a conexão, 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

      Neste modo, 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 não contém os parâmetros serviceDiscoveryMode e zooKeeperNamespace sobre ZooKeeper.

      Por exemplo, quando você usa o cliente de Beeline, no modo de segurança, 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=spark/hadoop.<System domain name>@<System domain name>;saslQop=auth-conf;auth=KERBEROS;principal=spark/hadoop.<System domain name>@<System domain name>;"

      • No comando acima, <server_IP>:<server_Port> indica o URL do nó do JDBCServer especificado.
      • CLIENT_HOME indica o caminho do cliente.

      Exceto o método de conexão, outras operações da API do JDBCServer nos dois modos são as mesmas. Spark JDBCServer é outra implementação do HiveServer2 no Hive. Para obter detalhes sobre como usar Spark JDBCServer, consulte https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients.

HA multi-locatário do Spark

Na solução de instâncias multi-ativas do JDBCServer, o JDBCServer usa o modo Yarn-client, mas há apenas uma fila de recursos Yarn disponível. Para resolver esse problema de limitação de recursos, o modo multi-locatário é introduzido.

No modo multi-locatário, os JDBCServers são vinculados aos locatários. Cada locatário corresponde a um ou mais JDBCServers, e um JDBCServer fornece serviços para apenas um locatário. Locatários diferentes podem ser configurados com filas de Yarn diferentes para implementar o isolamento de recursos. Além disso, o JDBCServer pode ser iniciado dinamicamente conforme necessário para evitar o desperdício de recursos.

  • Implementação

    Figura 2 mostra a solução HA do modo multi-locatário.

    Figura 2 Modo multi-locatário do Spark JDBCServer
    1. Quando um ProxyServer é iniciado, ele se registra no ZooKeeper escrevendo as informações do nó em um diretório especificado. As informações do nó incluem o endereço IP da instância, o número da porta, a versão e o número de série.

      No modo multi-locatário, a instância do JDBCServer refere-se ao ProxyServer (proxy do DBCServer).

    2. Para se conectar ao ProxyServer, o cliente deve especificar um namespace, que é o diretório da instância do ProxyServer onde você deseja acessar o ZooKeeper. Quando o cliente se conecta ao ProxyServer, uma instância aleatória sob o namespace é selecionada para conexão. Para obter detalhes sobre o URL, consulte Visão geral da conexão de URL.
    3. Depois que o cliente se conecta com sucesso ao ProxyServer que primeiro verifica se o JDBCServer de um locatário existe. Se sim, o Beeline conecta o JDBCServer. Se não, um novo JDBCServer será iniciado no modo Yarn-cluster. Após a inicialização do JDBCServer, o ProxyServer obtém o endereço IP do JDBCServer e estabelece a conexão entre o Beeline e o JDBCServer.
    4. O cliente envia instruções SQL para ProxyServer que encaminha instruções para o JDBCServer conectado. JDBCServer retorna os resultados para ProxyServer que, em seguida, retorna os resultados para o cliente.

    No modo HA de instância multi-ativa, todas as instâncias são independentes e equivalentes. Se uma instância for interrompida durante a atualização, outras instâncias poderão aceitar a solicitação de conexão do cliente.

  • Visão geral da conexão de URL
    • Modo multi-locatário

      No modo multi-locatário, o cliente lê o conteúdo do nó do ZooKeeper e se conecta ao ProxyServer. As cadeias de conexão estão listadas abaixo.

      • Modo de segurança:
        Se a autenticação Kinit estiver ativada, o URL de cliente 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=spark/hadoop.<System domain name>@<System domain name>;
        • No URL acima, <zkNode_IP>:<zkNode_Port> indica o URL do ZooKeeper. Use vírgulas (,) para separar vários URLs,

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

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

        Por exemplo, quando utiliza o cliente de Beeline para ligação, 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=spark/hadoop.<System domain name>@<System domain name>;"

        Se a autenticação Keytab estiver ativada, o CURL 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=spark/hadoop.<System domain name>@<System domain name>;user.principal=<principal_name>;user.keytab=<path_to_keytab>

        No URL acima, <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, execute o seguinte comando quando utiliza o cliente de Beeline para conexão no modo normal:

        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 não multi-locatário

      No modo não multi-locatário, um cliente se conecta a um nó do JDBCServer especificado. Comparado com o modo de instância multi-locatário, a cadeia de conexão neste modo 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-locatário, execute o seguinte comando:

      sh CLIENT_HOME/spark/bin/beeline -u "jdbc:hive2://<server_IP>:<server_Port>/;user.principal=spark/hadoop.<System domain name>@<System domain name>;saslQop=auth-conf;auth=KERBEROS;principal=spark/hadoop.<System domain name>@<System domain name>;"

      • No comando acima, <server_IP>:<server_Port> indica o URL do nó do JDBCServer especificado.
      • CLIENT_HOME indica o caminho do cliente.

      Exceto o método de conexão, outras operações da API do JDBCServer no modo multi-locatário e no modo não multi-locatário 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.

      Especificar um locatário

      Geralmente, o cliente enviado por um usuário se conecta ao JDBCServer padrão do locatário ao qual o usuário pertence. Se quiser conectar o cliente ao JDBCServer de um locatário especificado, adicione o parâmetro --hiveconf mapreduce.job.queuename.

      Se você usar o cliente de Beeline para conexão, execute o seguinte comando (aaa é o nome do locatário):

      beeline --hiveconf mapreduce.job.queuename=aaa -u 'jdbc:hive2://192.168.39.30:2181,192.168.40.210:2181,192.168.215.97:2181;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;saslQop=auth-conf;auth=KERBEROS;principal=spark/hadoop.<System domain name>@<System domain name>;'