Éischt Andréck vun Amazon Neptun

Salut, Khabrovsk Awunner. An der Erwaardung vum Start vum Cours "AWS fir Entwéckler" Mir hunn eng Iwwersetzung vun interessant Material virbereet.

Éischt Andréck vun Amazon Neptun

A ville Benotzungsfäll déi mir gär hunn bakdataWéi mir op de Websäite vun eise Clienten gesinn, ass relevant Informatioun a Verbindungen tëscht Entitéite verstoppt, zum Beispill wann Dir Relatiounen tëscht Benotzer analyséiert, Ofhängegkeeten tëscht Elementer oder Verbindungen tëscht Sensoren. Esou Benotzungsfäll ginn normalerweis op enger Grafik modelléiert. Fréier dëst Joer huet Amazon seng nei Grafikdatenbank, Neptun, verëffentlecht. An dësem Post wëlle mir eis éischt Iddien deelen, gutt Praktiken a wat mat der Zäit verbessert ka ginn.

Firwat mir Amazon Neptun gebraucht hunn

Grafik Datenbanken verspriechen héich verbonne Datesätz besser ze handhaben wéi hir relational Äquivalenten. An esou Datesätz gëtt relevant Informatioun normalerweis a Relatiounen tëscht Objekter gespäichert. Mir hunn en erstaunlech oppen Dateprojet benotzt fir den Neptun ze testen MusekBrainz. MusicBrainz sammelt all Zort vu Museks-Metadaten, déi erdenklech sinn, wéi zB Informatiounen iwwer Kënschtler, Lidder, Albumreleases oder Concerten, wéi och mat wiem de Kënschtler hannert dem Lidd zesummegeschafft huet oder wéini den Album a wéi engem Land erauskomm ass. MusicBrainz kann als e risegt Netzwierk vun Entitéite gesi ginn, déi iergendwéi mat der Museksindustrie verbonne sinn.

De MusicBrainz Dataset gëtt als CSV Dump vun enger relationaler Datebank zur Verfügung gestallt. Am Ganzen enthält den Dump ongeféier 93 Millioune Reihen an 157 Dëscher. Wärend e puer vun dësen Dëscher Basisdaten enthalen wéi Kënschtler, Eventer, Opzeechnungen, Verëffentlechungen oder Tracks, anerer Link Dëscher - Store Bezéiungen tëscht Kënschtler an Opzeechnungen, aner Kënschtler oder Verëffentlechungen, etc ... Si weisen d'Grafikstruktur vun engem Datesaz. Wann Dir den Dataset an RDF Triple konvertéiert, hu mir ongeféier 500 Millioune Fäll kritt.

Baséierend op d'Erfahrung an d'Impressioune vun de Projetspartner mat deenen mir schaffen, presentéiere mir e Kader an deem dës Wëssensbasis benotzt gëtt fir nei Informatioun ze kréien. Zousätzlech erwaarden mir datt et regelméisseg aktualiséiert gëtt, zum Beispill andeems Dir nei Verëffentlechungen bäidréit oder Gruppememberen aktualiséieren.

Upassung

Wéi erwaart ass d'Installatioun vun Amazon Neptun einfach. Si ass ganz detailléiert dokumentéiert. Dir kënnt eng Grafikdatebank mat just e puer Mausklicken starten. Wéi och ëmmer, wann et ëm méi detailléiert Konfiguratioun geet, néideg Informatiounen schwéier ze fannen. Dofir wëlle mir op ee Konfiguratiounsparameter weisen.

Éischt Andréck vun Amazon Neptun
Configuratioun Screenshot fir Parametergruppen

Amazon seet, datt den Neptun sech op Low-latency Transaktiounsaarbechtslaascht fokusséiert, dofir ass de Standard-Ufro-Timeout 120 Sekonnen. Mir hunn awer vill analytesch Benotzungsfäll getest an deenen mir regelméisseg dës Limit erreecht hunn. Dësen Timeout kann geännert ginn andeems Dir eng nei Parametergrupp fir Neptun an Astellung erstellt neptune_query_timeout entspriechend Restriktioun.

Lueden Daten

Drënner wäerte mir am Detail diskutéieren wéi mir MusicBrainz Daten an Neptun gelueden hunn.

Relatiounen an dräi

Als éischt hu mir d'MusicBrainz Daten an RDF Triple ëmgewandelt. Dofir hu mir fir all Dësch eng Schabloun definéiert déi definéiert wéi all Kolonn am Triple vertruede gëtt. An dësem Beispill gëtt all Zeil aus der Leeschtungstabel op zwielef RDF-Dräilännerecke gemappt.

<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/gid> "${gid}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/name> "${name}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/sort-name> "${sort_name}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/begin-date> "${begin_date_year}-${begin_date_month}-${begin_date_day}"^^xsd:<http://www.w3.org/2001/XMLSchema#date> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/end-date> "${end_date_year}-${end_date_month}-${end_date_day}"^^xsd:<http://www.w3.org/2001/XMLSchema#date> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/type> <http://musicbrainz.foo/artist-type/${type}> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/area> <http://musicbrainz.foo/area/${area}> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/gender> <http://musicbrainz.foo/gender/${gender}> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/comment> "${comment}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/edits-pending> "${edits_pending}"^^<http://www.w3.org/2001/XMLSchema#int> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/last-updated> "${last_updated}"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/ended> "${ended}"^^<http://www.w3.org/2001/XMLSchema#boolean> .

bulk eropluede

De virgeschloene Wee fir grouss Quantitéiten un Daten an Neptun ze lueden ass duerch de bulk Uploadprozess iwwer S3. Nodeems Dir Är Triples Dateien op S3 eropgelueden hutt, fänkt Dir den Eroplueden mat enger POST Ufro un. An eisem Fall huet et ongeféier 24 Stonnen fir 500 Milliounen Triplets gedauert. Mir hunn erwaart datt et méi séier wier.

curl -X POST -H 'Content-Type: application/json' http://your-neptune-cluster:8182/loader -d '{
 
 
 "source" : "s3://your-s3-bucket",
 
 "format" : "ntriples",
 
 "iamRoleArn" : "arn:aws:iam::your-iam-user:role/NeptuneLoadFromS3",
 
 "region" : "eu-west-1",
 
 "failOnError" : "FALSE"
 
}'

Fir dëse laange Prozess ze vermeiden all Kéier wann mir den Neptun starten, hu mir décidéiert d'Instanz vun engem Snapshot ze restauréieren an deem dës Triplets scho geluede goufen. Vun engem Snapshot lafen ass wesentlech méi séier, awer dauert nach ongeféier eng Stonn bis den Neptun fir Ufroe verfügbar ass.

Wann ursprénglech Triplets an Neptun lued, hu mir verschidde Feeler begéint.

{
 
 
 "errorCode" : "PARSING_ERROR",
 
 "errorMessage" : "Content after '.' is not allowed",
 
 "fileName" : [...],
 
 "recordNum" : 25
 
}

E puer vun hinnen waren Parsingfehler, wéi uewen gewisen. Bis haut hu mer nach net erausfonnt, wat zu dësem Zäitpunkt genee falsch gaang ass. E bësse méi Detail géif definitiv hei hëllefen. Dëse Feeler ass geschitt fir ongeféier 1% vun agebauten Triple. Awer sou wäit wéi den Neptun testen geet, hu mir d'Tatsaach ugeholl datt mir nëmme mat 99% vun der Informatioun vu MusicBrainz schaffen.

Och wann dëst einfach ass fir Leit déi mat SPARQL vertraut sinn, bewosst datt RDF Triple mat explizit Datentypen annotéiert musse ginn, wat erëm Feeler verursaache kann.

Streaming download

Wéi uewen ernimmt, wëlle mir den Neptun net als statesche Dategeschäft benotzen, mee éischter als flexibel an evoluéierend Wëssensbasis. Also musse mir Weeër fannen fir nei Triple aféieren wann d'Wëssenbasis ännert, zum Beispill wann en neien Album publizéiert gëtt oder wa mir ofgeleet Wëssen materialiséieren wëllen.

Neptun ënnerstëtzt Inputbetreiber duerch SPARQL Ufroen, souwuel rau a Probe-baséiert. Mir wäerte béid Approche hei drënner diskutéieren.

Ee vun eisen Ziler war d'Donnéeën op eng Streaming Manéier anzeginn. Denkt drun en Album an engem neie Land erauszebréngen. Aus der Perspektiv vun MusicBrainz heescht dat, datt fir eng Verëffentlechung déi Alben, Singelen, EPen, asw. Fräisetzung-Land. Am RDF passen mir dës Informatioun mat zwee neien Triple.

INSERT DATA { <http://musicbrainz.foo/release-country/737041> <http://musicbrainz.foo/release> <http://musicbrainz.foo/release/435759> };INSERT DATA { <http://musicbrainz.foo/release-country/737041> <http://musicbrainz.foo/date-year> "2018"^^<http://www.w3.org/2001/XMLSchema#int> };

En anert Zil war nei Wëssen aus der Grafik ze kréien. Loosst eis soen, mir wëllen d'Zuel vun de Releases kréien, déi all Kënschtler an hirer Carrière publizéiert huet. Sou eng Ufro ass zimmlech komplex an dauert iwwer 20 Minutten am Neptun, also musse mir d'Resultat materialiséieren fir dëst neit Wëssen an enger anerer Ufro ze benotzen. Also addéiere mir Triple mat dëser Informatioun zréck an d'Grafik, gitt d'Resultat vun der Ënnerquery.

INSERT {
 
 
  ?artist_credit <http://musicbrainz.foo/number-of-releases> ?number_of_releases
 
} WHERE {
 
  SELECT ?artist_credit (COUNT(*) as ?number_of_releases)
 
  WHERE {
 
     ?artist_credit <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit> .
 
     ?release_group <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?release_group <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/release-group> .
 
     ?release_group <http://musicbrainz.foo/name> ?release_group_name .
 
  }
 
  GROUP BY ?artist_credit
 
}

Eenzel Triple op d'Grafik bäidroen dauert e puer Millisekonnen, während d'Ausféierungszäit fir d'Resultat vun enger Ënnerquery anzeginn hänkt vun der Ausféierungszäit vun der Ënnerquery selwer of.

Och wa mir et net dacks benotzt hunn, erlaabt Neptun Iech och Triplets ze läschen op Basis vu Proben oder explizit Daten, déi benotzt kënne fir Informatioun ze aktualiséieren.

SPARQL Ufroen

Duerch d'Aféierung vun der viregter Ënnersample, déi d'Zuel vun de Verëffentlechunge fir all Kënschtler zréckginn, hu mir schonn déi éischt Zort Ufro agefouert, déi mir mat Neptun beäntweren wëllen. Eng Ufro am Neptun bauen ass einfach - schéckt eng POST Ufro un de SPARQL Endpunkt, wéi hei ënnendrënner:

curl -X POST --data-binary 'query=SELECT ?artist ?p ?o where {?artist <http://musicbrainz.foo/name> "Elton John" . ?artist ?p ?o . }' http://your-neptune-cluster:8182/sparql

Zousätzlech hu mir eng Ufro implementéiert déi e Kënschtlerprofil zréckginn mat Informatioun iwwer hiren Numm, Alter oder Hierkonftsland. Denkt drun datt d'Performer Individuen, Bands oder Orchestere kënne sinn. Zousätzlech ergänzen mir dës Donnéeën mat Informatioun iwwer d'Zuel vun de Verëffentlechunge vun de Kënschtler am Laf vum Joer. Fir Solo-Kënschtler fügen mir och Informatiounen iwwer d'Bands un, un deenen d'Kënschtler all Joer matgemaach hunn.

SELECT
 
 
 ?artist_name ?year
 
 ?releases_in_year ?releases_up_year
 
 ?artist_type_name ?releases
 
 ?artist_gender ?artist_country_name
 
 ?artist_begin_date ?bands
 
 ?bands_in_year
 
WHERE {
 
 # Bands for each artist
 
 {
 
   SELECT
 
     ?year
 
     ?first_artist
 
     (group_concat(DISTINCT ?second_artist_name;separator=",") as ?bands)
 
     (COUNT(DISTINCT ?second_artist_name) AS ?bands_in_year)     
 
   WHERE {
 
     VALUES ?year {
 
       1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
 
       1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
 
       1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
 
       1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
 
       2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
 
       2010 2011 2012 2013 2014 2015 2016 2017 2018
 
     }   
 
     ?first_artist <http://musicbrainz.foo/name> "Elton John" .
 
     ?first_artist <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist> .
 
     ?first_artist <http://musicbrainz.foo/type> ?first_artist_type .
 
     ?first_artist <http://musicbrainz.foo/name> ?first_artist_name .
 

 
 
     ?second_artist <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist> .
 
     ?second_artist <http://musicbrainz.foo/type> ?second_artist_type .
 
     ?second_artist <http://musicbrainz.foo/name> ?second_artist_name .
 
     optional { ?second_artist <http://musicbrainz.foo/begin-date-year> ?second_artist_begin_date_year . }
 
     optional { ?second_artist <http://musicbrainz.foo/end-date-year> ?second_artist_end_date_year . }
 

 
 
     ?l_artist_artist <http://musicbrainz.foo/entity0> ?first_artist .
 
     ?l_artist_artist <http://musicbrainz.foo/entity1> ?second_artist .
 
     ?l_artist_artist <http://musicbrainz.foo/link> ?link .
 

 
 
     optional { ?link <http://musicbrainz.foo/begin-date-year> ?link_begin_date_year . }
 
     optional { ?link <http://musicbrainz.foo/end-date-year> ?link_end_date_year . }
 

 
 
     FILTER (!bound(?link_begin_date_year) || ?link_begin_date_year <= ?year)
 
     FILTER (!bound(?link_end_date_year) || ?link_end_date_year >= ?year)
 
     FILTER (!bound(?second_artist_begin_date_year) || ?second_artist_begin_date_year <= ?year)
 
     FILTER (!bound(?second_artist_end_date_year) || ?second_artist_end_date_year >= ?year)
 
     FILTER (?first_artist_type NOT IN (<http://musicbrainz.foo/artist-type/2>, <http://musicbrainz.foo/artist-type/5>, <http://musicbrainz.foo/artist-type/6>))
 
     FILTER (?second_artist_type IN (<http://musicbrainz.foo/artist-type/2>, <http://musicbrainz.foo/artist-type/5>, <http://musicbrainz.foo/artist-type/6>))
 
   }
 
   GROUP BY ?first_artist ?year
 
 }
 
 # Releases up to a year
 
 {
 
   SELECT
 
     ?artist
 
     ?year
 
     (group_concat(DISTINCT ?release_name;separator=",") as ?releases)
 
     (COUNT(*) as ?releases_up_year)
 
   WHERE {
 
     VALUES ?year {
 
       1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
 
       1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
 
       1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
 
       1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
 
       2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
 
       2010 2011 2012 2013 2014 2015 2016 2017 2018 
 
     }
 

 
 
     ?artist <http://musicbrainz.foo/name> "Elton John" .
 

 
 
     ?artist_credit_name <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?artist_credit_name <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit-name> .
 
     ?artist_credit_name <http://musicbrainz.foo/artist> ?artist .
 
     ?artist_credit <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit> .
 

 
 
     ?release_group <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?release_group <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/release-group> .
 
     ?release_group <http://musicbrainz.foo/name> ?release_group_name .
 
     ?release <http://musicbrainz.foo/release-group> ?release_group .
 
     ?release <http://musicbrainz.foo/name> ?release_name .
 
     ?release_country <http://musicbrainz.foo/release> ?release .
 
     ?release_country <http://musicbrainz.foo/date-year> ?release_country_year .
 

 
 
     FILTER (?release_country_year <= ?year)
 
   }
 
   GROUP BY ?artist ?year
 
 }
 
 # Releases in a year
 
 {
 
   SELECT ?artist ?year (COUNT(*) as ?releases_in_year)
 
   WHERE {
 
     VALUES ?year {
 
       1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
 
       1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
 
       1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
 
       1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
 
       2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
 
       2010 2011 2012 2013 2014 2015 2016 2017 2018 
 
     }
 

 
 
     ?artist <http://musicbrainz.foo/name> "Elton John" .
 

 
 
     ?artist_credit_name <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?artist_credit_name <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit-name> .
 
     ?artist_credit_name <http://musicbrainz.foo/artist> ?artist .
 
     ?artist_credit <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit> .
 

 
 
     ?release_group <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?release_group <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/release-group> .
 
     ?release_group <http://musicbrainz.foo/name> ?release_group_name .
 
     ?release <http://musicbrainz.foo/release-group> ?release_group .
 
     ?release_country <http://musicbrainz.foo/release> ?release .
 
     ?release_country <http://musicbrainz.foo/date-year> ?release_country_year .
 

 
 
     FILTER (?release_country_year = ?year)
 
   }
 
   GROUP BY ?artist ?year
 
 }
 
 # Master data
 
 {
 
   SELECT DISTINCT ?artist ?artist_name ?artist_gender ?artist_begin_date ?artist_country_name
 
   WHERE {
 
     ?artist <http://musicbrainz.foo/name> ?artist_name .
 
     ?artist <http://musicbrainz.foo/name> "Elton John" .
 
     ?artist <http://musicbrainz.foo/gender> ?artist_gender_id .
 
     ?artist_gender_id <http://musicbrainz.foo/name> ?artist_gender .
 
     ?artist <http://musicbrainz.foo/area> ?birth_area .
 
     ?artist <http://musicbrainz.foo/begin-date-year> ?artist_begin_date.
 
     ?birth_area <http://musicbrainz.foo/name> ?artist_country_name .
 

 
 
     FILTER(datatype(?artist_begin_date) = xsd:int)
 
   }

Wéinst der Komplexitéit vun esou enger Ufro kënne mir nëmme Punktufroe fir e spezifesche Kënschtler ausféieren, wéi zum Beispill Elton John, awer net fir all Kënschtler. Den Neptun schéngt net sou eng Ufro ze optimiséieren andeems Filteren an Ënnerselektioune falen. Dofir muss all Auswiel manuell nom Kënschtlernumm gefiltert ginn.

Neptun huet souwuel Stonneplang a pro-I / O Käschten. Fir eisen Testen hu mir déi minimal Neptun Instanz benotzt, déi $ 0,384 / Stonn kascht. Am Fall vun der Ufro hei uewen, déi de Profil fir en eenzegen Aarbechter berechent, berechnet Amazon eis Zéngdausende vun I/O Operatiounen, wat e Käschte vun $ 0.02 implizéiert.

Konklusioun

Als éischt hält Amazon Neptun déi meescht vu senge Verspriechen. Als verwalteten Service ass et eng Grafikdatenbank déi extrem einfach ze installéieren ass a ka lafen ouni vill Konfiguratioun. Hei sinn eis fënnef Schlësselbefunde:

  • Bulk Upload ass einfach awer lues. Awer et kann komplizéiert ginn mat Fehlermeldungen déi net ganz hëllefräich sinn.
  • Streaming Download ënnerstëtzt alles wat mir erwaart hunn a war zimlech séier
  • Ufroe sinn einfach, awer net interaktiv genuch fir analytesch Ufroen auszeféieren
  • SPARQL Ufroe musse manuell optimiséiert ginn
  • Amazon Bezuelungen si schwéier ze schätzen, well et schwéier ass d'Quantitéit vun den Donnéeën ze schätzen, déi vun enger SPARQL Ufro gescannt ginn.

Dat ass alles. Umellen fir Gratis Webinar zum Thema "Load Balancing".


Source: will.com

Setzt e Commentaire