Kaptár válaszfalak és vödrök példával

⚡ Okos összefoglaló

A partíciók és a vödrök az Apache Hive kétféleképpen osztja fel a táblaadatokat a lemezen: egy partíció kulcsértékenként egy könyvtárat hoz létre, míg egy vödör rögzített számú fájlba hasheli a sorokat.

  • 🗂️ A partíció egy könyvtár: A partíciós kulcs minden egyes különálló értéke saját alkönyvtárrá válik a HDFS táblamappájában.
  • ✂️ Partíció metszése: Egy partíciós kulcs alapján szűrő lekérdezés csak a megfelelő könyvtárakat olvassa be a teljes tábla beolvasása helyett.
  • 🇧🇷 Dinamikus mód szükséges: Több partíció SELECT metódusból történő betöltéséhez a hive.exec.dynamic.partition.mode értékét nonstrict értékre kell állítani.
  • 🧮 A vödör egy fájl: A CLUSTERED BY függvény hasheli a kiválasztott oszlopot, és minden sort egy rögzített számú fájl egyikébe ír.
  • 🔍 Mintavételezés és illesztések: A vödrös táblák hatékony TABLESAMPLE olvasásokat és térképoldali vödrös illesztéseket támogatnak, amelyeket a sima táblák nem tudnak.
  • 📐 Válasszon kardinalitás szerint: Particionálás alacsony számosságú oszlopok, például állapot vagy dátum szerint, és gyűjtés magas számosságú oszlopok, például felhasználói azonosítók szerint.

A kaptár partícióinak és vödreinek magyarázata egy működő példával

A táblák, partíciók és vödrök a Hive adatmodellezésének részei. Egy tábla határozza meg a sémát, egy partíció a táblát a lemezen található könyvtárakra osztja, és egy vödrök a könyvtárban lévő adatokat rögzített számú fájlra osztják.

Mi az a partíciók?

A Hive partíciók egy módja a táblák partíciókba rendezésének a partíciós kulcsok alapján különböző részekre osztásával. Fizikailag minden partíció egy külön alkönyvtár a HDFS táblamappája alatt, ami lehetővé teszi a Hive számára, hogy kihagyja a nem szükséges adatokat.

A partíció akkor hasznos, ha a tábla egy vagy több partíciós kulccsal rendelkezik. A partíciós kulcsok alapvető elemek annak meghatározására, hogy hogyan tárolódnak az adatok a táblában. A partíciós kulcs nem magukban az adatfájlokban tárolódik – az értéke a könyvtár nevében van kódolva, így egy erre a kulcsra szűrt lekérdezés teljes könyvtárakat dobhat el, mielőtt bármelyik sor beolvasásra kerülne. Ezt partíciótisztításnak nevezik.

Például: –

„Az ügyfél rendelkezik néhány e-kereskedelmi adattal, amelyek indiai műveletekhez tartoznak, ahol minden állam (38 állam) műveletet egészében említenek. Ha az állapot oszlopot vesszük partíciós kulcsként, és particionálást végzünk az indiai adatok egészén, akkor megkaphatjuk a partíciók számát (38 partíció), ami megegyezik az Indiában jelen lévő államok számával (38). Így minden államadat külön megtekinthető a partíciós táblázatokban.”

Minta Code Kódrészlet a partíciókhoz

Az alábbi hat utasítás sorrendben fut a Hive shellben. Mindegyik egy különálló lépés, és az azt követő képernyőképek ugyanazt a sorozatot mutatják egy élő fürtön végrehajtva.

  1. Az allstates tábla létrehozása
    create table allstates(state string, District string,Enrolments string)
    
    row format delimited
    
    fields terminated by ',';
    
  2. Adatok betöltése a létrehozott allstates táblába
    Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
  3. Partíciós tábla létrehozása
    create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
  4. A partícióhoz be kell állítanunk ezt a tulajdonságot
    set hive.exec.dynamic.partition.mode=nonstrict
  5. Adatok betöltése partíciós táblába
    INSERT OVERWRITE TABLE state_part PARTITION(state)
    SELECT district,enrolments,state from  allstates;
  6. A partíciós táblák tényleges feldolgozása és kialakítása partíciós kulcsként állapot alapján

A HDFS tárolóban 38 partíciós kimenet lesz, a fájlnévvel mint állapotnévvel. Ezt fogjuk ellenőrizni ebben a lépésben.

A következő képernyőképek a fent említett kód végrehajtását mutatják be.

Az első képernyőn az 1. lépés a következő helyen fut: kaptár> felszólít és létrehozza a minden állam tábla három oszloppal és vesszővel a mezőelválasztóként.

A kaptár shell létrehozza az allstates táblát három elválasztott oszloppal

A következő képernyő a 2. és 3. lépést mutatja be: az AllStates.csv fájl betöltődik a minden állam, és a particionált tábla állam_része létrejön, a partíciós kulcsként deklarált állapottal.

Az AllStates.csv fájl betöltése az allstates mappába és a state_part particionált tábla létrehozása

Ezután a 4. és 5. lépés jelenik meg. A dinamikus partíciós mód nem szigorú értékre van állítva, és az INSERT OVERWRITE utasítás elindít egy MapReduce feladatot, amelynek naplósorai minden egyes állapotértékhez egy partíció betöltését mutatják.

MapReduce feladat kimenete egy Hive-partíció betöltése állapotértékenként

A HDFS-ben a raktárkönyvtár listázása megerősíti a 6. lépés eredményét – a shell 38 elemet jelent, egyet állapot_rész/állapot= könyvtár államonként.

A HDFS lista 38 state_part partíciós könyvtárat mutat a Hive adattárházban

A fenti kódból a következőket tesszük

  1. Az allstates tábla létrehozása 3 oszlopnévvel, például állam, kerület és beiratkozások
  2. Adatok betöltése az allstates táblába
  3. Partíciós tábla létrehozása partíciókulcsként állapottal
  4. Ebben a lépésben a partíciós módot nem szigorúra kell állítani (ez a mód aktiválja a dinamikus partíciós módot)
  5. Adatok betöltése a state_part partíciós táblába
  6. A partíciós táblák tényleges feldolgozása és kialakítása partíciós kulcsként állapot alapján
  7. A HDFS tárolóban 38 partíciós kimenet lesz, ahol az állapotnév a fájlnév lesz. Ebben a lépésben a 38 partíciós kimenetet látjuk a HDFS-ben.

Statikus vs. dinamikus particionálás a Hive-ban

A fenti kidolgozott példa dinamikus particionálást használ, de a Hive két betöltési stílust támogat, és a különbség határozza meg, hogy mennyi typing – és hogy mekkora kockázatot hordoz – minden egyes rakomány.

Statikus particionálás magában az utasításban nevezi meg a partíció értékét, tehát az értéket ismerni kell a betöltés futtatása előtt, és egy utasítás pontosan egy partíciót tölt ki. Dinamikus particionálás lehetővé teszi a Hive számára, hogy a SELECT lista utolsó oszlopából olvassa ki a partíció értékét, és futásidőben hozza létre a könyvtárakat, ezért a példának csak egyetlen INSERT utasításra van szüksége 38 könyvtár létrehozásához.

Aspect Statikus particionálás Dinamikus particionálás
Partícióérték Kézzel szállítva a PARTITION záradékban Futásidőben beolvas a SELECT oszlopból
Partíciók utasításonként egy Sok
Configuration Az alapértelmezett szigorú módban működik A hive.exec.dynamic.partition.mode fájlt nem szigorú értékre kell állítani.
Terhelési sebesség Gyorsabb, mert nincs szükség értékszkennelésre Lassabb, mert a feladat kulcsok szerint csoportosítja a sorokat
A legalkalmasabb Kis, ismert készletek, például napi adag Nagy vagy ismeretlen kulcskészletek, például 38 állapot

A dinamikus betöltések is korlátozottak. A Hive korlátozza, hogy hány partíciót hozhat létre egy feladat – alapértelmezés szerint 100 leképezőnként vagy reduktoronként és 1000 a teljes utasításra vonatkozóan –, és a feladat meghiúsul, ha bármelyik határértéket átlépik, így egy nagyon magas kardinalitású kulcshoz ezeket a korlátokat meg kell emelni, vagy más kialakításra van szükség.

Mi az a Buckets?

A Hive-ban a vödrök a Hive táblaadatok több fájlba vagy könyvtárba történő szétválasztására szolgálnak. Hatékony lekérdezésre szolgálnak, és a partíciókkal ellentétben a vödrök száma a tábla létrehozásakor rögzített, így soha nem növekszik az adatokkal.

  • Az ezekben a partíciókban található adatok tovább oszthatók vödrökre
  • A felosztást a táblázatban kiválasztott oszlopok hash-e alapján végezzük.
  • A vödrök valamilyen hashelési algoritmust használnak a háttérben az egyes rekordok beolvasásához és a vödrökbe helyezéséhez.
  • Egy sor melyik vödörbe érkezzen, attól függ, hogy hash_function(vödröző_oszlop) mod vödrök_száma, így az azonos értékek mindig ugyanabba a fájlba kerülnek
  • A Hive 0.x és 1.x verzióin a bucketinget engedélyezni kellett a következővel: set hive.enforce.bucketing=true; a beillesztés előtt

Ez az utolsó beállítás az aktuális klaszter előzményei: az Apache Hive kézikönyve megjegyzi, hogy a Hive 2.x verziójától kezdve nincs rá szükség, mivel a motor mostantól automatikusan kiválasztja a tábla definíciójából a redukálók számát és a fürtök szerinti oszlopot.

Step 1) Vödör létrehozása az alábbiak szerint.

Az alábbi képernyő a CREATE TABLE utasítást mutatja a következőhöz: mintavödör, ahol az alsó CLUSTERED BY záradék rögzíti a vödrök számát.

A Hive CREATE TABLE utasítása négy vödrbe csoportosítja a samplebucketet

A fenti képernyőképből

  • Samplebucket-et hozunk létre olyan oszlopnevekkel, mint a first_name, job_id, department, salary és country
  • Négy vödröt készítünk itt.
  • Miután az adatok betöltődtek, automatikusan 4 tárolóba helyezi azokat.
  • Az ország oszlop a klaszterezési oszlop, tehát egy ország minden sora ugyanabba a tárolófájlba kerül.

Step 2) Adatok betöltése a samplebucket táblába

Feltételezve, hogy az „employees” tábla már létre van hozva a Hive rendszerben, ebben a lépésben az adatok betöltését fogjuk látni az employees táblából a samplebucket táblába.

Mielőtt elkezdenénk az alkalmazottak adatait vödrökbe helyezni, győződjünk meg arról, hogy azok oszlopneveket tartalmaznak, például keresztnév, munkaköri azonosító, részleg, fizetés és ország.

Itt töltünk adatokat a samplebucket mappába az employees táblából – az alábbi képernyőkép az INSERT OVERWRITE utasítást mutatja, amely a másolást végzi.

INSERT OVERWRITE utasítás, amely az alkalmazottak sorait másolja a samplebucket táblába

Step 3) Az 1. lépésben létrehozott 4 vödör megjelenítése

A HDFS táblakönyvtárának listázása a fizikai eredményt mutatja: négy számozott adatfájl egy helyett.

A samplebucket könyvtár alatt létrehozott négy bucket fájl HDFS listája

A fenti képernyőképen láthatjuk, hogy az alkalmazottak táblájából származó adatok átkerülnek az 1. lépésben létrehozott 4 vödörbe.

Kaptár particionálás vs. vödrözés: Főbb különbségek

Mindkét funkció kisebb darabokra vágja a táblázatot, de ezt a fájlrendszer különböző szintjein teszik, és különböző problémákra adnak választ. Az alábbi táblázat egymás mellé helyezi őket.

Összehasonlítási pont Particionálás Vödrösítés
Egység létrehozva Egy könyvtár kulcsértékenként Egy fájl hashvödörönként
Kijelentve a következővel: PARTÍCIÓK SZERINT … n VÖDÖRBE CSOPORTOSÍTVA
Darabszám A különböző értékek számával növekszik Javítva a tábla létrehozásakor
Adatfájlokban tárolt oszlop Nem – az érték a könyvtár nevében található Igen – az oszlop normál oszlop marad
Legjobb oszloptípus Alacsony kardinalitás, például állam, év vagy ország Magas kardinalitás, például user_id vagy transaction_id
Fő előny A partíciók metszése kihagyja a felesleges könyvtárakat Egyenletes fájlméretek, olcsó mintavételezés és térképoldali illesztések

A kettő nem rivális. Egy gyakori éles elrendezés dátum szerint particionálja a ténytáblát, majd a join kulcs alapján naponta csoportosítja a tárolókat, így a lekérdezés egyetlen könyvtárra metszi a tárolókat, majd azon belül csoportosítja a tárolókat.

Mikor használjunk particionálást, vödrözést vagy mindkettőt?

A választás az oszlop kardinalitásával és a táblázatot olvasó lekérdezések alakjával kezdődik.

  • Feloszt amikor a lekérdezések szinte mindig ugyanazon az alacsony számosságú oszlopon szűrnek, és amikor a különböző értékek száma több százban, nem pedig milliókban marad
  • Vödör amikor a hasznos oszlop túl sok különböző értékkel rendelkezik ahhoz, hogy könyvtár legyen, vagy amikor a táblát ismételten összekapcsolják vagy mintavételezik az adott oszlop alapján
  • Használja mindkettőt nagyméretű ténytáblák esetén: particionálás dátum szerint, majd gyűjtőként bontás minden partíción belül a csatlakozási kulcs szerint

A figyelendő hibamód a kis fájlok problémája. Egy nagyon magas kardinalitású oszlop – időbélyeg vagy ügyfél-azonosító – alapján történő particionálás több ezer apró könyvtárat hoz létre, amelyek mindegyike egy, a HDFS blokkméretnél jóval kisebb fájlt tartalmaz. Ez felfújja a NameNode memóriáját, és minden vizsgálatot lelassít, ami pontosan az eredmény particionálásának célja volt. A bucketelés ezt elkerüli, mert a fájlok számát a tábladefiníció korlátozza.

A tárolókba rendezésnek (bucketing) megvan a maga fenntartása: az elrendezés csak akkor helyes, ha minden író tiszteletben tartja azt. A létrehozáskor deklarált tárolók száma metaadat, így egy olyan feladat, amely helyes fürtözés nélkül ír a táblába, olyan fájlokat hagyhat maga után, amelyek nem felelnek meg a deklarált elrendezésnek, és a későbbi mintavételezés vagy tárolócsatlakozások rossz sorokat fognak olvasni.

GYIK

Futtassa a SHOW PARTITIONS table_name parancsot a Hive shellben. Ez beolvassa a metaadattárat, és partíciónként egy sort nyomtat ki, ami gyorsabb, mint a HDFS-ben a tárház elérési útjának listázása, és azt is ellenőrzi, hogy a metaadattár szinkronban van-e.

Az ALTER TABLE table_name ADD PARTITION (state='Goa') parancs regisztrál egy új könyvtárat, és az ALTER TABLE table_name DROP PARTITION (state='Goa') eltávolítja azt. Dropping egy felügyelt partíció törli az adatait, miközben a dropping egy külső csak a metaadattár bejegyzést törli.

A Hive alapértelmezés szerint csomópontonként 100-ra, utasításonként pedig 1000-re korlátozza a dinamikus partíciók számát. Egy több különböző értékkel rendelkező kulcs kiiktatja a korlátot és leállítja a jobot. Emeld meg a hive.exec.max.dynamic.partitions.pernode és a hive.exec.max.dynamic.partitions értékeket, vagy válassz durvább kulcsot.

Nem. A Hive 0.x és 1.x verzióin szükség volt rá, hogy a reduktorok számát a gyűjtők számával egyezzen meg. A HIVE-12331 eltávolította ezt a Hive 2.0-ban, és a motor mostantól mind a reduktorok számát, mind a fürtök oszlopát a táblázatból származtatja.

A TABLESAMPLE(BUCKET x OUT OF y ON oszlop) függvény csak az egyező bucket fájlokat olvassa be ahelyett, hogy mindent átvizsgálna. Mivel a sorok íráskor ugyanazon az oszlopon lettek hashelve, a minta megismételhető és sokkal olcsóbb, mint egy véletlenszerű sorszűrő.

Egy tábla több ezer apró fájlra való felosztása pazarolja a NameNode memóriáját, és fájlonként egy feladatot indít el, így a vizsgálat lelassul. Általában egy nagyon magas kardinalitású partíciós kulcsot követ. Durvább kulcsok, vödrözés vagy fájltömörítés oldja meg a problémát.

Igen. A lekérdezésnapló-elemzés és a gépi tanulási modellek olyan eszközökben, mint a Cloudera Workload XM, a szűrőgyakoriság, a ferdülés és a kardinalitás alapján rangsorolják az oszlopokat, majd elrendezést javasolnak. A javaslatot továbbra is felül kell vizsgálni, mert nem látja a tervezett munkaterheléseket.

A Copilot gyorsan elkészíti a PARTITIONED BY és CLUSTERED BY utasításokat egy megjegyzésből, az ügynöki asszisztensek pedig teljes betöltési szkriptet tudnak generálni. Mindig ellenőrizd a generált tárolóegységek számát és kulcsát a valós kardinalitással szemben, mert a modell csak a nevekből tippel.

Foglald össze ezt a bejegyzést a következőképpen: