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.
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çãohive.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
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.
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
Em um navegador da Web, navegue até
https://LLAPCLUSTERNAME.azurehdinsight.net/#/main/services/HIVE
, em que LLAPCLUSTERNAME é o nome do cluster Interactive Query.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
.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
.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
.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
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.Expanda spark2-defaults personalizados.
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, usewasbs://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. SubstituaSTORAGE_ACCOUNT_NAME
pelo nome da conta de armazenamento que está sendo usada pelo cluster eSTORAGE_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 efalse
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. 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.
Na interface do usuário da Web do Ambari do cluster Spark, navegue até Spark2>CONFIGURAÇÕES>spark2-defaults personalizados.
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.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.Por exemplo,
hive/hn*.mjry42ikpruuxgs2qy2kpg4q5e.cx.internal.cloudapp.net@PKRSRVUQVMAE6J85.D2.INTERNAL.CLOUDAPP.NET
.
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.
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
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
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
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
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');
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()
Aplique uma política de mascaramento de coluna que mostre apenas os últimos quatro caracteres da coluna.
Vá para a interface do usuário administrador do Ranger em
https://LLAPCLUSTERNAME.azurehdinsight.net/ranger/
.Clique no serviço do Hive para seu cluster em Hive.
Clique na guia Mascaramento e em Adicionar Nova Política
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.
Veja o conteúdo da tabela novamente. Depois de aplicar a política do Ranger, podemos ver apenas os últimos quatro caracteres da coluna.