<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; Bigdata</title>
	<atom:link href="http://hovenko.no/blog/tag/bigdata/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Bigdata RDF-server erfaringer</title>
		<link>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/</link>
		<comments>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/#comments</comments>
		<pubDate>Mon, 23 Jun 2014 09:13:25 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Infrastruktur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Bigdata]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=813</guid>
		<description><![CDATA[I jobbsammenheng jobber jeg mye med modellering av data i RDF. Vi har lenge lagret RDF-grafer som filer på disk, men har den siste tida undersøkt flere RDF-databaser. Felles for de fleste grafdatabaser er at de trives best i RAM. Store installasjoner som skryter av å lagre milliarder av tripler består enten av servere med [...]]]></description>
			<content:encoded><![CDATA[<p>I jobbsammenheng jobber jeg mye med modellering av data i <a href="http://www.w3.org/RDF/">RDF</a>.</p>
<p>Vi har lenge lagret RDF-grafer som filer på disk, men har den siste tida undersøkt flere RDF-databaser.</p>
<p>Felles for de fleste grafdatabaser er at de trives best i RAM.<br />
<a href="http://www.w3.org/wiki/LargeTripleStores">Store installasjoner som skryter av å lagre milliarder av tripler</a> består enten av servere med masse minne, eller av mange maskiner i et kluster som tilsammen innehar mye minne &#8211; da snakker vi størrelsesorden hundrevis av GB RAM.</p>
<h2>Tidligere tester av RDF-databaser</h2>
<p>Vi har tidligere testet <a href="http://jena.apache.org/documentation/serving_data/index.html">Jena Fuseki</a> og <a href="http://virtuoso.openlinksw.com/">OpenLink Virtuoso</a>, men begge har sine irriterende problemer.</p>
<h3>Jena Fuseki TDB</h3>
<p>Jena Fuseki med TDB blir fort ubrukelig når databasen blir større enn Java heap-size, og den feiler ofte med OutOfMemoryError.<br />
Testet med 4 GB Java-heap.</p>
<h3>OpenLink Virtuoso</h3>
<p>OpenLink Virtuoso har vi testet i versjon 6 og versjon 7.<br />
Versjon 6, som følger med i pakkesystemet til Ubuntu, støttet ikke SPARQL UPDATE.<br />
Versjon 7 feiler når vi prøver å laste inn grafer som inneholder mange blank nodes, selv om vi klarte å hacke oss til en løsning ved å splitte opp insertene i mindre deler.<br />
Generelt sett har Virtuoso flere irriterende problemer, blant annet at den ikke forstår &#8220;INSERT DATA&#8221; fra SPARQL UPDATE &#8211; her måtte vi bruke &#8220;INSERT INTO&#8221;.</p>
<h2>Bigdata</h2>
<p>Jeg har i noen dager testet <a href="http://www.bigdata.com/">Bigdata</a>, en server for lagring og spørring over RDF-data.</p>
<p>Bigdata-serveren er en Java-applikasjon som kjører i en standard Servlet applikasjons-container.</p>
<h2>Innlasting av data</h2>
<p>Datagrunnlaget er oppdelt i 525K (<strong>525.000</strong>) grafer &#8211; dokumenter i RDF/TURTLE-format.</p>
<p>Grafene inneholder mange blank nodes, ressurser som ikke er navngitte og globalt identifisérbare med IRI.<br />
Grunnen til at vi bruker blank nodes er fordi vi konstruerer ressurser sammensatt av data fra kildesystemer som ikke tilordner ID-er til disse konseptene.<br />
Dersom vi skulle konstruert ID-er for disse ressursene må vi bruke mye energi og mange kodelinjer for å holde de ID-ene stabile, for å tilordne de samme ID-ene ved neste eksport fra kildesystemet &#8211; da er det mye enklere å konstruerer blank nodes.</p>
<p>Innlasting av data ble gjort graf for graf i form av <a href="http://www.w3.org/TR/sparql11-update/">SPARQL UPDATE</a>-meldinger over HTTP, hver delt i to seksjoner &#8211; først sletting av eksisterende tripler i grafen, for så innsetting av nye tripler i samme graf.</p>
<p>Sletting av grafer er en viktig funksjon i vårt tilfelle, da vi ønsker å bytte ut alle tripler fra en eventuell gammel versjon av grafen med tripler fra en ny versjon.<br />
Utskiftingen av hele grafer ønsker vi å gjøre som en atomisk operasjon for å unngå at en graf fremstår som tom før nye data lastes inn.</p>
<h3>Serveroppsett</h3>
<p>Jeg startet med å kjøre Bigdata i en Jetty-container på en server med 4 GB RAM og 100 GB disk &#8211; <strong>dbdev01</strong>.<br />
Med unntak av lokasjonen til journal-fila (databasen til Bigdata), kjørte jeg med standardinnstillinger og 2 GB Java-heap.</p>
<h3>Datamengder</h3>
<p>Mot denne lastet jeg inn ca 450K (<strong>450.000</strong>) grafer.<br />
Dette utgjorde i overkant av 84M (<strong>84.000.000</strong>) tripler.</p>
<p>Journal-fila vokste til 14 GB.</p>
<h3>Ytelse ved innlasting av data</h3>
<p>I starten klarte jeg å laste inn ca 10 grafer per sekund.<br />
Det er ikke spesielt imponerende hastighet, men siden dette var en test så lot jeg prosessen fortsette.<br />
Etter ett døgn var hastigheten nede i 2-3 grafer per sekund.<br />
Etter to døgn var hastigheten nede i 1-2 grafer per sekund.</p>
<p>Å gjøre SPARQL-spørringer mot databasen samtidig som importen pågikk var bortimot ubrukelig, selv enkle spørringer som å hente ut navn på 60 ressurser.<br />
Samtidig sakt importhastigheten ned til ca 1 graf per 10 sekunder.</p>
<p>Da var 450.000 grafer importert, 85% av datasettet vårt, som for tiden øker med ca 100.000 grafer per år.<br />
Dette skalerer ikke.<br />
Bestemte meg for å avbryte importen.</p>
<h3>Ny server med mer minne</h3>
<p>Jeg fikk en ny server til rådighet, med 32 GB RAM og 100 GB disk &#8211; <strong>dbdev02</strong>.<br />
Serveren kjørte allerede noen tjenester, så jeg hadde ca 28 GB RAM ledig.<br />
Ellers var det lite last på serveren.</p>
<p>Jeg kopierte journal-fila på 14GB fra dbdev01 til dbdev02, og starta opp Bigdata på begge servere, samme konfigurasjon, og med 1 GB Java heap.</p>
<h2>Ytelsestester spørringer</h2>
<p>Gjorde samme tester mot begge serverne.</p>
<h3>Test #1</h3>
<p>Første spørringen mot serveren er en SPARQL-spørring med datofiltrering og dybde på 5 (Vedlegg 1).<br />
Resultatet fra spørringen er ca 80K (<strong>80.000</strong>) løsninger, i SPARQL RESULTS XML-format på 75 MB.</p>
<p>Ved kald, nyoppstartet Bigdata var dbdev02 (24s) vesentlig raskere enn dbdev01 (2m31s).</p>
<p>Ved gjentatte utføringer av samme spørring var begge servere nokså like raske, også etter kjøring av andre relativt enklere spørringer i mellomtiden.</p>
<h3>Test #2</h3>
<p>En annen spørring som ga store utslag var med dybde på 4, uten filtrering og med LIMIT 100.000 (Vedlegg 2).<br />
Resultatet fra spørringen er ca 53K (<strong>53.000</strong>) løsninger, i SPARQL RESULTS XML-format på 22 MB.<br />
Resultatet var altså mindre enn den angitte begrensningen på 100K.</p>
<p>dbdev02 (1m19s) var mye raskere enn dbdev01 (12m23s).<br />
Dette var med varm database.</p>
<h3>Innlasting av data mot 32 GB minne</h3>
<p>En ny test av import av data, som inkluderer overskriving av gamle grafer, denne gang gjort mot dbdev02 med 32 GB minne, viser en importhastighet på ca 5 grafer i sekundet.</p>
<h2>Analyse av testresultatene</h2>
<p>Den største forskjellen er rett etter Bigdata nettopp har starta opp.<br />
Mange av spørringene som ga store utslag etter kald oppstart returnerte omtrent like raskt etter gjentagende spørringer.<br />
Dataene i resultatet blir muligens cachet et sted.</p>
<h3>Minne</h3>
<p>dbdev01 har etter noen spørringer lite ledig RAM, mens dbdev02 har mye ledig RAM.<br />
Det kan tyde mot at Bigdata har det bedre når mye av datafila ligger i minnet.</p>
<h3>Diskytelse</h3>
<p>Hjelper nok også om disken er rask.<br />
Virker som at disken er raskere på dbdev02 enn dbdev01.<br />
En test lokalt på hver server viser at kopiering av fil på 1 GB tok 14.5s på dbdev01 og 6.2s på dbdev02.<br />
Ingen prosesser på noen av boksene som bruker nevneverdig mye disk-IO når Bigdata idler.</p>
<h3>Swapping</h3>
<p>Kanskje swapping på dbdev01 kan være årsak, selv om swap-aktiviteten for tiden er lav.</p>
<p>Munin-graf over minne for dbdev02 viser en økning på 16GB i cache (fil-cache) etter oppstart av Bigdata.<br />
Null swapping.</p>
<p>Munin-graf over minne for dbdev01 er fullstendig mongo, går opp og ned som en jojo i den perioden Bigdata har kjørt (2 dager).<br />
Viser også mye swapping, spesielt under inserts.</p>
<h2>Konklusjon</h2>
<p>Bigdata trives veldig godt med mye RAM og bruker operativsystemets filcache for å få rask aksess til dataene.</p>
<p>Bigdata feiler ikke like dramatisk som Jena Fuseki TDB når minnet går fullt.<br />
Selv om vi endte opp med å teste Bigdata med mer minne enn vi testet med Jena Fuseki TDB, så taklet Bigdata med 4 GB minne mye større datasett enn Jena Fuseki TDB klarte med det samme.</p>
<p>Det er ikke så viktig med stor Java heap under innlasting av data.<br />
Heap-størrelsen øker når det gjøres spørringer, så større heap har kanskje en positiv effekt ved mange og tunge spørringer.</p>
<p>Den nye innlastingstesten viser at Bigdata er mye raskere på innlasting av data dersom den har nok minne til databasen.</p>
<h2>Vedlegg</h2>
<h3>Vedlegg 1: SPARQL Test #1</h3>
<p>SPARQL-spørring som lister ut avspilt musikk i en tidsperiode på én måned:</p>
<p><code>
<pre>
PREFIX dct: &lt;http://purl.org/dc/terms/&gt;
PREFIX ebuccdm: &lt;http://www.ebu.ch/metadata/ontologies/ebuccdm#&gt;
PREFIX digas: &lt;http://id.nrk.no/2013/digas/class/&gt;
PREFIX xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt;

SELECT * WHERE {
  GRAPH ?g {
    ?part a digas:Music .
    ?timeline ebuccdm:hasTimelineTrackPart ?part .
    ?prog ebuccdm:hasTimelineTrack ?timeline .
    ?trans ebuccdm:playsOut ?prog .

    ?part dct:title ?partTitle .
    ?prog dct:title ?progTitle .
    ?trans ebuccdm:publicationStartDateTime ?startTime .
    FILTER ( ?startTime &gt;= &quot;2014-01-01T00:00:00+01:00&quot;^^xsd:dateTime ) .
    FILTER ( ?startTime &lt; &quot;2014-02-01T00:00:00+01:00&quot;^^xsd:dateTime ) .
  }
}
ORDER BY ?startTime
</pre>
<p></code></p>
<h3>Vedlegg 2: SPARQL Test #2</h3>
<p>SPARQL-spørring som lister ut medvirkende på programmer med en begrensning på 100.000 resultater:</p>
<p><code>
<pre>
PREFIX nrk: &lt;http://gluon.nrk.no/dataordbok.xml#&gt;
PREFIX dct: &lt;http://purl.org/dc/terms/&gt;
PREFIX ebuccdm: &lt;http://www.ebu.ch/metadata/ontologies/ebuccdm#&gt;

SELECT ?obj ?title ?contactName ?roleName
WHERE {
    ?obj a nrk:programme .
    ?obj dct:title ?title .
    ?obj ebuccdm:hasContributor ?contributor .
    ?contributor ebuccdm:contactName ?contactName .
    ?contributor ebuccdm:hasRole ?role .
    ?role ebuccdm:roleName ?roleName .
} LIMIT 100000
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
