505 Views
March 20, 18
スライド概要
https://yj-meetup.connpass.com/event/79031/
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
Vespa機能紹介 2018/03/13 Yahoo! JAPAN MEETUP # 22(Vespa 特別編) ヤフー株式会社 矢野 友貴
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 自己紹介 • 氏名 • 矢野 友貴 (やの ゆうき) • 所属 • ヤフー株式会社 D&S統括本部 • サイエンス的ななにか • 業務 • むかーしVespaのサービス運用してた • 検索モデリングとかチョットデキル • 最近はSolrに浮気中 Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 1
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ はじめに • Vespaの日本語向けのチュートリアル資料を以下に公開してます • 詳しい使い方はそちらを参照してください https://yahoojapan.github.io/vespa-tutorial/ • この発表ではVespaの特徴的な機能をSolr/Elasticsearchと比較しながら 紹介していきます (赤字と青字で区別) Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 2
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング まとめ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 3
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング まとめ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 4
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ インストール方法 • Vespaはrpmパッケージ or Dockerイメージとして提供 • 他と同じように全ノードに同じものをインストールすればよい • Solrだけ別途ZooKeeperが必要 (bundle版もあるけど非推奨) Vespa 提供方法 必要な パッケージ Solr rpm, docker tgz, docker vespa solr zookeeper Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 Elasticsearch tgz, rpm, deb, msi, docker elasticsearch 5
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ ノードとプロセス • Solr/Elasticsearchは全ノードで同じプロセスが起動 • インデックスに差があるだけで各プロセスの役割は同じ Solrクラスタ Elasticsearchクラスタ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 6
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ ノードとプロセス (cont’d) • Vespaでは各ノードに対して設定で役割を割り当て • 大きく分けて admin, container, content の3つのグループ • 設定に応じて起動するプロセスが変化 Vespaクラスタ Vespaクラスタ container admin config content Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 7
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ Vespaの構成 ユーザ 検索・更新 設定の更新 設定ファイル プラグイン モデル container admin Query/Rewrite Server Config Server Admin Server 管理者 管理コマンドの実行 Document Processor content クラスタの 状態管理 Distributor Search Node インデックス管理 検索・ランキング インデックス Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 8
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ Vespaの構成 (cont’d) • Vespaはコンポーネント毎に実装が大きく違います • フロントエンド側はJava、バックエンド側はC++ • コード量が非常に多いのもこの辺が起因してそう • コア実装を拡張するのは至難の業 (Javaプラグインは楽) グループ admin container content コンポーネント 実装 役割 Config Server Java 設定ファイルの管理 (ZooKeeperもどき) Admin Server Java クラスタの状態管理、ログの収集 Query/Rewrite Server Java 検索リクエスト・レスポンスの加工 Document Processor Java 更新ドキュメントの加工 Distributor C++ ドキュメント分散のメタ情報管理、分散制御 Search Node C++ インデックス管理、検索・ランキングの実行 ※実際はもっと細かいプロセスに分かれます Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 9
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング まとめ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 10
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ フィールド定義 • Vespaも基本型はSolr/Elasticsearchとほぼ同じ • Vespaでは多次元を扱う型が強い フィールド型 中身 string 文字列型 (トークナイズの有無は別途指定) integer 32-bit 整数の数値型 long 64-bit 整数の数値型 byte 8-bit 整数の数値型 float 単精度浮動小数点型 double 倍精度浮動小数点型 raw バイナリ型 array<element-type> 配列型、element-typeで要素の型を指定 weightedset<element-type> 辞書型、element-typeでキーの型を指定、値はinteger tensor(dimention-1, ...) テンソル型、dimention-1, ...で次元を指定 Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 11
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ weightedset型とtensor型 • weightedset型とtensor型は多次元データを扱う型 • weightedset : keyとそれに対する重みをmapとして定義 • tensor : 多次元配列 (疎 or 密) としてテンソルを定義 Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 12
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ weightedset型とtensor型 (cont’d) • これら2つの型があると嬉しいこと => ベクトル・行列演算 • ex1) 検索クエリでユーザベクトルを与えてレコメンド • ex2) ニューラルネットなモデルを用いたランキング input R output k users users documents hidden U documents k V Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 13
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 動的フィールド • フィールド名や値の型から新規フィールドを動的に作成する機能 • Vespaは動的フィールドは未サポート • フィールド追加には明示的な定義が必要 • Solr/Elasticsearchではサポート • データ形式が緩い用途 (ログ解析とか) だとVespaは不向きかも Solr (dynamic field) Elasticsearch (dynamic template) Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 14
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ リアルタイム性 • 更新した内容が検索可能になるまでの時間はVespaの方が速い • Vespa : 更新リクエストが完了した時点 • Solr/Elasticsearch : soft commitの間隔に依存 • soft commitの間隔と検索性能がトレードオフの関係 soft commit実行時に 更新差分がvisibleになる … 更新リクエストが完了 した時点でvisibleになる tlog memory index disk index tlog segments Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 15
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 16
チュートリアル資料
https://yahoojapan.github.io/vespa-tutorial/
検索
• よくある検索はVespaも網羅
• Solr/Elasticsearchと大差なし
検索内容
クエリ
defaultフィールドに対して “foo” を検索
query=foo
titleフィールドに対して “foo” を検索 (フィールド指定検索)
query=title:foo
“foo” かつ “bar” を含むものを検索 (AND検索)
query=foo bar
“foo” もしくは “bar” を含むものを検索 (OR検索)
query=(foo bar)
“foo” を含むが “bar” を含まないものを検索 (NOT検索)
query=foo -bar
“foo bar” というフレーズを検索 (フレーズ検索)
query="foo bar"
1000<=price<=10000 なものを検索 (範囲検索)
query=price:[1000;10000]
“foo” に150%の重みを付与して検索 (重み付き検索)
query=foo!150 bar
Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
17
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 集約 • 代表的な集約処理 => groupingとfaceting • grouping • 各グループの部分検索結果を出力 (検索寄り) • Vespaの方が強いイメージ • 後述のランキングと連携できるため • faceting • 各グループの統計値を出力 (解析寄り) • Solr/Elasticsearchの方が強いイメージ • Stream ExpressionやScriptingなど手広いため Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 18
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ Vespaと集約 • Vespaでは集約はDSLを用いて表現 • ex) 各ジャンルから1件ずつドキュメントを取得 select= all( group(genres) each( max(1) each( output(summary()) ) ) ) ... “children”: [ {“id”: “grouplist:genres”, “children”: [ {“id”: group:string:Elasticsearch, ”children”: [ document ]}, {“id”: group:string:Java, ”children”: [ document ]}, {“id”: group:string:Python, ”children”: [ document ]}, ... ] ] ... Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 19
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ Vespaと集約 (cont’d) • DSLではどのグループになにをするかを再帰的に定義 • ネストしていくことで多段の集約が実行可能 検索結果全体を genresでグループ分け Elasticsearch Java Python … … … … select= 各グループの中から all( 最大1件を取得 group(genres) each( max(1) each( output(summary()) ) ) グループ内の各ドキュメント ) 後述のランキング で各グループをソート について内容を出力 Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 20
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 高度な検索 • VespaではSolr/Elasticsearchにない高度な検索機能があります • WAND検索 • Predicateフィールド Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 21
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ WAND検索 • WAND = Weak AND or Weighted AND の略 • AND検索とOR検索の中間のような検索 • 10個の検索条件のうち6個を満たす、みたいな • 実際は各検索条件 (ex. 単語) に重みが付いた内積演算 • スコアの上限値を元に検索候補を枝刈りしながら高速に検索 • ex) レコメンドのような多数の条件で検索するケースとか ユーザベクトル 文書ベクトル インデックス Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 22
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ Predicateフィールド • フィールド自体に条件式を埋め込む検索 • クエリの属性情報を元に対象文書をフィルタリング • 各ドキュメントが個別に条件式を持つところがポイント • ex) 広告配信での対象ユーザ指定とか gender=male age=31 文書側に埋め込まれた 条件式を元に絞り込む docid gender age 1 female 20 <= age < 40 2 male OR female 30 <= age <= 39 3 male 25 <= age < 35 … Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 23
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング まとめ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 24
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 検索とランキング • 一般的にランキングは多段で実施 (ここでは2段を想定) • 候補文書を段階的に絞り込むことで計算コストを軽減 • 後段ほど複雑なモデルを配置 second-phase 重量モデルによる候補文書の並び替え first-phase 軽量モデルによる候補文書の絞り込み Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 25
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 検索とランキング (cont’d) • Solr/ElasticsearchではLTR pluginの追加が必要 • それぞれのフェーズを異なるコンポーネントが管理 • 設定がバラけて管理が煩雑 second-phase first-phase LTR plugin LTR plugin Function Query Function Score Query Similarity Similarity Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 26
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ 検索とランキング (cont’d) • Vespaではランキング全体を一つの設定ファイルで管理 • 計算式は専用のDSLを用いて記述 • 検索時に対応するプロファイルを指定することで実行 second-phase Rank Profile first-phase Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 27
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ DSLによるモデル記述 • DSLでは四則演算、数学関数、IF文といった記述が可能 • 様々なモデルがDSLを用いて表現できます スコア計算に関連するプロパティの定義 外部モデルファイルの参照 スコア計算式の記述 second-phaseのランキングの定義 Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 28
DSLによるモデル記述 (cont’d) チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ • Vespaではモデル計算で役立つ組み込み素性を多数定義 • フィールド情報のアクセス、クエリとの適合度、etc... • ただし独自素性を追加するのはちょっと大変かも... (C++実装) Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 29
テンソルを用いたスコア計算 チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ • Vespaでは前述のtensor型を用いた行列演算を提供 • ニューラルネットや分散表現といった先端的なモデルも表現可能 input hidden output … … 1 1 Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 30
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング まとめ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 31
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ インデックスの分散 • Solr/Elasticsearchでのインデックス分散 => shard/replica • 基本的にreplicaを増やすことでスケールアウト • shardの数は一度決めると変更することが困難 node1 node2 node1 node2 replica数に 偏りが生じる node3 node4 ノード 追加 node3 node4 リバランス Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 32
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ インデックスの分散 (cont’d) • Vespaではbucketというより小さい粒度で分散配置を管理 • bucketはデータ規模に応じて動的に統合・分離 • ユーザは冗長数だけを気にすればいい node1 node2 node3 node1 node4 ノード 追加 node3 node2 node4 より均等に データを分散 リバランス Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 33
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ クラスタの管理 • Vespaでは所属ホストを設定ファイルで管理 • 設定ファイルを修正・デプロイするだけでノードの増減が可能 • 必要なデータ分散なども自動で実行されます Vespaクラスタ 設定ファイル プラグイン モデル 最新設定のアップロードと反映 # vespa-deploy prepare CONFIG # vespa-deploy activate container admin 最新の設定の基づき クラスタ構成を更新 content Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 新しいcontentノード群 の中でリバランシング 34
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ アジェンダ • • • • • • 構成 スキーマ・更新 検索・集約 ランキング クラスタリング まとめ Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 35
チュートリアル資料 https://yahoojapan.github.io/vespa-tutorial/ まとめ • Vespaのいいところ • 全文検索に強い (リアルタイム性とか検索機能とか) • ランキング機能がすごく先進的 • スケーラビリティがとても高い • Vespaのイマイチなところ • データ解析用途ならElastic Stackとか使った方が楽 • C++部分の拡張が辛い (Javaの方はフレームワークが優秀) • OSS化が最近で公式以外にプラグインとか資料がほぼない Copyright (C) 2018 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 36