Compartilhar via


Integrar o Apache Spark e o Apache Hive ao Hive Warehouse Connector no Azure HDInsight

O HWC (Apache Hive Warehouse Connector) é uma biblioteca que permite que você trabalhe mais facilmente com o Apache Spark e o Apache Hive. Ele dá suporte a tarefas como a movimentação de dados entre os dataframes do Spark e as tabelas do Hive. Além disso, direciona dados de streaming do Spark para tabelas do Hive. O Hive Warehouse Connector funciona como uma ponte entre o Spark e o Hive. Ele também dá suporte a Scala, Java e Python como linguagens de programação para desenvolvimento.

O Hive Warehouse Connector permite que você aproveite os recursos exclusivos do Hive e do Spark para criar aplicativos de Big Data poderosos.

O Apache Hive dá suporte a transações de banco de dados ACID (atômicas, consistentes, isoladas e duráveis). Para obter mais informações sobre ACID e transações no Hive, confira Hive Transactions (Transações do Hive). O Hive também oferece controles de segurança detalhados por meio do Apache Ranger e LLAP (processamento analítico de baixa latência) não disponíveis no Apache Spark.

O Apache Spark tem uma API de streaming estruturado que fornece funcionalidades de streaming não disponíveis no Apache Hive. A partir do HDInsight 4.0, o Apache Spark 2.3.1 e posterior e o Apache Hive 3.1.0 têm catálogos de metastore separados que dificultam a interoperabilidade.

O HWC (Hive Warehouse Connector) facilita o uso do Spark e do Hive juntos. A biblioteca HWC carrega dados de daemons do LLAP para executores do Spark em paralelo. Esse processo torna-o mais eficiente e adaptável do que uma conexão JDBC padrão do Spark com o Hive. Isso apresenta dois modos de execução diferentes para o HWC:

  • Modo JDBC do Hive via HiveServer2
  • Modo LLAP do Hive usando daemons LLAP [Recomendado]

Por padrão, o HWC é configurado para usar daemons llAP do Hive. Para executar consultas Hive (leitura e gravação) usando os modos acima com suas respectivas APIs, consulte APIs HWC.

Arquitetura do Hive Warehouse Connector

Algumas das operações com suporte do Hive Warehouse Connector são:

  • Descrever uma tabela
  • Criar uma tabela para dados formatados por ORC
  • Selecionar dados do Hive e recuperar um dataframe
  • Gravar um dataframe no Hive em lote
  • Executar uma instrução update do Hive
  • Ler dados de tabela do Hive, transformá-los no Spark e gravá-los em uma nova tabela do Hive
  • Escrever um dataframe ou um fluxo do Spark para o Hive usando HiveStreaming

Configuração do Hive Warehouse Connector

Importante

  • A Biblioteca Hive Warehouse Connector (HWC) não tem suporte para uso com clusters Interactive Query onde o recurso Gerenciamento de Carga de Trabalho (WLM) está ativado.
    Em um cenário em que você tem apenas cargas de trabalho do Spark e deseja usar a Biblioteca HWC, verifique se o cluster Interactive Query não tem o recurso Gerenciamento de Carga de Trabalho habilitado (a configuração hive.server2.tez.interactive.queue não está definida nas configurações do Hive).
    Para um cenário em que existem cargas de trabalho do Spark (HWC) e cargas de trabalho nativas do LLAP, você precisa criar dois clusters Interactive Query separados com o banco de dados metastore compartilhado. Um cluster para cargas de trabalho LLAP nativas onde o recurso WLM pode ser habilitado conforme a necessidade e outro cluster para carga de trabalho somente HWC onde o recurso WLM não deve ser configurado. É importante observar que você pode exibir os planos de recursos WLM dos dois clusters, mesmo se ele estiver habilitado em apenas um cluster. Não faça nenhuma alteração nos planos de recursos no cluster em que o recurso WLM está desabilitado, pois ele pode afetar a funcionalidade WLM em outro cluster.
  • Embora o Spark dá suporte a linguagem de computação R para simplificar sua análise de dados, não há suporte para a biblioteca HWC (Hive Warehouse Connector) ser usada com o R. Para executar cargas de trabalho HWC, você pode executar consultas do Spark para o Hive usando a API HiveWarehouseSession no estilo JDBC que dá suporte apenas a Scala, Java e Python.
  • Não há suporte para a execução de consultas (leitura e gravação) através do HiveServer2 via modo JDBC para tipos de dados complexos, como matrizes/Struct/mapa.
  • O HWC dá suporte à escrita somente em formatos de arquivo ORC. Não há suporte para gravações não ORC (por exemplo: formatos de arquivo de texto e parquet) por meio do HWC.

O Hive Warehouse Connector precisa de clusters separados para cargas de trabalho do Spark e do Interactive Query. Siga estas etapas para configurar esses clusters no Azure HDInsight.

Tipos de cluster e versões com suporte

Versão do HWC Versão do Spark Versão do InteractiveQuery
v2.1 Spark 3.3.0 | HDI 5.1 Consulta Interativa 3.1 | HDI 5.1

Criar clusters

  1. Crie um cluster HDInsight Spark 5.1 com uma conta de armazenamento e uma rede virtual personalizada do Azure. Para obter informações sobre como criar um cluster em uma rede virtual do Azure, confira Adicionar o HDInsight a uma rede virtual existente.

  2. Crie um cluster DO HDInsight Interactive Query (LLAP) 5.1 com a mesma conta de armazenamento e rede virtual do Azure que o cluster Spark.

Definir configurações do HWC

Reunir informações preliminares

  1. Em um navegador da Web, navegue até https://LLAPCLUSTERNAME.azurehdinsight.net/#/main/services/HIVE, em que LLAPCLUSTERNAME é o nome do cluster Interactive Query.

  2. Navegue até Resumo>URL JDBC interativa do HiveServer2 e observe o valor. O valor pode ser semelhante a: jdbc:hive2://<zookeepername1>.rekufuk2y2ce.bx.internal.cloudapp.net:2181,<zookeepername2>.rekufuk2y2ce.bx.internal.cloudapp.net:2181,<zookeepername3>.rekufuk2y2ce.bx.internal.cloudapp.net:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-interactive.

  3. Navegue até Configurações>Avançado>Site do Hive Avançado>hive.zookeeper.quorum e observe o valor. O valor pode ser semelhante a: <zookeepername1>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181,<zookeepername2>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181,<zookeepername3>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181.

  4. Navegue até Configurações>Avançado>Geral>hive.metastore.uris e observe o valor. O valor pode ser semelhante a: thrift://iqgiro.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083,thrift://hn*.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083.

  5. Navegue até Configurações>Avançado>Site interativo do Hive Avançado>hive.llap.daemon.service.hosts e observe o valor. O valor pode ser semelhante a: @llap0.

Definir configurações de cluster do Spark

  1. Em um navegador da Web, navegue até https://CLUSTERNAME.azurehdinsight.net/#/main/services/SPARK2/configs, em que CLUSTERNAME é o nome do cluster do Apache Spark.

  2. Expanda spark2-defaults personalizados.

    Configuração do Apache Ambari Spark2.

  3. Selecione Adicionar propriedade... para adicionar as seguintes configurações:

    Configuração Valor
    spark.datasource.hive.warehouse.load.staging.dir Se você estiver usando a Conta de Armazenamento do ADLS Gen2, use abfss://STORAGE_CONTAINER_NAME@STORAGE_ACCOUNT_NAME.dfs.core.windows.net/tmp
    Se você estiver usando Armazenamento de Blobs do Azure Conta, use wasbs://STORAGE_CONTAINER_NAME@STORAGE_ACCOUNT_NAME.blob.core.windows.net/tmp.
    Defina como um diretório de teste adequado compatível com HDFS. Se você tiver dois clusters diferentes, o diretório de teste deverá ser uma pasta no diretório de teste da conta de armazenamento do cluster LLAP para que HiveServer2 tenha acesso a ela. Substitua STORAGE_ACCOUNT_NAME pelo nome da conta de armazenamento que está sendo usada pelo cluster e STORAGE_CONTAINER_NAME pelo nome do contêiner de armazenamento.
    spark.sql.hive.hiveserver2.jdbc.url O valor obtido anteriormente da URL JDBC interativa do HiveServer2
    spark.datasource.hive.warehouse.metastoreUri O valor obtido anteriormente de hive.metastore.uris.
    spark.security.credentials.hiveserver2.enabled true para o modo de cluster YARN e false para o modo de cliente YARN.
    spark.hadoop.hive.zookeeper.quorum O valor obtido anteriormente de hive.zookeeper.quorum.
    spark.hadoop.hive.llap.daemon.service.hosts O valor obtido anteriormente de hive.llap.daemon.service.hosts.
  4. Salve as alterações e reinicie todos os componentes afetados.

Configurações adicionais para Spark e Hive

A configuração a seguir precisa ser feita para todos os nós de cabeçalho e de trabalho de seus clusters Spark e Hive.

  1. Use o comando ssh para se conectar aos nós do Apache Spark e do Apache Hive. Edite o comando abaixo substituindo CLUSTERNAME pelo nome do cluster e, em seguida, insira o comando:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Acrescente o conteúdo do arquivo de /etc/hosts do cluster hive no arquivo /etc/hosts do cluster spark e vice-versa.

  3. Depois que todos os nós forem atualizados, reinicie os dois clusters.

Configurar o HWC para clusters do ESP (Enterprise Security Package)

O ESP (Enterprise Security Package) fornece funcionalidades de nível empresarial como autenticação baseada no Active Directory, suporte a multiusuário e controle de acesso baseado em função para clusters Apache Hadoop no Azure HDInsight. Para obter mais informações, confira Usar o Enterprise Security Package no HDInsight.

Além das configurações mencionadas na seção anterior, adicione a configuração a seguir para usar o HWC nos clusters ESP.

  1. Na interface do usuário da Web do Ambari do cluster Spark, navegue até Spark2>CONFIGURAÇÕES>spark2-defaults personalizados.

  2. Atualize as propriedades a seguir.

    Configuração Valor
    spark.sql.hive.hiveserver2.jdbc.url.principal hive/<llap-headnode>@<AAD-Domain>
    • Em um navegador da Web, vá até https://CLUSTERNAME.azurehdinsight.net/#/main/services/HIVE/summary, em que CLUSTERNAME é o nome do cluster Interactive Query. Clique em HiveServer2 Interactive. Você verá o FQDN (nome de domínio totalmente qualificado) do nó de cabeçalho no qual o LLAP está em execução, conforme mostrado na captura de tela. Substitua <llap-headnode> por esse valor.

      Captura de tela do nó principal do conector do hive warehouse.

    • Use o comando ssh para se conectar ao cluster Interactive Query. Procure o parâmetro default_realm no arquivo /etc/krb5.conf. Substitua <AAD-DOMAIN> por esse valor como uma cadeia de caracteres em maiúsculas. Caso contrário, a credencial não será encontrada.

      Captura de tela do Domínio do AAD do Hive Warehouse Connector.

    • Por exemplo, hive/hn*.mjry42ikpruuxgs2qy2kpg4q5e.cx.internal.cloudapp.net@PKRSRVUQVMAE6J85.D2.INTERNAL.CLOUDAPP.NET.

  3. A configuração a seguir precisa ser feita para todos os nós de cabeçalho e de trabalho de seus clusters Spark e Hive.

    • Use o comando ssh para se conectar aos nós do Apache Spark e do Apache Hive. Edite o comando abaixo substituindo CLUSTERNAME pelo nome do cluster e, em seguida, insira o comando:

      ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
      
    • Acrescente o nome de domínio do locatário (por exemplo, "fabrikam.onmicrosoft.com") na última linha de /etc/resolv.conf em nós de cabeçalho e de trabalho de seus clusters Spark e Hive.

  4. Salve as alterações e reinicie os componentes conforme necessário.

Uso do Hive Warehouse Connector

Você pode escolher entre alguns métodos diferentes para se conectar ao seu cluster Interactive Query e executar consultas usando o Hive Warehouse Connector. Os métodos com suporte incluem as seguintes ferramentas:

Abaixo estão alguns exemplos para se conectar ao HWC do Spark.

Spark-Shell

Essa é uma maneira de executar o Spark interativamente por meio de uma versão modificada do shell do Scala.

  1. Use o comando ssh para se conectar ao cluster do Apache Spark. Edite o comando abaixo substituindo CLUSTERNAME pelo nome do cluster e, em seguida, insira o comando:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Em sua sessão SSH, execute o seguinte comando para anotar a versão de hive-warehouse-connector-assembly:

    ls /usr/hdp/current/hive_warehouse_connector
    
  3. Edite o código abaixo com a versão de hive-warehouse-connector-assembly identificada acima. Em seguida, execute o comando para iniciar o shell do Spark:

    spark-shell --master yarn \
    --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-<VERSION>.jar \
    --conf spark.security.credentials.hiveserver2.enabled=false
    
  4. Depois de você iniciar o shell do Spark, uma instância do Hive Warehouse Connector pode ser iniciada usando os seguintes comandos:

    import com.hortonworks.hwc.HiveWarehouseSession
    val hive = HiveWarehouseSession.session(spark).build()
    

Spark-submit

Spark-submit é um utilitário para enviar qualquer programa spark (ou trabalho) para clusters Spark.

O spark-submit trabalho configurará e configurará o Conector do Spark e do Hive Warehouse de acordo com nossas instruções, executará o programa que passamos para ele e, em seguida, liberará corretamente os recursos que estavam sendo usados.

Depois de criar o código do Scala/Java junto com as dependências em um assembly jar, use o comando abaixo para iniciar um aplicativo Spark. Substitua <VERSION> e <APP_JAR_PATH> pelos valores reais.

  • Modo de cliente YARN

    spark-submit \
    --class myHwcApp \
    --master yarn \
    --deploy-mode client \
    --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-<VERSION>.jar \
    --conf spark.security.credentials.hiveserver2.enabled=false
    /<APP_JAR_PATH>/myHwcAppProject.jar
    
  • Modo de cluster YARN

    spark-submit \
    --class myHwcApp \
    --master yarn \
    --deploy-mode cluster \
    --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-<VERSION>.jar \
    --conf spark.security.credentials.hiveserver2.enabled=true
    /<APP_JAR_PATH>/myHwcAppProject.jar
    

Esse utilitário também é usado quando escrevemos o aplicativo inteiro em pySpark e empacotamos em arquivos .py (Python), para que possamos enviar o código interno para o cluster do Spark para execução.

Para aplicativos Python, passe um arquivo. py no lugar do /<APP_JAR_PATH>/myHwcAppProject.jar, e adicionar o arquivo de configuração abaixo (Python .zip) ao caminho de pesquisa com --py-files.

--py-files /usr/hdp/current/hive_warehouse_connector/pyspark_hwc-<VERSION>.zip

Executar consultas em clusters do ESP (Enterprise Security Package)

Use kinit antes de iniciar o spark-shell ou spark-submit. Substitua NOME DE USUÁRIO pelo nome de uma conta de domínio com permissões para acessar o cluster e execute o seguinte comando:

kinit USERNAME

Protegendo dados em clusters do Spark ESP

  1. Crie uma tabela demo com alguns dados de exemplo inserindo os seguintes comandos:

    create table demo (name string);
    INSERT INTO demo VALUES ('HDinsight');
    INSERT INTO demo VALUES ('Microsoft');
    INSERT INTO demo VALUES ('InteractiveQuery');
    
  2. Veja o conteúdo da tabela com o comando a seguir. Antes de você aplicar a política, a tabela demo mostra a coluna completa.

    hive.executeQuery("SELECT * FROM demo").show()
    

    Captura de tela da tabela de demonstração antes de aplicar a política de ranger.

  3. Aplique uma política de mascaramento de coluna que mostre apenas os últimos quatro caracteres da coluna.

    1. Vá para a interface do usuário administrador do Ranger em https://LLAPCLUSTERNAME.azurehdinsight.net/ranger/.

    2. Clique no serviço do Hive para seu cluster em Hive. Captura de tela do gerenciador de serviços ranger.

    3. Clique na guia Mascaramento e em Adicionar Nova Política

      Captura de tela da lista de políticas de hive do hive do hive connector do hive connector do hive warehouse.

    4. Forneça um nome de política desejado. Selecione o banco de dados: Padrão, tabela Hive: demonstração, coluna Hive: nome, Usuário: rsadmin2, Tipos de acesso: selecionar e Máscara parcial: mostra os últimos quatro no menu Selecionar Opção de Mascaramento. Clique em Adicionar. Captura de tela da política de criação.

  4. Veja o conteúdo da tabela novamente. Depois de aplicar a política do Ranger, podemos ver apenas os últimos quatro caracteres da coluna.

    Captura de tela da tabela de demonstração após a aplicação da política de ranger.

Próximas etapas