Deze bijdrage is geleverd door Wim van Gool
Vandaag schoof ik aan bij de cursus ‘Big Data – Architectures and Technologies’ van het SEI. De belangrijkste vraag die in deze cursus geaddresseerd werd was: ‘Wat zijn Big Data Systemen nu precies, en hoe ontwerp je ze?’
Big Data: wat is het en wat kunnen we ermee?
In het kort komt het erop neer dat Big Data systemen een grote hoeveelheid gegevens – zowel gestructureerd als ongestructureerd – verwerken en dat deze gegevens uiteindelijk in een bepaalde gestructureerde vorm worden opgeslagen om er daarna over te kunnen redeneren. Je zou kunnen zeggen dat het in feite zeer grote BI-systemen zijn, ware het niet dat deze systemen vaak real-time bijgewerkt en geraadpleegd moeten kunnen worden.
De grote opgave bij het ontwerpen van dit soort systemen is dan ook hoe je ze schaalbaar kunt houden.
Schaalbaarheid van Big Data oplossingen
Met schaalbaarheid wordt bedoeld dat men de capaciteit van een systeem qua performance en availability eenvoudig kan opvoeren door meer machines toe te voegen, terwijl de kosten ten hoogste lineair mogen meestijgen. Met exabytes aan data en miljoenen gebruikers per dag kan dat een behoorlijke uitdaging zijn. Traditionele relationele databases voldoen vaak niet omdat in hun ontwerp consistency is verkozen boven performance, en omdat ze vanwege hun uitgebreide constraint-query-mogelijkheden vaak beperkt schaalbaar zijn over meerdere machines heen. Bovendien zijn er dikwijls stevige licentiekosten gemoeid met het opschalen van professionele relationele databases.
Om bovengenoemde redenen zijn er de laatste jaren flink wat NoSQL-oplossingen ontwikkeld. De belangrijkste driver voor de keuze voor een NoSQL-systeem moet dus ook de schaalbaarheid ervan zijn. Daarnaast zijn veel NoSQL-databases open source en/of erg goedkoop (soms gratis) in het gebruik. De schaalbaarheid van NoSQL-oplossingen wordt met name bereikt door het vaste data-schema los te laten en te leunen op horizontal scaling (het kunnen bijplaatsen van machines/nodes) in plaats van vertical scaling of ‘up-scaling’ (het upgraden van machines, meer disks, etc). Het nadeel van horizontal scaling is echter wel dat men meer rekening moet gaan houden met consistency en availablitiy issues en dat de rijke set aan query-mogelijkheden niet meer out-of-the-box meegeleverd worden.
Architectuur keuzen maken
Het huidige aanbod NoSQL-databases is erg divers, maar over het algemeen kun je ze in de volgende categorieën opdelen, genoemd in de volgorde van schaalbaarheid (beste boven):
- Key-Value Stores
- Document Databases
- Column-Oriented Databases
- Graph Databases
Over het algemeen geldt hier: hoe schaalbaarder, hoe beter de performance en availability zullen zijn, maar hoe meer je inlevert op consistentie en query-mogelijkheden. Bij het kiezen van een bepaald type database is het dus erg belangrijk dat je een goede afweging maakt tussen de vereiste quaility attributes van het te bouwen systeem (reeds genoemd in de cursus van gisteren, de Advanced Software Architecture Workshop) en de eigenschappen c.q. mogelijkheden die een betreffende database je biedt. Hierbij is het erg belangrijk dat je de CAP-theorie goed kent en enigzins bekend bent met de tuning-mogelijkheden van de verschillende type databases.
Om uiteindelijk tot een weloverwogen keuze en ontwerp te komen geldt ook nu weer dat je er goed aan doet om vantevoren een aantal relevante use cases uit te werken waarbij men bepaald wat het gewenste gedrag van het systeem precies is qua performance, consistentie, availability, etc. Doe dit voor een aantal verschillende architectuuroplossingen/database types om te bepalen welke de optimale balans biedt, maar wees terughoudend in het te ver uitwerken/optimaliseren van de oplossingen, omdat het nog altijd om een inschatting gaat (uitwerken kost veel tijd). Het is tevens goed mogelijk om uiteindelijk voor een hybride oplossingen te kiezen (het toepassen van verschillende type databases, afhankelijk van de dataset en/of use cases), wat ook wel polyglot persistence genoemd wordt.
Aggregation frameworks
In het laatste gedeelte van deze cursus hebben we gekeken naar aggregation frameworks om over NoSQL-stores c.q. grote hoeveelheden data toch een soort queries uit te kunnen voeren. De bekendste techniek die hiervoor wordt gebruikt is MapReduce, waarbij een query over verschillende machines heen parallel wordt uitgevoerd en waarbij de deelresultaten ook parallel worden verwerkt en uiteindelijk worden samengevoegd tot één eindresultaat. Hadoop is het bekendste framework dat deze techniek momenteel implementeert.
Conclusie
De conclusie van het verhaal van vandaag was: NoSQL-oplossingen zijn een prima antwoord op de vraag van vandaag om zeer grote hoeveelheden data te kunnen beheren en verwerken, maar wees je ervan bewust dat je er zeer zorgvuldig mee om moet gaan en dat er niet te licht gedacht moet worden over de complexiteit die ermee geintroduceerd wordt, omdat veel zaken die we bij relationele databases out-of-the-box geleverd kregen nu op grote schaal zelf gebouwd en/of ingericht moeten worden. Zoals ze vroeger al zeiden: with great power comes great responsilibity.