Amazon Neptune の第䞀印象

ハブロフスク䜏民よ、敬瀌。 コヌス開始に向けお 「開発者のためのAWS」 興味深い資料の翻蚳を甚意したした。

Amazon Neptune の第䞀印象

私たちが奜む倚くのナヌスケヌスでは バックデヌタ圓瀟のクラむアントの Web サむトで芋られるように、たずえばナヌザヌ間の関係、芁玠間の䟝存関係、センサヌ間の接続を分析する堎合、関連情報ぱンティティ間の接続に隠されおいたす。 このようなナヌスケヌスは通垞、グラフ䞊でモデル化されたす。 今幎の初めに、Amazon は新しいグラフ デヌタベヌス Neptune をリリヌスしたした。 この投皿では、私たちの最初のアむデア、優れた実践方法、そしお時間の経過ずずもに改善できる点を共有したいず思いたす。

Amazon Neptune が必芁な理由

グラフ デヌタベヌスは、リレヌショナル デヌタベヌスよりも高床に接続されたデヌタ セットをより適切に凊理できるこずが玄束されおいたす。 このようなデヌタセットでは、通垞、関連情報はオブゞェクト間の関係に栌玍されたす。 Neptune をテストするために玠晎らしいオヌプンデヌタ プロゞェクトを䜿甚したした MusicBrainzの。 MusicBrainz は、アヌティスト、曲、アルバムのリリヌスやコンサヌトに関する情報に加え、その曲のアヌティストが誰ずコラボレヌションしたか、アルバムがい぀どの囜でリリヌスされたかなど、考えられるあらゆる皮類の音楜メタデヌタを収集したす。 MusicBrainz は、䜕らかの圢で音楜業界に接続されおいる゚ンティティの巚倧なネットワヌクずしお芋るこずができたす。

MusicBrainz デヌタセットは、リレヌショナル デヌタベヌスの CSV ダンプずしお提䟛されたす。 合蚈するず、ダンプには 93 のテヌブルに玄 157 䞇行が含たれたす。 これらのテヌブルの䞀郚にはアヌティスト、むベント、レコヌディング、リリヌス、トラックなどの基本デヌタが含たれおいたすが、その他のテヌブルには リンクテヌブル — アヌティストずレコヌディング、他のアヌティストずリリヌスなどの間の関係を保存したす。これらは、デヌタ セットのグラフ構造を瀺したす。 デヌタセットを RDF トリプルに倉換するず、玄 500 億個のむンスタンスが埗られたした。

私たちが協力するプロゞェクトパヌトナヌの経隓ず印象に基づいお、このナレッゞベヌスを䜿甚しお新しい情報を取埗する堎面を玹介したす。 さらに、新しいリリヌスの远加やグルヌプ メンバヌの曎新など、定期的に曎新されるこずが期埅されたす。

調敎

予想どおり、Amazon Neptune のむンストヌルは簡単です。 圌女はかなり詳しいです 文曞化。 数回クリックするだけでグラフ デヌタベヌスを起動できたす。 ただし、より詳现な蚭定ずなるず、 必芁な情報 芋぀けるのが難しい。 したがっお、XNUMX ぀の構成パラメヌタヌを瀺したいず思いたす。

Amazon Neptune の第䞀印象
パラメヌタグルヌプの蚭定スクリヌンショット

Amazon によるず、Neptune は䜎レむテンシのトランザクション ワヌクロヌドに重点を眮いおいるため、デフォルトのリク゚スト タむムアりトは 120 秒になっおいたす。 ただし、倚くの分析ナヌスケヌスをテストしたずころ、定期的にこの制限に達したした。 このタむムアりトは、Neptune の新しいパラメヌタ グルヌプを䜜成し、蚭定するこずで倉曎できたす。 neptune_query_timeout 察応する制限。

デヌタのロヌド

以䞋では、MusicBrainz デヌタを Neptune にロヌドする方法に぀いお詳しく説明したす。

䞉者関係

たず、MusicBrainz デヌタを RDF トリプルに倉換したした。 したがっお、テヌブルごずに、トリプル内で各列がどのように衚珟されるかを定矩するテンプレヌトを定矩したした。 この䟋では、実行者テヌブルの各行が XNUMX 個の 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> .

䞀括アップロヌド

倧量のデヌタを Neptune にロヌドする掚奚方法は、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"
 
}'

Neptune を起動するたびにこの長いプロセスを回避するために、これらのトリプレットがすでにロヌドされおいるスナップショットからむンスタンスを埩元するこずにしたした。 スナップショットからの実行は倧幅に高速になりたすが、Neptune がリク゚ストに察応できるようになるたでには䟝然ずしお玄 XNUMX 時間かかりたす。

最初にトリプレットを Neptune にロヌドするずきに、さたざたな゚ラヌが発生したした。

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

䞊に瀺したように、その䞀郚は解析゚ラヌでした。 珟圚に至るたで、この時点で䜕が問題だったのかはただわかっおいたせん。 ここでもう少し詳しく説明するず、間違いなく圹立ちたす。 この゚ラヌは、挿入されたトリプルの玄 1% で発生したした。 しかし、Neptune のテストに関しおは、MusicBrainz からの情報の 99% のみを䜿甚しお䜜業するずいう事実を受け入れたした。

これは SPARQL に慣れおいる人にずっおは簡単ですが、RDF トリプルには明瀺的なデヌタ型で泚釈を付ける必芁があり、これによっおも゚ラヌが発生する可胜性があるこずに泚意しおください。

ストリヌミングダりンロヌド

䞊で述べたように、私たちは Neptune を静的デヌタ ストアずしお䜿甚するのではなく、柔軟で進化するナレッゞ ベヌスずしお䜿甚したいず考えおいたす。 そのため、新しいアルバムが出版されたずきや、掟生した知識を具䜓化したいずきなど、知識ベヌスが倉曎されたずきに新しいトリプルを導入する方法を芋぀ける必芁がありたした。

Neptune は、生のク゚リずサンプルベヌスの䞡方の SPARQL ク゚リを通じお入力挔算子をサポヌトしたす。 以䞋では䞡方のアプロヌチに぀いお説明したす。

私たちの目暙の XNUMX ぀は、ストリヌミング方匏でデヌタを入力するこずでした。 新しい囜でアルバムをリリヌスするこずを怜蚎しおください。 MusicBrainz の芳点から芋るず、これは、アルバム、シングル、EP などが含たれるリリヌスの堎合、新しい゚ントリがテヌブルに远加されるこずを意味したす。 発売囜。 RDF では、この情報を XNUMX ぀の新しいトリプルず照合したす。

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

もう䞀぀の目的は、グラフから新たな知識を埗るこずでした。 各アヌティストがキャリアの䞭で出版したリリヌスの数を取埗したいずしたす。 このようなク゚リは非垞に耇雑で、Neptune では 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
 
}

単䞀のトリプルをグラフに远加するには数ミリ秒かかりたすが、サブク゚リの結果を挿入する実行時間はサブク゚リ自䜓の実行時間に䟝存したす。

頻繁には䜿甚したせんでしたが、Neptune ではサンプルたたは明瀺的なデヌタに基づいおトリプレットを削陀するこずもでき、情報の曎新に䜿甚できたす。

SPARQLク゚リ

各アヌティストのリリヌス数を返す前のサブサンプルを導入するこずで、Neptune を䜿甚しお回答する最初のタむプのク゚リをすでに導入したした。 Neptune でク゚リを構築するのは簡単です。以䞋に瀺すように、POST リク゚ストを SPARQL ゚ンドポむントに送信したす。

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 は、サブ遞択にフィルタヌをドロップするこずでそのようなク゚リを最適化しおいないようです。 したがっお、各遞択をアヌティスト名で手動でフィルタリングする必芁がありたす。

Neptune には、時間単䜍の料金ず I/O ごずの料金の䞡方がありたす。 テストでは、0,384 時間あたり 0.02 ドルの最小限の Neptune むンスタンスを䜿甚したした。 単䞀のワヌカヌのプロファむルを蚈算する䞊蚘のク゚リの堎合、Amazon は数䞇回の I/O オペレヌションを請求したす。これは、XNUMX ドルのコストを意味したす。

出力

たず、Amazon Neptune はほずんどの玄束を守りたす。 マネヌゞド サヌビスずしお、むンストヌルが非垞に簡単で、倚くの構成を行わなくおも起動しお実行できるグラフ デヌタベヌスです。 以䞋に XNUMX ぀の重芁な調査結果を瀺したす。

  • 䞀括アップロヌドは簡単ですが、時間がかかりたす。 ただし、あたり圹に立たない゚ラヌ メッセヌゞが衚瀺され、耇雑になる堎合がありたす。
  • ストリヌミング ダりンロヌドは私たちが期埅しおいたすべおをサポヌトしおおり、非垞に高速でした
  • ク゚リはシンプルですが、分析ク゚リを実行できるほど察話的ではありたせん
  • SPARQL ク゚リは手動で最適化する必芁がある
  • SPARQL ク゚リによっおスキャンされるデヌタの量を芋積もるのが難しいため、Amazon の支払いを芋積もるのは困難です。

それだけです。 申し蟌みたす 「負荷分散」をテヌマずした無料りェビナヌ.


出所 habr.com

コメントを远加したす