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.

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.
- allstates-taulukon luominen
create table allstates(state string, District string,Enrolments string) row format delimited fields terminated by ',';
- Ladataan tietoja luotuun allstates-taulukkoon
Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
- Osiotaulukon luominen
create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
- Osiota varten meidän on asetettava tämä ominaisuus
set hive.exec.dynamic.partition.mode=nonstrict - Ladataan tietoja osiotaulukkoon
INSERT OVERWRITE TABLE state_part PARTITION(state) SELECT district,enrolments,state from allstates;
- 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.
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.
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.
Varastohakemiston listaaminen HDFS:ssä vahvistaa vaiheen 6 tuloksen – komentotulkki raportoi 38 kohdetta, yhden osavaltion_osa/osavaltio= hakemisto osavaltioittain.
Yllä olevasta koodista teemme seuraavat asiat
- Kolmen sarakkeen nimellä varustetun allstates-taulukon luominen, kuten osavaltio, piirikunta ja ilmoittautumiset
- Ladataan tietoja taulukkoon allstates
- Osiotaulukon luominen tilalla osioavaimena
- Tässä vaiheessa osiotilan asettaminen ei-tiukaksi (tämä tila aktivoi dynaamisen osiotilan)
- Ladataan tietoja osiotaulukkoon state_part
- Varsinainen osiotaulukoiden käsittely ja muodostaminen osioavaimen tilan perusteella
- 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.
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.
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.
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ä.







