Таассуроти аввалини Амазонка Нептун

Салом, сокинони Хабаровск. Ба пешвози огози курс "AWS барои таҳиягарон" Мо тарчумаи материали шавковарро тайёр кардем.

Таассуроти аввалини Амазонка Нептун

Дар бисёр ҳолатҳо истифода, ки ба мо маъқул аст бакдатаТавре ки мо дар вебсайтҳои муштариёни худ мебинем, маълумоти дахлдор дар робитаҳои байни субъектҳо, масалан ҳангоми таҳлили муносибатҳои байни корбарон, вобастагӣ байни унсурҳо ё пайвастшавӣ байни сенсорҳо пинҳон карда мешавад. Чунин ҳолатҳои истифода одатан дар график модел карда мешаванд. Аввали соли равон Amazon базаи нави графикии худро Neptune нашр кард. Дар ин паём мо мехоҳем дар бораи ғояҳои аввалини худ, таҷрибаҳои хуб ва он чизеро, ки бо мурури замон беҳтар кардан мумкин аст, мубодила кунем.

Чаро ба мо Amazon Neptune лозим буд

Пойгоҳи додаҳои графикӣ ваъда медиҳанд, ки маҷмӯаҳои додаҳои хеле пайвастшуда нисбат ба эквивалентҳои реляционии онҳо беҳтар кор мекунанд. Дар чунин маҷмӯаҳои додаҳо, маълумоти дахлдор одатан дар муносибатҳои байни объектҳо нигоҳ дошта мешаванд. Мо барои санҷиши Нептун як лоиҳаи аҷиби маълумоти кушодро истифода бурдем MusicBrainz. MusicBrainz ҳама намуди метамаълумоти мусиқии тасаввуршавандаро ҷамъ меорад, аз қабили маълумот дар бораи рассомон, сурудҳо, нашри албом ё консертҳо, инчунин рассоми паси суруд бо кӣ ҳамкорӣ кардааст ё кай албом дар кадом кишвар нашр шудааст. MusicBrainz-ро метавон ҳамчун як шабакаи бузурги субъектҳо донист, ки бо ягон навъ ба саноати мусиқӣ пайвастанд.

Маҷмӯи додаҳои MusicBrainz ҳамчун партови CSV-и пойгоҳи додаҳои релятсионӣ таъмин карда мешавад. Дар маҷмӯъ, партовгоҳ тақрибан 93 миллион сатр дар 157 ҷадвалро дар бар мегирад. Дар ҳоле ки баъзе аз ин ҷадвалҳо дорои маълумоти асосӣ, аз қабили рассомон, рӯйдодҳо, сабтҳо, релизҳо ё трекҳо, дигарон ҷадвалҳои пайванд — нигоҳ доштани муносибатҳои байни рассомон ва сабтҳо, дигар рассомон ё нашрияҳо ва ғайра... Онҳо сохтори графикии маҷмӯи маълумотро нишон медиҳанд. Ҳангоми табдил додани маҷмӯи додаҳо ба сегонаи RDF, мо тақрибан 500 миллион мисол гирифтем.

Дар асоси таҷриба ва таассуроти шарикони лоиҳа, ки мо бо онҳо кор мекунем, мо шароитеро пешниҳод менамоем, ки дар он ин пойгоҳи дониш барои ба даст овардани маълумоти нав истифода мешавад. Илова бар ин, мо интизорем, ки он мунтазам нав карда мешавад, масалан тавассути илова кардани релизҳои нав ё навсозии аъзоёни гурӯҳ.

танзим

Тавре ки интизор мерафт, насб кардани Amazon Neptune оддӣ аст. Вай хеле муфассал аст ҳуҷҷатгузорӣ шудааст. Шумо метавонед як пойгоҳи графикиро бо чанд клик оғоз кунед. Аммо, вақте ки сухан дар бораи конфигуратсияи муфассал меравад, маълумоти зарурӣ ёфтан душвор аст. Аз ин рӯ, мо мехоҳем ба як параметри конфигуратсия ишора кунем.

Таассуроти аввалини Амазонка Нептун
Скриншоти конфигуратсия барои гурӯҳҳои параметр

Амазонка мегӯяд, ки Нептун ба сарбории транзаксионии камдаромад тамаркуз мекунад, аз ин рӯ мӯҳлати пешфарзи дархост 120 сония аст. Бо вуҷуди ин, мо бисёр ҳолатҳои истифодаи таҳлилиро санҷидаем, ки дар онҳо мунтазам ба ин маҳдудият расидаем. Ин вақтро метавон тавассути эҷоди гурӯҳи нави параметрҳо барои Нептун ва танзим тағир дод neptune_query_timeout маҳдудияти мувофиқ.

Боркунии маълумот

Дар зер мо ба таври муфассал муҳокима хоҳем кард, ки чӣ гуна мо маълумоти MusicBrainz-ро ба Нептун бор кардем.

Муносибатҳо дар сегона

Аввалан, мо маълумоти MusicBrainz-ро ба сегонаи RDF табдил додем. Аз ин рӯ, барои ҳар як ҷадвал, мо як қолаберо муайян кардем, ки чӣ гуна ҳар як сутун дар сегона муаррифӣ мешавад. Дар ин мисол, ҳар як сатри ҷадвали иҷрокунанда ба дувоздаҳ сегонаи 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> .

Боргирии оммавӣ

Роҳи пешниҳодшудаи бор кардани миқдори зиёди маълумот ба Нептун тавассути раванди боркунии оммавӣ тавассути S3 мебошад. Пас аз бор кардани файлҳои сегонаи худ ба S3, шумо бо истифода аз дархости POST боргузорӣ оғоз мекунед. Дар ҳолати мо, барои 24 миллион сегоник тақрибан 500 соат вақт лозим буд. Мо интизор будем, ки он зудтар мешавад.

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

Барои пешгирӣ кардани ин раванди тӯлонӣ ҳар дафъае, ки мо Нептунро ба кор меандозем, мо тасмим гирифтем, ки намунаро аз аксе, ки дар он ин сегонаҳо аллакай бор карда шуда буданд, барқарор кунем. Давидан аз аксбардорӣ ба таври назаррас тезтар аст, аммо ба ҳар ҳол тақрибан як соат вақт мегирад, то он даме ки Нептун барои дархостҳо дастрас шавад.

Ҳангоми бори аввал ба Нептун сегонаҳо бор кардан, мо ба хатогиҳои гуногун дучор шудем.

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

Баъзе аз онҳо хатогиҳои таҳлилӣ буданд, тавре ки дар боло нишон дода шудааст. То ба имрӯз, мо ҳанӯз нафаҳмидем, ки дар ин лаҳза чӣ хато шудааст. Тафсилоти каме бештар дар ин ҷо бешубҳа кӯмак хоҳад кард. Ин хато тақрибан барои 1% сегонаҳои воридшуда рух дод. Аммо вақте ки озмоиши Нептун меравад, мо қабул кардем, ки мо танҳо бо 99% маълумоти MusicBrainz кор мекунем.

Гарчанде ки ин барои одамоне, ки бо SPARQL ошно ҳастанд, осон аст, бидонед, ки сегонаҳои RDF бояд бо намудҳои возеҳи додаҳо шарҳ дода шаванд, ки ин боз метавонад боиси хатогиҳо гардад.

Зеркашии ҷараён

Тавре ки дар боло зикр гардид, мо намехоҳем Нептунро ҳамчун як анбори додаҳои статикӣ истифода барем, балки ҳамчун як пойгоҳи донишҳои тағйирёбанда ва инкишофёбанда. Аз ин рӯ, ба мо лозим буд, ки роҳҳои ҷорӣ кардани сегонаҳои навро ҳангоми тағир додани пойгоҳи дониш пайдо кунем, масалан, вақте ки албоми нав нашр мешавад ё вақте ки мо мехоҳем дониши ҳосилшударо амалӣ созем.

Neptune операторҳои воридотро тавассути дархостҳои SPARQL, ҳам хом ва ҳам дар асоси намуна дастгирӣ мекунад. Мо дар зер ҳарду равишро муҳокима хоҳем кард.

Яке аз ҳадафҳои мо ворид кардани маълумот ба тариқи ҷараён буд. Дар бораи баровардани албом дар кишвари нав фикр кунед. Аз нуқтаи назари MusicBrainz, ин маънои онро дорад, ки барои нашре, ки албомҳо, синглҳо, ДМ ва ғайраро дар бар мегирад, ба ҷадвал сабти нав илова карда мешавад. озод кардани кишвар. Дар RDF, мо ин маълумотро бо ду сегонаи нав мувофиқ мекунем.

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

Ҳадафи дигар аз график гирифтани донишҳои нав буд. Фарз мекунем, ки мо мехоҳем шумораи релизҳоеро, ки ҳар як рассом дар касби худ нашр кардааст, гирем. Чунин пурсиш хеле мураккаб аст ва дар Нептун зиёда аз 20 дақиқа вақтро мегирад, бинобар ин мо бояд натиҷаро амалӣ созем, то ин дониши навро дар ягон дархости дигар дубора истифода барем. Ҳамин тавр, мо бо ин маълумот се маротиба илова карда, натиҷаи зерпурсишро ворид мекунем.

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
 
}

Илова кардани сегонаҳои ягона ба график чанд миллисонияро мегирад, дар ҳоле ки вақти иҷро барои ворид кардани натиҷаи зерпурсиш аз вақти иҷрои худи зерпурсиш вобаста аст.

Гарчанде ки мо онро зуд-зуд истифода намебурдем, Нептун инчунин ба шумо имкон медиҳад, ки сегонаҳоро дар асоси намунаҳо ё маълумоти дақиқ, ки метавонанд барои навсозии иттилоот истифода шаванд, нест кунед.

Дархостҳои SPARQL

Бо ҷорӣ намудани зернамунаи қаблӣ, ки шумораи релизҳоро барои ҳар як рассом бармегардонад, мо аллакай навъи якуми пурсишро ҷорӣ кардем, ки мо мехоҳем бо истифода аз Нептун ҷавоб диҳем. Сохтани дархост дар Нептун осон аст - ба нуқтаи ниҳоии SPARQL дархости POST фиристед, тавре ки дар зер нишон дода шудааст:

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

Илова бар ин, мо дархостеро амалӣ кардем, ки профили рассомро бар мегардонад, ки дорои маълумот дар бораи ном, синну сол ё кишвари аслии онҳо мебошад. Дар хотир доред, ки иҷрокунандагон метавонанд шахсони алоҳида, гурӯҳҳо ё оркестрҳо бошанд. Илова бар ин, мо ин маълумотро бо маълумот дар бораи шумораи нашрияҳое, ки рассомон дар давоми сол баровардаанд, пурра мекунем. Барои ҳунармандони соло, мо инчунин маълумотро дар бораи гурӯҳҳое, ки рассом ҳар сол иштирок мекард, илова мекунем.

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

Аз сабаби мураккабии чунин пурсиш, мо метавонем танҳо барои як рассоми мушаххас, масалан Элтон Ҷон дархостҳои нуқтаҳоро иҷро кунем, аммо на барои ҳама рассомон. Чунин ба назар мерасад, ки Нептун чунин дархостро бо гузоштани филтрҳо ба зеринтихобҳо оптимизатсия намекунад. Аз ин рӯ, ҳар як интихоб бояд ба таври дастӣ аз рӯи номи рассом филтр карда шавад.

Нептун ҳам пардохтҳои ҳарсоата ва ҳам барои воридот / баромад дорад. Барои санҷиши мо, мо намунаи ҳадди ақали Neptune-ро истифода бурдем, ки арзиши он $ 0,384 дар як соат аст. Дар мавриди дархости дар боло овардашуда, ки профили як коргарро ҳисоб мекунад, Амазонка аз мо даҳҳо ҳазор амалиёти I/O-ро пардохт мекунад, ки арзиши 0.02 долларро дар назар дорад.

хулоса

Аввалан, Amazon Neptune аксарияти ваъдаҳои худро иҷро мекунад. Ҳамчун хидмати идорашаванда, он пойгоҳи додаҳои графикӣ мебошад, ки насб кардан бениҳоят осон аст ва метавонад бидуни конфигуратсияи зиёд фаъол бошад. Инҳоянд панҷ бозёфтҳои асосии мо:

  • Боркунии оммавӣ осон, вале суст аст. Аммо он метавонад бо паёмҳои хатогие, ки чандон муфид нестанд, мушкил гардад.
  • Зеркашии ҷараён ҳама чизеро, ки мо интизор будем, дастгирӣ мекунад ва хеле зуд буд
  • Пурсишҳо соддаанд, аммо барои иҷро кардани дархостҳои таҳлилӣ кофӣ интерактив нестанд
  • Дархостҳои SPARQL бояд дастӣ оптимизатсия карда шаванд
  • Ҳисоб кардани пардохтҳои Amazon душвор аст, зеро ҳисоб кардани миқдори маълумоте, ки тавассути дархости SPARQL скан шудааст, душвор аст.

Ҳамааш ҳамин. Барои обуна шудан вебинари ройгон дар мавзӯи "Тавозуни сарборӣ".


Манбаъ: will.com

Илова Эзоҳ