A 'chiad bheachdan air Amazon Neptune

Cuir fàilte air luchd-còmhnaidh Khabrovsk. Le dùil ri toiseach a’ chùrsa "AWS airson luchd-leasachaidh" Tha sinn air eadar-theangachadh de stuth inntinneach ullachadh.

A 'chiad bheachdan air Amazon Neptune

Ann an iomadh cùis cleachdaidh as toil leinn dàtaMar a chì sinn air làraich-lìn ar luchd-dèiligidh, tha fiosrachadh buntainneach falaichte ann an ceanglaichean eadar buidhnean, mar eisimpleir nuair a thathar a’ dèanamh anailis air dàimhean eadar luchd-cleachdaidh, eisimeileachd eadar eileamaidean, no ceanglaichean eadar mothachairean. Mar as trice bidh cùisean cleachdaidh mar sin air am modaladh air graf. Nas tràithe am-bliadhna, chuir Amazon a-mach an stòr-dàta grafa ùr aca, Neptune. Anns an dreuchd seo tha sinn airson ar ciad bheachdan, deagh chleachdaidhean agus na ghabhas leasachadh thar ùine a cho-roinn.

Carson a bha feum againn air Amazon Neptune

Tha stòran-dàta graf a’ gealltainn gun làimhsich iad seataichean dàta làn-cheangailte nas fheàrr na an co-ionannachdan dàimheach. Ann an stòran-dàta mar sin, mar as trice bidh fiosrachadh buntainneach air a stòradh ann an dàimhean eadar nithean. Chleachd sinn pròiseact dàta fosgailte iongantach gus deuchainn a dhèanamh air Neptune CeòlBrainz. Bidh MusicBrainz a’ cruinneachadh a h-uile seòrsa meata-dàta ciùil a ghabhas smaoineachadh, leithid fiosrachadh mu luchd-ealain, òrain, fiosan clàr no cuirmean, a bharrachd air cò leis an do cho-obraich an neach-ealain air cùl an òrain no cuin a chaidh an clàr fhoillseachadh anns an dùthaich sin. Faodar MusicBrainz fhaicinn mar lìonra mòr de bhuidhnean a tha ceangailte ann an dòigh air choireigin ri gnìomhachas a’ chiùil.

Tha an stòr-dàta MusicBrainz air a thoirt seachad mar dhump CSV de stòr-dàta dàimh. Gu h-iomlan, tha timcheall air 93 millean sreath ann an 157 clàran anns an dump. Ged a tha dàta bunaiteach ann an cuid de na clàran sin leithid luchd-ealain, tachartasan, clàraidhean, fiosan no slighean, cuid eile clàran ceangail — a' stòradh dhàimhean eadar luchd-ealain agus clàran, luchd-ealain eile no fiosan, msaa... Bidh iad a' taisbeanadh structar graf seata dàta. Nuair a thionndaidh sinn an dàta gu trì-fhillte RDF, fhuair sinn timcheall air 500 millean cùis.

Stèidhichte air eòlas agus beachdan chom-pàirtichean a’ phròiseict leis a bheil sinn ag obair, bidh sinn a’ taisbeanadh suidheachadh far a bheil am bunait eòlais seo air a chleachdadh gus fiosrachadh ùr fhaighinn. A bharrachd air an sin, tha sinn an dùil gun tèid ùrachadh gu cunbhalach, mar eisimpleir le bhith a’ cur fiosan ùra ris no ag ùrachadh buill na buidhne.

adjustment

Mar a bhiodh dùil, tha stàladh Amazon Neptune sìmplidh. Tha i gu math mionaideach clàraichte. Faodaidh tu stòr-dàta graf a chuir air bhog ann am beagan chlican. Ach, nuair a thig e gu rèiteachadh nas mionaidiche, fiosrachadh riatanach duilich a lorg. Mar sin, tha sinn airson iomradh a thoirt air aon paramadair rèiteachaidh.

A 'chiad bheachdan air Amazon Neptune
Glacadh-sgrìn rèiteachaidh airson buidhnean paramadair

Tha Amazon ag ràdh gu bheil Neptune a’ cuimseachadh air eallach obrach gnìomhachd ìosal latency, agus is e sin as coireach gur e 120 diogan an ùine tagraidh bunaiteach. Ach tha sinn air deuchainn a dhèanamh air mòran chùisean cleachdaidh anailis anns an do ràinig sinn a’ chrìoch seo gu cunbhalach. Faodar an ùine seo atharrachadh le bhith a’ cruthachadh buidheann paramadair ùr airson Neptune agus suidheachadh neptune_query_timeout cuingealachadh co-fhreagarrach.

A’ luchdachadh dàta

Gu h-ìosal bruidhnidh sinn gu mionaideach mar a chuir sinn dàta MusicBrainz a-steach gu Neptune.

Dàimhean ann an triùir

An toiseach, thionndaidh sinn an dàta MusicBrainz gu trì-fhilltean RDF. Mar sin, airson gach clàr, mhìnich sinn teamplaid a mhìnicheas mar a tha gach colbh air a riochdachadh anns an triple. Anns an eisimpleir seo, tha gach sreath bhon chlàr cluicheadair air a mhapadh gu dusan trì-deug 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> .

luchdachadh suas mòr

Is e an dòigh a thathar a’ moladh tòrr dàta a luchdachadh a-steach do Neptune tron ​​phròiseas luchdachadh suas mòr tro S3. Às deidh dhut na faidhlichean triple agad a luchdachadh suas gu S3, tòisichidh tu air an luchdachadh suas a’ cleachdadh iarrtas POST. Anns a 'chùis againn, thug e timcheall air 24 uairean airson 500 millean triplets. Bha sinn an dùil gum biodh e nas luaithe.

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

Gus am pròiseas fada seo a sheachnadh a h-uile uair a chuireas sinn Neptune air bhog, chuir sinn romhainn an eisimpleir a thoirt air ais bho dhealbh anns an robh na triplets sin air an luchdachadh mu thràth. Tha ruith bho dhealbh gu math nas luaithe, ach bheir e timcheall air uair a thìde gus am bi Neptune ri fhaighinn airson iarrtasan.

Nuair a bha sinn an toiseach a’ luchdachadh triplets a-steach do Neptune, thachair sinn ri grunn mhearachdan.

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

Bha cuid dhiubh nam mearachdan parsaidh, mar a chithear gu h-àrd. Gu ruige seo, chan eil sinn fhathast air faighinn a-mach dè dìreach a chaidh ceàrr aig an ìre seo. Bhiodh beagan a bharrachd mion-fhiosrachaidh gu cinnteach na chuideachadh an seo. Thachair a’ mhearachd seo airson timcheall air 1% de na trì tursan a chaidh a chuir a-steach. Ach a thaobh deuchainn Neptune, ghabh sinn ris nach obraich sinn ach le 99% den fhiosrachadh bho MusicBrainz.

Eadhon ged a tha seo furasta do dhaoine a tha eòlach air SPARQL, bi mothachail gum feumar trì-fhilltean RDF a bhith air an comharrachadh le seòrsachan dàta soilleir, a dh’ fhaodadh mearachdan adhbhrachadh a-rithist.

Streaming luchdadh a-nuas

Mar a chaidh ainmeachadh gu h-àrd, chan eil sinn airson Neptune a chleachdadh mar stòr dàta statach, ach mar bhunait eòlais sùbailte agus mean-fhàs. Mar sin dh'fheumadh sinn dòighean a lorg gus trì-fhilltean ùra a thoirt a-steach nuair a dh'atharraicheas am bunait eòlais, mar eisimpleir nuair a thèid clàr ùr fhoillseachadh no nuair a tha sinn airson eòlas a thoirt gu buil.

Bidh Neptune a’ toirt taic do ghnìomhaichean cuir a-steach tro cheistean SPARQL, an dà chuid amh agus stèidhichte air sampall. Bruidhnidh sinn an dà dhòigh-obrach gu h-ìosal.

B’ e aon de na h-amasan againn dàta a chuir a-steach ann an dòigh sruthadh. Beachdaich air clàr a leigeil ma sgaoil ann an dùthaich ùr. Bho shealladh MusicBrainz, tha seo a’ ciallachadh gum bi inntrig ùr air a chur ris a’ chlàr airson foillseachadh a tha a’ toirt a-steach clàran, singles, EPs, msaa. dùthaich fuasglaidh. Ann an RDF, bidh sinn a’ maidseadh an fhiosrachaidh seo le dà thriùir ùr.

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

B’ e amas eile eòlas ùr fhaighinn bhon ghraf. Canaidh sinn gu bheil sinn airson an àireamh de fhiosan a tha gach neach-ealain air fhoillseachadh nan cùrsa-beatha. Tha a leithid de cheist gu math toinnte agus bheir e còrr air 20 mionaid ann an Neptune, agus mar sin feumaidh sinn an toradh a thoirt gu buil gus an t-eòlas ùr seo ath-chleachdadh ann an ceist eile. Mar sin cuiridh sinn triples leis an fhiosrachadh seo air ais chun ghraf, a’ dol a-steach do thoradh an fho-cheist.

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
 
}

Le bhith a’ cur trì-bhilean singilte ris a’ ghraf bheir e beagan mhilleanan diog, agus tha an ùine cur gu bàs airson toradh subquery a chuir a-steach an urra ri àm cur gu bàs an fho-cheist fhèin.

Ged nach do chleachd sinn e gu tric, leigidh Neptune leat triplets a thoirt air falbh stèidhichte air sampallan no dàta soilleir, a ghabhas cleachdadh gus fiosrachadh ùrachadh.

Ceistean SPARQL

Le bhith a’ toirt a-steach an fho-shampall a bh’ ann roimhe, a thilleas an àireamh de sgaoilidhean airson gach neach-ealain, tha sinn mu thràth air a’ chiad seòrsa ceist a tha sinn airson a fhreagairt a’ cleachdadh Neptune a thoirt a-steach. Tha e furasta ceist a thogail ann an Neptune - cuir iarrtas POST chun cheann-uidhe SPARQL, mar a chithear gu h-ìosal:

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

A bharrachd air an sin, tha sinn air ceist a chuir an gnìomh a thilleas ìomhaigh neach-ealain anns a bheil fiosrachadh mun ainm, an aois no an dùthaich às an tàinig iad. Cumaibh cuimhne gum faod na cleasaichean a bhith nan daoine fa leth, còmhlain, no orcastra. A bharrachd air an sin, bidh sinn a’ cur ris an dàta seo le fiosrachadh mun àireamh de fhiosan a chaidh fhoillseachadh le luchd-ealain tron ​​bhliadhna. Airson luchd-ealain aon-neach, bidh sinn cuideachd a’ cur fiosrachadh ris mu na còmhlain anns an do ghabh luchd-ealain pàirt gach bliadhna.

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

Air sgàth cho iom-fhillte 'sa tha an leithid de cheist, cha b' urrainn dhuinn ach ceistean puing a dhèanamh airson neach-ealain sònraichte, leithid Elton John, ach chan ann airson a h-uile neach-ealain. Chan eil e coltach gu bheil Neptune a’ dèanamh an fheum as fheàrr de cheist le bhith a’ leigeil sìoltachain gu fo-roghainnean. Mar sin, feumaidh gach taghadh a bhith air a shìoladh le làimh a rèir ainm neach-ealain.

Tha cosgaisean gach uair agus per-I/O aig Neptune. Airson ar deuchainn, chleachd sinn an eisimpleir lom as ìsle de Neptune, a chosgas $0,384 san uair. A thaobh na ceiste gu h-àrd, a bhios a’ tomhas ìomhaigh aon neach-obrach, tha Amazon a’ cur cosgais oirnn deichean de mhìltean de ghnìomhachd I/O, a’ ciallachadh cosgais $0.02.

co-dhùnadh

An toiseach, tha Amazon Neptune a 'cumail a' mhòr-chuid de na geallaidhean aige. Mar sheirbheis stiùirichte, is e stòr-dàta graf a th’ ann a tha gu math furasta a stàladh agus a dh’ fhaodas a bhith ag obair gun mòran rèiteachaidh. Seo na còig prìomh thoraidhean againn:

  • Tha luchdachadh suas mòr furasta ach slaodach. Ach faodaidh e fàs iom-fhillte le teachdaireachdan mearachd nach eil gu math cuideachail.
  • Tha luchdachadh sìos sruthadh a’ toirt taic don a h-uile dad a bha sinn an dùil agus bha e gu math luath
  • Tha ceistean sìmplidh, ach chan eil iad eadar-ghnìomhach gu leòr airson ceistean anailis a ruith
  • Feumaidh ceistean SPARQL a bhith air an ùrachadh le làimh
  • Tha e duilich tuairmse a dhèanamh air pàighidhean Amazon oir tha e duilich tuairmse a dhèanamh air an ìre de dhàta a chaidh a sganadh le ceist SPARQL.

Sin e. Clàraich airson webinar saor 's an asgaidh air a' chuspair "Load Balancing".


Source: www.habr.com

Cuir beachd ann