Migrace úloh Azure HDInsight 3.6 Hive do HDInsight 4.0
HDInsight 4.0 má oproti HDInsight 3.6 několik výhod. Tady je přehled novinek ve službě HDInsight 4.0.
Tento článek popisuje postup migrace úloh Hive ze služby HDInsight 3.6 na verzi 4.0, včetně
- Upgrade kopírování a schématu metastoru Hive
- Sejf migrace kvůli kompatibilitě ACID
- Zachování zásad zabezpečení Hive
Nové a staré clustery HDInsight musí mít přístup ke stejným účtům úložiště.
Migraci tabulek Hive do nového účtu úložiště je potřeba provést jako samostatný krok. Viz Migrace Hivu mezi účty úložiště.
Změny v Hivu 3 a novinky:
Změny klienta Hive
Hive 3 podporuje pouze tenkého klienta, Beeline pro spouštění dotazů a příkazů pro správu Hive z příkazového řádku. Beeline ke spuštění všech příkazů používá připojení JDBC k HiveServeru. V HiveServeru dochází k parsování, kompilaci a provádění operací.
Podporované příkazy Rozhraní příkazového řádku Hive zadáte vyvoláním Beeline pomocí klíčového slova Hive jako uživatele Hive nebo vyvoláním beeline pomocí beeline -u <JDBC URL>
. Adresu URL JDBC můžete získat ze stránky Ambari Hive.
Použití Beeline (místo silného rozhraní příkazového řádku Hive klienta, které se už nepodporuje) má několik výhod, mezi které patří:
- Místo údržby celého základu kódu Hive můžete udržovat pouze klienta JDBC.
- Režie při spuštění je nižší pomocí Beeline, protože se nezabíjí celý základ kódu Hive.
Můžete také spustit skript Hive, který je pod adresářem /usr/bin, který vyvolá připojení beeline pomocí adresy URL JDBC.
Dynamická klientská architektura usnadňuje zabezpečení dat v
- Stav relace, interní datové struktury, hesla atd., se nacházejí v klientovi místo na serveru.
- Malý počet démonů potřebných ke spouštění dotazů zjednodušuje monitorování a ladění.
HiveServer vynucuje nastavení seznamu povolených a blokovaných položek, které můžete změnit pomocí SET
příkazů. Pomocí seznamů blokování můžete omezit konfiguraci paměti, abyste zabránili nestabilitě Serveru Hive. Můžete nakonfigurovat více instancí HiveServer s různými seznamy povolených a blokovými seznamy, abyste vytvořili různé úrovně stability.
Změny metastoru Hive
Hive teď podporuje jenom vzdálené metastory místo vloženého metastoru (v prostředí HS2 JVM). Metastor Hive se nachází v uzlu v clusteru spravovaném službou Ambari jako součást zásobníku HDInsight. Samostatný server mimo cluster není podporovaný. Pro konfiguraci metastoru Hive už na příkazovém řádku nenastavíte příkazy key=value. Na základě hodnoty nakonfigurované v hive.metastore.uris=' ' " se používá služba HMS a navázáno připojení.
Změna prováděcího modulu
Apache Tez nahrazuje MapReduce jako výchozí prováděcí modul Hive. MapReduce je zastaralý od spuštění Hive 2.0 Refer HIVE-12300. Díky výrazům směrovaných acyklických grafů (DAG) a primitivních přenosů dat se provádění dotazů Hive v rámci Tez zvyšuje výkon. Dotazy SQL, které odešlete do Hivu, se spustí následujícím způsobem:
- Hive zkompiluje dotaz.
- Tez spustí dotaz.
- YARN přiděluje prostředky pro aplikace v clusteru a umožňuje autorizaci pro úlohy Hive ve frontách YARN.
- Hive aktualizuje data v ABFS nebo WASB.
- Hive vrátí výsledky dotazu přes připojení JDBC.
Pokud starší verze skriptu nebo aplikace určuje MapReduce pro spuštění, dojde k výjimce následujícím způsobem:
Poznámka:
Většina uživatelem definovaných funkcí (UDF) nevyžaduje provedení žádné změny v Tez místo MapReduce.
Změny v souvislosti s transakcí ACID a CBO:
Tabulky ACID jsou výchozím typem tabulky v HDInsight 4.x bez výkonu nebo provozního přetížení.
Zjednodušený vývoj aplikací, operace se silnějšími transakčními zárukami a jednodušší sémantikou pro příkazy SQL
Interní Hive se postará o dělení na tabulky ACID v HDInsight 4.1, čímž se odstraní režijní náklady na údržbu.
Pokročilé optimalizace – Upgrade v CBO
Automatická mezipaměť dotazů Vlastnost použitá k povolení ukládání dotazů do mezipaměti je
hive.query.results.cache.enabled
. Tuto vlastnost musíte nastavit na true. Hive ukládá mezipaměť výsledků dotazu ve/tmp/hive/__resultcache__/.
výchozím nastavení, Hive přidělí pro mezipaměť výsledků dotazu 2 GB. Toto nastavení můžete změnit konfigurací následujícího parametru v bajtechhive.query.results.cache.max.size
.Další informace najdete v výhodách migrace do Azure HDInsight 4.0.
Materializované zobrazení přepíše
Další informace o Hive – materializovaná zobrazení
Změny po upgradu na Apache Hive 3
Pokud chcete po upgradu vyhledat a používat tabulky Apache Hive 3, musíte porozumět změnám, ke kterým dochází během procesu upgradu. Změny správy a umístění tabulek,oprávněních
Správa tabulek Hive
Hive 3 přebírá větší kontrolu nad tabulkami než Hive 2 a vyžaduje, aby spravované tabulky dodržovaly striktní definici. Úroveň řízení Hive přebírá tabulky homogenní pro tradiční databáze. Hive si uvědomuje rozdílové změny dat; tato řídicí architektura zvyšuje výkon.
Pokud například Hive ví, že překlad dotazu nevyžaduje prohledávání tabulek pro nová data, Vrátí Hive výsledky z mezipaměti výsledků dotazu Hive. Když se podkladová data v materializovaném zobrazení změní, Musí Hive znovu sestavit materializované zobrazení. Vlastnosti ACID přesně odhalí, které řádky se změnily, a je potřeba je zpracovat a přidat do materializovaného zobrazení.
Změny vlastností ACID v Hivu
Hive 2.x a 3.x mají transakční (spravované) i netransakční (externí) tabulky. Transakční tabulky mají atomické, konzistentní, izolované a odolné vlastnosti (ACID). V Hive 2.x je počáteční verze zpracování transakce ACID ACID v1. V Hive 3.x by výchozí tabulky byly s ACID v2.
Nativní formáty úložiště a jiné než nativní formáty úložiště
Formáty úložiště jsou faktorem při upgradu změn typů tabulek. Hive 2.x a 3.x podporuje následující nativní formáty úložiště Hadoop a jiné než nativní formáty úložiště
Nativní: Tabulky s integrovanou podporou Hive v následujících formátech souborů
- Text
- Sekvenční soubor
- RC Soubor
- Soubor AVRO
- Soubor ORC
- Soubor Parquet
Ne nativní: Tabulky, které používají obslužnou rutinu úložiště, například DruidStorageHandler nebo HBaseStorageHandler
Upgrade změn v typech tabulek ve službě HDInsight 4.x
Následující tabulka porovnává typy tabulek Hive a operace ACID před upgradem z HDInsight 3.x a po upgradu na HDInsight 4.x. Vlastnictví souboru tabulky Hive je faktorem při určování typů tabulek a operací ACID po upgradu.
Porovnání typů tabulek HDInsight 3.x a HDInsight 4.x
HDInsight 3.x | - | - | - | HDInsight 4.x | - |
---|---|---|---|---|---|
Typ tabulky | ACID v1 | Formát | Vlastník (uživatel) souboru tabulky Hive | Typ tabulky | ACID v2 |
Externí | No | Nativní nebo ne nativní | Hive nebo jiné než Hive | Externí | No |
Spravované | Ano | ORC | Hive nebo jiné než Hive | Spravované, aktualizovatelné | Ano |
Spravované | No | ORC | Hive | Spravované, aktualizovatelné | Ano |
Spravované | No | ORC | jiné než Hive | Externí s odstraněním dat | NE |
Spravované | No | Nativní (ale bez ORC) | Hive | Spravováno, vložení pouze | Ano |
Spravované | No | Nativní (ale bez ORC) | jiné než Hive | Externí s odstraněním dat | No |
Spravované | No | Ne nativní | Hive nebo jiné než Hive | Externí s odstraněním dat | No |
Zosobnění Hivu
Zosobnění Hive bylo ve výchozím nastavení povolené v Hive 2 (doAs=true) a ve výchozím nastavení je v Hive 3 zakázáno. Zosobnění Hive spouští Hive jako koncový uživatel, nebo ne.
Další změny upgradu HDInsight 4.x
- Spravované, tabulky ACID, které nevlastní uživatel Hive, zůstávají spravované tabulky po upgradu, ale Hive se stane vlastníkem.
- Po upgradu je formát tabulky Hive stejný jako před upgradem. Například nativní nebo ne nativní tabulky zůstávají nativní nebo ne nativní, v uvedeném pořadí.
Změny umístění
Po upgradu se umístění spravovaných tabulek nebo oddílů nezmění za žádné z následujících podmínek:
- Původní adresář tabulky nebo oddílu nebyl před upgradem ve výchozím umístění /apps/hive/warehouse.
- Stará tabulka nebo oddíl je v jiném systému souborů než nový adresář skladu.
- Starý adresář tabulky nebo oddílu je v jiné zóně šifrování než nový adresář skladu.
Jinak se umístění spravovaných tabulek nebo oddílů změní. Proces upgradu přesune spravované soubory do /hive/warehouse/managed
. Ve výchozím nastavení Hive umístí všechny nové externí tabulky, které vytvoříte ve službě HDInsight 4.x. /hive/warehouse/external
, /apps/hive directory
což je bývalé umístění skladu Hive 2.x, může nebo nemusí existovat ve službě HDInsight 4.x.
Změny umístění jsou k dispozici v následujícím scénáři.
Scénář 1
Pokud je tabulka spravovanou tabulkou v HDInsight-3.x a pokud se nachází v umístění /apps/hive/warehouse
a převede se jako externí tabulka v HDInsight-4.x, umístění je stejné /apps/hive/warehouse
i ve službě HDInsight 4.x. Nezmění se žádné umístění. Pokud po tomto kroku provádíte příkaz alter table a převedete ji jako spravovanou (acid) tabulku v té době, která se nachází ve stejném umístění /apps/hive/warehouse
.
Scénář 2
Pokud je tabulka spravovanou tabulkou v HDInsight-3.x a pokud je v umístění /apps/hive/warehouse
a převedena na spravovanou tabulku (ACID) v HDInsight 4.x, umístění je /hive/warehouse/managed
.
Scénář 3 : Pokud vytváříte externí tabulku, v HDInsight-4.x bez zadání umístění se zobrazí v umístění /hive/warehouse/external
.
Převod tabulky
Po upgradu převedete netransakční tabulku na transakční tabulku ACID v2 pomocí ALTER TABLE
příkazu a nastavíte vlastnosti tabulky na .
transaction'='true' and 'EXTERNAL'='false
- Spravovaná tabulka, jiný než ACID, formát ORC a vlastněný uživatelem bez Hivu v HDInsight-3.x se převede na externí tabulku bez ACID v HDInsight-4.x.
- Pokud si uživatel přeje změnit externí tabulku (jiné než ACID) na ACID, měli by také změnit externí tabulku na spravovanou a ACID. Vzhledem k tomu, že ve službě HDInsight-4.x jsou všechny spravované tabulky ve výchozím nastavení výhradně ACID. Externí tabulky (jiné než ACID) nemůžete převést na tabulku ACID.
Poznámka:
Tabulka musí být tabulka ORC.
Chcete-li převést externí tabulku (jiné než ACID) na tabulku Managed (ACID),
- Pomocí následujícího příkazu převeďte externí tabulku na spravovanou a kyselinu rovno hodnotě true:
alter table <table name> set TBLPROPERTIES ('EXTERNAL'='false', 'transactional'='true');
- Pokud se pokusíte spustit následující příkaz pro externí tabulku, zobrazí se následující chyba.
Scénář 1
Představte si, že tabulka rt je externí tabulka (jiná než ACID). Pokud tabulka není tabulka ORC,
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
Scénář 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)
K této chybě dochází, protože tabulka rt je externí tabulka a nemůžete převést externí tabulku na ACID.
Scénář 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)
Snažíme se nejdřív změnit externí tabulku na spravovanou tabulku. V HDInsight 4.x by měla být přísně spravovaná tabulka (což znamená, že by měla být ACID). Takže sem dostaneš zablokování. Jediný způsob, jak převést externí tabulku (NON_ACID) na spravovanou (ACID), musíte postupovat podle příkazu:
alter table rt set TBLPROPERTIES ('EXTERNAL'='false', 'transactional'='true');
Syntaxe a sémantika
Vytvoření tabulky Za účelem zlepšení použitelnosti a funkčnosti změnilo Vytvoření tabulky Hive 3. Hive změnil vytváření tabulek následujícími způsoby:
- Vytvoří tabulku kompatibilní s acid, což je výchozí hodnota v HDP.
- Podporuje jednoduché zápisy a vkládání.
- Zápisy do více oddílů
- Vloží více aktualizací dat do jednoho příkazu SELECT.
- Eliminuje potřebu dělení na kontejnery.
Pokud máte kanál ETL, který vytváří tabulky v Hivu, tabulky se vytvoří jako ACID. Hive teď pevně řídí přístup a pravidelně provádí komprimace tabulek.
Před upgradem v HDInsight 3.x ve výchozím nastavení create TABLE vytvořil tabulku, která není acid.
Po upgradu Ve výchozím nastavení CREATE TABLE vytvoří úplnou transakční tabulku ACID ve formátu ORC.
Akce Požadovaná pro přístup k tabulkám Hive ACID ze Sparku se připojíte k Hivu pomocí Připojení oru Hive Warehouse (HWC). K zápisu tabulek ACID do Hivu ze Sparku použijete rozhraní HWC a HWC API.
Escaping
db.table
ReferencesJe potřeba změnit dotazy, které používají odkazy db.table, aby Hive interpretovat celý řetězec db.table jako název tabulky. Hive 3.x odmítne
db.table
v dotazech SQL. V názvech tabulek není povolená tečka (.). Název databáze a název tabulky uzavřete do backticks. Najděte tabulku s problematickým odkazem na tabulku.math.students
který se zobrazí v příkazu CREATE TABLE. Uzavřete název databáze a název tabulky do backticks.TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));
CASTING TIMESTAMPS Results of applications that cast numerics to timestamps differ from Hive 2 to Hive 3. Apache Hive změnil chování CAST tak, aby vyhovovalo standardu SQL, což nepřidružuje časové pásmo k typu TIMESTAMP.
Před upgradem přetypování číselného typu do časového razítka lze vytvořit výsledek, který odráží časové pásmo clusteru. Například 1597217764557 je 2020-08-12 00:36:04 PDT. Spuštěním následujícího dotazu přetypuje číslo na časové razítko v PDT:
SELECT CAST(1597217764557 AS TIMESTAMP);
| 2020-08-12 00:36:04 |Po upgradu přetypování číselného typu do časového razítka vznikne výsledek, který místo časového pásma clusteru odráží utc. Spuštění dotazu přetypuje číslo na časové razítko ve standardu UTC.
SELECT CAST(1597217764557 AS TIMESTAMP);
| 2020-08-12 07:36:04.557 |Akce Požadovaná změna aplikací Nepřetypovávejte z číslic pro získání místního časového pásma. Předdefinované funkce from_utc_timestamp a to_utc_timestamp lze použít k napodobení chování před upgradem.
KONTROLA KOMPATIBILITY ZMĚN SLOUPCŮ A výchozí změna konfigurace může způsobit selhání aplikací, které mění typy sloupců.
Před upgradem v HDInsight 3.x Hive.metastore.disallow.incompatible.col.type.changes je ve výchozím nastavení false, aby bylo možné změny v nekompatibilních typech sloupců. Sloupec STRING můžete například změnit na sloupec nekompatibilního typu, například MAP<STRING nebo STRING>. Nedojde k žádné chybě.
Po upgradu hive.metastore.disallow.incompatible.col.type.changes je ve výchozím nastavení true. Hive zabraňuje změnám nekompatibilních typů sloupců. Kompatibilní změny typu sloupce, například INT, STRING, BIGINT, nejsou blokované.
Akce Požadovaná změna aplikací pro zakázání nekompatibilních změn typu sloupce, aby se zabránilo možnému poškození dat
VYŘAZENÍ ODDÍLŮ
Klíčová slova OFFLINE a NO_DROP v klauzuli CASCADE pro vyřazení oddílů způsobují problémy s výkonem a už se nepodporují.
Před upgradem můžete použít klíčová slova OFFLINE a NO_DROP v klauzuli CASCADE, aby se zabránilo čtení nebo vyřazení oddílů.
Po upgradu OFFLINE a NO_DROP nejsou v klauzuli CASCADE podporovány.
Akce Požadovaná změna aplikací pro odebrání OFFLINE a NO_DROP z klauzule CASCADE Pokud chcete zabránit vyřazení nebo čtení oddílů, použijte schéma autorizace, jako je Ranger.
PŘEJMENOVÁNÍ TABULKY po upgradu Přejmenování spravované tabulky přesune jeho umístění pouze v případě, že je tabulka vytvořena bez
LOCATION
klauzule a je pod jejím databázovým adresářem.
Omezení týkající se CBO
Vidíme, že výběr výstupu dává koncové nule v několika sloupcích. Pokud například máme sloupec tabulky s datovým typem jako desetinné číslo(38;4) a pokud vložíme data jako 38, přidáme koncové nuly a výsledek zadáme jako 38,0000 Podle a https://issues.apache.org/jira/browse/HIVE-12063https://issues.apache.org/jira/browse/HIVE-24389, myšlenka se zachová měřítko a přesnost místo spuštění obálky v desítkových sloupcích. Toto je výchozí chování z Hivu 2. Pokud chcete tento problém vyřešit, můžete postupovat podle následující možnosti.
- Upravte datový typ na úrovni zdroje a upravte přesnost jako sloupec1(decimal(38;0)). Tato hodnota poskytuje výsledek jako 38 bez koncové nuly. Pokud ale vložíte data jako 35,0005, je to 0005 a poskytne pouze hodnotu 38 1.Odeberte koncové nuly sloupců s problémem a pak přetypujte na řetězec,
- Použití příkazu TRIM(cast(<column_name> AS STRING)+0 FROM <table_name>;
- Použijte regulární výraz.
- Upravte datový typ na úrovni zdroje a upravte přesnost jako sloupec1(decimal(38;0)). Tato hodnota poskytuje výsledek jako 38 bez koncové nuly. Pokud ale vložíte data jako 35,0005, je to 0005 a poskytne pouze hodnotu 38 1.Odeberte koncové nuly sloupců s problémem a pak přetypujte na řetězec,
Dotaz Hive selže s výrazem Nepodporovaný poddotaz, když v dotazu použijeme systém UNIX_TIMESTAMP. Pokud například spustíme dotaz, vyvolá chybu Nepodporovaný výraz poddotazového dotazu.
select * from (SELECT col_1 from table1 where col_2 >= unix_timestamp('2020-03-07','yyyy-MM-dd'));
Kořenovým případem tohoto problému je, že aktuální základ kódu Hive vyvolává výjimku, která parsuje systém UNIX_TIMESTAMP, protože neexistuje žádné mapování
HiveTypeSystemImpl.java code
přesnosti pro přesnostUNIX_TIMESTAMP
, kterou Calcite rozpozná jakoBIGINT
. Následující dotaz ale funguje správně.select * from (SELECT col_1 from table1 where col_2 >= 1);
Tento příkaz se úspěšně spustí, protože col_2 je celé číslo. Výše uvedený problém byl opraven v hdi-3.1.2-4.1.12(zásobník 4.1) a hdi-3.1.2-5.0.8(5.0 stack)
Postup upgradu
1. Příprava dat
HDInsight 3.6 ve výchozím nastavení nepodporuje tabulky ACID. Pokud jsou však k dispozici tabulky ACID, spusťte na nich komprimace MAJOR. Podrobnosti o komprimování najdete v jazykové příručce Hive.
Pokud používáte Azure Data Lake Storage Gen1, umístění tabulek Hive pravděpodobně závisí na konfiguracích HDFS clusteru. Spuštěním následující akce skriptu proveďte přenosná umístění do jiných clusterů. Viz akce skriptu pro spuštěný cluster.
Vlastnost Hodnota Identifikátor URI skriptu Bash https://hdiconfigactions.blob.core.windows.net/linuxhivemigrationv01/hive-adl-expand-location-v01.sh
Typy uzlů Head Parametry
2. Kopírování databáze SQL
Pokud cluster používá výchozí metastore Hive, postupujte podle tohoto průvodce a exportujte metadata do externího metastoru. Potom vytvořte kopii externího metastoru pro upgrade.
Pokud cluster používá externí metastore Hive, vytvořte jeho kopii. Mezi možnosti patří export/import a obnovení k určitému bodu v čase.
3. Upgrade schématu metastoru
Tento krok používá Hive Schema Tool
k upgradu schématu metastoru ze služby HDInsight 4.0.
Upozorňující
Tento krok není nevratný. Spusťte tento příkaz pouze na kopii metastoru.
Vytvořte dočasný cluster HDInsight 4.0 pro přístup k Hivu
schematool
4.0 . Pro tento krok můžete použít výchozí metastore Hive.Z clusteru HDInsight 4.0 spusťte
schematool
upgrade cílového metastoru HDInsight 3.6. Upravte následující skript prostředí a přidejte název serveru SQL, název databáze, uživatelské jméno a heslo. Otevřete relaci SSH na hlavním uzlu a spusťte ji.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
Poznámka:
Tento nástroj používá klienta
beeline
ke spouštění skriptů SQL v/usr/hdp/$STACK_VERSION/hive/scripts/metastore/upgrade/mssql/upgrade-*.mssql.sql
.Syntaxe SQL v těchto skriptech nemusí být nutně kompatibilní s jinými klientskými nástroji. Například SSMS a Editor Power Query na webu Azure Portal vyžadují po každém příkazu klíčové slovo
GO
.Pokud některý skript selže kvůli vypršení časového limitu kapacity prostředků nebo transakce, vertikálně navyšte kapacitu služby SQL Database.
Ověřte konečnou verzi s dotazem
select schema_version from dbo.version
.Výstup by se měl shodovat s následujícím příkazem Bash z clusteru HDInsight 4.0.
grep . /usr/hdp/$(hdp-select --version)/hive/scripts/metastore/upgrade/mssql/upgrade.order.mssql | tail -n1 | rev | cut -d'-' -f1 | rev
Odstraňte dočasný cluster HDInsight 4.0.
4. Nasazení nového clusteru HDInsight 4.0
Vytvořte nový cluster HDInsight 4.0, vyberte upgradovaný metastore Hive a stejné účty úložiště.
Nový cluster nevyžaduje stejný výchozí systém souborů.
Pokud metastor obsahuje tabulky umístěné ve více účtech úložiště, musíte tyto účty úložiště přidat do nového clusteru, abyste k těmto tabulkám měli přístup. Viz přidání dalších účtů úložiště do SLUŽBY HDInsight.
Pokud úlohy Hive selžou kvůli nedostupnosti úložiště, ověřte, že je umístění tabulky v účtu úložiště přidaném do clusteru.
K identifikaci umístění tabulky použijte následující příkaz Hive:
SHOW CREATE TABLE ([db_name.]table_name|view_name);
5. Převod tabulek pro dodržování předpisů ACID
Spravované tabulky musí být kompatibilní s ACID ve službě HDInsight 4.0. Spusťte strictmanagedmigration
v HDInsight 4.0 a převeďte všechny nespravované tabulky ACID na externí tabulky s vlastností 'external.table.purge'='true'
. Spusťte z hlavního uzlu:
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. Chyba třídy nebyla nalezena s MultiDelimitSerDe
Problém
V některých situacích při spuštění dotazu Hive se může zobrazit java.lang.ClassNotFoundException
oznámení, že org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
třída nebyla nalezena. K této chybě dochází, když zákazník migruje z HDInsight 3.6 do HDInsight 4.0. Třída org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
SerDe, která je součástí hive-contrib-1.2.1000.2.6.5.3033-1.jar
HDInsight 3.6, je odebrána a používáme org.apache.hadoop.hive.serde2.MultiDelimitSerDe
třídu, která je součástí hive-exec jar
HDI-4.0. hive-exec jar
při spuštění služby se ve výchozím nastavení načte do HS2.
POSTUP ŘEŠENÍ POTÍŽÍ
- Zkontrolujte, jestli nějaký soubor JAR ve složce (pravděpodobně má být ve složce knihoven Hive, která je
/usr/hdp/current/hive/lib
ve službě HDInsight), obsahuje tuto třídu nebo ne. - Zkontrolujte třídu
org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
aorg.apache.hadoop.hive.serde2.MultiDelimitSerDe
jak je uvedeno v řešení.
Řešení
I když je soubor JAR binárním souborem, můžete stále použít
grep
příkaz s-Hrni
přepínači, jak je uvedeno níže, a vyhledat konkrétní název třídy.grep -Hrni "org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe" /usr/hdp/current/hive/lib
Pokud se třída nenašla, nevrátí žádný výstup. Pokud najde třídu v souboru JAR, vrátí výstup.
Níže je uvedený příklad, který pochází z clusteru HDInsight 4.x.
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
Z výše uvedeného výstupu můžeme potvrdit, že žádný soubor JAR neobsahuje třídu
org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
a soubor jar hive-exec obsahujeorg.apache.hadoop.hive.serde2.MultiDelimitSerDe
.Pokuste se vytvořit tabulku s formátem řádků DerDe jako
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.MultiDelimitSerDe
Tento příkaz problém vyřeší. Pokud jste tabulku už vytvořili, můžete ji přejmenovat pomocí následujících příkazů.
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';
Příkaz update slouží k ruční aktualizaci podrobností v back-endové databázi a příkaz alter se používá ke změně tabulky s novou třídou SerDe z beeline nebo Hive.
Porovnání skriptu schématu back-endové databáze Hive
Po dokončení migrace můžete spustit následující skript.
Existuje šance, že v back-endové databázi chybí několik sloupců, což způsobuje selhání dotazů. Pokud k upgradu schématu nedošlo správně, je možné, že dojde k problému s neplatným názvem sloupce. Následující skript načte název sloupce a datový typ z databáze back-endu zákazníka a poskytne výstup, pokud chybí nějaký sloupec nebo nesprávný datový typ.
Následující cesta obsahuje soubor schemacompare_final.py a test.csv. Skript se nachází v souboru "schemacompare_final.py" a soubor "test.csv" obsahuje název sloupce a datový typ pro všechny tabulky, které by měly být přítomné v back-endové databázi Hive.
https://hdiconfigactions2.blob.core.windows.net/hiveschemacompare/schemacompare_final.py
https://hdiconfigactions2.blob.core.windows.net/hiveschemacompare/test.csv
Stáhněte si tyto dva soubory z odkazu. Tyto soubory zkopírujte do jednoho z hlavních uzlů, kde je spuštěná služba Hive.
Postup spuštění skriptu:
V adresáři /tmp vytvořte adresář s názvem schemacompare.
Do složky /tmp/schemacompare vložte "schemacompare_final.py" a "test.csv". Proveďte "ls -ltrh /tmp/schemacompare/" a ověřte, jestli jsou soubory k dispozici.
Pokud chcete spustit skript Pythonu, použijte příkaz Python schemacompare_final.py. Tento skript spustí skript a dokončení tohoto skriptu trvá méně než pět minut. Výše uvedený skript se automaticky připojí k back-endové databázi a načte podrobnosti z každé a každé tabulky, kterou Hive používá, a aktualizuje podrobnosti v novém souboru CSV s názvem return.csv. Po vytvoření souboru return.csv porovná data se souborem "test.csv" a vytiskne název sloupce nebo datový typ, pokud v názvu tabulky chybí něco.
Jakmile po spuštění skriptu uvidíte následující řádky, které označují, že se podrobnosti načítají pro tabulky a skript probíhá.
KEY_CONSTRAINTS
Details Fetched
DELEGATION_TOKENS
Details Fetched
WRITE_SET
Details Fetched
SERDES
Details Fetched
A podrobnosti o rozdílu můžete zobrazit na řádku "PODROBNOSTI ROZDÍLU:". Pokud je nějaký rozdíl, vytiskne se
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.
Pokud v tabulce nejsou žádné rozdíly, je výstup
BUCKETING_COLS;
('difference', [])
PARTITIONS;
('difference', [])
V tomto výstupu můžete najít názvy sloupců, které chybí nebo nejsou správné. V back-endové databázi můžete spustit následující dotaz, abyste ověřili, jestli sloupec chybí nebo ne.
SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = 'PART_COL_STATS';
V případě, že některý ze sloupců v tabulce chybí, například když spustíme dotazy, jako je vložení nebo vložení, přepíšeme, statistiky se vypočítají automaticky a pokusí se aktualizovat tabulku statistik, jako je PART_COL_STATS a TAB_COL_STATS. A pokud v tabulkách chybí sloupec jako "BIT_VECTOR", dojde k chybě Neplatný název sloupce. Sloupec můžete přidat, jak je uvedeno v následujících příkazech. Jako alternativní řešení můžete statistiky zakázat nastavením následujících vlastností, které nemůžou aktualizovat statistiky v back-endové databázi.
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);
Tento krok zabraňuje selháním dotazů, které po migraci selžou s chybou Neplatný název sloupce.
Zabezpečení Hivu napříč verzemi HDInsight
HDInsight se volitelně integruje s ID Microsoft Entra pomocí balíčku zabezpečení HDInsight Enterprise (ESP). ESP ke správě oprávnění konkrétních prostředků v clusteru používá Kerberos a Apache Ranger. Zásady Rangeru nasazené pro Hive ve službě HDInsight 3.6 je možné migrovat do HDInsight 4.0 pomocí následujících kroků:
- V clusteru HDInsight 3.6 přejděte na panel Ranger Service Manager.
- Přejděte na zásadu s názvem HIVE a exportujte ji do souboru JSON.
- Ujistěte se, že v novém clusteru existují všichni uživatelé odkazovaní na json exportovaných zásad. Pokud se uživatel odkazuje v kódu JSON zásad, ale v novém clusteru neexistuje, přidejte uživatele do nového clusteru nebo odeberte odkaz ze zásad.
- V clusteru HDInsight 4.0 přejděte na panel Ranger Service Manager .
- Přejděte na zásadu s názvem HIVE a importujte json zásad rangeru z kroku 2.
Změny Hivu ve službě HDInsight 4.0, které můžou vyžadovat změny aplikace
Viz Extra konfigurace pomocí Připojení oru Hive Warehouse ke sdílení metastoru mezi Sparkem a Hivem pro tabulky ACID.
HDInsight 4.0 používá autorizaci na základě úložiště. Pokud upravíte oprávnění k souborům nebo vytvoříte složky jako jiný uživatel než Hive, pravděpodobně dojde k chybám Hive na základě oprávnění úložiště. Pokud chcete tento problém vyřešit, udělte
rw-
uživateli přístup. Viz Průvodce oprávněními HDFS.HiveCLI
je nahrazena znakemBeeline
.
Další změny najdete v oznámení HDInsight 4.0.
Po migraci
Po dokončení migrace nezapomeňte postupovat podle těchto kroků.
Sanita tabulky
- Znovu vytvořte tabulky v Hive 3.1 pomocí CTAS nebo IOW a změňte typ tabulky místo změny vlastností tabulky.
- Ponechte hodnoty doA jako false.
- Ujistěte se, že vlastnictví spravovaných tabulek nebo dat je u uživatele hive.
- Používejte spravované tabulky ACID, pokud je formát tabulky ORC a spravovaný jiný než ACID pro jiné typy než ORC.
- Opětovné vygenerování statistik u znovu vytvořených tabulek, protože migrace by způsobila nesprávné statistiky.
Stav clusteru
Pokud více clusterů sdílí stejné úložiště a databázi HMS, měli bychom povolit automaticky komprimační/komprimační vlákna pouze v jednom clusteru a zakázat všude jinde.
Vylaďte metastore, abyste snížili využití procesoru.
Zakažte naslouchací procesy transakčních událostí.
Poznámka:
Následující kroky proveďte pouze v případě, že se nepoužívá funkce replikace Hive.
- Z uživatelského rozhraní Ambari odeberte hodnotu hive.metastore.transactional.event.listeners.
- Výchozí hodnota:
org.apache.hive.hcatalog.listener.DbNotificationListener
- Nová hodnota:
<Empty>
Zakázání Hive PrivilegeSynchronizer
- V uživatelském rozhraní Ambari nastavte hive.privilege.synchronizer = false.
- Výchozí hodnota:
true
- Nová hodnota:
false
Optimalizace funkce opravy oddílů
Zakázat opravu oddílů – Tato funkce slouží k synchronizaci oddílů tabulek Hive v umístění úložiště s metastorem Hive. Tuto funkci můžete zakázat, pokud se po příjmu dat použije oprava msck.
Pokud chcete funkci zakázat , přidejte do vlastností tabulky příkaz discover.partitions=false pomocí příkazu ALTER TABLE. NEBO (pokud tuto funkci nejde zakázat)
Zvyšte frekvenci oprav oddílů.
V uživatelském rozhraní Ambari zvyšte hodnotu metastore.partition.management.task.frequency (v sekundách).
Poznámka:
Tato změna může zpozdit viditelnost některých oddílů přijatých do úložiště.
- Výchozí hodnota:
60
- Navrhovaná hodnota:
3600
- Výchozí hodnota:
Pokročilé optimalizace: Před použitím na produkční prostředí je potřeba otestovat následující možnosti v nižším (neprodukčním) prostředí.
- Pokud se materializované zobrazení nepoužívá, odeberte naslouchací proces související s materializovaným zobrazením.
- Z uživatelského rozhraní Ambari přidejte vlastní vlastnost (ve vlastním hive-site.xml) a odeberte nežádoucí vlákna metastoru na pozadí.
- Název vlastnosti: metastore.task.threads.remote
- Výchozí hodnota:
N/A (it uses few class names internally)
- Nová hodnota:
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
Pokud je replikace zakázaná, zakažte vlákna na pozadí.
- Z uživatelského rozhraní Ambari přidejte vlastní vlastnost (ve vlastním hive-site.xml) a odeberte nežádoucí vlákna.
- Název vlastnosti: metastore.task.threads.always
- Výchozí hodnota:
N/A (it uses few class names internally)
- Nová hodnota:
org.apache.hadoop.hive.metastore.RuntimeStatsCleanerTask
Ladění dotazů
- Ponechte výchozí konfigurace Hivu pro spouštění dotazů, protože jsou vyladěné pro úlohy TPC-DS. Potřebujete ladění na úrovni dotazu jenom v případě, že selže nebo běží pomalu.
- Ujistěte se, že jsou statistiky aktuální, abyste se vyhnuli špatným plánům nebo nesprávným výsledkům.
- Vyhněte se kombinování externích a spravovaných tabulek ACID v typu spojení dotazů. V takovém případě se pokuste převést externí na spravovanou tabulku, která není acid, prostřednictvím rekreačního prostředí.
- V Hive-3 se hodně práce stalo s vektorizací, CBO, časovým razítkem se zónou atd., což může mít chyby produktu. Pokud tedy některý dotaz vrátí nesprávné výsledky, zkuste zakázat vektorizaci, CBO, připojení map atd., abyste zjistili, jestli to pomůže.
Další kroky, které je potřeba provést k opravě nesprávných výsledků a nízkého výkonu po migraci
Dotaz Hive vydá nesprávný výsledek. I výběrový dotaz (*) vrátí nesprávný výsledek.
Příčina Vlastnost hive.compute.query.using.stats je ve výchozím nastavení nastavená na hodnotu true. Pokud nastavíme hodnotu true, použije statistiky uložené v metastoru ke spuštění dotazu. Pokud statistiky nejsou aktuální, výsledkem jsou nesprávné výsledky.
Řešení shromažďuje statistiky spravovaných tabulek pomocí
alter table <table_name> compute statics;
příkazu na úrovni tabulky a na úrovni sloupce. Odkaz na odkaz – https://cwiki.apache.org/confluence/display/hive/statsdev#StatsDev-TableandPartitionStatisticsProvádění dotazů Hive trvá dlouho.
Příčina: Pokud dotaz obsahuje podmínku spojení, hive vytvoří plán, jestli se má použít připojení k mapování nebo sloučení spojení na základě velikosti tabulky a podmínky spojení. Pokud jedna z tabulek obsahuje malou velikost, načte tuto tabulku do paměti a provede operaci spojení. Tímto způsobem je provádění dotazu rychlejší v porovnání s slučovacím spojením.
Řešení Nezapomeňte nastavit vlastnost hive.auto.convert.join=true, což je výchozí hodnota. Když ho nastavíte na false, použije se spojení sloučení a může dojít k nízkému výkonu. Hive se rozhodne, jestli se má použít připojení k mapě nebo ne, na základě následujících vlastností, které jsou nastavené v clusteru.
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>;
Běžné spojení se může automaticky převést na mapování spojení, pokud
hive.auto.convert.join.noconditionaltask=true
je odhadovaná velikost malých tabulek menší než podregistr.auto.convert.join.noconditionaltask.size
(výchozí hodnota je 10000000 MB).Pokud se setkáte s jakýmkoli problémem souvisejícím s OOM nastavením vlastnosti
hive.auto.convert.join
na hodnotu true, doporučujeme ji nastavit na false pouze pro konkrétní dotaz na úrovni relace a ne na úrovni clusteru. K tomuto problému může dojít v případě, že jsou statistiky chybné a Hive se rozhodne použít připojení k mapě na základě statistik.
Problém s dotazem Hive vrátí nesprávný výsledek, pokud má dotaz podmínku spojení a příslušné tabulky mají hodnoty null nebo prázdné.
Příčina Někdy může dojít k problému souvisejícímu s hodnotami null, pokud tabulky zahrnuté v dotazu obsahují velké množství hodnot null. Hive provede optimalizaci dotazu nesprávně s hodnotami null, které mají za následek nesprávné výsledky.
Řešení Doporučujeme zkusit nastavit vlastnost
set hive.cbo.returnpath.hiveop=true
na úrovni relace, pokud se zobrazí nesprávné výsledky. Tato konfigurace zavádí nenulové filtrování pro klíče spojení. Pokud mají tabulky mnoho hodnot null pro optimalizaci operace spojení mezi více tabulkami, můžeme tuto konfiguraci povolit, aby se zvažuje pouze hodnoty null.Problém s dotazem Hive vrátí nesprávný výsledek, pokud má dotaz více podmínek spojení.
Příčina Sometime Tez vytváří chybné plány modulu runtime pokaždé, když jsou stejná spojení s map-joins více času.
Řešení má šanci získat nesprávné výsledky, když nastavíme
hive.merge.nway.joins
hodnotu false. Zkuste ho nastavit na true jenom pro dotaz, který to ovlivnilo. To pomáhá dotazovat se více spojeními ve stejné podmínce a sloučit spojení dohromady do jednoho operátoru spojení. Tato metoda je užitečná, pokud se velké shuffle spojí, aby se zabránilo reshuffle fáze.Problém: V porovnání s předchozími spuštěními dochází ke zvýšení doby provádění dotazu o den.
Příčinou tohoto problému může být zvýšení většího počtu malých souborů. Hive tedy potřebuje čas při čtení všech souborů ke zpracování dat, což vede ke zvýšení doby provádění.
Řešení : Nezapomeňte často spouštět komprimace pro tabulky, které jsou spravovány. Tento krok zabrání malým souborům a zlepší výkon.
Referenční odkaz: Transakce Hive – Apache Hive – Apache Software Foundation.
Problém s dotazem Hive dává nesprávný výsledek, když zákazník používá podmínku spojení u spravované tabulky acid orc a spravovanou tabulku bez ACID orc.
Příčina Od HIVE 3 je přísně požadována, aby všechny spravované tabulky zůstaly jako acid table. A pokud ji chceme zachovat jako kyselinovou tabulku, musí být formát tabulky orc a to je hlavní kritéria. Pokud ale zakážeme vlastnost striktní spravované tabulky hive.strict.managed.tables na false, můžeme vytvořit spravovanou tabulku, která není acid. V některých případech zákazník vytvoří externí tabulku ORC nebo po migraci převedenou na externí tabulku a zakáže striktní vlastnost spravované tabulky a převede ji na spravovanou tabulku. V tomto okamžiku se tabulka převedla na nespravovaný formát orc bez acid.
Optimalizace Hivu řešení se pokazí, pokud připojíte tabulku s tabulkou, která není spravovaná pomocí ACID spravované tabulky ORC s tabulkou orc spravovanou kyselinou.
Pokud převádíte externí tabulku na spravovanou tabulku,
- Nenastavujte vlastnost hive.strict.managed.tables na false. Pokud nastavíte, můžete vytvořit tabulku, která není spravovaná službou ACID, ale není požadována v HIVE-3.
- Místo následujícího příkazu alter převeďte externí tabulku na spravovanou tabulku.
alter table <table_name> set TBLPROPERTIES ('EXTERNAL'='false');
alter table rt set TBLPROPERTIES ('EXTERNAL'='false', 'transactional'='true');
Příručka pro řešení problémů
Průvodce odstraňováním potíží se službou HDInsight 3.6 až 4.0 pro úlohy Hive poskytuje odpovědi na běžné problémy při migraci úloh Hive ze služby HDInsight 3.6 do HDInsight 4.0.
Další texty
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro