Integrera Apache Spark och Apache Hive med Hive Warehouse Connector i Azure HDInsight

Apache Hive Warehouse Connector (HWC) är ett bibliotek som gör att du enklare kan arbeta med Apache Spark och Apache Hive. Den stöder uppgifter som att flytta data mellan Spark DataFrames- och Hive-tabeller. Dessutom genom att dirigera Spark-strömmande data till Hive-tabeller. Hive Warehouse Connector fungerar som en brygga mellan Spark och Hive. Det stöder även Scala, Java och Python som programmeringsspråk för utveckling.

Med Hive Warehouse Connector kan du dra nytta av de unika funktionerna i Hive och Spark för att skapa kraftfulla stordataprogram.

Apache Hive har stöd för databastransaktioner som är atomiska, konsekventa, isolerade och varaktiga (ACID). Mer information om ACID och transaktioner i Hive finns i Hive-transaktioner. Hive erbjuder även detaljerade säkerhetskontroller via Apache Ranger och LLAP (Low Latency Analytical Processing) som inte är tillgängliga i Apache Spark.

Apache Spark har ett API för strukturerad direktuppspelning som ger strömningsfunktioner som inte är tillgängliga i Apache Hive. Från och med HDInsight 4.0 har Apache Spark 2.3.1 och Apache Hive 3.1.0 separata metaarkivkataloger, vilket gör samverkan svår.

Hive Warehouse Connector (HWC) gör det enklare att använda Spark och Hive tillsammans. HWC-biblioteket läser in data från LLAP-daemoner till Spark-köre parallellt. Den här processen gör den mer effektiv och anpassningsbar än en JDBC-standardanslutning från Spark till Hive. Här visas två olika körningslägen för HWC:

  • Hive JDBC-läge via HiveServer2
  • Hive LLAP-läge med LLAP-daemoner [Rekommenderas]

Som standard är HWC konfigurerat att använda Hive LLAP-daemoner. Information om hur du kör Hive-frågor (både läsa och skriva) med hjälp av ovanstående lägen med sina respektive API:er finns i HWC-API:er.

arkitektur för hive Warehouse Connector.

Några av de åtgärder som stöds av Hive Warehouse Connector är:

  • Beskriva en tabell
  • Skapa en tabell för ORC-formaterade data
  • Välja Hive-data och hämta en DataFrame
  • Skriva en dataram till Hive i batch
  • Köra en Hive-uppdateringsinstruktor
  • Läsa tabelldata från Hive, transformera dem i Spark och skriva dem till en ny Hive-tabell
  • Skriva en DataFrame- eller Spark-dataström till Hive med HiveStreaming

Konfiguration av Hive Warehouse Connector

Viktigt!

  • HiveServer2 Interactive-instansen som är installerad på Spark 2.4 Enterprise Security Package-kluster stöds inte för användning med Hive Warehouse Connector. I stället måste du konfigurera ett separat Interaktivt HiveServer2-kluster som värd för dina interaktiva HiveServer2-arbetsbelastningar. En Hive Warehouse Connector-konfiguration som använder ett enda Spark 2.4-kluster stöds inte.
  • Hive Warehouse Connector-biblioteket (HWC) stöds inte för användning med Interaktiv fråga kluster där WLM-funktionen (Workload Management) är aktiverad.
    I ett scenario där du bara har Spark-arbetsbelastningar och vill använda HWC-biblioteket kontrollerar du Interaktiv fråga klustret inte har funktionen Arbetsbelastningshantering aktiverad (hive.server2.tez.interactive.queuekonfigurationen har inte angetts i Hive-konfigurationer).
    För ett scenario där både Spark-arbetsbelastningar (HWC) och LLAP-interna arbetsbelastningar finns måste du skapa två separata Interaktiv fråga kluster med delad metaarkivdatabas. Ett kluster för interna LLAP-arbetsbelastningar där WLM-funktionen kan aktiveras på behovsbasis och ett annat kluster för HWC endast arbetsbelastning där WLM-funktionen inte ska konfigureras. Observera att du kan visa WLM-resursplaner från båda klustren även om de bara är aktiverade i ett kluster. Gör inga ändringar i resursplaner i klustret där WLM-funktionen är inaktiverad eftersom det kan påverka WLM-funktionerna i andra kluster.
  • Spark stöder R-databehandlingsspråk för att förenkla dataanalysen, men Hive Warehouse Connector-biblioteket (HWC) stöds inte för att användas med R. Om du vill köra HWC-arbetsbelastningar kan du köra frågor från Spark till Hive med hjälp av HiveWarehouseSession-API:et i JDBC-format som endast stöder Scala, Java och Python.
  • Att köra frågor (både läsa och skriva) via HiveServer2 via JDBC-läge stöds inte för komplexa datatyper som Matriser/Struct/Karttyper.
  • HWC stöder endast skrivning i ORC-filformat. Icke-ORC-skrivningar (t.ex. parquet- och textfilformat) stöds inte via HWC.

Hive Warehouse Connector behöver separata kluster för Spark- och Interaktiv fråga arbetsbelastningar. Följ de här stegen för att konfigurera dessa kluster i Azure HDInsight.

Klustertyper och versioner som stöds

HWC-version Spark-version InteractiveQuery-version
v1 Spark 2.4 | HDI 4.0 Interaktiv fråga 3.1 | HDI 4.0
v2 Spark 3.1 | HDI 5.0 Interaktiv fråga 3.1 | HDI 5.0

Skapa kluster

  1. Skapa ett HDInsight Spark 4.0-kluster med ett lagringskonto och ett anpassat virtuellt Azure-nätverk. Information om hur du skapar ett kluster i ett virtuellt Azure-nätverk finns i Lägga till HDInsight i ett befintligt virtuellt nätverk.

  2. Skapa ett HDInsight Interaktiv fråga-kluster (LLAP) 4.0 med samma lagringskonto och virtuella Azure-nätverk som Spark-klustret.

Konfigurera HWC-inställningar

Samla in preliminär information

  1. Från en webbläsare navigerar du till https://LLAPCLUSTERNAME.azurehdinsight.net/#/main/services/HIVE platsen där LLAPCLUSTERNAME är namnet på ditt Interaktiv fråga kluster.

  2. Gå till Sammanfattning>HiveServer2 Interaktiv JDBC-URL och notera värdet. Värdet kan likna: 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. Navigera till Configs>Advanced>Advanced hive-site>hive.zookeeper.quorum och notera värdet. Värdet kan likna: <zookeepername1>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181,<zookeepername2>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181,<zookeepername3>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181.

  4. Gå till Configs>Advanced>General>hive.metastore.uris och notera värdet. Värdet kan likna: thrift://iqgiro.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083,thrift://hn*.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083.

  5. Gå till Konfigurationer>Advanced>Advanced hive-interactive-site>hive.llap.daemon.service.hosts och notera värdet. Värdet kan likna: @llap0.

Konfigurera Inställningar för Spark-kluster

  1. Från en webbläsare navigerar du till https://CLUSTERNAME.azurehdinsight.net/#/main/services/SPARK2/configs platsen där CLUSTERNAME är namnet på ditt Apache Spark-kluster.

  2. Expandera Anpassade spark2-standardvärden.

    Apache Ambari Spark2-konfiguration.

  3. Välj Lägg till egenskap... för att lägga till följande konfigurationer:

    Konfiguration Värde
    spark.datasource.hive.warehouse.load.staging.dir Om du använder ADLS Gen2-lagringskonto använder du abfss://STORAGE_CONTAINER_NAME@STORAGE_ACCOUNT_NAME.dfs.core.windows.net/tmp
    Om du använder Azure Blob Storage-kontot använder du wasbs://STORAGE_CONTAINER_NAME@STORAGE_ACCOUNT_NAME.blob.core.windows.net/tmp.
    Ange till en lämplig HDFS-kompatibel mellanlagringskatalog. Om du har två olika kluster bör mellanlagringskatalogen vara en mapp i mellanlagringskatalogen för LLAP-klustrets lagringskonto så att HiveServer2 har åtkomst till det. Ersätt STORAGE_ACCOUNT_NAME med namnet på lagringskontot som används av klustret och STORAGE_CONTAINER_NAME med namnet på lagringscontainern.
    spark.sql.hive.hiveserver2.jdbc.url Värdet som du fick tidigare från HiveServer2 Interactive JDBC URL
    spark.datasource.hive.warehouse.metastoreUri Det värde som du fick tidigare från hive.metastore.uris.
    spark.security.credentials.hiveserver2.enabled true för YARN-klusterläge och false för YARN-klientläge.
    spark.hadoop.hive.zookeeper.quorum Det värde som du fick tidigare från hive.zookeeper.quorum.
    spark.hadoop.hive.llap.daemon.service.hosts Det värde som du fick tidigare från hive.llap.daemon.service.hosts.
  4. Spara ändringar och starta om alla berörda komponenter.

Konfigurera HWC för ESP-kluster (Enterprise Security Package)

Enterprise Security Package (ESP) tillhandahåller funktioner i företagsklass som Active Directory-baserad autentisering, stöd för flera användare och rollbaserad åtkomstkontroll för Apache Hadoop-kluster i Azure HDInsight. Mer information om ESP finns i Använda Enterprise Security Package i HDInsight.

Förutom de konfigurationer som nämns i föregående avsnitt lägger du till följande konfiguration för att använda HWC i ESP-klustren.

  1. Från Ambari-webbgränssnittet för Spark-klustret går du till Spark2>CONFIGS>Anpassade spark2-standardvärden.

  2. Uppdatera följande egenskap.

    Konfiguration Värde
    spark.sql.hive.hiveserver2.jdbc.url.principal hive/<llap-headnode>@<AAD-Domain>
    • Från en webbläsare navigerar du till https://CLUSTERNAME.azurehdinsight.net/#/main/services/HIVE/summary platsen där CLUSTERNAME är namnet på ditt Interaktiv fråga kluster. Klicka på HiveServer2 Interactive. Du ser det fullständigt kvalificerade domännamnet (FQDN) för huvudnoden som LLAP körs på enligt skärmbilden. Ersätt <llap-headnode> med det här värdet.

      hive warehouse connector Head Node.

    • Använd ssh-kommandot för att ansluta till ditt Interaktiv fråga kluster. Leta default_realm efter parametern /etc/krb5.conf i filen. Ersätt <AAD-DOMAIN> med det här värdet som en versalsträng, annars hittas inte autentiseringsuppgifterna.

      hive warehouse connector AAD Domain.

    • Till exempel hive/hn*.mjry42ikpruuxgs2qy2kpg4q5e.cx.internal.cloudapp.net@PKRSRVUQVMAE6J85.D2.INTERNAL.CLOUDAPP.NET.

  3. Spara ändringar och starta om komponenter efter behov.

Användning av Hive Warehouse Connector

Du kan välja mellan några olika metoder för att ansluta till ditt Interaktiv fråga kluster och köra frågor med Hive Warehouse Connector. Metoderna som stöds innehåller följande verktyg:

Nedan visas några exempel på hur du ansluter till HWC från Spark.

Spark-shell

Det här är ett sätt att köra Spark interaktivt via en modifierad version av Scala-gränssnittet.

  1. Använd ssh-kommandot för att ansluta till ditt Apache Spark-kluster. Redigera kommandot nedan genom att ersätta CLUSTERNAME med namnet på klustret och ange sedan kommandot:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Från ssh-sessionen kör du följande kommando för att notera hive-warehouse-connector-assembly versionen:

    ls /usr/hdp/current/hive_warehouse_connector
    
  3. Redigera koden nedan med den hive-warehouse-connector-assembly version som identifieras ovan. Kör sedan kommandot för att starta spark-gränssnittet:

    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. När du har startat Spark-gränssnittet kan en Hive Warehouse Connector-instans startas med hjälp av följande kommandon:

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

Spark-skicka

Spark-submit är ett verktyg för att skicka alla Spark-program (eller jobb) till Spark-kluster.

Spark-submit-jobbet konfigurerar Spark och Hive Warehouse Connector enligt våra instruktioner, kör det program som vi skickar till det och släpper sedan resurserna som användes.

När du har skapat scala/java-koden tillsammans med beroendena i en sammansättningsburk använder du kommandot nedan för att starta ett Spark-program. Ersätt <VERSION>och <APP_JAR_PATH> med de faktiska värdena.

  • YARN-klientläge

    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
    
  • YARN-klusterläge

    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
    

Det här verktyget används också när vi har skrivit hela programmet i pySpark och paketerat i .py filer (Python), så att vi kan skicka hela koden till Spark-klustret för körning.

För Python-program skickar du en .py fil i stället för /<APP_JAR_PATH>/myHwcAppProject.jaroch lägger till nedanstående konfigurationsfil (Python .zip) i sökvägen med --py-files.

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

Köra frågor i ESP-kluster (Enterprise Security Package)

Använd kinit innan du startar spark-shell eller spark-submit. Ersätt USERNAME med namnet på ett domänkonto med behörighet att komma åt klustret och kör sedan följande kommando:

kinit USERNAME

Skydda data i Spark ESP-kluster

  1. Skapa en tabell demo med exempeldata genom att ange följande kommandon:

    create table demo (name string);
    INSERT INTO demo VALUES ('HDinsight');
    INSERT INTO demo VALUES ('Microsoft');
    INSERT INTO demo VALUES ('InteractiveQuery');
    
  2. Visa tabellens innehåll med följande kommando. Innan du tillämpar principen visar tabellen demo den fullständiga kolumnen.

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

    demotabell innan du tillämpar ranger-principen.

  3. Använd en kolumnmaskeringsprincip som bara visar de fyra sista tecknen i kolumnen.

    1. Gå till rangeradministratörsgränssnittet på https://LLAPCLUSTERNAME.azurehdinsight.net/ranger/.

    2. Klicka på Hive-tjänsten för klustret under Hive. ranger service manager.

    3. Klicka på fliken Maskering och sedan på Lägg till ny princip

      hive warehouse connector ranger hive policy list.

    4. Ange ett önskat principnamn. Välj databas: Standard, Hive-tabell: demo, Hive-kolumn: namn, Användare: rsadmin2, Åtkomsttyper: välj och Partiell mask: visa de sista 4menyn Välj maskeringsalternativ . Klicka på Lägg till. skapa princip.

  4. Visa tabellens innehåll igen. När du har tillämpat ranger-principen kan vi bara se de sista fyra tecknen i kolumnen.

    demotabell efter att du har tillämpat ranger-principen.

Nästa steg