Big Data fra et teknisk perspektiv – Del 1

Begrebet ”Big Data” er efterhånden blevet temmelig omsiggribende og de muligheder, der nu gemmer sig under ”Big Data” paraplyen for virksomhederne er under konstant udvikling. Det betyder at de holdninger, der findes omkring hvad begrebet dækker også ændrer sig. Se f.eks. disse 43 udtalelser fra forskellige anerkendte ledere, som Data Science hos Berkeley indsamlede i sidste måned.

Den oprindelige definition som Gartner udtrykte den handlede dog om de berømte 3 v’er, nemlig ”Volume” (mængde), ”Velocity” (hastighed) og ”Variety” (variation).

Deres definition lød således:

”Big data is high volume, high velocity, and/or high variety information assets that require new forms of processing to enable enhanced decision making, insight discovery and process optimization.”

De mente dermed at der var tale om data (information assets), der på grund af deres mængde og den hastighed de opstod med, eller deres uensartethed ikke passede ind i de teknologier man traditionelt havde til rådighed.

Det har dog senere vist sig, at de eksisterende teknologier ofte kan håndtere disse nye typer data, og at man i stedet for at smide de gamle teknologier væk bør benytte en større pallette af teknologier. F.eks. udtrykte Oracle i sidste uge på deres Oracle Open World konference at Big Data teknisk set bør være ”Hadoop + Relational (DB’s) + NoSQL (DB’s)”

Men uanset hvordan man anskuer det og hvilken værktøjspallette man vælger at benytte, er det nye dyr i åbenbaringen Hadoop når det kommer til Big Data set ud fra et teknisk perspektiv. Det er derfor Hadoop jeg vil beskæftige mig med i første del af dette blogindlæg. De efterhånden mange tilhørende værktøjer til Hadoop vil jeg så komme nærmere ind på i anden del.

Så hvad er Hadoop?

Hadoop består i sin simpleste og oprindelige form af to produkter, nemlig Hadoop Distributed File System (HDFS) og Hadoop MapReduce. Ideen til Hadoop blev udklækket hos Google, der kort efter årtusindskiftet havde brug for at kunne regne på og indeksere data langt hurtigere end de kunne komme til med traditionelle værktøjer, for at kunne opnå de mål de havde omkring deres internet søgemaskine. Efter de havde udviklet teknologierne til eget brug, frigav de to artikler, der beskrev hvordan de havde gjort det og overlod resten af den teknologiske verden til at følge op på det. Det valgte to medarbejdere hos Yahoo at gøre i 2005, og de skabte og navngav produkterne HDFS og Hadoop MapReduce og frigav dem til hele verden som Open Source under Apache paraplyen. De to produkter er siden blevet synonymet med teknisk Big Data, selvom der naturligvis er blevet udviklet videre på dem og de har fået mange støtteprodukter til mere eller mindre specifikke formål.

Så hvad er det så de to produkter er og kan?

Hadoop Distributed File System er et distribueret filsystem, der er næsten 100% skalerbart og som er beregnet til at køre på en mængde (cluster) af billige servere. Som udgangspunkt består et HDFS cluster af en navnenode, der ved hvor alle de øvrige noder er og en masse datanoder, som hver har både diskplads og regnekraft (CPU). HDFS er beregnet til at gemme meget store datamængder, og fremstår for brugeren som en enkelt disk hvorpå data kan tilgås. De enkelte noder kender til hinanden og står selv for at flytte og replikere data ud over alle de underliggende diske, således at data altid findes flere steder på én gang (typisk 3), og systemet dermed er fejltolerant, selvom diskene ikke i sig selv er replikerede. Data splittes ud i store blokke og replikeringen sker direkte på skrivetidspunktet.

Man kan som udgangspunkt ikke rette i data, men kun lave nye filer i systemet. Det er en vigtig pointe at man typisk ikke har taget stilling til hvad det er man gemmer når man loader data ind i sit HDFS. Data består simpelthen af store filer, og arbejdet med at forstå data og arbejde med dem kommer først senere.

Ud over navnenoden er der ingen delte ressourcer i HDFS, hvilket er grunden til at en skalerbarhed på næsten 100% kan opnås. Hvis ens cluster bliver for lille sætter man blot en ny billige maskine inkl. disk og CPU på, og man har fået mere plads og mere regnekraft, uden at det er gået ud over performance, som man ellers typisk ser ved cluster-udvidelser.

Det andet oprindelige Hadoop produkt er Hadoop MapReduce. MapReduce’s formål er at forstå data og udføre beregninger på dem. Det består af en JobTracker det holder styr på de beregningsopgaver der skal løses og hvilke data der er på hver node, og et antal TaskTrackers, svarende til det antal noder der er i clusteret, som udfører deres del af de enkelte beregningsopgaver. En meget vigtig pointe i denne sammenhæng er, at data (næsten)aldrig flyttes når de indgår i en beregning. De bearbejdes altid af den TaskTracker der findes på samme node og med den regnekraft (CPUer) der er på noden, hvilket er en anden af grundene til at Hadoop er næsten 100% skalerbar.

En skitse over et cluster med HDFS og Hadoop MapReduce kunne se således ud:

figur1

Som navnet antyder, består MapReduce af en mapnings-del og en del, der regner på og typisk aggregerer/reducerer data. Derudover er der også en input del, hvor data splittes op til noget der kan mappes, en shuffle/sort del, hvor de mappede data sorteres efter hvilken reduce beregning de skal indgå i, og en output-del, hvor resultatet skrives til disk i en ny fil. En skitse over processen kunne se således ud:

figur2

 

En typisk opgave for MapReduce er histogramanalyser, hvor man tæller hvor mange gange et element, f.eks. et ord, optræder på tværs af sin datamængde. I den situation er Map-delen ret simpel, da den blot skiller data ad ord for ord, og Reduce-delen tæller derefter fremkomsten af hvert enkelt ord og skriver den til disk. Det svarer med andre ord til en SELECT med en COUNT og en GROUP BY i den relationelle verden – men på uordnede data og paralleliseret på alle de noder der er til rådighed. MapReduce funktioner er typisk mere komplekse end dette eksempel, men det er ikke unormalt at man må sætte flere af dem efter hinanden for at opnå det udtræk eller den beregning man ønsker.

Måden man implementerer en MapReduce funktion er ved at udvikle henholdsvis Map-funktionen og Reduce-funktionen. I den oprindelige udgave af Hadoop gjorde man altid dette i sproget Java, ved at lave en ny klasse der arvede fra en MapReduseBase klasse, der fulgte med Hadoop og implementerede henholdsvis Mapper og Reducer metoderne. En klasse der overholder dette kan umiddelbart loades ind som Job og afvikles. Her er et udklippet eksempel på en implementation af de to metoder:

figur3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Der findes også andre sprog der kan kompileres og anvendes med den oprindelige Hadoop pakke, men Java er klart det mest benyttede.

Så som opsummering kan man sige, at HDFS og Hadoop MapReduce er et billigt, redundant super-skalerbart filsystem til håndtering af primært meget store mængder af ustrukturerede data og en distribueret og super-skalerbar regnemotor, der kan mappe disse data og trække (typisk aggregerede) informationer ud af dem.

Hvad er så ulemperne ved de oprindelige to Hadoop værktøjer?

For det første er de kun beregnet til at afvikle én opgave af gangen, så øvrige opgaver lægges i kø og må vente på at det første job afsluttes. For det andet er de ”batch basered”, det vil sige at de ikke er beregnet til at svare i realtid på en given forespørgsel. For det tredje er de forholdsvis langsomme til at udføre deres opgaver. Og for det fjerde er de temmelig svære at bruge, da de kræver at man til en vis grad forstår deres virkemåde og forstår at udvikle metoder i Java.

Disse problemer er der naturligvis en masse teknikere der har forsøgt at løse uden at ødelægge de fordele Hadoop har. Det er der kommet en masse nye produkter ud af, som jeg vil komme nærmere ind på i andel del af dette blogindlæg.

I have been working as a system developer, data modeler and DBA on the Oracle platform using SQL, Pl/SQL, Forms, Reports, JSP, HTML and Javascript since 1996, and have been involved in both client/server and web-based projects for 25+ different customers. I'm normally known as a problem solver