Beste svaret
I alle mulige referanser er Spark Sql ‘mye’ raskere enn Hive. Selv om Facebook kom med Presto – en billig kopi av Sparks design satt under bikubehetten, og det er også en nyere versjon av bikupen på Tez – hvis misforhold med DAG-er er godt dokumentert her The Tragedy of Tez , men i alle SQL-relaterte oppgaver (f.eks. Map side sqls => filter, datamutasjon eller reduser side Sqls => Sorter / aggregat / Window-funksjoner), skinner gnisten fremdeles lyst.
Siden spørsmålet ikke stiller «Hvorfor», vil jeg ikke gå mye inn i disse tekniske detaljene. Men bare for å gi deg en følelse, tenk på en distribuert databehandlingsmodell der hver oppgave må skrive hele datasettet (med replikering) det holder før du fullfører, der applikasjonen ikke klarer å måle ressursutnyttelse alene og hvor applikasjonen er på barmhjertigheten til klyngebehandleren ved å starte oppgaven / utførelsesfasen og sammenligne den med en annen distribuert databehandlingsmodell der oppgaver kan leve i minnet for det meste, der ressursene kan tildeles intelligent av motoren og hvor rammeverket kan sitte på toppen av en klyngebehandler og er avhengig av klyngebehandleren for ingenting – annet enn containerallokering (og litt De / Serialization som til og med kan omgåes)
(og for å holde det kort, gjorde det ikke nevn til og med Spark 1.6 / 2.x som trapper opp spillet med Tungsten eller simd implementering for spørreoptimalisering)
Hvilken modell tror du ville vinne kampen om latens?
Svar
La oss starte med spørsmålet ditt : Hive implementerer en delmengde av SQL – Hive Language ( LanguageManual – Apache Hive – Apache Software Foundation ) som er spesifikk for Hives og Hadoops evner. Det innsendte spørsmålet ditt er delt inn i deler, predikater, som kan implementeres i operasjoner eller stadier. VELG col1 , col2 ,… coln angir hvilke kolonner i hver returnerte rad som skal beholdes og returneres i løsningssettet. Likeledes vil en VENSTRE eller HØYRE sammenføyning bli implementert i en bestemt tilstand, sannsynligvis et Map-Reduce (M\_R) -stadium. Når spørringen din er delt inn i brikkene som samsvarer med spesifikke operasjoner, bruker Cost-Based Optimizer (CBO) samlet og lagret statistikk for å ta intelligente beslutninger om hvordan hvert av disse trinnene skal utføres. For eksempel kan en WHERE-ledd implementeres som en tabellskanning, hvis den ikke er veldig spesifikk (lav kardinalitet) eller hvis en tabell ikke er partisjonert, eller det kan resultere i partisjon eliminering hvis tabellen er partisjonert og WHERE-setningen spesifiserer partisjonskolonner med høy spesifisitet. Hvis et spørsmål spesifiserer flere sammenføyninger, blir hver sammenføyning implementert som et trinn for kartreduksjon. Hvis en av koblingstabellene er veldig liten, kan en Map-Join velges for utføring av CBO for bedre ytelse.
Når CBO legger ut en utførelsesplan, planlegges og utføres trinnene, vanligvis som flere MR-stadier. Du kan undersøke utførelsesplanen som CBO vil bruke til å utføre et hvilket som helst spørsmål ved å kjøre en EXPLAIN på spørringen.
Jeg hadde en klient i videoindustrien som samlet statistikk om brukernes visningsvaner. Denne statistikken ble samlet i en veldig stor tabell (100-tallet av TiB) som klienten ønsket sammen med omtrent 20 relativt små tabeller som inneholdt data om hver video, skuespillerne i videoen, plottet til hver video, produksjonsdataene etc. Jeg opprettet visninger som suksessivt ble med i de mindre tabellene som til slutt ble koblet til visningstabellen til en resultatvisning, som deretter ble skrevet inn i en utgangstabell. Da jeg sendte inn en enkel spørring for å velge fra resultatvisningen til utgangstabellen (CREATE TABLE output (…) AS SELECT * FROM results\_view) opprettet Hive en 25-trinns spørring som materialiserte alle mellomvisningene til den endelige visningen som deretter ble skrevet til utgangstabellen. Siden hvert trinn var en MR-jobb (for YARN) og installasjonstiden for en MR-jobb var omtrent 30 sekunder for den klyngen, ble det brukt 12–14 minutter i MR-installasjonstiden. De fleste av M-R-trinnene ble utført på 5 sekunder, hvorav 2/3 var M-R-oppsettstid og 1/3 av den faktiske utførelsen. Det endelige kartet ble sammen med de mindre tabellene i tabellen for seerstatistikk, ytterligere 20 minutter. Å lage en haug med visninger som suksessivt ble slått sammen i en resultattabell, tillot meg å lage en rørledning som ble samlet med en haug med relativt enkle spørsmål, i stedet for å prøve å lage en massiv spørring som ville prøve å bli med i 20+ tabeller i ett spørsmål.