Follow Us on Twitter

Wat is Oracle NoSQL en hoe gebruik ik het?

*** in het meer recente blog "NoSQL quick 101 with Oracle NoSQL v3.4" geeft Patrick wat aanvullingen op onderstaand Whitebook ***

Maart 2014 – NoSQL is de verzamelnaam voor een brede groep databasemanagementsystemen die zich voornamelijk onderscheidt van relationele databases in het ontbreken van tabelrelaties ten gunste van eenvoud, schaalbaarheid en beschikbaarheid. Het zoemt al een paar jaar rond: NoSQL is de nieuwe techniek om data gestructureerd op te slaan, en RDBMS’en en SQL zijn achterhaald, ouderwets. Toch is dit nog niet het geval. Sterker nog, men komt tot de conclusie dat ook NoSQL niet de heilige graal in database-land is. alhoewel NoSQL absoluut zijn toepassingen heeft, zal het SQL en andere querytalen niet zomaar vervangen.

Blijkbaar staat NoSQL aan het begin van de plateaufase van Gartner’s Hype cycle. Deze grafiek beschrijft de volwassenwording, acceptatie en toepassing van nieuwe technieken. NoSQL is in zijn adolescentie geraakt.

  Gartner Hype Cycle
Figuur 1 - Gartner's Hype Cycle (bron: Wikipedia)

Wat is NoSQL eigenlijk? Het is in elk geval geen standaard. Er is geen consortium dat bepaalt hoe gegevens opgeslagen worden, hoe een interface eruit moet zien, of aan welke eisen een NoSQL database moet voldoen op het gebied van schaalbaarheid of consistentie. Kort gezegd is een NoSQL database een database-systeem dat geen gebruik maakt van tabellen en relaties zoals bij relationele (SQL) databases. Er zijn verschillende leveranciers en ontwikkelaars, en die hebben allemaal eigen keuzes gemaakt. Zo kiezen sommige partijen voor key-value pairs om data op te slaan, maar afhankelijk van de behoefte kan ook voor column stores, document stores of graph databases gekozen worden. En ook in Key-Value (KV) databases zijn weer subtypes te onderscheiden. Zo zijn er KV Cache, KV Store, KV Ordered Store en KV Store – eventually consistent types.

De voordelen van een NoSQL database zijn schaalbaarheid, beschikbaarheid en performance. Maar deze eigenschappen hebben hun prijs: NoSQL is uitermate geschikt voor “key-value pair” data en in mindere mate voor relationele data. Het is mogelijk om een complex datamodel te creëren in NoSQL, maar alle logica die je er in een RDBMS gratis bij krijgt (referentiële integriteit, lees- en schrijfconsistentie) moet je dan wel zelf schrijven.

Waar wordt NoSQL voor gebruikt? Het korte antwoord is Big Data. Als de hoeveelheid data groeit, komt er een moment dat het alleen nog in een gedistribueerde architectuur te beheersen is. Dit gaat niet alleen over de hoeveelheid data, maar ook over de snelheid waarmee data groeit. Aansprekende voorbeelden van Big Data zijn Facebook (135 miljard berichten per maand in 2010) en Twitter (500 miljoen tweets en vele terabytes per dag in 2013). In deze presentatie staat fraai beschreven hoe de architectuur van Twitter er uit ziet, gebruikmakend van NoSQL databases zoals HBase, Cassandra en FlockDB, en analysetools zoals Hadoop. Ook een bedrijf als Amazon maakt gebruik van een NoSQL database; zij hebben een eigen variant gemaakt, genaamd DynamoDB.

Overigens blijkt dat in de meeste gevallen gekozen wordt voor een hybride oplossing, waarbij zowel relationele databases (zoals Oracle en MySQL) als NoSQL database ingezet worden. Ze kunnen blijkbaar niet alleen naast elkaar bestaan, maar elkaar ook nog aanvullen.

Dit Whitebook beschrijft de NoSQL variant van Oracle, genaamd Oracle NoSQL. In de volgende hoofdstukken geef ik een introductie hoe dit te installeren en configureren, en toon enkele voorbeelden hoe dit te integreren met bestaande relationele databases en analysetools.

De eerste stappen met Oracle NoSQL

We beginnen met de installatie van Oracle NoSQL en de basishandelingen zoals starten, stoppen en het vullen met gegevens. Voor deze handleiding heb je een Windows of Linux shell nodig, een Oracle Database, en Jdeveloper. In de voorbeelden wordt de Oracle NoSQL Enterprise Edition en Ubuntu Linux als platform gebruikt.

Download Oracle NoSQL EE van de Oracle site, pak het ziparchief uit en ga de directory in.

$ java -jar lib/kvstore.jar kvlite &
[1] 10386
Created new kvlite store with args:-root ./kvroot -store kvstore -host weblogic -port 5000 -admin 5001
$ java -jar lib/kvstore.jar kvlite &
[1] 10386
Created new kvlite store with args:-root ./kvroot -store kvstore -host weblogic -port 5000 -admin 5001
$ java -jar lib/kvstore.jar ping -host oracle-Virtualbox -port 5000
Pinging components of store kvstore based upon topology sequence #14Time: 2014-02-11 11:02:13 UTC kvstore comprises 10 partitions and 1 Storage NodesStorage Node [sn1] on weblogic:5000    Datacenter: KVLite [1]    Status: RUNNING   Ver: 12cR1.2.1.57 2014-01-10 06:21:46 UTC  Build id: 4d323d1b5495	Rep Node [rg1-rn1]	Status: RUNNING,MASTER at sequence number: 31 haPort: 5006

Met bovenstaande commando’s maak je een single-process instance van een Oracle NoSQL database. De eerste keer dat kvstore.jar wordt aangeroepen, maakt kvstore een nieuwe instance aan. Afsluiten van de instance kan maar op één manier: een kill van het proces.

De volgende keer dat je het proces start, wordt de bestaande instantie gevonden en verschijnt de melding "Opened existing kvlite store with config… ”.

NoSQL heeft zijn eigen commandline en een eenvoudige adminconsole in de browser. Start de commandline met het volgende commando:

java -Xmx256m -Xms256m -jar ./kvcli.jar -host weblogic -port 5000 -store kvstore

 

Oracle NoSQL commandline interface

Figuur 2 - Oracle NoSQL commandline interface

En de webconsole ziet er als volgt uit (deze is te benaderen op port 5001):

Oracle NoSQL administration panel

Figuur 3 - Oracle NoSQL administration panel

Er is geen tool beschikbaar om een bestaande instantie te verwijderen. Stop hiervoor gewoon de instance en verwijder de directory als volgt:

java -jar KVHOME/lib/kvstore.jar stop -root kvroot
rm -rf kvroot

De kvroot directory is ook de plek waar de configuratie en de data van een NoSQL datastore wordt opgeslagen. De datafile staat in een subdirectory met een naam als 00000000.jdb.

Integratie met andere applicatiesoftware

Geen enkele database of applicatie staat op zichzelf, en dat is voor Oracle NoSQL niet anders.

Oracle database

Laten we beginnen met een voor de hand liggende keuze: de Oracle Database zelf. Met een paar kleine aanpassingen kan de Oracle database gegevens uit NoSQL lezen en is het zelfs mogelijk om met Oracle tabellen te joinen. Het gaat als volgt:

Maak een account aan in de Oracle database, en maak 2 directories en een tabel:

SQL> connect / as sysdba
Connected.
SQL> create directory ext_tab as '/home/weblogic/data/data';
Directory created.
SQL> create directory nosql_bin_dir as '/home/weblogic/software/kv-2.1.57/exttab/bin';
Directory created.
SQL> create user nosqluser identified by welcome1;
User created.
SQL> grant create session to nosqluser;
Grant succeeded.
SQL> grant execute on sys.utl_file to nosqluser;
Grant succeeded.
SQL> grant read, write on directory ext_tab to nosqluser;
Grant succeeded.
SQL> grant read, execute on directory nosql_bin_dir to nosqluser;
Grant succeeded.
SQL> grant create table to nosqluser;
Grant succeeded.
SQL> connect nosqluser/welcome1
Connected.
SQL> CREATE TABLE nosql_data (email VARCHAR2(30),
                           gender CHAR(1),
                           address VARCHAR2(40),
                           phone VARCHAR2(20))
      ORGANIZATION EXTERNAL
          (type oracle_loader
           default directory ext_tab
           access parameters (records delimited by newline
           preprocessor nosql_bin_dir:'nosql_stream'
           fields terminated by '|')
      LOCATION ('nosql.dat'))
      PARALLEL 1; 
Table created.

We hebben nu een account met rechten op 2 directories (één voor de gegevens, één voor de configuratie), en een external table die is geconfigureerd voor communicatie met een NoSQL database.

Vervolgens passen we 2 configuratiebestanden aan.

Het bestand nosql_stream staat in de nosql_bin_dir en is in de external table aangewezen als preprocessorfile. In ons voorbeeld is de inhoud als volgt (vergeet niet alle omgevingsvariabelen opnieuw in te stellen waar nodig!):

export KVHOME=/home/weblogic/software/kv-2.1.57
export CLASSPATH="$KVHOME/lib/kvstore.jar":$KVHOME/examples/externaltables/*.jar:/home/weblogic/software/kv-2.1.57/examples
/usr/lib/jvm/java-7-oracle/bin/java oracle.kv.exttab.Preproc $*

Het bestand config.xml staat in de exttab directory en bevat de parameters voor de Oracle database en de NoSQL database:

<config version="1">
  <component name="publish" type="params">
    <property name="oracle.kv.exttab.connection.url"
       value="jdbc:oracle:thin:/@//localhost:1521/orcl"
       type="STRING"/>
    <property name="oracle.kv.exttab.connection.user"
       value="nosqluser" type="STRING"/>
    <property name="oracle.kv.exttab.tableName" value="nosql_data"
       type="STRING"/>
  </component>
  <component name="nosql_stream" type="params">
    <property name="oracle.kv.kvstore"
       value="kvstore"
       type="STRING"/>
    <property name="oracle.kv.hosts"
       value="weblogic:5000"
       type="STRING"/>
    <property name="oracle.kv.batchSize"
       value="100"
       type="INT"/>
    <property name="oracle.kv.depth"
       value="PARENT_AND_DESCENDANTS"
       type="STRING"/>
    <property name="oracle.kv.parentKey"
       value="/user"
       type="STRING"/>
    <property name="oracle.kv.formatterClass"
       value="externaltables.MyFormatter"
       type="STRING"/>
  </component>
</config>

De publish utility schrijft een nosql.dat bestand weg dat door de external table gebruikt wordt om met de NoSQL database te verbinden. De inhoud lijkt sterk op de config.xml die als parameter wordt aangeroepen.

java -classpath lib/kvstore.jar:$ORACLE_HOME/jdbc/lib/ojdbc6.jar oracle.kv.exttab.Publish -config /home/weblogic/data/data/config.xml -publish

In de NoSQL directory staat voorbeeldcode voor het laden van records in de store. Met 2 commando’s compileer je de code en schrijf je daarmee (in dit voorbeeld) 10 regels in de NoSQL database.

javac -classpath lib/kvstore.jar:examples examples/externaltables/*.java
java -classpath lib/kvclient.jar:examples externaltables.LoadCookbookData -store kvstore -host weblogic -port 5000 -nops 10

In de code wordt een store handle aangemaakt met de KVStoreFactory.getStore API call. Door middel van een store.put of store.putIfAbsent (deze slaat alleen nog niet-bestaande key-value pairs op) wordt een nieuwe key-value pair opgeslagen.

store = KVStoreFactory.getStore (new KVStoreConfig(storeName, hostName + ":" + hostPort));
store.putIfAbsent(userInfo.getStoreKey(), userInfo.getStoreValue());  

Wat er nu in de store staat kan eenvoudig getest worden door het preprocessor commando van de external table uit te voeren met als parameter het nosql.dat bestand. Deze output is gelijk aan het resultaat  van een query op de external table. Niet verbazend, aangezien ze dezelfde gegevens lezen die met hetzelfde script worden opgehaald. 

resultaatset in Javacall en query op external table

Figuur 4 - resultaatset in Javacall en query op external table

Zoals in de afbeelding te zien is, toont het preprocessor commando de ruwe uitvoer, met een pipe symbool als veldscheidingsteken. In de external table is dat ook zo opgegeven, zodat in de SQL query netjes 4 kolommen getoond worden met kolomnamen die ook afkomstig zijn uit de tabeldefinitie. Dus niet uit de NoSQL database! Het is niet mogelijk om records toe te voegen in een external table, dus dat moet altijd via de API van de Oracle NoSQL database.

Java/JDeveloper

Uit de vorige paragraaf is al gebleken dat er een uitgebreide Java API beschikbaar  is voor Oracle NoSQL. Deze is eenvoudig in bijvoorbeeld JDeveloper beschikbaar te maken. Voeg de kvclient.jar toe in het ”Libraries and Classpath” onderdeel van de projectproperties door middel van de knop Add Jar/Directory:

JDeveloper, toevoegen kvclient.jar in het Libraries and Classpath
Figuur 5 - Voeg kvclient.jar toe in het 'Libraries and Classpath'

Ook hier is het nuttig om de voorbeeldcode te gebruiken om een snelle start te maken. Voeg bijvoorbeeld HelloBigWorldData.java uit KVHOME/examples/hello toe aan het project via het menu File -> New -> Java Class (java). De code kan nu vanuit de IDE uitgevoerd worden:

JDeveloper. 1) importeer de voorbeeldclass. 2) voer de class uit. 3) resultaat getoond in de log.
Figuur 6 - JDeveloper. 1) importeer de voorbeeldclass. 2) voer de class uit. 3) resultaat getoond in de log.

Een al eerder genoemde tool is Hadoop. Hadoop is een open-source framework van The Apache Software Foundation, speciaal ontwikkeld om op een gedistribueerde omgeving grote hoeveelheden data te kunnen verwerken. Via het mapreduce algoritme wordt data opgesplitst in kleine deeltaken die over veel nodes parallel geanalyseerd kan worden. De symbiose met NoSQL wordt al snel duidelijk.

Voeg bijvoorbeeld de Hadoop CDH classes toe aan de Jdeveloper libraries, en het map reduce algoritme is binnen handbereik om NoSQL data te verwerken. Op Oracle Technology Network staat een uitgebreide handleiding met gebruikmaking van de Cloudera distributie voor Hadoop.

Conclusie

Het configureren van de Oracle NoSQL database vergt wat uitzoekwerk. Je moet de documentatie grondig doornemen om iets meer te kunnen dan alleen een kvstore starten. Eenmaal goed geconfigureerd is het eenvoudig om de scope uit te breiden en naar de toepassing van NoSQL te gaan kijken.

De API, waarvan hier maar een tipje van de sluier is opgelicht, is goed gedocumenteerd en integratie met Jdeveloper is eenvoudig. Dat geldt ook voor de integratie met bijvoorbeeld Hadoop.

De conclusie met betrekking tot Oracle NoSQL is dat de principes relatief snel te leren zijn. De installatie is eenvoudig, heeft een beperkte footprint, en met de bijgeleverde voorbeelden en documentatie kan je snel aan de slag.

Het is inmiddels duidelijk dat NoSQL geen vervanger is van een RDBMS. Er zijn scenario’s waarin je zou verwachten dat NoSQL zwaar ingezet wordt, maar dat toch voor MySQL of een andere relationele database gekozen is. Een voorbeeld hiervan is Facebook. Ook in combinatie met Hadoop wordt niet zonder nadenken NoSQL gekozen. Soms is de Oracle database een betere keuze.

Kijkende naar de gekozen oplossingen van bedrijven die met Big Data te maken hebben, en vooral ook de uitdagingen waar ze voor komen te staan, is de weg naar een echt schaalbare en performante architectuur er één van trial and error. Er is meestal een combinatie van verschillende technieken nodig om de soms explosieve groei van data het hoofd te bieden.

Het is absoluut aan te raden om in het vervolg de mogelijkheden van Oracle NoSQL, eventueel in combinatie met analysetools, te onderzoeken als er echt grote hoeveelheden data verwerkt moeten worden. Maar verwacht ook bij het inzetten van (Oracle) NoSQL niet dat het de ‘silver bullet’ is om data beheersbaar te houden.

Referenties

Waardering:
 

Reacties

Enkele aanvullingen op dit artikel zijn te vinden op http://blog.whitehorses.nl/2015/10/20/nosql-quick-101-with-v3-4/

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.