Vespa quick start

表題の通り。少し前から気になっている”Vespa“を触り始めてみたい。

■ 環境

  • Docker 17.09.0-ce
  • Mac OSX El Capitan

■ Vespa

Vespa. Big data. Real time.
http://vespa.ai/

とりあえず手始めに下記を順にやっていってみる。

Vespa quick start using Docker
http://docs.vespa.ai/documentation/vespa-quick-start.html

Prerequisites“は問題なさそう。

1. Clone the Vespa sample apps from github

$ git clone https://github.com/vespa-engine/sample-apps.git
$ export VESPA_SAMPLE_APPS=`pwd`/sample-apps
$

Sampleアプリケーションを落として環境変数に入れる。

2. Start a Vespa Docker container

Dockerコンテナを起動する。volumeは先ほど環境変数に入れたSampleアプリケーションの場所を指定している。

$ docker run --detach --name vespa --hostname vespa-container --privileged \
--volume $VESPA_SAMPLE_APPS:/vespa-sample-apps --publish 8080:8080 vespaengine/vespa

vespaengine/vespa“というコンテナイメージはローカルにはないので、初めての時はダウンロードから開始。

やっている内容については、詳しくは”Dockerfile“とスクリプトを見ろよ、と。

3. Wait for configuration server to start – wait for a 200 OK response

コンテナの起動状態を確認する。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f72ec6bbe78b        vespaengine/vespa   "/usr/local/bin/st..."   33 seconds ago      Up 32 seconds       0.0.0.0:8080->8080/tcp   vespa
$

このコンテナに対してコマンドを実行するようだ。

$ docker exec vespa bash -c 'curl -s --head http://localhost:19071/ApplicationStatus'
HTTP/1.1 200 OK
Date: Thu, 02 Nov 2017 10:11:19 GMT
Content-Type: application/json
Content-Length: 8478

$

4. Deploy and activate a sample application

Sampleアプリケーションのdeployのようである。`vespa-deploy`コマンドがあるんだな。”prepare“(作成)して”activate“(有効化)といったところか。

$ docker exec vespa bash -c '/opt/vespa/bin/vespa-deploy prepare /vespa-sample-apps/basic-search/src/main/application/ && \
/opt/vespa/bin/vespa-deploy activate'
Uploading application '/vespa-sample-apps/basic-search/src/main/application/' using http://localhost:19071/application/v2/tenant/default/session?name=application
Session 2 for tenant 'default' created.
Preparing session 2 using http://localhost:19071/application/v2/tenant/default/session/2/prepared
Session 2 for tenant 'default' prepared.
Activating session 2 using http://localhost:19071/application/v2/tenant/default/session/2/active
Session 2 for tenant 'default' activated.
Checksum:   7e2d87f846179be18c806d7e1f1aeea6
Timestamp:  1509606901569
Generation: 2
$

5. Ensure the application is active – wait for a 200 OK response

Sampleアプリケーションの状態。これはDockerの外部から実行するようだ。公開したようなイメージだろうか。

$ curl -s --head http://localhost:8080/ApplicationStatus
HTTP/1.1 200 OK
Date: Thu, 02 Nov 2017 10:17:00 GMT
Content-Type: application/json
Transfer-Encoding: chunked

$

200 OK“が返ってきているので問題なさそうだ。

6. Feed documents

ドキュメントを投入する、というようなイメージだろうか。POSTしてるし。

$ curl -s -X POST --data-binary @${VESPA_SAMPLE_APPS}/basic-search/music-data-1.json \
    http://localhost:8080/document/v1/music/music/docid/1 | python -m json.tool
{
    "id": "id:music:music::1",
    "pathId": "/document/v1/music/music/docid/1"
}
$ curl -s -X POST --data-binary @${VESPA_SAMPLE_APPS}/basic-search/music-data-2.json \
    http://localhost:8080/document/v1/music/music/docid/2 | python -m json.tool
{
    "id": "id:music:music::2",
    "pathId": "/document/v1/music/music/docid/2"
}
$

7. Run a query and a document get request

投入したドキュメントに対してクエリの実行と取得。

$ curl -s http://localhost:8080/search/?query=bad | python -m json.tool
{
    "root": {
        "children": [
            {
                "fields": {
                    "artist": "Michael Jackson",
                    "documentid": "id:music:music::1",
                    "duration": 247,
                    "sddocname": "music",
                    "title": "Bad",
                    "year": 1987
                },
                "id": "id:music:music::1",
                "relevance": 0.254574922399675,
                "source": "music"
            },
            {
                "fields": {
                    "artist": "Eminem",
                    "documentid": "id:music:music::2",
                    "sddocname": "music",
                    "title": "So Bad",
                    "year": 2010
                },
                "id": "id:music:music::2",
                "relevance": 0.05447959677335429,
                "source": "music"
            }
        ],
        "coverage": {
            "coverage": 100,
            "documents": 2,
            "full": true,
            "nodes": 0,
            "results": 1,
            "resultsFull": 1
        },
        "fields": {
            "totalCount": 2
        },
        "id": "toplevel",
        "relevance": 1.0
    }
}
$

bad“という文字列を含むドキュメントの取得、といったところだろうか。

`python -m json.tool`は長いので`jq .`にしてみた。

$ curl -s http://localhost:8080/document/v1/music/music/docid/2 |  jq .
{
  "fields": {
    "artist": "Eminem",
    "title": "So Bad",
    "year": 2010,
    "album": "Recovery"
  },
  "id": "id:music:music::2",
  "pathId": "/document/v1/music/music/docid/2"
}
$

こっちはドキュメント自体の取得か。

■ おしまい

ここまでだけだと「ふーん」というだけの結果であるが、”big data serving engine“というものがどういうものかまだイメージがしっかりついていないので、Sampleアプリケーション等もうちょっとしっかり見ていこうかと思う。

以上。