Nîşanên pêşîn ên Amazon Neptune

Silav, niştecîhên Khabrovsk. Li hêviya destpêkirina qursê "AWS ji bo Pêşdebiran" Me wergerek ji materyalên balkêş amade kiriye.

Nîşanên pêşîn ên Amazon Neptune

Di gelek rewşên ku em hez dikin de bikar tînin bakdataWekî ku em li ser malperên xerîdarên xwe dibînin, agahdariya têkildar di têkiliyên di navbera saziyan de veşartiye, mînakî dema ku têkiliyên di navbera bikarhêneran de, girêdanên di navbera hêmanan de, an girêdanên di navbera senzoran de analîz dikin. Bûyerên karanîna weha bi gelemperî li ser grafikek têne model kirin. Di destpêka vê salê de, Amazon databasa xweya grafîkî ya nû, Neptune, derxist. Di vê postê de em dixwazin ramanên xwe yên yekem, pratîkên baş û tiştê ku dikare bi demê re were çêtir kirin parve bikin.

Çima me hewceyê Amazon Neptune bû

Databasên grafîkê soz didin ku berhevokên daneya pir bi hev ve girêdayî ji hevberên wan ên pêwendiyê çêtir bi rê ve bibin. Di danehevên weha de, agahdariya têkildar bi gelemperî di têkiliyên di navbera tiştan de têne hilanîn. Me projeyek daneya vekirî ya ecêb bikar anî da ku Neptune ceribandin MusicBrainz. MusicBrainz her cûre metadata muzîkê ya ku meriv dikare were xeyal kirin berhev dike, wek agahdariya li ser hunermend, stran, weşanên albûmê an konseran, û hem jî hunermendê ku li pişt stranê bi kê re hevkarî kiriye an kengê albûm li kîjan welatî derketiye. MusicBrainz dikare wekî torgilokek mezin a saziyan were dîtin ku bi rengekî bi pîşesaziya muzîkê ve girêdayî ne.

Danûstendina MusicBrainz wekî peldankek CSV ya databasek têkildar tê peyda kirin. Bi tevahî, çopê di 93 tabloyan de nêzî 157 mîlyon rêzan hene. Digel ku hin ji van tabloyan daneyên bingehîn ên wekî hunermend, bûyer, tomarkirin, weşandin an şop, yên din hene tabloyên girêdanê - Têkiliyên di navbera hunermend û tomaran de, hunermendên din an weşanên din, hwd... Ew strukturên grafîkî yên komek daneyê nîşan didin. Dema ku databasê vediguhezînin sê caran RDF, me bi qasî 500 mîlyon mînak bi dest xist.

Li ser bingeha ezmûn û nerînên hevkarên projeyê yên ku em bi wan re dixebitin, em cîhek pêşkêş dikin ku tê de ev bingeha zanînê ji bo bidestxistina agahdariya nû tê bikar anîn. Wekî din, em li bendê ne ku ew bi rêkûpêk were nûve kirin, mînakî bi lê zêdekirina berdanên nû an nûvekirina endamên komê.

ligorî

Wekî ku tê hêvî kirin, sazkirina Amazon Neptune hêsan e. Ew pir berfireh e belgekirî. Hûn dikarin databasek grafîkî bi tenê çend klîk dest pê bikin. Lêbelê, gava ku dor tê ser veavakirina berfirehtir, agahiyên pêwîst zehmet dîtin. Ji ber vê yekê, em dixwazin yek pîvanek veavakirinê destnîşan bikin.

Nîşanên pêşîn ên Amazon Neptune
Dîmenê veavakirinê ji bo komên parametreyê

Amazon dibêje Neptune balê dikişîne ser barkêşên danûstendinê yên kêm-dereng, ji ​​ber vê yekê dema daxwaziya xwerû 120 saniye ye. Lêbelê, me gelek dozên karanîna analîtîk ceribandin ku tê de em bi rêkûpêk gihîştine vê sînorê. Ev dem dikare bi afirandina komek parametreyek nû ya ji bo Neptune û mîhengê were guheztin neptune_query_timeout sînorkirina têkildar.

Daneyên barkirin

Li jêr em ê bi hûrgulî nîqaş bikin ka me çawa daneyên MusicBrainz li Neptune bar kir.

Têkiliyên di sê

Pêşîn, me daneyên MusicBrainz veguherand sê caran RDF. Ji ber vê yekê, ji bo her tabloyê, me şablonek destnîşan kir ku diyar dike ka her stûnek çawa di sê-sêkan de tê temsîl kirin. Di vê nimûneyê de, her rêzek ji tabloya performerker bi diwanzdeh sêqatên RDF-ê ve tête nexşandin.

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

barkirina mezin

Rêya pêşniyarkirî ya barkirina mîqdarên mezin ên daneyê li Neptune bi pêvajoya barkirina girseyî ya bi S3 re ye. Piştî ku pelên xweyên sêyan li S3 barkirin, hûn bi karanîna daxwazek POST dest bi barkirinê dikin. Di rewşa me de, ji bo 24 mîlyon sêçikan bi qasî 500 demjimêran girt. Me hêvî dikir ku ew zûtir be.

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

Ji bo ku em ji vê pêvajoya dirêj dûr bikevin her gava ku em Neptune dest pê dikin, me biryar da ku em nimûneyê ji wêneyek ku tê de ev sêçik berê hatine barkirin vegerînin. Rakirina ji wêneyek bi girîngî zûtir e, lê dîsa jî bi qasî saetekê digire heya ku Neptune ji bo daxwazan peyda bibe.

Dema ku di destpêkê de sêçikan li Neptune bar kirin, em rastî xeletiyên cihêreng hatin.

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

Hin ji wan xeletiyên parskirinê bûn, wekî ku li jor hatî destnîşan kirin. Heya nuha, me hîn jî fêhm nekiriye ku di vê nuqteyê de bi rastî çi xelet bû. Dê hûrguliyek piçûktir bê guman li vir bibe alîkar. Ev xeletî ji bo 1% ji sê caran têxistî qewimî. Lê bi qasî ku ceribandina Neptune diçe, me vê rastiyê qebûl kir ku em tenê bi% 99-ê agahdariya ji MusicBrainz re dixebitin.

Her çend ev ji bo kesên ku bi SPARQL-ê re nas dikin hêsan e jî, hay ji xwe hebin ku sêweyên RDF divê bi celebên daneya eşkere bêne şîrove kirin, ku dîsa dikare bibe sedema xeletiyan.

Streaming download

Wekî ku li jor hatî behs kirin, em naxwazin Neptune wekî depoyek daneya statîk bikar bînin, lê bêtir wekî bingehek zanînê ya maqûl û pêşkeftî. Ji ber vê yekê hewce bû ku em rêyên ku sêweyên nû bidin nasandin dema ku bingeha zanînê diguhezîne, wek mînak dema ku albûmek nû tê weşandin an jî dema ku em dixwazin zanyariyên jêderketî pêk bînin.

Neptune bi navgîniya pirsên SPARQL, hem xav û hem jî li gorî nimûneyê, operatorên têketinê piştgirî dike. Em ê li jêr li ser her du rêbazan nîqaş bikin.

Yek ji armancên me ew bû ku em daneyan bi şêwazek weşangerî têkevin. Bifikirin ku albûmek li welatek nû derxin. Ji perspektîfa MusicBrainz, ev tê vê wateyê ku ji bo serbestberdana ku albûm, single, EP, hwd tê de, têketinek nû li tabloyê tê zêdekirin. berdan-welat. Di RDF de, em vê agahiyê bi du sêlên nû re hevaheng dikin.

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

Armancek din jî wergirtina zanyariyên nû ji grafîkê bû. Ka em bibêjin em dixwazin hejmara weşanên ku her hunermendek di kariyera xwe de çap kiriye bi dest bixin. Lêpirsînek wusa pir tevlihev e û li Neptune zêdetirî 20 hûrdem digire, ji ber vê yekê em hewce ne ku encamê bicîh bînin da ku em vê zanîna nû di hin pirsek din de ji nû ve bikar bînin. Ji ber vê yekê em bi vê agahiyê re sê caran li grafîkê zêde dikin, û dikevin encama jêrpirsînê.

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
 
}

Zêdekirina yek sê sêyan li grafîkê çend milî çirkeyan digire, di heman demê de dema cîbicîkirinê ya ji bo têxistina encama jêrpirsekê bi dema darvekirina jêrpirsînê bi xwe ve girêdayî ye.

Her çend me ew pir caran bi kar neaniye jî, Neptune di heman demê de destûrê dide we ku hûn li gorî nimûneyan an daneyên eşkere, ku dikarin ji bo nûvekirina agahdariyan werin bikar anîn, sêçikan derxînin.

Pirsên SPARQL

Bi danasîna jêr-nimûneya berê, ku ji bo her hunermendek jimara berdanan vedigerîne, me berê celebê yekem ê pirsê ku em dixwazin bi karanîna Neptune bersiv bidin destnîşan kir. Avakirina pirsek li Neptune hêsan e - wekî ku li jêr tê xuyang kirin daxwazek POST ji xala dawiya SPARQL re bişînin:

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

Wekî din, me pirsnameyek bicîh kiriye ku profîla hunermendek ku agahdariya li ser nav, temen, an welatê jêdera wan vedigire vedigerîne. Bînin bîra xwe ku lîstikvan dibe ku kes, kom an orkestra bin. Digel vê yekê, em vê daneyê bi agahdariya li ser hejmara serbestberdanên ku di nav salê de ji hêla hunermendan ve hatine berdan temam dikin. Ji bo hunermendên solo, em her sal di derbarê komên ku hunermend beşdarî wan bûne de jî agahiyan zêde dikin.

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

Ji ber tevliheviya pirsek weha, me tenê dikarî ji bo hunermendek taybetî, wek Elton John, lê ne ji bo hemî hunermendan pirsên xalê pêk bînin. Neptune bi daxistina parzûnan di binhilbijarkan de pirsek wusa xweşbîn nake. Ji ber vê yekê, divê her hilbijark bi destê navê hunermend were fîltre kirin.

Neptune hem heqê demjimêr û hem jî per-I/O heye. Ji bo ceribandina xwe, me mînaka Neptune ya herî kêm bikar anî, ku lêçûn 0,384 $ / saet. Di doza pirsa li jor de, ku profîlê ji bo xebatkarek yekane hesab dike, Amazon bi deh hezaran karûbarên I/O ji me re bar dike, ku tê wateya lêçûnek $0.02.

encamê

Pêşîn, Amazon Neptune piraniya sozên xwe digire. Wekî karûbarek rêvekirî, ew databasek grafîkî ye ku sazkirina wê zehf hêsan e û dikare bêyî gelek veavakirinê were xebitandin û xebitandin. Li vir pênc encamên me yên sereke hene:

  • Barkirina girseyî hêsan e lê hêdî ye. Lê ew dikare bi peyamên xeletiyê yên ku ne pir arîkar in tevlihev bibe.
  • Daxistina Streaming her tiştê ku me hêvî dikir piştgirî dike û pir zû bû
  • Pirs hêsan in, lê ne têra xwe înteraktîf in ku pirsên analîtîk bimeşînin
  • Pirsên SPARQL divê bi destan werin xweşkirin
  • Texmînkirina dravdanên Amazon-ê dijwar e ji ber ku dijwar e ku meriv mîqdara daneya ku ji hêla pirsek SPARQL ve hatî şopandin texmîn bike.

Navê pêger. Sign up for webinar belaş li ser mijara "Balankirina Barkirinê".


Source: www.habr.com

Add a comment