表題の通り。少し前から気になっている”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アプリケーション等もうちょっとしっかり見ていこうかと思う。
以上。