ScalatraがScala3で使えるようになりました

地道にメンテナンスを継続しているScalatraですが、最近ついにScala 3で動作するマイルストーンビルド(3.0.0-M1)を公開しました。

github.com

Scala 3対応の作業はほとんどよしださんにやっていただき自分はリリースしただけですが…。

サンプルとしてScala 3で動作するScalatraプロジェクトを作ってみました。

github.com

一応コードはScala 3のシンタックスで書いてあります。これだけだとあまり嬉しい感じはしないかもしれませんが…。

package com.example.app

import org.scalatra._

class MyScalatraServlet extends ScalatraServlet:
  get("/") {
    views.html.hello()
  }

ScalatraがデフォルトでサポートしているテンプレートエンジンであるTwirl(と言っても何か特別なインテグレーションを提供しているわけではありませんが)はまだ正式なScala 3対応版がリリースされていないのですが、Scala 3に対応したマイルストーンビルド(現時点の最新版は1.6.0-M6)が提供されているのでこれを使うとScala 3でも動きます。

github.com

もちろんまだマイルストーンなのでGAまでに追加で変更が入る可能性はありますが、Scalatraではここ数年大きな変更はありませんし、あってもマイナーな変更だけかなと思います(JettyやServlet APIのバージョンは上げるかも?)。また、Scala 3対応にあたって特に何か大きく変更した部分もありませんのでマイルストーンビルドではありますが普通に使えるのではないかと思います。

DBTest '22でトレジャーデータでのTrinoのアップグレードに関する発表をさせていただきました

今週SIGMODと併催でフィラデルフィアで開催されたDBTest '22というワークショップでトレジャーデータでのTrinoのアップグレード時のテストに関する発表をさせていただきました(自分はリモートで発表させていただきました)。

内容的には以前Presto Conference 2020でお話しさせていただいたものとほぼ同様ですが、今回は新たに執筆した以下の論文を元にした発表になっています。

arxiv.org

発表に使用したスライドは以下になります。

www.slideshare.net

クエリエンジンのテスト周りは特にここ2-3年、チーム内で地道に改善を続けている部分なのですが、最近はテスト自体が改善された分、テスト後の調査にかかる時間が目立つようになってきました。false positiveを減らす工夫はしているものの、まだまだ数が多いので、さらにfalse positiveを減らすための改善を行うこと、最終的に調査が必要になった場合のサポートなどが今後の課題と考えています。

データベースのテストというのは世間一般的にはニッチな領域かと思いますが、ベンダ各社からも論文が出ていたり、DBTestのような国際的なワークショップも存在するので、他社さんの事例も参考にしつつ今後もさらなる改善を続けていきたいと思います。

Data Governance: The Definitive Guide: People, Processes, and Tools to Operationalize Data Trustworthiness

仕事の絡みもあって読んでみたのですが、割と基本的な事項が丁寧に書かれている感じでデータガバナンスの必要性や基本的な考え方、留意事項などを押さえるには良い書籍なのではないかと思いました。

一方で具体的な実現方法までにはほとんど踏み込んでいないので、じゃあどうすればいいのか?というところまではもう2ステップくらいある感じ。既存の製品やソリューションの紹介だったり、著者はGoogle Cloudの方々らしいので「GCPではこんな感じでサポートされている」みたいな感じでもう少し具体例を書いてもらえるとより参考になったのではないかなという気がしました(なくはないけどすごく控えめな感じ。ベンダーや製品依存にならないよう敢えて詳しい言及を避けているのかも知れませんが…)。

それと、基本的な内容が繰り返し丁寧に書かれている分、読んでいて情報量の割にちょっと冗長だなぁと感じる面もありましたし、トピックによってはもう少し突っ込んだ内容を読みたかったかなと感じた部分もありました。この書籍の元になったというホワイトペーパーを読むだけでもある程度ポイントは掴めるのではないかと思います。

ちなみにGoogle Clouldのブログに著者のEvrenさんのインタビュー記事が掲載されていました。こちらは日本語訳されたものもあります。

cloud.google.com

cloud.google.com

システム運用アンチパターン ―エンジニアがDevOpsで解決する組織・自動化・コミュニケーション

タイトルからしてこれは読まなくてはと発売前から思っていたのですが、色々と積読があり読み終わるまでに少し時間がかかってしまいました。オライリーから出ていますが原著はManningの「Operations Anti-Patterns, DevOps Solutions」のようです。

各章のタイトルがかなりキャッチーな感じだったのでもっと現場感のあるホラー系の内容を予想していたのですが、実際はそこまででもなく、内容はかなり真っ当なDevOps本でした。序盤はモニタリングやテスト、デプロイ、オンコールといった比較的現場レベルの課題、後半に進むにつれて情報共有、組織の文化といった話題にも及んでいきます。

個人的には「見ても状況が良いのか悪いのかわからないダッシュボード」というのがフフッとなってしまったのですが、これはDevOpsが浸透して開発メンバーが自分たちで運用していると逆に気付きにくいところかもしれないなあと思ったりしました。

書かれている内容は基本に忠実な感じなので、これからDevOpsを導入しようとしている場合にはよい参考書になるのではないかと思いますし、すでにDevOpsを実践している場合でも振り返りの意味で改めて読んでみると新たな気付きや更なる改善点が見つかるのではないかと思います。

ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ

原著も含めオンラインのレビューなどを見ているとなかなか評判の良い本書ですが、個人的には読んでいてちょっと感想に困るなぁ…という感じの内容でした。

というのもタイトルだけ見て勝手に勘違いしていたのですが、この本は「ソフトウェアアーキテクチャ」の本というよりは「ソフトウェアアーキテクト」の本なんですね。書籍の説明文にもちゃんと以下のように書かれていました。

ソフトウェアアーキテクチャとは、ソフトウェアシステムの成功に欠かせない重要な土台です。そのためソフトウェア開発者には、効果的なアーキテクチャを実現するスキルが求められます。本書は、そうした効果的なアーキテクチャを設計、構築、維持するアーキテクトになるために必要なスキルや知識を、現代的な視点から整理して包括的に解説する書籍です。 ソフトウェアアーキテクチャの定義から、アーキテクトの役割、モジュールや結合、アーキテクチャスタイルといったアーキテクチャ設計の基礎、チームやステークホルダーと効果的にコラボレーションしていくために必要なソフトスキルまで、さまざまなトピックについて実践的な例とともに説明します。

そんなわけでちょっと思ってたのと違ったというか…。

とはいえ、第I部のソフトウェアアーキテクチャの考え方、第II部のアーキテクチャカタログは経験に頼りがちなソフトウェアアーキテクチャ選定の際に体系的な指針を与えてくれるきっかけになるのではないかと思います。アーキテクチャカタログはパターン自体というよりはそれぞれのパターンの評価軸が参考になる感じかなと。第III部のソフトスキルなどの部分も実際のところ必要だよね…という感じではあるのですが、個人的にはもう少しソフトウェアアーキテクチャ自体を突き詰めた内容が読みたかったかなと思いました。

TrinoにおけるPostgreSQLのVARCHAR/CHAR型に対する範囲検索のプッシュダウンについて

TrinoはJDBC経由で様々なデータベースに接続できるのですが、PostgreSQLコネクタで以前はサポートされていたVARCHAR/CHAR型のカラムに対する範囲検索(<、<=、>、>=)のプッシュダウンがTrino 353以降廃止されていました。これはTrinoとPostgreSQLのCOLLATIONの違いが原因で、カラムの値によっては検索結果が期待したものにならないケースがあるためです。

github.com

そこで、以下のように明示的にCOLLATIONを指定してプッシュダウンする修正をTrino 365で取り込んでもらいました。

github.com

しかし、このプッシュダウンはオプションとなっており、Trinoのデフォルト設定では無効になっています。有効にするにはTrinoに以下の設定を追加する必要があります。

postgresql.experimental.enable-string-pushdown-with-collate=true

というのもPostgreSQL側でインデックスが張られていてもPostgreSQL側のCOLLATIONでインデックスが作成されているとプッシュダウンした場合にそのインデックスを利用することができないからという理由のようです(Trinoが指定するCOLLATIONでインデックスを作っておく必要がある)。個人的にはどっちにしろフルスキャンするんだからPostgreSQL→Trino間の転送量が減る分インデックスが使えなくてもプッシュダウンした方がマシなのではという気がしないでもないですが…。

実際にこのプッシュダウンが嬉しいケースは限られるかなと思いますが、もしTrinoからレコード数の多いPostgreSQLのテーブルのVARCHAR/CHAR型のカラムに対して範囲検索をしたいという場合はこのオプションの有効にすると速くなるのではないかと思います。前述のようにTrino用にインデックスを作っておくとより効果的です。

なお、最近のTrinoではJDBCコネクタでのプッシュダウンの強化(LIKE検索など)なども進められているようなので、PostgreSQLなどTrinoからJDBCコネクタ経由で接続可能なデータベースの検索パフォーマンスのさらなる向上が期待できそうです。

Trino/Prestoをdockerで動かしてみる

もう少しTrino/Prestoネタもブログに書いていこうかなというのと、普段テスト用途で古いバージョンのTrino/Prestoを手元で動かす際にdockerを使うことが多いので自分用のメモを兼ねて。

TrinoはDockerHubで公式のdockerイメージが公開されているので簡単にdockerで動かすことができます。イメージの使い方については以下にドキュメントがあります。

github.com

デフォルト設定で実行するだけならこんな感じ。

docker run --rm -p 8080:8080 --name trino trinodb/trino:371

起動後、以下のようにしてCLIクライアントで接続可能。もちろんlocalhostの8080ポートでWeb UIにもアクセスできますし、JDBCドライバなどで接続することも可能です。

docker exec -it trino trino

設定ファイルは /etc/trino ディレクトリに格納されているのでローカルで設定ファイルを用意しておきこのディレクトリにマウントすることで任意の設定で動作させることができます。

docker run --rm -p 8080:8080 -v <ローカルディレクトリ>:/etc/trino --name trino trinodb/trino:371

以下のディレクトリにデフォルトの設定ファイル群があるのでこれをベースに設定を弄ったりカタログを追加したりするとよいと思います。

なお、Trinoへのリブランディングされた350以前のPresto時代のdockerイメージについてはDockerHubから削除されてしまっているのですが、GitHub Container Registryにイメージがバックアップされています。互換性のチェックのために過去のバージョンを使いたいケースも多いので助かります。

docker run --rm -p 8080:8080 -v <ローカルディレクトリ>:/etc/presto --name presto ghcr.io/trinodb/presto:350

設定ファイルを配置するディレクトリは /etc/presto または /usr/lib/presto/default/etc になっています(後者が優先されます)。

docker run --rm -p 8080:8080 -v <ローカルディレクトリ>:/etc/presto --name presto ghcr.io/trinodb/presto:350