Pesän väliseinät ja kauhat esimerkillä

⚡ Älykäs yhteenveto

Osiot ja säilöjä ovat kaksi tapaa, joilla Apache Hive jakaa taulukon tiedot levylle: osio luo yhden hakemiston avainarvoa kohden, kun taas säilö tiivistää rivit kiinteäksi määräksi tiedostoja.

  • 🗂️ Osio on hakemisto: Jokaisesta osioavaimen erillisestä arvosta tulee oma alihakemistonsa HDFS:n taulukkokansiossa.
  • ✂️ Osioiden karsinta: Osioavaimen perusteella suodattava kysely lukee vain vastaavat hakemistot koko taulukon skannaamisen sijaan.
  • ⚙️ Dynaaminen tila vaaditaan: Useiden osioiden lataaminen SELECT-komennosta vaatii hive.exec.dynamic.partition.mode-asetuksen olevan nonstrict.
  • 🧮 Bucket on tiedosto: CLUSTERED BY hajauttaa valitun sarakkeen ja kirjoittaa jokaisen rivin yhteen kiinteästä määrästä tiedostoja.
  • 🔍 Näytteenotto ja liitokset: Kauhataulukot tukevat tehokkaita TABLESAMPLE-lukuja ja kartan puolen kauhaliitoksia, joihin tavalliset taulukot eivät pysty.
  • 📐 Valitse kardinaalisuuden mukaan: Jaa matalan kardinaliteettinsa sarakkeisiin, kuten tila tai päivämäärä, ja ryhmittele korkean kardinaliteettinsa sarakkeisiin, kuten käyttäjätunnuksiin.

Pesän osiot ja ämpärit selitettynä toimivan esimerkin avulla

Taulukot, osiot ja säilöelementit ovat Hive-tietomallinnuksen osia. Taulukko määrittelee skeeman, osio jakaa taulukon levyllä oleviin hakemistoihin ja säilöelementti jakaa hakemiston tiedot kiinteään määrään tiedostoja.

Mikä on Partitions?

Hive Partitions on tapa järjestää taulukoita osioiksi jakamalla taulukot eri osiin osioavainten perusteella. Fyysisesti jokainen osio on erillinen alihakemisto HDFS:n taulukkokansion alla, minkä ansiosta Hive voi ohittaa tarpeettomia tietoja.

Partitio on hyödyllinen, kun taulukossa on yksi tai useampi osioavain. Osiointiavaimet ovat peruselementtejä, jotka määrittävät, miten tiedot tallennetaan taulukkoon. Osiointiavainta ei tallenneta itse datatiedostojen sisään – sen arvo koodataan hakemiston nimeen, joten kyseisen avaimen perusteella suodattava kysely voi hylätä kokonaisia ​​hakemistoja ennen kuin yhtäkään riviä on luettu. Tätä kutsutaan osiointikarsinnaksi.

Esimerkiksi: –

”Asiakkaalla on verkkokauppadataa, joka kuuluu Intian toimintoihin, joissa kutakin osavaltiota (38 osavaltiota) käsitellään kokonaisuutena. Jos otamme osavaltiosarakkeen osioavaimeksi ja suoritamme osioinnin kyseiselle Intian datalle kokonaisuutena, voimme saada osioiden määrän (38 osiota), joka on yhtä suuri kuin Intiassa olevien osavaltioiden lukumäärä (38). Siten kutakin osavaltiodataa voidaan tarkastella erikseen osiotaulukoissa.”

Näyte Code Katkelma osioille

Alla olevat kuusi lausetta suoritetaan Hive-komennossa järjestyksessä. Jokainen on erillinen vaihe, ja seuraavat kuvakaappaukset näyttävät saman sarjan suoritettavan reaaliaikaisessa klusterissa.

  1. allstates-taulukon luominen
    create table allstates(state string, District string,Enrolments string)
    
    row format delimited
    
    fields terminated by ',';
    
  2. Ladataan tietoja luotuun allstates-taulukkoon
    Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
  3. Osiotaulukon luominen
    create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
  4. Osiota varten meidän on asetettava tämä ominaisuus
    set hive.exec.dynamic.partition.mode=nonstrict
  5. Ladataan tietoja osiotaulukkoon
    INSERT OVERWRITE TABLE state_part PARTITION(state)
    SELECT district,enrolments,state from  allstates;
  6. Varsinainen osiotaulukoiden käsittely ja muodostaminen osioavaimen tilan perusteella

HDFS-tallennustilassa on 38 osiotulostetta, joiden tilana on tiedostonimi. Tarkistamme tämän tässä vaiheessa.

Seuraavat näyttökuvat näyttävät edellä mainitun koodin suorituksen.

Ensimmäisessä näytössä vaihe 1 suoritetaan pesä> kehote ja luo kaikki osavaltiot taulukko, jossa on kolme saraketta ja pilkku kenttien erottimena.

Hive-kuori, joka luo allstates-taulukon, jossa on kolme eroteltua saraketta

Seuraava näyttö kattaa vaiheet 2 ja 3: AllStates.csv-tiedosto ladataan kaikki osavaltiotja osioitu taulukko osavaltion_osa luodaan siten, että tila on ilmoitettu osioavaimeksi.

Tiedoston AllStates.csv lataaminen allstates-kenttään ja osioidun state_part-taulukon luominen

Vaiheet 4 ja 5 tulevat seuraavaksi näkyviin. Dynaaminen osiotila asetetaan ei-rajoittavaksi ja INSERT OVERWRITE -lauseke käynnistää MapReduce-työn, jonka lokirivit näyttävät yhden osion latauksen kullekin tila-arvolle.

MapReduce-työn tuloste lataa yhden Hive-osion tila-arvoa kohden

Varastohakemiston listaaminen HDFS:ssä vahvistaa vaiheen 6 tuloksen – komentotulkki raportoi 38 kohdetta, yhden osavaltion_osa/osavaltio= hakemisto osavaltioittain.

HDFS-listaus, joka näyttää 38 state_part-osiohakemistoa Hive-varastossa

Yllä olevasta koodista teemme seuraavat asiat

  1. Kolmen sarakkeen nimellä varustetun allstates-taulukon luominen, kuten osavaltio, piirikunta ja ilmoittautumiset
  2. Ladataan tietoja taulukkoon allstates
  3. Osiotaulukon luominen tilalla osioavaimena
  4. Tässä vaiheessa osiotilan asettaminen ei-tiukaksi (tämä tila aktivoi dynaamisen osiotilan)
  5. Ladataan tietoja osiotaulukkoon state_part
  6. Varsinainen osiotaulukoiden käsittely ja muodostaminen osioavaimen tilan perusteella
  7. HDFS-tallennustilassa on 38 osiolähtöä, joiden tilana on tiedostonimi. Tässä vaiheessa näemme 38 osiolähtöä HDFS:ssä.

Staattinen vs. dynaaminen osiointi Hivessä

Yllä oleva esimerkki käyttää dynaamista osiointia, mutta Hive tukee kahta lataustyyliä ja ero määrää, kuinka paljon typing – ja kuinka paljon riskejä – kukin kuorma sisältää.

Staattinen osiointi nimeää osion arvon itse lausekkeessa, joten arvo on tiedettävä ennen latauksen suorittamista ja yksi lauseke täyttää täsmälleen yhden osion. Dynaaminen osiointi antaa Hiven lukea osion arvon SELECT-listan viimeisestä sarakkeesta ja luoda hakemistot suorituksen aikana, minkä vuoksi esimerkissä tarvitaan vain yksi INSERT-käsky 38 hakemiston luomiseen.

Aspect Staattinen osiointi Dynaaminen osiointi
Osion arvo Toimitetaan käsin PARTITION-lausekkeessa Lue suorituksen aikana SELECT-sarakkeesta
Osiot lausetta kohden yksi Paljon
Konfigurointi Toimii oletusarvoisessa tiukassa tilassa Edellyttää, että hive.exec.dynamic.partition.mode on asetettu arvoon nonstrict.
Kuormitusnopeus Nopeampi, koska arvoskannausta ei tarvita Hitaampi, koska työ ryhmittelee rivit avaimen mukaan
Soveltuu parhaiten Pienet, tunnetut sarjat, kuten päivittäinen kuorma Suuret tai tuntemattomat avainjoukot, kuten 38 tilaa

Myös dynaamisille kuormille on asetettu rajoituksia. Hive rajoittaa yhden työtehtävän luomien osioiden määrää – oletusarvoisesti 100 osiota per mapper tai reducer ja 1000 koko lausekkeelle – ja työ epäonnistuu, kun jompikumpi näistä osioista ylittyy, joten erittäin korkean kardinaliteettiarvon omaava avain tarvitsee näiden rajojen nostamisen tai erilaisen suunnittelun.

Mikä on Buckets?

Hive-järjestelmässä säilöjä käytetään Hive-taulukkodatan jakamiseen useisiin tiedostoihin tai hakemistoihin. Niitä käytetään tehokkaaseen kyselyyn, ja toisin kuin osioissa, säilöjen määrä on kiinteä taulukkoa luotaessa, joten se ei koskaan kasva datan mukana.

  • Näissä osioissa oleva data voidaan jakaa edelleen osiin (säilöihin)
  • Jako suoritetaan taulukosta valittujen tiettyjen sarakkeiden tiivisteen perusteella
  • Kauhat käyttävät jonkinlaista hajautusalgoritmia taustalla lukeakseen jokaisen tietueen ja sijoittaakseen sen kauhoihin
  • Rivin osumispaikka määräytyy sen mukaan, hash_function(bucketing_column) mod num_bucketsjoten samat arvot päätyvät aina samaan tiedostoon
  • Hive 0.x- ja 1.x-versioissa kauhojen luonti piti ottaa käyttöön aseta hive.enforce.bucketing=true; ennen lisäystä

Viimeinen asetus on historia nykyisessä klusterissa: Apache Hiven käyttöohje huomauttaa, että sitä ei tarvita Hive 2.x:stä eteenpäin, koska moottori valitsee nyt redusoijien määrän ja klusterikohtaisen sarakkeen taulukkomäärityksestä automaattisesti.

Vaihe 1) Kauhan luominen alla olevan kuvan mukaisesti.

Alla oleva näyttö näyttää CREATE TABLE -käskyn kohteelle näyteämpäri, jossa alareunassa oleva CLUSTERED BY -lauseke määrittää säiliöiden määrän.

Hive CREATE TABLE -lauseke klusteroi samplebucketin neljään säilöön

Yllä olevasta kuvakaappauksesta

  • Luomme esimerkkiämpärin, jonka sarakeniminä on esimerkiksi etunimi, työpaikkatunnus, osasto, palkka ja maa.
  • Luomme tänne neljä ämpäriä
  • Kun tiedot on ladattu, ne sijoitetaan automaattisesti neljään säiliöön.
  • Maa-sarake on klusterointisarake, joten jokainen yhden maan rivi kirjoitetaan samaan säiliötiedostoon.

Vaihe 2) Ladataan tietoja taulukkoon samplebucket

Olettaen, että ”employees”-taulukko on jo luotu Hive-järjestelmään, tässä vaiheessa näemme tietojen lataamisen employees-taulukosta samplebucket-taulukkoon.

Ennen kuin alamme siirtää työntekijöiden tietoja säilöihin, varmista, että ne sisältävät sarakenimiä, kuten etunimi, työpaikkatunnus, osasto, palkka ja maa.

Tässä lataamme tietoja samplebucket-kansioon employees-taulukosta – alla olevassa näytössä näkyy INSERT OVERWRITE -lauseke, joka suorittaa kopioinnin.

INSERT OVERWRITE -lauseke, joka kopioi työntekijöiden rivit samplebucket-taulukkoon

Vaihe 3) Vaiheessa 1 luotujen neljän säiliön näyttäminen

Taulukkohakemiston listaaminen HDFS:ssä näyttää fyysisen tuloksen: neljä numeroitua datatiedostoa yhden sijaan.

HDFS-luettelo neljästä samplebucket-hakemistoon luodusta ämpäritiedostosta

Yllä olevasta kuvakaappauksesta näemme, että työntekijätaulukon tiedot siirretään vaiheessa 1 luotuihin neljään säiliöön.

Pesän osiointi vs. kauhottaminen: Keskeiset erot

Molemmat ominaisuudet pilkkovat taulukon pienempiin osiin, mutta ne tekevät sen tiedostojärjestelmän eri tasoilla ja vastaavat eri ongelmiin. Alla oleva taulukko asettaa ne rinnakkain.

Vertailupiste osiointi Kauhaaminen
Yksikkö luotu Hakemisto avaimen arvoa kohden Tiedosto hash-ämpäriä kohden
Ilmoitettu OSIOINTI RYHMITTÄÄ … n ÄMPÄRIIN
Palojen lukumäärä Kasvaa erillisten arvojen määrän mukana Korjattu taulukon luonnin yhteydessä
Datatiedostoihin tallennettu sarake Ei – arvo sijaitsee hakemiston nimessä Kyllä – sarake pysyy normaalina sarakkeena
Paras saraketyyppi Matala kardinaliteetti, kuten osavaltio, vuosi tai maa Korkea kardinaliteetti, kuten user_id tai transaction_id
Tärkein etu Osioiden karsiminen ohittaa tarpeettomat hakemistot Tasaiset tiedostokoot, edullinen näytteenotto ja kartan puoleiset liitokset

Nämä kaksi eivät ole kilpailijoita. Yleinen tuotantoasettelu osittaa faktataulukon päivämäärän mukaan ja luokittelee sitten päivän liittymisavaimella, joten kysely karsii yhteen hakemistoon ja liittää sitten hakemistot sen sisällä hakemistosta hakemistoon.

Milloin käyttää osiointia, ryhmittelyä tai molempia

Niiden välillä valinta alkaa sarakkeen kardinaalisuudesta ja taulukkoa lukevien kyselyiden muodosta.

  • Väliseinä kun kyselyt suodattavat lähes aina saman matalan kardinaliteettinsa sarakkeen perusteella ja kun erillisten arvojen määrä pysyy sadoissa miljoonien sijaan
  • Ämpäri kun hyödyllisellä sarakkeella on liian monta erillistä arvoa ollakseen hakemisto, tai kun taulukko liitetään tai näytettä otetaan toistuvasti kyseisestä sarakkeesta
  • Käytä molempia suurille faktataulukoille: osioi päivämäärän mukaan ja luo sitten säiliö jokaisen osion sisällä liittymisavaimen mukaan

Huomionarvoinen vikatila on pienten tiedostojen ongelma. Erittäin kardinaaliselta sarakkeelta – aikaleima tai asiakastunnus – osiointi tuottaa tuhansia pieniä hakemistoja, joista jokainen sisältää tiedoston, joka on paljon HDFS-lohkon kokoa pienempi. Tämä kasvattaa NameNode-muistin määrää ja hidastaa jokaista skannausta, mikä on juuri se, mitä osioinnin tarkoituksena oli estää. Kauhoittaminen välttää tämän, koska taulukkomääritelmä rajoittaa tiedostojen määrän.

Rypälöinnillä on oma rajoituksensa: asettelu on oikea vain, jos jokainen kirjoittaja noudattaa sitä. Luonnin yhteydessä ilmoitettu säiliöiden lukumäärä on metatietoa, joten työ, joka kirjoittaa taulukkoon ilman oikeaa klusterointia, voi jättää tiedostoja, jotka eivät vastaa ilmoitettua asettelua, ja myöhemmät otanta- tai säiliöliitokset lukevat vääriä rivejä.

UKK

Suorita Hive-komennossa SHOW PARTITIONS table_name. Se lukee metastoren ja tulostaa yhden rivin osiohakemistoa kohden, mikä on nopeampaa kuin varastopolun listaaminen HDFS:ssä ja varmistaa myös, että metastori on synkronoitu.

ALTER TABLE table_name ADD PARTITION (state='Goa') rekisteröi uuden hakemiston ja ALTER TABLE table_name DROP PARTITION (state='Goa') poistaa sen. Dropping hallittu osio poistaa tietonsa, kun taas dropping ulkoinen tyhjentää vain metastore-merkinnän.

Hive rajoittaa dynaamisten osioiden määrän oletusarvoisesti 100:aan solmua kohden ja 1000:een lauseketta kohden. Avaimella, jolla on enemmän erottuvia arvoja, rajoitus ylittyy ja työ lopetetaan. Nosta hive.exec.max.dynamic.partitions.pernode- ja hive.exec.max.dynamic.partitions-arvoja tai valitse karkeampi avain.

Ei. Sitä tarvittiin Hive 0.x- ja 1.x-versioissa pakottamaan reduktorien määrä vastaamaan säiliöiden määrää. HIVE-12331 poisti sen Hive 2.0:ssa, ja moottori johtaa nyt sekä reduktorien määrän että klusterikohtaisen sarakkeen taulukosta.

TABLESAMPLE(BUCKET x OUT OF y ON column) lukee vain vastaavat ämpäritiedostot kaiken skannaamisen sijaan. Koska rivit tiivistettiin samaan sarakkeeseen kirjoitushetkellä, otos on toistettavissa ja paljon halvempi kuin satunnaisrivien suodatin.

Taulukon jakaminen tuhansiin pieniin tiedostoihin tuhlaa NameNode-muistia ja käynnistää yhden tehtävän tiedostoa kohden, joten skannaukset hidastuvat. Se seuraa yleensä erittäin kardinaalista osioavainta. Karkeammat avaimet, ryhmittely tai tiedostojen pakkaaminen korjaavat ongelman.

Kyllä. Kyselylokien analyysi ja koneoppimismallit työkaluissa, kuten Cloudera Workload XM, luokittelevat sarakkeet suodatusfrekvenssin, vinouden ja kardinaliteetin mukaan ja ehdottavat sitten asettelua. Ehdotus vaatii vielä tarkistusta, koska se ei näe suunniteltuja työkuormia.

Copilot luonnostelee PARTITIONED BY- ja CLUSTERED BY -lausekkeet nopeasti kommentista, ja agenttiavustajat voivat luoda koko latausskriptin. Tarkista aina luotu säiliöiden määrä ja avain todelliseen kardinaliteettiin nähden, koska malli arvaa pelkästään nimien perusteella.

Tiivistä tämä viesti seuraavasti: