Azure HDInsight 3.6 Hive-workloads migreren naar HDInsight 4.0

HDInsight 4.0 heeft verschillende voordelen ten opzichte van HDInsight 3.6. Hier volgt een overzicht van wat er nieuw is in HDInsight 4.0.

In dit artikel worden de stappen beschreven voor het migreren van Hive-workloads van HDInsight 3.6 naar 4.0, waaronder

  • Hive-metastore kopiëren en schema-upgrade
  • Veilige migratie voor ACID-compatibiliteit
  • Behoud van Hive-beveiligingsbeleid

De nieuwe en oude HDInsight-clusters moeten toegang hebben tot dezelfde opslagaccounts.

Migratie van Hive-tabellen naar een nieuw opslagaccount moet als afzonderlijke stap worden uitgevoerd. Zie Hive-migratie tussen opslagaccounts.

Wijzigingen in Hive 3 en wat er nieuw is:

Wijzigingen in Hive-client

Hive 3 ondersteunt alleen de thin client, Beeline voor het uitvoeren van query's en Hive-beheeropdrachten vanaf de opdrachtregel. Beeline maakt gebruik van een JDBC-verbinding met HiveServer om alle opdrachten uit te voeren. Parseren, compileren en uitvoeren van bewerkingen vindt plaats in HiveServer.

U voert ondersteunde Hive CLI-opdrachten in door Beeline aan te roepen met behulp van het Trefwoord Hive als Een Hive-gebruiker of door een beeline aan te roepen met behulp van beeline -u <JDBC URL>. U kunt de JDBC-URL ophalen van de Ambari Hive-pagina.

Screenshot showing JDBC URL output.

Gebruik Beeline (in plaats van de dikke client Hive CLI, die niet meer wordt ondersteund) heeft verschillende voordelen, waaronder:

  • In plaats van de volledige Hive-codebasis te onderhouden, kunt u alleen de JDBC-client onderhouden.
  • Opstartoverhead is lager door Beeline te gebruiken omdat de volledige Hive-codebasis niet betrokken is.

U kunt ook het Hive-script uitvoeren, dat zich onder de map '/usr/bin' bevindt, waarmee een beelineverbinding wordt aangeroepen met behulp van de JDBC-URL.

Screenshot showing beeline connection output.

Een thin client-architectuur vereenvoudigt het beveiligen van gegevens in

  • Sessiestatus, interne gegevensstructuren, wachtwoorden, enzovoort, bevinden zich op de client in plaats van de server.
  • Het kleine aantal daemons dat nodig is voor het uitvoeren van query's vereenvoudigt de bewaking en foutopsporing.

HiveServer dwingt allowlist- en bloklijstinstellingen af die u kunt wijzigen met behulp van SET opdrachten. Met behulp van de bloklijsten kunt u de geheugenconfiguratie beperken om instabiliteit van Hive Server te voorkomen. U kunt meerdere HiveServer-exemplaren configureren met verschillende acceptatielijst en bloklijst om verschillende stabiliteitsniveaus tot stand te brengen.

Wijzigingen in Hive Metastore

Hive ondersteunt nu alleen een externe metastore in plaats van een ingesloten metastore (binnen HS2 JVM). De Hive-metastore bevindt zich op een knooppunt in een cluster dat wordt beheerd door Ambari als onderdeel van de HDInsight-stack. Een zelfstandige server buiten het cluster wordt niet ondersteund. U stelt geen key=value-opdrachten meer in op de opdrachtregel om Hive Metastore te configureren. Op basis van de waarde die is geconfigureerd in hive.metastore.uris=' ' HMS-service die wordt gebruikt en verbinding tot stand is gebracht.

Wijziging van uitvoeringsengine

Apache Tez vervangt MapReduce als de standaard-Hive-uitvoeringsengine. MapReduce is afgeschaft vanaf Hive 2.0 Refer HIVE-12300. Met expressies van gerichte acyclische grafieken (DAG's) en primitieven voor gegevensoverdracht, verbetert de uitvoering van Hive-query's onder Tez de prestaties. SQL-query's die u naar Hive verzendt, worden als volgt uitgevoerd

  1. Hive compileert de query.
  2. Tez voert de query uit.
  3. YARN wijst resources toe voor toepassingen in het cluster en maakt autorisatie mogelijk voor Hive-taken in YARN-wachtrijen.
  4. Hive werkt de gegevens bij in ABFS of WASB.
  5. Hive retourneert queryresultaten via een JDBC-verbinding.

Als een verouderd script of een verouderde toepassing MapReduce opgeeft voor uitvoering, treedt er als volgt een uitzondering op

Screenshot showing map reducer exception output.

Notitie

Voor de meeste door de gebruiker gedefinieerde functies (UDF's) hoeft u geen wijzigingen in Tez uit te voeren in plaats van MapReduce.

Wijzigingen met betrekking tot ACID-transacties en CBO:

  • ACID-tabellen zijn het standaardtabeltype in HDInsight 4.x zonder prestaties of operationele overbelasting.

  • Vereenvoudigde toepassingsontwikkeling, bewerkingen met sterkere transactionele garanties en eenvoudigere semantiek voor SQL-opdrachten

  • Hive intern zorgt voor bucketing voor ACID-tabellen in HDInsight 4.1, waardoor onderhoudsoverhead wordt verwijderd.

  • Geavanceerde optimalisaties : upgraden in CBO

  • Automatische querycache. De eigenschap die wordt gebruikt om het opslaan van query's in te schakelen, is hive.query.results.cache.enabled. U moet deze eigenschap instellen op waar. Hive slaat de cache met queryresultaten standaard op in /tmp/hive/__resultcache__/. Hive wijst 2 GB toe voor de cache met queryresultaten. U kunt deze instelling wijzigen door de volgende parameter in bytes hive.query.results.cache.max.sizete configureren.

    Voordelen van migratie naar Azure HDInsight 4.0 voor meer informatie .

Gerealiseerde weergave herschrijft

Voor meer informatie over Hive - gerealiseerde weergaven

Wijzigingen na een upgrade naar Apache Hive 3

Als u na een upgrade uw Apache Hive 3-tabellen wilt zoeken en gebruiken, moet u de wijzigingen begrijpen die optreden tijdens het upgradeproces. Wijzigingen in het beheer en de locatie van tabellen, machtigingen voor tabelmappen, tabeltypen en problemen met ACID-naleving.

Hive-beheer van tabellen

Hive 3 heeft meer controle over tabellen dan Hive 2 en vereist dat beheerde tabellen voldoen aan een strikte definitie. Het controleniveau van Hive neemt tabellen over, is homogeen voor de traditionele databases. Hive is zelfbewust van de deltawijzigingen in de gegevens; dit controleframework verbetert de prestaties.

Als Hive bijvoorbeeld weet dat het oplossen van een query geen scantabellen voor nieuwe gegevens vereist, retourneert Hive resultaten uit de cache met hive-queryresultaten. Wanneer de onderliggende gegevens in een gerealiseerde weergave veranderen, moet Hive de gerealiseerde weergave opnieuw opbouwen. ACID-eigenschappen laten precies zien welke rijen zijn gewijzigd en moeten worden verwerkt en toegevoegd aan de gerealiseerde weergave.

Hive-wijzigingen in ACID-eigenschappen

Hive 2.x en 3.x hebben zowel transactionele(beheerde) als niet-transactionele (externe) tabellen. Transactionele tabellen hebben atomische, consistente, isolatie- en duurzame (ACID)-eigenschappen. In Hive 2.x is de eerste versie van ACID-transactieverwerking ACID v1. In Hive 3.x zijn de standaardtabellen met ACID v2.

Systeemeigen en niet-systeemeigen opslagindelingen

Opslagindelingen zijn een factor bij het bijwerken van wijzigingen in tabeltypen. Hive 2.x en 3.x ondersteunt de volgende hadoop-indelingen en niet-systeemeigen opslagindelingen

Systeemeigen: Tabellen met ingebouwde ondersteuning in Hive, in de volgende bestandsindelingen

  • Sms verzenden
  • Reeksbestand
  • RC-bestand
  • AVRO-bestand
  • ORC-bestand
  • Parquet-bestand

Niet-systeemeigen: tabellen die gebruikmaken van een opslaghandler, zoals druidStorageHandler of HBaseStorageHandler

HdInsight 4.x-upgradewijzigingen in tabeltypen

De volgende tabel vergelijkt Hive-tabeltypen en ACID-bewerkingen vóór een upgrade van HDInsight 3.x en na een upgrade naar HDInsight 4.x. Het eigendom van het Hive-tabelbestand is een factor bij het bepalen van tabeltypen en ACID-bewerkingen na de upgrade

Vergelijking van tabeltypen in HDInsight 3.x en HDInsight 4.x

HDInsight 3.x - - - HDInsight 4.x -
Tabeltype ACID v1 Notatie Eigenaar (gebruiker) van Hive-tabelbestand Tabeltype ACID v2
External Nee Systeemeigen of niet-systeemeigen Hive of niet-Hive External Nee
Beheerd Ja ORC Hive of niet-Hive Beheerd, bijgewerkt Ja
Beheerd Nee ORC Hive Beheerd, bijgewerkt Ja
Beheerd Nee ORC niet-Hive Extern, met gegevens verwijderen NO
Beheerd Nee Systeemeigen (maar niet-ORC) Hive Beheerd, alleen invoegen Ja
Beheerd Nee Systeemeigen (maar niet-ORC) niet-Hive Extern, met gegevens verwijderen Nee
Beheerd Nee Niet-systeemeigen Hive of niet-Hive Extern, met gegevens verwijderen Nee

Hive-imitatie

Hive-imitatie is standaard ingeschakeld in Hive 2 (doAs=true) en is standaard uitgeschakeld in Hive 3. Hive-imitatie voert Hive uit als eindgebruiker of niet.

Andere upgradewijzigingen voor HDInsight 4.x

  1. Beheerd, ACID-tabellen die niet eigendom zijn van de Hive-gebruiker blijven beheerde tabellen na de upgrade, maar Hive wordt de eigenaar.
  2. Na de upgrade is de indeling van een Hive-tabel hetzelfde als vóór de upgrade. Systeemeigen of niet-systeemeigen tabellen blijven bijvoorbeeld systeemeigen of niet-systeemeigen tabellen.

Locatiewijzigingen

Na de upgrade verandert de locatie van beheerde tabellen of partities niet onder een van de volgende voorwaarden:

  • De oude tabel- of partitiemap bevindt zich niet in de standaardlocatie /apps/hive/warehouse vóór de upgrade.
  • De oude tabel of partitie bevindt zich in een ander bestandssysteem dan de nieuwe magazijnmap.
  • De oude tabel of partitiemap bevindt zich in een andere versleutelingszone dan de nieuwe magazijnmap.

Anders verandert de locatie van beheerde tabellen of partities. Het upgradeproces verplaatst beheerde bestanden naar /hive/warehouse/managed. Hive plaatst standaard alle nieuwe externe tabellen die u maakt in HDInsight 4.x in /hive/warehouse/external

De /apps/hive directory, de voormalige locatie van het Hive 2.x-magazijn, bestaat mogelijk of niet in HDInsight 4.x

De volgende scenario's zijn aanwezig voor locatiewijzigingen

Scenario 1

Als de tabel een beheerde tabel is in HDInsight-3.x en deze aanwezig is op de locatie /apps/hive/warehouse en wordt geconverteerd als externe tabel in HDInsight-4.x, is de locatie ook hetzelfde /apps/hive/warehouse in HDInsight 4.x. Er wordt geen locatie gewijzigd. Als u na deze stap de opdracht Tabel wijzigen uitvoert om deze op dat moment te converteren als beheerde (acid)-tabel die aanwezig is op dezelfde locatie /apps/hive/warehouse.

Scenario 2

Als de tabel een beheerde tabel is in HDInsight-3.x en deze aanwezig is op de locatie /apps/hive/warehouse en wordt geconverteerd naar een beheerde (ACID)-tabel in HDInsight 4.x, is de locatie./hive/warehouse/managed

Scenario 3 Als u een externe tabel maakt, in HDInsight-4.x zonder een locatie op te geven, wordt deze weergegeven op de locatie /hive/warehouse/external.

Tabelconversie

Nadat u een upgrade hebt uitgevoerd, gebruikt u de ALTER TABLE opdracht om een niet-transactiesde tabel te converteren naar een transactionele ACID v2-tabel en stelt u tabeleigenschappen in op

transaction'='true' and 'EXTERNAL'='false
  • De beheerde tabel, niet-ACID, ORC-indeling en eigendom van een niet-Hive-gebruiker in HDInsight-3.x wordt geconverteerd naar een externe, niet-ACID-tabel in HDInsight-4.x.
  • Als de gebruiker de externe tabel (niet-ACID) wil wijzigen in ACID, moet de externe tabel ook worden gewijzigd in beheerd en ACID. Omdat in HDInsight-4.x alle beheerde tabellen strikt ACID zijn. U kunt de externe tabellen (niet-ACID) niet converteren naar de ACID-tabel.

Notitie

De tabel moet een ORC-tabel zijn.

Externe tabel (niet-ACID) converteren naar beheerde (ACID)-tabel,

  1. Converteer externe tabel naar beheerd en zuur is gelijk aan waar met behulp van de volgende opdracht:
    alter table <table name> set TBLPROPERTIES ('EXTERNAL'='false', 'transactional'='true');
    
  2. Als u de volgende opdracht voor een externe tabel probeert uit te voeren, krijgt u de onderstaande fout.

Scenario 1

Overweeg dat tabel RT een externe tabel is (niet-ACID). Als de tabel geen ORC-tabel is,

alter table rt set TBLPROPERTIES ('transactional'='true');
ERROR : FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The table must be stored using an ACID compliant format (such as ORC): work.rt
The table must be ORC format

Scenario 2

>>>> alter table rt set TBLPROPERTIES ('transactional'='true'); If the table is ORC table.
ERROR:
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. work.rt can't be declared transactional because it's an external table (state=08S01,code=1)

Deze fout treedt op omdat de tabel rt een externe tabel is en u geen externe tabel kunt converteren naar ACID.

Scenario 3

>>>> alter table rt set TBLPROPERTIES ('EXTERNAL'='false');
ERROR:
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. Table work.rt failed strict managed table checks due to the following reason: Table is marked as a managed table but isn't transactional. (state=08S01,code=1)

Hier proberen we eerst de externe tabel te wijzigen in een beheerde tabel. In HDInsight 4.x moet deze strikt beheerde tabel zijn (wat betekent dat het ACID moet zijn). Dus, hier krijg je een impasse. De enige manier om de externe tabel (NON_ACID) te converteren naar beheerd (ACID) moet u de opdracht volgen:

alter table rt set TBLPROPERTIES ('EXTERNAL'='false', 'transactional'='true');

Syntaxis en semantiek

  • Het maken van een tabel om de bruikbaarheid en functionaliteit te verbeteren, is het maken van tabellen in Hive 3 gewijzigd. Hive heeft het maken van tabellen op de volgende manieren gewijzigd

    • Maakt een ACID-compatibele tabel. Dit is de standaardtabel in HDP
    • Ondersteunt eenvoudige schrijf- en invoegbewerkingen
    • Schrijfbewerkingen naar meerdere partities
    • Hiermee voegt u meerdere gegevensupdates in één SELECT-instructie in
    • Elimineert de noodzaak van bucketing.

    Als u een ETL-pijplijn hebt waarmee tabellen in Hive worden gemaakt, worden de tabellen als ACID gemaakt. Hive beheert nu nauw de toegang en voert periodiek compressie uit op de tabellen

    Voordat u een upgrade uitvoert in HDInsight 3.x, heeft CREATE TABLE standaard een niet-ACID-tabel gemaakt.

    Na de upgrade maakt CREATE TABLE standaard een volledige, TRANSACTIONELE ACID-tabel in ORC-indeling.

    Actie vereist voor toegang tot Hive ACID-tabellen vanuit Spark, maakt u verbinding met Hive met behulp van de Hive Warehouse Verbinding maken or (HWC). Als u ACID-tabellen vanuit Spark naar Hive wilt schrijven, gebruikt u de HWC- en HWC-API

  • Escape-verwijzingen db.table

    U moet query's wijzigen die db.table-verwijzingen gebruiken om te voorkomen dat Hive de hele db.table-tekenreeks als tabelnaam interpreteert. Hive 3.x weigert db.table in SQL-query's. Een punt (.) is niet toegestaan in tabelnamen. U plaatst de databasenaam en de tabelnaam in backticks. Zoek een tabel met de problematische tabelreferentie. math.students die wordt weergegeven in een CREATE TABLE-instructie. Plaats de databasenaam en de tabelnaam in backticks.

    TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));
    
  • CASTING TIMESTAMPS Results of applications that cast numerics to timestamps different from Hive 2 to Hive 3. Apache Hive heeft het gedrag van CAST gewijzigd om te voldoen aan de SQL Standard, die geen tijdzone koppelt aan het timestAMP-type.

    Voordat upgrade wordt uitgevoerd, kan een numerieke typewaarde in een tijdstempel worden gebruikt om een resultaat te produceren dat overeenkomt met de tijdzone van het cluster. 1597217764557 is bijvoorbeeld 2020-08-12 00:36:04 PDT. Als u de volgende query uitvoert, wordt de numerieke waarde omgezet in een tijdstempel in PDT: SELECT CAST(1597217764557 AS TIMESTAMP); | 2020-08-12 00:36:04 |

    Na upgrade casten van een numerieke typewaarde in een tijdstempel produceert een resultaat dat de UTC weerspiegelt in plaats van de tijdzone van het cluster. Als u de query uitvoert, wordt de numerieke waarde omgezet in een tijdstempel in UTC. SELECT CAST(1597217764557 AS TIMESTAMP); | 2020-08-12 07:36:04.557 |

    Actie vereist wijzigingstoepassingen. Cast niet van een cijfer om een lokale tijdzone te verkrijgen. Ingebouwde functies from_utc_timestamp en to_utc_timestamp kunnen worden gebruikt om gedrag na te bootsen vóór de upgrade.

  • HET CONTROLEREN VAN DE COMPATIBILITEIT VAN KOLOMWIJZIGINGEN EEN standaardconfiguratiewijziging kan ertoe leiden dat toepassingen die kolomtypen wijzigen mislukken.

    Vóór de upgrade in HDInsight 3.x Hive.metastore.disallow.incompatible.col.type.changes is standaard onwaar, zodat wijzigingen in niet-compatibele kolomtypen zijn toegestaan. U kunt bijvoorbeeld een kolom TEKENREEKS wijzigen in een kolom van een niet-compatibel type, zoals MAP<STRING, STRING>. Er treedt geen fout op.

    Na de upgrade is De hive.metastore.disallow.incompatible.col.type.changes standaard waar. Hive voorkomt dat wijzigingen in niet-compatibele kolomtypen worden gewijzigd. Compatibele wijzigingen in het kolomtype, zoals INT, STRING, BIGINT, worden niet geblokkeerd.

    Actie Vereist wijzigingstoepassingen om incompatibele kolomtypewijzigingen niet toe te laten om mogelijke beschadiging van gegevens te voorkomen.

  • PARTITIES VERWIJDEREN

    De trefwoorden OFFLINE en NO_DROP in de CASCADE-component voor het verwijderen van partities veroorzaken prestatieproblemen en worden niet meer ondersteund.

    Voordat u een upgrade uitvoert, kunt u OFFLINE en NO_DROP trefwoorden in de TRAPSGEWIJZE component gebruiken om te voorkomen dat partities worden gelezen of verwijderd.

    Na de upgrade OFFLINE en NO_DROP worden niet ondersteund in de TRAPSGEWIJZE component.

    Actie Vereist wijzigingstoepassingen om OFFLINE en NO_DROP uit de TRAPSGEWIJZE component te verwijderen. Gebruik een autorisatieschema, zoals Ranger, om te voorkomen dat partities worden verwijderd of gelezen.

  • Als u de naam van een TABEL wijzigt nadat de upgrade de naam van een beheerde tabel is gewijzigd, wordt de locatie alleen verplaatst als de tabel wordt gemaakt zonder een LOCATION component en zich in de databasemap bevindt.

Beperkingen met betrekking tot CBO

  • We zien dat de select-uitvoer in enkele kolommen een volgnul geeft. Als we bijvoorbeeld een tabelkolom met gegevenstype hebben als decimaal(38,4) en als we gegevens invoegen als 38, worden de volgnullen toegevoegd en wordt het resultaat als 38.0000 per https://issues.apache.org/jira/browse/HIVE-12063 dag https://issues.apache.org/jira/browse/HIVE-24389bewaard. Het idee blijft de schaal en precisie behouden in plaats van een wrapper uit te voeren in decimale kolommen. Dit is het standaardgedrag van Hive 2. U kunt dit probleem oplossen door de onderstaande optie te volgen.

    1. Wijzig het gegevenstype op bronniveau om de precisie aan te passen als col1(decimaal(38,0)). Deze waarde levert het resultaat op als 38 zonder volgnullen. Maar als u de gegevens invoegt als 35.0005, is dit .0005 en levert alleen de waarde als 38 1.Verwijder de volgnullen voor de kolommen met een probleem en cast vervolgens naar tekenreeks,
      1. Selecteer TRIM(cast(<column_name> AS STRING)+0 UIT <table_name>;
      2. Gebruik regex.
  1. Hive-query mislukt met 'Niet-ondersteunde SubQuery-expressie' wanneer we UNIX_TIMESTAMP in de query gebruiken. Als we bijvoorbeeld een query uitvoeren, wordt de fout 'Niet-ondersteunde subquery-expressie' gegenereerd

    select * from
    (SELECT col_1 from table1 where col_2 >= unix_timestamp('2020-03-07','yyyy-MM-dd'));
    

    Het hoofdscenario van dit probleem is dat de huidige Hive-codebasis een uitzondering genereert die de UNIX_TIMESTAMP parseert omdat er geen precisietoewijzing HiveTypeSystemImpl.java code is voor de precisie UNIX_TIMESTAMP waarin Calcite wordt herkend als BIGINT. Maar de onderstaande query werkt prima select * from (SELECT col_1 from table1 where col_2 >= 1);

    Deze opdracht wordt uitgevoerd omdat col_2 een geheel getal is. Het bovenstaande probleem is opgelost in hdi-3.1.2-4.1.12(4.1 stack) en hdi-3.1.2-5.0.8(5.0 stack)

Stappen voor het upgraden

1. De gegevens voorbereiden

  • HDInsight 3.6 biedt standaard geen ondersteuning voor ACID-tabellen. Als ACID-tabellen aanwezig zijn, voert u echter 'MAJOR' compressie uit. Zie de Hive Language Manual voor meer informatie over compressie.

  • Als u Azure Data Lake Storage Gen1 gebruikt, zijn Hive-tabellocaties waarschijnlijk afhankelijk van de HDFS-configuraties van het cluster. Voer de volgende scriptactie uit om deze locaties overdraagbaar te maken naar andere clusters. Zie scriptactie naar een actief cluster.

    Eigenschap Waarde
    Bash-script-URI https://hdiconfigactions.blob.core.windows.net/linuxhivemigrationv01/hive-adl-expand-location-v01.sh
    Knooppunttype(n) Head
    Parameters

2. Kopieer de SQL-database

  • Als het cluster een standaard Hive-metastore gebruikt, volgt u deze handleiding om metagegevens te exporteren naar een externe metastore. Maak vervolgens een kopie van de externe metastore voor een upgrade.

  • Als het cluster een externe Hive-metastore gebruikt, maakt u er een kopie van. Opties zijn onder andere exporteren/importeren en herstel naar een bepaald tijdstip.

3. Het metastore-schema upgraden

In deze stap wordt gebruikgemaakt Hive Schema Tool van HDInsight 4.0 om het metastore-schema te upgraden.

Waarschuwing

Deze stap is niet omkeerbaar. Voer dit alleen uit op een kopie van de metastore.

  1. Maak een tijdelijk HDInsight 4.0-cluster voor toegang tot 4.0 Hive schematool. U kunt de standaard Hive-metastore voor deze stap gebruiken.

  2. Voer vanuit het HDInsight 4.0-cluster een schematool upgrade uit om de doel-HDInsight 3.6-metastore bij te werken. Bewerk het volgende shellscript om uw SQL Server-naam, databasenaam, gebruikersnaam en wachtwoord toe te voegen. Open een SSH-sessie op het hoofdknooppunt en voer deze uit.

    SERVER='servername.database.windows.net'  # replace with your SQL Server
    DATABASE='database'  # replace with your 3.6 metastore SQL Database
    USERNAME='username'  # replace with your 3.6 metastore username
    PASSWORD='password'  # replace with your 3.6 metastore password
    STACK_VERSION=$(hdp-select status hive-server2 | awk '{ print $3; }')
    /usr/hdp/$STACK_VERSION/hive/bin/schematool -upgradeSchema -url "jdbc:sqlserver://$SERVER;databaseName=$DATABASE;trustServerCertificate=false;encrypt=true;hostNameInCertificate=*.database.windows.net;" -userName "$USERNAME" -passWord "$PASSWORD" -dbType "mssql" --verbose
    

    Notitie

    Dit hulpprogramma maakt gebruik van de client beeline voor het uitvoeren van SQL-scripts in /usr/hdp/$STACK_VERSION/hive/scripts/metastore/upgrade/mssql/upgrade-*.mssql.sql.

    SQL-syntaxis in deze scripts is niet noodzakelijkerwijs compatibel met andere clienthulpprogramma's. SSMS en Power Query-editor in Azure Portal vereisen bijvoorbeeld een trefwoord GO na elke opdracht.

    Als een script mislukt vanwege time-outs voor resourcecapaciteit of transactie, schaalt u de SQL Database omhoog.

  3. Controleer de definitieve versie met de query select schema_version from dbo.version.

    De uitvoer moet overeenkomen met die van de volgende bash-opdracht van het HDInsight 4.0-cluster.

    grep . /usr/hdp/$(hdp-select --version)/hive/scripts/metastore/upgrade/mssql/upgrade.order.mssql | tail -n1 | rev | cut -d'-' -f1 | rev
    
  4. Verwijder het tijdelijke HDInsight 4.0-cluster.

4. Een nieuw HDInsight 4.0-cluster implementeren

Maak een nieuw HDInsight 4.0-cluster, waarbij u de bijgewerkte Hive-metastore en dezelfde opslagaccounts selecteert.

  • Voor het nieuwe cluster is niet hetzelfde standaardbestandssysteem vereist.

  • Als de metastore tabellen bevat die zich in meerdere opslagaccounts bevinden, moet u deze opslagaccounts toevoegen aan het nieuwe cluster om toegang te krijgen tot deze tabellen. Zie Extra opslagaccounts toevoegen aan HDInsight.

  • Als Hive-taken mislukken vanwege ontoegankelijkheid van opslag, controleert u of de tabellocatie zich in een opslagaccount bevindt dat is toegevoegd aan het cluster.

    Gebruik de volgende Hive-opdracht om de locatie van de tabel te identificeren:

    SHOW CREATE TABLE ([db_name.]table_name|view_name);
    

5. Tabellen converteren voor ACID-naleving

Beheerde tabellen moeten ACID-compatibel zijn in HDInsight 4.0. Uitvoeren strictmanagedmigration op HDInsight 4.0 om alle niet-ACID beheerde tabellen te converteren naar externe tabellen met eigenschap 'external.table.purge'='true'. Uitvoeren vanaf het hoofdknooppunt:

sudo su - hive
STACK_VERSION=$(hdp-select status hive-server2 | awk '{ print $3; }')
/usr/hdp/$STACK_VERSION/hive/bin/hive --config /etc/hive/conf --service strictmanagedmigration --hiveconf hive.strict.managed.tables=true -m automatic --modifyManagedTables

6. Fout met klasse niet gevonden met MultiDelimitSerDe

Probleem

In bepaalde situaties wanneer u een Hive-query uitvoert, ontvangt u mogelijk dat java.lang.ClassNotFoundExceptionorg.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe de klasse niet wordt gevonden. Deze fout treedt op wanneer de klant migreert van HDInsight 3.6 naar HDInsight 4.0. De SerDe-klasse org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe, die deel uitmaakt van hive-contrib-1.2.1000.2.6.5.3033-1.jar HDInsight 3.6, wordt verwijderd en we gebruiken org.apache.hadoop.hive.serde2.MultiDelimitSerDe klasse, die deel uitmaakt van hive-exec jar HDI-4.0. hive-exec jar wordt standaard geladen naar HS2 wanneer we de service starten.

STAPPEN VOOR HET OPLOSSEN VAN PROBLEMEN

  1. Controleer of een JAR-bestand onder een map (waarschijnlijk onder de map Hive-bibliotheken, die /usr/hdp/current/hive/lib zich in HDInsight bevindt), deze klasse bevat of niet.
  2. Controleer op de klasse org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe en org.apache.hadoop.hive.serde2.MultiDelimitSerDe zoals vermeld in de oplossing.

Oplossing

  1. Hoewel een JAR-bestand een binair bestand is, kunt u nog steeds een opdracht met -Hrni schakelopties zoals hieronder gebruiken grep om te zoeken naar een bepaalde klassenaam

    grep -Hrni "org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe" /usr/hdp/current/hive/lib
    
  2. Als de klasse niet kan worden gevonden, wordt er geen uitvoer geretourneerd. Als de klasse in een JAR-bestand wordt gevonden, wordt de uitvoer geretourneerd

  3. Hieronder ziet u het voorbeeld van het HDInsight 4.x-cluster

    sshuser@hn0-alters:~$ grep -Hrni "org.apache.hadoop.hive.serde2.MultiDelimitSerDe" /usr/hdp/4.1.9.7/hive/lib/
    Binary file /usr/hdp/4.1.9.7/hive/lib/hive-exec-3.1.0.4.1-SNAPSHOT.jar matches
    
  4. Uit de bovenstaande uitvoer kunnen we bevestigen dat geen jar de klasse org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe bevat en hive-exec jar bevat org.apache.hadoop.hive.serde2.MultiDelimitSerDe.

  5. Probeer de tabel te maken met rijopmaak DerDe als ROW FORMAT SERDE org.apache.hadoop.hive.serde2.MultiDelimitSerDe

  6. Met deze opdracht wordt het probleem opgelost. Als u de tabel al hebt gemaakt, kunt u de naam ervan wijzigen met behulp van de onderstaande opdrachten

    Hive => ALTER TABLE TABLE_NAME SET SERDE 'org.apache.hadoop.hive.serde2.MultiDelimitSerDe'
    Backend DB => UPDATE SERDES SET SLIB='org.apache.hadoop.hive.serde2.MultiDelimitSerDe' where SLIB='org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe';
    

De updateopdracht is het handmatig bijwerken van de details in de back-enddatabase en de opdracht Alter wordt gebruikt om de tabel te wijzigen met de nieuwe SerDe-klasse van beeline of Hive.

Hive Backend DB-schema vergelijken Script

U kunt het volgende script uitvoeren nadat u de migratie hebt voltooid.

Er is een kans dat er weinig kolommen ontbreken in de back-enddatabase, waardoor de queryfouten optreden. Als de schema-upgrade niet correct is uitgevoerd, is de kans groot dat er een probleem met de ongeldige kolomnaam optreedt. Met het onderstaande script wordt de kolomnaam en het gegevenstype opgehaald uit de back-enddatabase van de klant en wordt de uitvoer weergegeven als er een ontbrekende kolom of onjuist gegevenstype is.

Het volgende pad bevat het bestand schemacompare_final.py en test.csv. Het script is aanwezig in het bestand schemacompare_final.py en het bestand test.csv bevat alle kolomnaam en het gegevenstype voor alle tabellen, die aanwezig moeten zijn in de hive-back-enddatabase.

https://hdiconfigactions2.blob.core.windows.net/hiveschemacompare/schemacompare_final.py

https://hdiconfigactions2.blob.core.windows.net/hiveschemacompare/test.csv

Download deze twee bestanden via de koppeling. Kopieer deze bestanden naar een van de hoofdknooppunten waarop de Hive-service wordt uitgevoerd.

Stappen voor het uitvoeren van het script:

Maak een map met de naam schemacompare onder de map /tmp.

Plaats de map 'schemacompare_final.py' en 'test.csv' in de map '/tmp/schemacompare'. Voer 'ls -ltrh /tmp/schemacompare/' uit en controleer of de bestanden aanwezig zijn.

Gebruik de opdracht python schemacompare_final.py om het Python-script uit te voeren. Met dit script wordt het script uitgevoerd en duurt het minder dan vijf minuten. Het bovenstaande script maakt automatisch verbinding met uw back-enddatabase en haalt de details op uit elke tabel, die Hive gebruikt en de details bijwerkt in het nieuwe CSV-bestand met de naam return.csv. Nadat u het bestand return.csv hebt gemaakt, worden de gegevens vergeleken met het bestand test.csv en wordt de kolomnaam of het gegevenstype afgedrukt als er iets ontbreekt onder de tabelnaam.

Na het uitvoeren van het script ziet u de volgende regels, die aangeven dat de details voor de tabellen worden opgehaald en het script wordt uitgevoerd

KEY_CONSTRAINTS
Details Fetched
DELEGATION_TOKENS
Details Fetched
WRITE_SET
Details Fetched
SERDES
Details Fetched

En u kunt de details van het verschil zien onder de regel 'VERSCHILDETAILS:'. Als er een verschil is, wordt het afgedrukt

PART_COL_STATS;
('difference', ['BIT_VECTOR', 'varbinary'])
The line with semicolon PART_COL_STATS; is the table name. And under the table name you can find the differences as ('difference', ['BIT_VECTOR', 'varbinary']) if there are any difference in column or datatype.

Als er geen verschillen in de tabel zijn, is de uitvoer

BUCKETING_COLS;
('difference', [])
PARTITIONS;
('difference', [])

In deze uitvoer vindt u de kolomnamen die ontbreken of onjuist zijn. U kunt de volgende query uitvoeren in uw back-enddatabase om eenmaal te controleren of de kolom ontbreekt of niet.

SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = 'PART_COL_STATS';

Als een van de kolommen in de tabel wordt gemist, bijvoorbeeld als we de query's uitvoeren zoals invoegen of overschrijven, worden de statistieken automatisch berekend en wordt geprobeerd de statistiekentabel zoals PART_COL_STATS en TAB_COL_STATS bij te werken. En als de kolom zoals 'BIT_VECTOR' ontbreekt in de tabellen, mislukt deze met de fout 'Ongeldige kolomnaam'. U kunt de kolom toevoegen zoals vermeld in de volgende opdrachten. Als tijdelijke oplossing kunt u de statistieken uitschakelen door de volgende eigenschappen in te stellen, waardoor de statistieken niet kunnen worden bijgewerkt in de back-enddatabase.

hive.stats.autogather=false;
hive.stats.column.autogather=false;
To Fix this issue, run the following two queries on backend SQL server (Hive metastore DB):

ALTER TABLE PART_COL_STATS ADD BIT_VECTOR VARBINARY(MAX);
ALTER TABLE TAB_COL_STATS ADD BIT_VECTOR VARBINARY(MAX);

Met deze stap voorkomt u dat de queryfouten mislukken, die na de migratie één keer mislukken met 'Ongeldige kolomnaam'.

Hive beveiligen in HDInsight-versies

HDInsight kan eventueel worden geïntegreerd met Microsoft Entra ID met behulp van HDInsight Enterprise Security Package (ESP). ESP gebruikt Kerberos en Apache Ranger om de machtigingen van specifieke resources binnen het cluster te beheren. Ranger-beleid dat is geïmplementeerd op Hive in HDInsight 3.6, kan met de volgende stappen worden gemigreerd naar HDInsight 4.0:

  1. Navigeer naar het deelvenster Ranger Service Manager in uw HDInsight 3.6-cluster.
  2. Navigeer naar het beleid met de naam HIVE en exporteer het beleid naar een json-bestand.
  3. Zorg ervoor dat alle gebruikers waarnaar wordt verwezen in de geëxporteerde beleids-json aanwezig zijn in het nieuwe cluster. Als een gebruiker wordt verwezen in de json van het beleid, maar niet in het nieuwe cluster bestaat, voegt u de gebruiker toe aan het nieuwe cluster of verwijdert u de verwijzing uit het beleid.
  4. Navigeer naar het deelvenster Ranger Service Manager in uw HDInsight 4.0-cluster.
  5. Navigeer naar het beleid met de naam HIVE en importeer de json van het ranger-beleid uit stap 2.

Hive-wijzigingen in HDInsight 4.0 waarvoor mogelijk toepassingswijzigingen zijn vereist

  • Zie Extra configuratie met Hive Warehouse Verbinding maken or voor het delen van de metastore tussen Spark en Hive voor ACID-tabellen.

  • HDInsight 4.0 maakt gebruik van autorisatie op basis van opslag. Als u bestandsmachtigingen wijzigt of mappen maakt als een andere gebruiker dan Hive, raakt u waarschijnlijk Hive-fouten op basis van opslagmachtigingen. U kunt dit oplossen door toegang te verlenen rw- aan de gebruiker. Zie de handleiding voor HDFS-machtigingen.

  • HiveCLI wordt vervangen door Beeline.

Raadpleeg HDInsight 4.0-aankondiging voor andere wijzigingen.

Na de migratie

Zorg ervoor dat u deze stappen volgt nadat u de migratie hebt voltooid.

Tabel sanity

  1. Maak tabellen opnieuw in Hive 3.1 met CTAS of IOW om het tabeltype te wijzigen in plaats van tabeleigenschappen te wijzigen.
  2. DoAs behouden als onwaar.
  3. Zorg ervoor dat het eigendom van beheerde tabellen/gegevens is met de hive-gebruiker.
  4. Gebruik beheerde ACID-tabellen als tabelindeling ORC en beheerd niet-ACID is voor niet-ORC-typen.
  5. Genereer statistieken opnieuw voor opnieuw gemaakte tabellen, omdat de migratie onjuiste statistieken zou hebben veroorzaakt.

Clusterstatus

Als meerdere clusters dezelfde opslag en HMS DB delen, moeten we automatisch comprimeren/comprimeren van threads alleen in één cluster inschakelen en overal uitschakelen.

Stem Metastore af om het CPU-gebruik te verminderen.

  1. Schakel transactionele gebeurtenislisteners uit.

    Notitie

    Voer de volgende stappen uit, alleen als de hive-replicatiefunctie niet wordt gebruikt.

    1. Verwijder de waarde voor hive.metastore.transactional.event.listeners uit de Ambari-gebruikersinterface.
    2. Standaardwaarde: org.apache.hive.hcatalog.listener.DbNotificationListener
    3. Nieuwe waarde: <Empty>
  2. Hive PrivilegeSynchronizer uitschakelen

    1. Stel vanuit de Ambari-gebruikersinterface hive.privilege.syncr = false in.
    2. Standaardwaarde: true
    3. Nieuwe waarde: false
  3. De functie voor het herstellen van partities optimaliseren

  4. Partitieherstel uitschakelen: deze functie wordt gebruikt om de partities van Hive-tabellen in de opslaglocatie te synchroniseren met Hive-metastore. U kunt deze functie uitschakelen als msck-reparatie wordt gebruikt na de gegevensopname.

  5. Als u de functie wilt uitschakelen, voegt u 'discover.partitions=false' toe onder tabeleigenschappen met behulp van ALTER TABLE. OF (als de functie niet kan worden uitgeschakeld)

  6. Verhoog de frequentie voor partitieherstel.

  7. Verhoog vanuit de Ambari-gebruikersinterface de waarde 'metastore.partition.management.task.frequency' (in seconden).

    Notitie

    Deze wijziging kan de zichtbaarheid van sommige partities die zijn opgenomen in de opslag vertragen.

    1. Standaardwaarde: 60
    2. Voorgestelde waarde: 3600
  8. Geavanceerde optimalisaties De volgende opties moeten worden getest in een lagere (niet-prod) omgeving voordat ze worden toegepast op productie.

    1. Verwijder de gerelateerde listener voor gerealiseerde weergave als de gerealiseerde weergave niet wordt gebruikt.
    2. Voeg vanuit de Ambari-gebruikersinterface een aangepaste eigenschap toe (in aangepaste hive-site.xml) en verwijder de ongewenste metastore-threads op de achtergrond.
    3. Eigenschapsnaam: metastore.task.threads.remote
    4. Standaardwaarde: N/A (it uses few class names internally)
    5. Nieuwe waarde: org.apache.hadoop.hive.metastore.txn.AcidHouseKeeperService,org.apache.hadoop.hive.metastore.txn.AcidOpenTxnsCounterService,org.apache.hadoop.hive.metastore.txn.AcidCompactionHistoryService,org.apache.hadoop.hive.metastore.txn.AcidWriteSetService,org.apache.hadoop.hive.metastore.PartitionManagementTask
  9. Schakel de achtergrondthreads uit als replicatie is uitgeschakeld.

    1. Voeg vanuit de Ambari-gebruikersinterface een aangepaste eigenschap toe (in aangepaste hive-site.xml) en verwijder de ongewenste threads.
    2. Eigenschapsnaam: metastore.task.threads.always
    3. Standaardwaarde: N/A (it uses few class names internally)
    4. Nieuwe waarde: org.apache.hadoop.hive.metastore.RuntimeStatsCleanerTask

Query's afstemmen

  1. Behoud de standaardconfiguraties van Hive om de query's uit te voeren terwijl ze zijn afgestemd op TPC-DS-workloads. U hebt alleen afstemming op queryniveau nodig als deze mislukt of traag wordt uitgevoerd.
  2. Zorg ervoor dat statistieken up-to-date zijn om slechte plannen of verkeerde resultaten te voorkomen.
  3. Vermijd het combineren van externe en beheerde ACID-tabellen in het jointype query's. Probeer in dat geval externe naar beheerde niet-ACID-tabel te converteren via recreatie.
  4. In Hive-3 is veel werk gebeurd op vectorisatie, CBO, tijdstempel met zone enzovoort, die productfouten kan hebben. Dus als een query verkeerde resultaten geeft, kunt u vectorisatie, CBO, map-join enzovoort uitschakelen om te zien of dat helpt.

Andere stappen die moeten worden gevolgd om de onjuiste resultaten en slechte prestaties na de migratie op te lossen

  1. Probleem Hive-query geeft het onjuiste resultaat. Zelfs de selectieaantal(*) query geeft het onjuiste resultaat.

    De eigenschap hive.compute.query.using.stats is standaard ingesteld op true. Als we deze op waar instellen, worden de statistieken gebruikt, die zijn opgeslagen in metastore om de query uit te voeren. Als de statistieken niet up-to-date zijn, resulteert dit in onjuiste resultaten.

    Oplossing verzamelt de statistieken voor de beheerde tabellen met behulp van alter table <table_name> compute statics; de opdracht op tabelniveau en kolomniveau. Referentiekoppeling - https://cwiki.apache.org/confluence/display/hive/statsdev#StatsDev-TableandPartitionStatistics

  2. Het uitvoeren van Hive-query's duurt lang.

    Oorzaak : als de query een joinvoorwaarde heeft, maakt Hive een plan om toewijzingsdeelname of samenvoeging te gebruiken op basis van de tabelgrootte en joinvoorwaarde. Als een van de tabellen een kleine grootte bevat, wordt die tabel in het geheugen geladen en wordt de joinbewerking uitgevoerd. Op deze manier is de uitvoering van de query sneller in vergelijking met de samenvoeging.

    Oplossing Zorg ervoor dat u de eigenschap hive.auto.convert.join=true instelt. Dit is de standaardwaarde. Als u deze instelt op onwaar, wordt de samenvoeging gebruikt en kan dit leiden tot slechte prestaties. Hive bepaalt of toewijzingsdeelname wel of niet moet worden gebruikt op basis van de volgende eigenschappen, die is ingesteld in het cluster

    set hive.auto.convert.join=true;
    set hive.auto.convert.join.noconditionaltask=true;
    set hive.auto.convert.join.noconditionaltask.size=<value>;
    set hive.mapjoin.smalltable.filesize = <value>;
    

    Algemene join kan automatisch worden geconverteerd naar toewijzingsdeelname wanneer hive.auto.convert.join.noconditionaltask=truede geschatte grootte van kleine tabellen kleiner is dan hive.auto.convert.join.noconditionaltask.size (de standaardwaarde is 10000000 MB).

    Als u een probleem ondervindt met betrekking tot OOM door de eigenschap hive.auto.convert.join in te stellen op waar, is het raadzaam deze alleen in te stellen op onwaar voor die specifieke query op sessieniveau en niet op clusterniveau. Dit probleem kan optreden als de statistieken onjuist zijn en Hive besluit kaartdeelname te gebruiken op basis van de statistieken.

  • Probleem hive-query geeft het onjuiste resultaat als de query een joinvoorwaarde heeft en de betrokken tabellen null- of lege waarden hebben.

    Soms krijgen we mogelijk een probleem met betrekking tot null-waarden als de tabellen in de query veel null-waarden hebben. Hive voert de queryoptimalisatie ten onrechte uit met de betrokken null-waarden, wat resulteert in onjuiste resultaten.

    Oplossing We raden u aan de eigenschap set hive.cbo.returnpath.hiveop=true op sessieniveau in te stellen als u onjuiste resultaten krijgt. Deze configuratie introduceert geen null-filtering voor joinsleutels. Als de tabellen veel null-waarden hebben, kunnen we deze configuratie inschakelen om de samenvoegbewerking tussen meerdere tabellen te optimaliseren, zodat alleen de niet null-waarden worden meegekeken.

  • Probleem Hive-query geeft het onjuiste resultaat als de query meerdere joinvoorwaarden heeft.

    Omdat Sommigetime Tez slechte runtime-abonnementen produceert wanneer er meerdere keer dezelfde joins zijn met map-joins.

    Oplossing Er is een kans dat er onjuiste resultaten worden weergegeven wanneer we zijn ingesteld op hive.merge.nway.joins onwaar. Stel dit in op true alleen voor de query, waardoor dit is beïnvloed. Dit helpt bij het uitvoeren van query's met meerdere joins op dezelfde voorwaarde, waarbij joins worden samengevoegd tot één join-operator. Deze methode is handig als grote shuffle-joins worden gebruikt om een hershuffle-fase te voorkomen.

  • Probleem' Er is een toename in de tijd van de dag waarop de query wordt uitgevoerd, in vergelijking met de eerdere uitvoeringen.

    Dit probleem kan optreden als er meer kleine bestanden zijn. Hive neemt dus tijd in beslag bij het lezen van alle bestanden om de gegevens te verwerken, wat resulteert in een toename van de uitvoeringstijd.

    Oplossing Zorg ervoor dat u de compressie regelmatig uitvoert voor de tabellen, die worden beheerd. Deze stap voorkomt de kleine bestanden en verbetert de prestaties.

    Referentiekoppeling: Hive Transactions - Apache Hive - Apache Software Foundation.

  • Probleem hive-query geeft een onjuist resultaat wanneer de klant een joinvoorwaarde gebruikt in een beheerde acid orc-tabel en een beheerde niet-ACID-orc-tabel.

    De oorzaak is dat vanaf HIVE 3 strikt wordt gevraagd om alle beheerde tabellen als een acid-tabel te bewaren. En als we deze als een acid-tabel willen behouden, moet de tabelindeling orc zijn en dit zijn de belangrijkste criteria. Maar als we de strikte beheerde tabeleigenschap hive.strict.managed.tables uitschakelen op false, kunnen we een beheerde niet-ACID-tabel maken. Sommige case klant maakt een externe ORC-tabel of na de migratie de tabel geconverteerd naar een externe tabel en schakelt de strikte beheerde tabeleigenschap uit en converteert deze naar een beheerde tabel. Op dit moment is de tabel geconverteerd naar niet-ACID beheerde orc-indeling.

    Oplossing hive-optimalisatie gaat fout als u een tabel koppelt aan een niet-ACID beheerde ORC-tabel met een door acid beheerde orc-tabel.

    Als u een externe tabel converteert naar een beheerde tabel,

    1. Stel de eigenschap hive.strict.managed.tables niet in op false. Als u deze optie instelt, kunt u een niet-ACID beheerde tabel maken, maar deze wordt niet aangevraagd in HIVE-3
    2. Converteer de externe tabel naar een beheerde tabel met behulp van de volgende alter-opdracht in plaats van alter table <table_name> set TBLPROPERTIES ('EXTERNAL'='false');
    alter table rt set TBLPROPERTIES ('EXTERNAL'='false', 'transactional'='true');
    

Guide voor probleemoplossing

HdInsight 3.6-4.0-probleemoplossingsgids voor Hive-workloads biedt antwoorden op veelvoorkomende problemen bij het migreren van Hive-workloads van HDInsight 3.6 naar HDInsight 4.0.

Meer lezen