Амазонка Нептунунун алгачкы таасирлери

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

Амазонка Нептунунун алгачкы таасирлери

Көптөгөн учурларда бизге жагат bakdataКардарларыбыздын веб-сайттарында көргөнүбүздөй, тиешелүү маалымат объекттер ортосундагы байланыштарда, мисалы, колдонуучулардын ортосундагы мамилелерди, элементтердин ортосундагы көз карандылыктарды же сенсорлордун ортосундагы байланыштарды талдоодо жашырылган. Мындай колдонуу учурлары адатта графикте моделделет. Ушул жылдын башында Amazon өзүнүн жаңы графикалык базасы Нептунды чыгарды. Бул постто биз биринчи идеяларыбызды, жакшы тажрыйбаларыбызды жана убакыттын өтүшү менен эмнени жакшыртууга болорун бөлүшкүбүз келет.

Эмне үчүн бизге Амазонка Нептун керек эле

Графикалык маалымат базалары алардын реляциялык эквиваленттерине караганда жогорку туташтырылган маалымат топтомдорун жакшыраак иштетүүгө убада берет. Мындай маалымат топтомдорунда тиешелүү маалымат адатта объекттердин ортосундагы мамилелерде сакталат. Биз Нептунду сыноо үчүн укмуштуудай ачык маалымат долбоорун колдондук MusicBrainz. MusicBrainz ар кандай музыкалык метадайындарды, мисалы, аткаруучулар, ырлар, альбомдордун чыгарылыштары же концерттери, ошондой эле ырдын артында турган аткаруучу ким менен кызматташкан же альбом кайсы өлкөдө качан чыкканы тууралуу маалымат чогултат. MusicBrainz кандайдыр бир жол менен музыка индустриясы менен байланышкан объекттердин зор тармагы катары каралышы мүмкүн.

MusicBrainz маалымат топтому реляциялык маалымат базасынын CSV таштандысы катары берилген. Жалпысынан таштанды 93 таблицадагы 157 миллион сапты камтыйт. Бул таблицалардын айрымдары сүрөтчүлөр, окуялар, жазуулар, релиздер же тректер сыяктуу негизги маалыматтарды камтыса, башкалары шилтеме таблицалар — сүрөтчүлөр жана жазуулар, башка сүрөтчүлөр же релиздердин ортосундагы мамилелерди сактоо, ж.б.... Алар маалымат топтомунун графикалык түзүлүшүн көрсөтөт. Берилиштер топтомун RDF үч эселенгенге айландырганда, биз болжол менен 500 миллион нуска алдык.

Биз иштеп жаткан долбоордун өнөктөштөрүнүн тажрыйбасына жана таасирлерине таянып, биз бул билим базасы жаңы маалыматтарды алуу үчүн колдонулган шартты сунуштайбыз. Мындан тышкары, биз анын үзгүлтүксүз жаңырылышын күтөбүз, мисалы, жаңы релиздерди кошуу же топтун мүчөлөрүн жаңыртуу.

тууралоо

Күтүлгөндөй, Amazon Нептун орнотуу жөнөкөй. Ал абдан майда-чүйдөсүнө чейин документтештирилген. Сиз бир нече чыкылдатуу менен график базасын ишке киргизе аласыз. Бирок, кененирээк конфигурацияга келгенде, керектүү маалымат табуу кыйын. Ошондуктан, биз бир конфигурация параметрин көрсөтүп келет.

Амазонка Нептунунун алгачкы таасирлери
Параметр топтору үчүн конфигурация скриншоту

Амазондун айтымында, Нептун аз күтүлүүчү транзакциялык жүктөргө басым жасайт, ошондуктан демейки суроо-талаптын күтүү убактысы 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% үчүн болгон. Бирок Нептунду сыноого келсек, биз MusicBrainz маалыматынын 99% менен гана иштейбиз деп кабыл алганбыз.

Бул SPARQL менен тааныш адамдар үчүн оңой болсо да, RDF үч эселенген маалыматтар ачык типтеги аннотацияланышы керек экенин унутпаңыз, бул дагы каталарды жаратышы мүмкүн.

Агымды жүктөө

Жогоруда айтылгандай, биз Нептунду статикалык маалымат сактагыч катары колдонгубуз келбейт, тескерисинче, ийкемдүү жана өнүгүп жаткан билим базасы катары. Ошентип, биз билим базасы өзгөргөндө, мисалы, жаңы альбом жарык көргөндө же алынган билимди ишке ашырууну каалаганда жаңы үчилтикти киргизүүнүн жолдорун табышыбыз керек болчу.

Нептун SPARQL сурамдары аркылуу киргизүү операторлорун колдойт, чийки жана үлгү негизинде. Биз төмөндө эки ыкманы тең талкуулайбыз.

Биздин максаттарыбыздын бири маалыматтарды агымдуу түрдө киргизүү болчу. Жаңы өлкөдө альбом чыгарууну ойлонуп көрүңүз. MusicBrainz'тин көз карашы боюнча, бул альбомдорду, синглдерди, EP'лерди ж.б. камтыган чыгаруу үчүн жадыбалга жаңы жазуу кошулат дегенди билдирет. чыгаруу-өлкө. 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)
 
   }

Мындай суроонун татаалдыгынан улам, биз Элтон Жон сыяктуу белгилүү бир сүрөтчү үчүн гана чекиттик сурамдарды аткара алдык, бирок бардык сүрөтчүлөр үчүн эмес. Нептун чыпкаларды кошумча тандоолорго таштап, мындай суроону оптималдаштырбайт окшойт. Ошондуктан, ар бир тандоо кол менен сүрөтчүнүн аты менен чыпкаланышы керек.

Нептун сааттык жана ар бир I/O заряды бар. Сыноо үчүн биз Нептундун минималдуу инстанциясын колдондук, анын баасы $0,384/саат. Бир жумушчунун профилин эсептеген жогорудагы суроодо, Amazon бизден он миңдеген I/O операцияларын төлөйт, бул $0.02 чыгымды билдирет.

жыйынтыктоо

Биринчиден, Amazon Нептун убадаларынын көбүн аткарат. Башкарылуучу кызмат катары, бул орнотууга өтө оңой жана көп конфигурациясыз иштей турган графикалык маалымат базасы. Бул жерде биздин беш негизги жыйынтыктар болуп саналат:

  • Жаппай жүктөө оңой, бирок жай. Бирок ал өтө пайдалуу болбогон ката билдирүүлөрү менен татаалдашы мүмкүн.
  • Агымды жүктөө биз күткөн нерселердин баарын колдойт жана абдан тез болду
  • Суроолор жөнөкөй, бирок аналитикалык сурамдарды аткаруу үчүн интерактивдүү эмес
  • SPARQL сурамдары кол менен оптималдаштырылышы керек
  • Amazon төлөмдөрүн баалоо кыйын, анткени SPARQL суроосу менен сканерленген маалыматтардын көлөмүн баалоо кыйын.

Баары болду. Жазылуу "Жүк балансы" темасында акысыз вебинар.


Source: www.habr.com

Комментарий кошуу