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.

hive warehouse connector architecture.

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 instância HiveServer2 Interactive instalada nos clusters Spark 2.4 Enterprise Security Package não tem suporte para uso com o Hive Warehouse Connector. Em vez disso, você deve configurar um cluster HiveServer2 Interactive separado para hospedar as cargas de trabalho do HiveServer2 Interactive. Não há suporte para uma configuração do Hive Warehouse Connector que usa um cluster Spark 2.4 único.
  • 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
v1 Spark 2.4 (HDI 4.0) Interactive Query 3.1 (HDI 4.0)
v2 Spark 3.1 (HDI 5.0) Interactive Query 3.1 (HDI 5.0)

Criar clusters

  1. Crie um cluster do HDInsight Spark 4.0 com uma conta de armazenamento e uma rede virtual do Azure personalizada. 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 LLAP (HDInsight Interactive Query) 4.0 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.

    Apache Ambari Spark2 configuration.

  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.

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.

      hive warehouse connector Head Node.

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

      hive warehouse connector AAD Domain.

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

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

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

O trabalho Spark-Submit irá configurar e definir o Spark e o Hive Warehouse Connector de acordo com nossas instruções, executar o programa que passamos para ele e 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()
    

    demo table before applying ranger policy.

  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. ranger service manager.

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

      hive warehouse connector ranger hive policy list.

    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. create policy.

  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.

    demo table after applying ranger policy.

Próximas etapas