2022年2月5日 星期六

準備 Vespa 測試環境

其實本來想紀錄一下建 Vespa container 的過程,但翻了一下之前的文章 [1],發現其實雖然細節有點不同,但大體上也是大同小異,這篇就簡單寫了,畢竟內容其實就跟 Vespa 的 Github 上寫得差不多 😆。

這篇其實算是個前置作業,目的是因為最近想紀錄一點 Vespa 的實驗數據,不過畢竟不能拿公司的數據放部落格(其實也不是公司不允許,單純只是要申請跟審核感覺很麻煩,我懶得弄 🙈),所以想要用簡單的 Vespa container 來做測試。基於這個原因,需要在自己的電腦準備一個 Vespa 環境,並且需要塞一些合理的測試資料進去。Vespa 團隊在他們的 Github [2] 上有準備一個 e-commerce 的範例,看起來還不錯,所以預計會先拿這個來做初始環境的建置。

Vespa 環境準備

準備的過程可以參考 [2]。首先就是把 repository 下載下來,然後用 docker 啟動。

$ git clone --depth 1 https://github.com/vespa-engine/sample-apps.git
$ cd sample-apps/use-case-shopping && mvn clean package
$ docker run --detach --name vespa --hostname vespa-container \
  --publish 8080:8080 --publish 19071:19071 \
  vespaengine/vespa

這裡需要小小注意的地方是,docker run 啟動的單純只是純粹的 Vespa cluster,上面並沒有 application。所以 docker run 完成後,可以透過 http://localhost:19071 來查詢 Vespa cluster 的相關狀態,但無法做其他操作像是塞資料等,這是因為這時還沒有把 Vespa application 佈署上去。所以換言之,上述步驟中用 Maven 打包的東西其實還沒使用到,這是下個步驟會做的事。

$ curl --header Content-Type:application/zip --data-binary @target/application.zip \
  localhost:19071/application/v2/tenant/default/prepareandactivate

佈署 application 是一個 curl 指令,把 mvn 打包的東西送上 Vespa 作為一個 tenant。以我的狀況來說,會得到以下的 response:

{
  "log": [
    {
      "time": 1644043626140,
      "level": "WARNING",
      "message": "'jvmargs' is deprecated and will be removed in Vespa 8. Please merge 'jvmargs' into 'options' or 'gc-options' in 'jvm' element. See https://docs.vespa.ai/en/reference/services-container.html#jvm",
      "applicationPackage": true
    },
    {
      "time": 1644043626140,
      "level": "WARNING",
      "message": "Invalid or misplaced JVM options in services.xml: -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8998. See https://docs.vespa.ai/en/reference/services-container.html#jvm",
      "applicationPackage": true
    }
  ],
  "tenant": "default",
  "url": "http://localhost:19071/application/v2/tenant/default/application/default/environment/prod/region/default/instance/default",
  "message": "Session 3 for tenant 'default' prepared and activated.",
  "configChangeActions": {
    "restart": [],
    "refeed": [],
    "reindex": []
  }
}

中間有一些 WARNING 是警告使用的某些設定在未來會被 deprecate,不過現在先不理它 😆。如果想確認 application 有沒有成功佈署,可以試著呼叫 http://localhost:8080,如果有成功拿到回覆就表示有成功地佈署,其中回覆的內容會長得有點像 http://localhost:19071/ApplicationStatus 那樣,會列出可用的 handlers。

接下來就是要塞資料進 Vespa 了。

$ curl -L -o vespa-feed-client-cli.zip \
    https://search.maven.org/remotecontent?filepath=com/yahoo/vespa/vespa-feed-client-cli/7.527.20/vespa-feed-client-cli-7.527.20-zip.zip
$ unzip vespa-feed-client-cli.zip

$ gunzip -c meta_sports_20k_sample.json.gz | ./convert_meta.py > feed_items.json
$ ./vespa-feed-client-cli/vespa-feed-client \
    --verbose --file feed_items.json --endpoint http://localhost:8080

$ gunzip -c reviews_sports_24k_sample.json.gz | ./convert_reviews.py > feed_reviews.json
$ ./vespa-feed-client-cli/vespa-feed-client \
    --verbose --file feed_reviews.json --endpoint http://localhost:8080

第一段是下載 Vespa 的 feed client,第二、三段是分別把 20K 個商品和評論的資料解壓縮,並且透過 feed client 寫入到 Vespa 中。

更新 Schema

如果要更新 schema 的話,需要做的事情就是更新完以後,用 Maven 重新打包一次,然後再執行一次上述的 prepare and activate 的 API,就可以把更新的 schema 覆蓋上去了。

$ curl --header Content-Type:application/zip --data-binary @target/application.zip \
  localhost:19071/application/v2/tenant/default/prepareandactivate

如果這時 schema 有變動的話,就會在 configChangeActions 這裡會顯示出偵測到的變動。

參考資料
  1. Vespa 入門(一):在本機建立 containerized Vespa
  2. Vespa sample applications – e-commerce

沒有留言: