L-ewwel impressjonijiet ta 'Amazon Neptune

Salut, residenti Khabrovsk. B'antiċipazzjoni tal-bidu tal-kors "AWS għall-Iżviluppaturi" Ħejjejna traduzzjoni ta’ materjal interessanti.

L-ewwel impressjonijiet ta 'Amazon Neptune

F'ħafna każijiet ta 'użu li nħobbu bakdataKif naraw fuq il-websajts tal-klijenti tagħna, informazzjoni rilevanti hija moħbija f'konnessjonijiet bejn entitajiet, pereżempju meta jiġu analizzati r-relazzjonijiet bejn l-utenti, id-dipendenzi bejn l-elementi, jew il-konnessjonijiet bejn is-sensuri. Każijiet ta' użu bħal dawn huma ġeneralment immudellati fuq graff. Aktar kmieni din is-sena, Amazon ħarġet database tal-grafiċi ġdida msejħa Neptune. F'din il-post irridu naqsmu l-ewwel ideat tagħna, prattiki tajbin u x'jista' jittejjeb maż-żmien.

Għaliex kellna bżonn Amazon Neptune

Id-databases tal-grafiċi jwiegħdu li jimmaniġġjaw settijiet ta' data konnessi ħafna aħjar mill-ekwivalenti relazzjonali tagħhom. F'tali datasets, l-informazzjoni rilevanti normalment tinħażen f'relazzjonijiet bejn l-oġġetti. Aħna użajna proġett aqwa tad-dejta miftuħa biex nittestjaw lil Neptune MusicBrainz. MusicBrainz jiġbor kull tip ta’ metadata tal-mużika immaġinabbli, bħal informazzjoni dwar artisti, kanzunetti, ħarġiet ta’ albums jew kunċerti, kif ukoll ma’ min ikkollabora l-artist wara l-kanzunetta jew meta l-album ġie rilaxxat f’liema pajjiż. MusicBrainz jista 'jitqies bħala netwerk enormi ta' entitajiet li huma b'xi mod konnessi mal-industrija tal-mużika.

Is-sett tad-dejta MusicBrainz huwa pprovdut bħala dump CSV ta' database relazzjonali. B'kollox, il-miżbla fiha madwar 93 miljun ringiela f'157 tabella. Filwaqt li xi wħud minn dawn it-tabelli fihom dejta bażika bħal artisti, avvenimenti, reġistrazzjonijiet, rilaxxi jew binarji, oħrajn link tabelli — jaħżnu relazzjonijiet bejn artisti u reġistrazzjonijiet, artisti jew rilaxxi oħra, eċċ... Dawn juru l-istruttura tal-graff ta’ sett ta’ dejta. Meta kkonverti d-dataset fi trippli RDF, ksibna madwar 500 miljun każ.

Fuq il-bażi tal-esperjenza u l-impressjonijiet tal-imsieħba tal-proġett li naħdmu magħhom, nippreżentaw ambjent li fih din il-bażi tal-għarfien tintuża biex tinkiseb informazzjoni ġdida. Barra minn hekk, nistennew li tiġi aġġornata regolarment, pereżempju billi nżidu ħarġiet ġodda jew naġġornaw il-membri tal-grupp.

aġġustament

Kif mistenni, l-installazzjoni ta 'Amazon Neptune hija sempliċi. Hija pjuttost dettaljata dokumentat. Tista' tniedi database tal-graff fi ftit klikks biss. Madankollu, meta niġu għal konfigurazzjoni aktar dettaljata, informazzjoni meħtieġa diffiċli li ssib. Għalhekk, irridu nippuntaw għal parametru ta 'konfigurazzjoni wieħed.

L-ewwel impressjonijiet ta 'Amazon Neptune
Screenshot tal-konfigurazzjoni għal gruppi ta' parametri

Amazon tgħid li Neptune jiffoka fuq xogħol transazzjonali b'latenza baxxa, u huwa għalhekk li l-timeout tat-talba default huwa 120 sekonda. Madankollu, ittestjajna ħafna każijiet ta' użu analitiku li fihom regolarment lħaqna dan il-limitu. Dan il-timeout jista' jinbidel billi jinħoloq grupp ta' parametri ġdid għal Neptune u l-issettjar neptune_query_timeout restrizzjoni korrispondenti.

Tagħbija tad-Dejta

Hawn taħt ser niddiskutu fid-dettall kif għabbejna d-dejta ta' MusicBrainz f'Neptune.

Relazzjonijiet fi tlieta

L-ewwel, aħna kkonvertit id-data MusicBrainz fi trippli RDF. Għalhekk, għal kull tabella, iddefinijna mudell li jiddefinixxi kif kull kolonna hija rappreżentata fit-trippla. F'dan l-eżempju, kull ringiela mit-tabella tal-artist hija mmappjata għal tnax-il trippla RDF.

<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> .

upload bl-ingrossa

Il-mod suġġerit biex tagħbija ammonti kbar ta 'dejta f'Neptune huwa permezz tal-proċess ta' upload bl-ingrossa permezz ta 'S3. Wara li ttella' l-fajls tat-triples tiegħek fuq S3, tibda t-tlugħ billi tuża talba POST. Fil-każ tagħna, ħadet madwar 24 siegħa għal 500 miljun triplet. Aħna stennejna li jkun aktar mgħaġġel.

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"
 
}'

Biex nevitaw dan il-proċess twil kull darba li nniedu Neptune, iddeċidejna li nirrestawraw l-istanza minn snapshot li fiha dawn it-tripletti kienu diġà mgħobbija. It-tmexxija minn snapshot hija ferm aktar mgħaġġla, iżda xorta tieħu madwar siegħa sakemm Neptune jkun disponibbli għat-talbiet.

Meta inizjalment tagħbija triplets f'Neptune, iltqajna ma 'diversi żbalji.

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

Xi wħud minnhom kienu parsing żbalji, kif muri hawn fuq. Sal-lum, għadna ma dehretx x'ġara ħażin eżattament f'dan il-punt. Ftit aktar dettall żgur jgħin hawn. Dan l-iżball seħħ għal madwar 1% tat-tripli mdaħħla. Imma sa fejn imur l-ittestjar ta 'Neptune, aċċettajna l-fatt li naħdmu biss b'99% tal-informazzjoni minn MusicBrainz.

Anke jekk dan huwa faċli għal nies familjari ma 'SPARQL, kun konxju li t-tripli RDF għandhom jiġu annotati b'tipi ta' dejta espliċiti, li għal darb'oħra jistgħu jikkawżaw żbalji.

Streaming download

Kif imsemmi hawn fuq, ma rridux nużaw Neptune bħala maħżen tad-dejta statika, iżda pjuttost bħala bażi ta 'għarfien flessibbli u li tevolvi. Għalhekk kellna bżonn insibu modi kif nintroduċu trippli ġodda meta l-bażi tal-għarfien tinbidel, pereżempju meta jiġi ppubblikat album ġdid jew meta rridu jimmaterjalizzaw għarfien derivat.

Neptune jappoġġja operaturi ta 'input permezz ta' mistoqsijiet SPARQL, kemm mhux maħduma kif ukoll ibbażati fuq kampjuni. Aħna ser niddiskutu ż-żewġ approċċi hawn taħt.

Waħda mill-għanijiet tagħna kienet li ndaħħlu d-data b'mod streaming. Ikkunsidra li toħroġ album f'pajjiż ġdid. Mill-perspettiva ta’ MusicBrainz, dan ifisser li għal ħruġ li jinkludi albums, singles, EPs, eċċ., tiżdied entrata ġdida mat-tabella. rilaxx-pajjiż. F'RDF, inqabblu din l-informazzjoni ma' żewġ trippli ġodda.

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> };

Għan ieħor kien li jinkiseb għarfien ġdid mill-graff. Ejja ngħidu li rridu nġibu n-numru ta’ ħarġiet li kull artist ippubblika fil-karriera tiegħu. Mistoqsija bħal din hija pjuttost kumplessa u tieħu aktar minn 20 minuta f'Neptune, għalhekk jeħtieġ li nimmaterjalizzaw ir-riżultat sabiex nużaw mill-ġdid dan l-għarfien ġdid f'xi mistoqsija oħra. Allura aħna nżidu t-tripli b'din l-informazzjoni lura għall-graff, u ndaħħlu r-riżultat tas-subquery.

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
 
}

Iż-żieda ta 'tripli singoli mal-graff tieħu ftit millisekondi, filwaqt li l-ħin ta' eżekuzzjoni biex jiddaħħal ir-riżultat ta 'subquery jiddependi fuq il-ħin ta' eżekuzzjoni tas-subquery innifsu.

Għalkemm aħna ma użajnax spiss, Neptune jippermettilek ukoll li tneħħi triplets ibbażati fuq kampjuni jew data espliċita, li jistgħu jintużaw biex taġġorna l-informazzjoni.

Mistoqsijiet SPARQL

Bl-introduzzjoni tas-subkampjun preċedenti, li jirritorna n-numru ta 'rilaxxi għal kull artist, diġà introduċejna l-ewwel tip ta' mistoqsija li rridu nwieġbu billi tuża Neptune. Il-bini ta' mistoqsija f'Neptune huwa faċli - ibgħat talba POST lill-endpoint SPARQL, kif muri hawn taħt:

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

Barra minn hekk, implimentajna mistoqsija li tirritorna profil tal-artist li jkun fih informazzjoni dwar isimhom, l-età jew il-pajjiż tal-oriġini tagħhom. Żomm f'moħħok li l-artisti jistgħu jkunu individwi, baned, jew orkestri. Barra minn hekk, aħna nissupplimentaw din id-dejta b'informazzjoni dwar in-numru ta 'rilaxxi rilaxxati minn artisti matul is-sena. Għall-artisti solisti, inżidu wkoll informazzjoni dwar il-baned li l-artist ipparteċipa fihom kull sena.

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)
 
   }

Minħabba l-kumplessità ta’ mistoqsija bħal din, nistgħu nwettqu biss mistoqsijiet tal-punti għal artist speċifiku, bħal Elton John, iżda mhux għall-artisti kollha. Neptune ma jidhirx li jottimizza tali mistoqsija billi jwaqqa' filtri f'subselects. Għalhekk, kull għażla trid tiġi ffiltrata manwalment mill-isem tal-artist.

Neptune għandu ħlasijiet kemm fis-siegħa kif ukoll għal kull I/O. Għall-ittestjar tagħna, użajna l-istanza minima ta' Neptune, li tiswa $ 0,384/siegħa. Fil-każ tal-mistoqsija ta 'hawn fuq, li tikkalkula l-profil għal ħaddiem wieħed, Amazon tiċċarġjana għexieren ta' eluf ta 'operazzjonijiet I/O, li timplika spiża ta' $0.02.

Output

L-ewwel, Amazon Neptune iżżomm ħafna mill-wegħdiet tagħha. Bħala servizz ġestit, hija database tal-graff li hija estremament faċli biex tinstalla u tista 'titħaddem u taħdem mingħajr ħafna konfigurazzjoni. Hawn huma l-ħames sejbiet ewlenin tagħna:

  • It-tlugħ bl-ingrossa huwa faċli iżda bil-mod. Iżda jista 'jikkumplika messaġġi ta' żball li mhumiex ta 'għajnuna kbira.
  • L-istreaming download jappoġġja dak kollu li stennejna u kien pjuttost mgħaġġel
  • Il-mistoqsijiet huma sempliċi, iżda mhux interattivi biżżejjed biex imexxu mistoqsijiet analitiċi
  • Il-mistoqsijiet SPARQL għandhom jiġu ottimizzati manwalment
  • Il-pagamenti tal-Amazon huma diffiċli biex jiġu stmati minħabba li huwa diffiċli li jiġi stmat l-ammont ta 'dejta skennjata minn mistoqsija SPARQL.

Dak kollox. Irreġistra għal Webinar b'xejn dwar is-suġġett "Ibbilanċjar tat-Tagħbija".


Sors: www.habr.com

Żid kumment