Unang mga impresyon sa Amazon Neptune

Salute, mga residente sa Khabrovsk. Sa pagpaabot sa pagsugod sa kurso "AWS alang sa mga Developer" Nag-andam kami ug usa ka hubad sa makaiikag nga materyal.

Unang mga impresyon sa Amazon Neptune

Sa daghang mga kaso sa paggamit nga gusto namon bakdataSama sa among nakita sa mga website sa among mga kliyente, ang may kalabutan nga kasayuran gitago sa mga koneksyon tali sa mga entidad, pananglitan kung mag-analisar sa mga relasyon tali sa mga tiggamit, dependency tali sa mga elemento, o koneksyon tali sa mga sensor. Ang ingon nga mga kaso sa paggamit kasagaran gimodelo sa usa ka graph. Sayo ning tuiga, gipagawas sa Amazon ang bag-ong database sa graph, ang Neptune. Sa kini nga post gusto namon nga ipaambit ang among una nga mga ideya, maayong mga gawi ug kung unsa ang mahimong mapauswag sa paglabay sa panahon.

Ngano nga kinahanglan namon ang Amazon Neptune

Ang mga database sa graph nagsaad nga madumala ang labi ka konektado nga mga set sa datos nga labi ka maayo kaysa sa ilang mga katumbas nga relasyon. Sa ingon nga mga dataset, ang may kalabutan nga impormasyon kasagarang gitipigan sa mga relasyon tali sa mga butang. Gigamit namo ang usa ka talagsaon nga open data project aron sulayan ang Neptune MusicBrainz. Gikolekta sa MusicBrainz ang tanang matang sa metadata sa musika nga mahunahunaan, sama sa impormasyon bahin sa mga artista, kanta, pagpagawas sa album o konsiyerto, ingon man kung kinsa ang artist sa luyo sa kanta nakigtambayayong o kanus-a gipagawas ang album kung asa nga nasud. Ang MusicBrainz makita nga usa ka dako nga network sa mga entidad nga konektado sa industriya sa musika.

Ang MusicBrainz dataset gihatag isip CSV dump sa usa ka relational database. Sa kinatibuk-an, ang dump adunay mga 93 milyon nga mga laray sa 157 nga mga lamesa. Samtang ang pipila niini nga mga lamesa adunay sukaranan nga datos sama sa mga artista, panghitabo, pagrekord, pagpagawas o mga track, uban pa link nga mga lamesa — tindahan sa mga relasyon tali sa mga artista ug mga rekording, uban pang mga artista o mga gipagawas, ug uban pa... Gipakita nila ang istruktura sa graph sa usa ka set sa datos. Kung gi-convert ang dataset ngadto sa RDF triples, nakuha namo ang gibana-bana nga 500 ka milyon nga mga higayon.

Base sa kasinatian ug mga impresyon sa mga kauban sa proyekto nga among gitrabahoan, among gipresentar ang usa ka kahimtang diin kini nga base sa kahibalo gigamit aron makakuha og bag-ong impormasyon. Dugang pa, gilauman namon nga kini kanunay nga ma-update, pananglitan pinaagi sa pagdugang mga bag-ong pagpagawas o pag-update sa mga miyembro sa grupo.

kausaban

Sama sa gipaabut, ang pag-install sa Amazon Neptune yano ra. Detalyado kaayo siya dokumentado. Mahimo kang maglunsad og database sa graph sa pipila lang ka pag-klik. Bisan pa, kung bahin sa mas detalyado nga pag-configure, gikinahanglan nga impormasyon lisud pangitaon. Busa, gusto namong itudlo ang usa ka parameter sa configuration.

Unang mga impresyon sa Amazon Neptune
Pag-configure sa screenshot alang sa mga grupo sa parameter

Giingon sa Amazon nga ang Neptune naka-focus sa mga low-latency nga transactional workloads, mao nga ang default nga oras sa paghangyo mao ang 120 segundos. Kami, bisan pa, nagsulay sa daghang mga kaso sa paggamit sa analitikal diin kanunay namon nga naabot kini nga limitasyon. Kini nga timeout mahimong mausab pinaagi sa paghimo og bag-ong grupo sa parameter para sa Neptune ug setting neptune_query_timeout katugbang nga pagdili.

Nagkarga sa Data

Sa ubos atong hisgotan sa detalye kon sa unsang paagi atong gikarga ang MusicBrainz data ngadto sa Neptune.

Mga relasyon sa tulo

Una, among gi-convert ang MusicBrainz data ngadto sa RDF triples. Busa, alang sa matag lamesa, among gihubit ang usa ka template nga naghubit kung giunsa ang matag kolum girepresentar sa triple. Niini nga pananglitan, ang matag laray gikan sa lamesa sa performer gimapa ngadto sa dose ka triple sa 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> .

Daghang pag-upload

Ang gisugyot nga paagi sa pag-load sa daghang mga datos sa Neptune mao ang pinaagi sa daghang proseso sa pag-upload pinaagi sa S3. Human ma-upload ang imong triples files sa S3, sugdan nimo ang pag-upload gamit ang POST request. Sa among kaso, niabot ug mga 24 ka oras para sa 500 ka milyon nga triplets. Gipaabot namo nga mas paspas kini.

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

Aron malikayan kining taas nga proseso sa matag higayon nga maglansad kami sa Neptune, nakahukom kami nga ibalik ang instance gikan sa usa ka snapshot diin kini nga mga triplet nakarga na. Ang pagdagan gikan sa usa ka snapshot labi ka paspas, apan molungtad gihapon mga usa ka oras hangtod magamit ang Neptune alang sa mga hangyo.

Sa una nga pagkarga sa mga triplets ngadto sa Neptune, nasugatan namo ang lainlaing mga sayop.

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

Ang uban niini mga sayop sa pag-parse, sama sa gipakita sa ibabaw. Hangtod karon, wala pa namo mahibaw-i kung unsa gyud ang nahitabo niining puntoha. Ang gamay nga dugang nga detalye siguradong makatabang dinhi. Kini nga sayup nahitabo sa gibana-bana nga 1% sa gisulud nga triple. Apan kutob sa pagsulay sa Neptune, among gidawat ang kamatuoran nga kami nagtrabaho lamang sa 99% sa impormasyon gikan sa MusicBrainz.

Bisan kung kini dali alang sa mga tawo nga pamilyar sa SPARQL, hinumdomi nga ang mga triple sa RDF kinahanglan nga adunay annotate nga mga klaro nga tipo sa datos, nga mahimo usab nga hinungdan sa mga sayup.

Pag-download sa streaming

Sama sa gihisgutan sa ibabaw, dili namo gusto nga gamiton ang Neptune isip usa ka static nga data store, apan isip usa ka flexible ug nag-uswag nga base sa kahibalo. Busa kinahanglan namong mangitag mga paagi sa pagpaila sa bag-ong mga triple sa dihang mausab ang base sa kahibalo, pananglitan sa dihang mamantala ang usa ka bag-ong album o kon gusto namong matuman ang nakuha nga kahibalo.

Gisuportahan sa Neptune ang mga operator sa input pinaagi sa mga pangutana sa SPARQL, pareho nga hilaw ug base sa sample. Atong hisgotan ang duha ka pamaagi sa ubos.

Usa sa among mga katuyoan mao ang pagsulod sa datos sa usa ka streaming nga paagi. Ikonsiderar ang pagpagawas sa usa ka album sa usa ka bag-ong nasud. Gikan sa panan-aw sa MusicBrainz, kini nagpasabot nga alang sa usa ka pagpagawas nga naglakip sa mga album, singles, EPs, ug uban pa, usa ka bag-ong entry ang idugang sa lamesa release-nasud. Sa RDF, gipares namo kini nga impormasyon sa duha ka bag-ong 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> };

Ang laing tumong mao ang pagkuha og bag-ong kahibalo gikan sa graph. Ingnon ta nga gusto namon makuha ang gidaghanon sa mga pagpagawas nga gipatik sa matag artista sa ilang karera. Ang ingon nga pangutana medyo komplikado ug molungtad og kapin sa 20 ka minuto sa Neptune, mao nga kinahanglan natong i-materialize ang resulta aron magamit pag-usab kining bag-ong kahibalo sa ubang pangutana. Mao nga gidugang namon ang mga triple sa kini nga kasayuran balik sa graph, nga gisulod ang resulta sa 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
 
}

Ang pagdugang og usa ka triple sa graph nagkinahanglan og pipila ka millisecond, samtang ang oras sa pagpatuman sa pagsal-ot sa resulta sa usa ka subquery nagdepende sa oras sa pagpatuman sa subquery mismo.

Bisan kung dili namon kini kanunay nga gigamit, gitugotan ka usab sa Neptune nga tangtangon ang mga triplet base sa mga sample o klaro nga datos, nga magamit sa pag-update sa kasayuran.

Mga pangutana sa SPARQL

Pinaagi sa pagpaila sa miaging subsample, nga nagbalik sa gidaghanon sa mga gipagawas alang sa matag artist, gipaila na namo ang unang matang sa pangutana nga gusto namong tubagon gamit ang Neptune. Ang paghimo og pangutana sa Neptune sayon ​​- magpadala ug POST nga hangyo sa SPARQL endpoint, sama sa gipakita sa ubos:

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

Dugang pa, nagpatuman kami usa ka pangutana nga nagbalik sa usa ka profile sa artista nga adunay kasayuran bahin sa ilang ngalan, edad, o nasud nga gigikanan. Hinumdomi nga ang mga tigpasundayag mahimong mga indibidwal, banda, o orkestra. Dugang pa, gidugangan namon kini nga datos sa kasayuran bahin sa gidaghanon sa mga gipagawas nga gipagawas sa mga artista sa tuig. Para sa mga solo artist, nagdugang usab kami og impormasyon bahin sa mga banda nga giapilan sa artist matag tuig.

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

Tungod sa kakomplikado sa ingon nga pangutana, mahimo ra namon nga himuon ang mga pangutana sa punto alang sa usa ka piho nga artista, sama ni Elton John, apan dili alang sa tanan nga mga artista. Ang Neptune ingon og dili ma-optimize ang ingon nga pangutana pinaagi sa paghulog sa mga filter sa mga subselect. Busa, ang matag pagpili kinahanglan nga mano-mano nga masala sa ngalan sa artist.

Ang Neptune adunay duha ka oras ug kada-I/O nga mga bayronon. Alang sa among pagsulay, gigamit namon ang labing gamay nga pananglitan sa Neptune, nga nagkantidad og $0,384/oras. Sa kaso sa pangutana sa ibabaw, nga nagkalkula sa profile alang sa usa ka trabahante, ang Amazon nagsingil kanamo napulo ka libo nga mga operasyon sa I/O, nga nagpasabut nga kantidad nga $0.02.

konklusyon

Una, gituman sa Amazon Neptune ang kadaghanan sa mga saad niini. Ingon usa ka gidumala nga serbisyo, kini usa ka database sa graph nga labi ka dali nga i-install ug mahimo’g mag-andar nga wala’y daghang pag-configure. Ania ang among lima ka hinungdanon nga nahibal-an:

  • Ang daghan nga pag-upload sayon ​​apan hinay. Apan mahimo kini nga komplikado sa mga mensahe sa sayup nga dili kaayo makatabang.
  • Ang pag-download sa streaming nagsuporta sa tanan nga among gipaabut ug paspas kaayo
  • Ang mga pangutana yano ra, apan dili igo nga interactive aron makadagan ang analytical nga mga pangutana
  • Ang mga pangutana sa SPARQL kinahanglang manu-mano nga ma-optimize
  • Ang pagbayad sa Amazon lisod banabanaon tungod kay lisod ang pagbanabana sa gidaghanon sa datos nga na-scan sa usa ka pangutana sa SPARQL.

Mao ra. Sign up para sa libre nga webinar sa hilisgutan nga "Load Balancing".


Source: www.habr.com

Idugang sa usa ka comment