About Me

My photo
Software Engineer at Starburst. Maintainer at Trino. Previously at LINE, Teradata, HPE.

2022-12-31

Throwback 2022

Starburst

2021年の8月23日にStarburstに入社して1年以上経ったのでその記録もかねて2022年の振り返りです。以前はTrinoに既にコントリビュートしている人が入社してきている印象がありましたが最近は入社してから初めてPRを送る人もよく見かけるので会社としてのフェーズの変化を感じます。
開発する機能によってOSSか社内版かが決まるのですが、僕はほぼフルタイムでTrinoにコミットしています。数年前はOSSのフルタイムコミッターに対する憧れが自分にはあったのですが、実際になってみるとチームにはメンテナーは自分の他にもう1人しかいないので、その人が休暇をとると自分のコードがコミットできず時々困る場面があります。そういった際はPRのレビューにあてる時間を長くしたりして都度調整しています。

Connectors team

入社当時はStarburst EnterpriseのConnectorsチームというSaaS、JDBC、NoSQL系のコネクターを開発するチームに所属していました。チームの名前からはコネクターの開発のみを行う印象を受けますが、必要に応じてエンジンにも手を入れます。例えばALTER TABLE ... SET PROPERTIESやTRUNCATE TALEなどの新しいシンタックスは僕が追加しました。コネクターによって気をつけるポイントは異なるのでそれらについて満遍なく学べたことは良かったです。例えばSaaS系のコネクターは自分達のコードが変わっていなくてもSaaSサービス側の変更で期待とは異なる動作に繋がることがあるので、パッと見では冗長とも見えるほど多くのテストコードを書く必要があります。JDBC系のコネクターではJDBCドライバーの標準になっている部分の開発は比較的楽なのですが、タイプマッピングなど実装依存の部分や、ドライバーのコードがオープンになっていないコネクターを直すのはなかなかの手間でした。JDBC系の多くのコネクターがJulianからGregorianのカレンダースイッチ(1582月10-05日~1582月10日14)以前の日付を正常に扱えないバグを途中見つけたのですが個別に直していくのは時間がかかりました。

Lakehouse team

2022年3月23日からはLakehouseチームというHadoopエコシステム系のコネクター(Hive, Iceberg, Delta Lake, Hudi)を開発するチームに移りました。年の後半に組織の改変がありGalaxyというTrinoをSaaSとして提供する組織内にチームは所属しています。このチームも以前のチームと同様に必要があればエンジンも修正します。2022年はCOMMENT ON VIEWやALTER TABLE ... ALTER COLUMN ... SET DATA TYPEを僕は追加しました。追加機能ではIcebergコネクターでAvroフォーマットのサポートや、まだマージできていないですがHiveのテーブルをIcebergに変換するprocedure、Delta LakeコネクターのCHECK constraintをサポートするためにエンジン部分のコードやANTLRを使ってSpark expressionをTrino expressionに変換するパーサーを書いたりしました。チームを移って知識の幅が広がったのがとても良かったです。このチームに移ってから2度ポーランドに出張する機会があり、ずっとオンラインでのみやり取りしてきたメンバーと遂に会うことができました。2度目の出張ではCOVID-19にかかって帰国後は大変でしたが2回とも良い経験でした。

Maintainers work

Trinoのメンテナーとして、チームのメンバー以外からも来るPRのレビューもする必要があるのでこれをどうバランスを取るのを日々気にかけながら進めています。2022年はtrinodb/trinoリポジトリの自分自身のコミット数およびマージしたコミット数が共に2番目でした。数だけが重要な訳ではもちろんないですが、スピードは落とさず来年はより複雑な機能の開発や様々な領域のレビューに取り組んでいきたいです。

2022-12-24

Trino 2022 recap

Trinoで2022年に追加された新機能を紹介します。他にも多くの機能が追加されていますがメジャーなものに絞りました。

Polymorphic table functions

Polymorphic table functionsは聞き慣れないかもしれませんが、スカラー関数とは違って複数の行や列を返却できる関数のことです。例: SELECT * FROM TABLE(my_function(1, 100));
テーブルを引数に取れないなど内部的にはまだ未実装の部分もありますが、クエリをパススルーする関数がJDBC系コネクター、Elasticsearch, BigQueryおよびMongoDBが実装しています。関数の性質上、クエリをリモートに実際に実行する前に結果のカラム名とタイプを取得する必要があります。JDBCはPrepared StatementでResultSetMetaDataから取得、Elasticserachは取得が難しいので現状は1カラム1レコードにJSONを詰め込む形の実装、BigQueryはクエリをdry runして取得、MongoDBは内部的に管理している_schemaコレクションから取得といった流れになっています。
JDBCコネクターを使用する人が多そうなのでもう少し内部的な実装を説明すると、ResultSetMetaDataを取得する必要があるのでDDLなどは基本的にはサポートされていません。"基本的には"と書いたのはJDBCドライバの実装依存だからです。DDLに関してはTable functionではなくProcedureで実装される予定です #12322。次に内部的には完全にパススルーしている訳ではなくSELECT * FROM (...) oのようにラップしています。そのため対象のデータベースが生成されたクエリを実行できない場合もあります。例えばSELECT * FROM (SHOW DATABASES) oなどはエラーになるDBが多いでしょう。これらはあくまでデフォルトの実装 (DefaultQueryBuilder)なのでコネクターを自身で開発されている方は適宜変更することも可能です。

関連リンク

JSON functions

元々JSON関連の関数は存在しましたがJSON pathがサポートされ、これまでよりシンプルに複雑なJSONを分析することが可能になりました。
JSON pathを使用したjson_exists関数の例を説明します。以下のようなテーブルがあったとします。
 id  |                    description
-----+---------------------------------------------------
 101 | {"comment" : "nice", "children" : [10, 13, 16]}
 103 | {"comment" : "knows best", "children" : [2]}
 102 | {"comment" : "problematic", "children" : [8, 11]}

childrenフィールドの配列内に10より大きい数が存在するかを確認するためにはlax $.children[*]?(@ > 10)というパスを使用できます。
SELECT
      id,
      json_exists(
                  description,
                  'lax $.children[*]?(@ > 10)'
                 ) AS children_above_ten
FROM customers;

 id  | children_above_ten
-----+--------------------
 102 | true
 103 | false
 101 | true

関連リンク

MERGE statement

ANSIで定義されているシンタックスなので文法に関する説明は割愛しますが、MERGE statementが追加されました。現時点では以下のコネクターでサポートされています。
  • Hive
  • Iceberg
  • Delta Lake
  • Kudu
  • Raptor
MERGE statementの他にはCOMMENT ON VIEWや、カラムの型を変更するALTER TABLE ... ALTER COLUMN ... SET DATA TYPEが今年は追加されました。


Fault-tolerant execution

Trinoはアドホックな分析やBIツールで使用されることが多いのですが、ETLの使用にも耐えられるよう開発が始まったのがFault-Tolerant Execution (Project Tardigrade)です。リトライのポリシーにはQUERYとTASKの2種類があります。QUERYは失敗時にクエリ全体、TASKは個々のタスクレベルでリトライを行います。大きめなETLワークロードの環境では外部ストレージに中間結果を書き込むExhange managerを有効にしてTASKリトライポリシーを使用することが推奨されています。現在サポートされているコネクターは以下の通りでBigQuery向けの開発が現在進んでいます。

  • Delta Lake
  • Hive
  • Iceberg
  • MySQL
  • PostgreSQL
  • SQL Server
  • MongoDB
関連リンク

New connectors

2022年は新たにDelta LakeMariaDBおよびHudiコネクターが追加されました。Delta LakeコネクターはStarburstで元々開発されていたものがオープンソース化されました。MariaDBコネクターについては以前はMySQL/SingleStore (MemSQL)コネクターを使っている方が多かったのですが、Compatibilityの乖離も徐々に進んできて分けた方が良いと判断のもと新しく追加されました。HudiコネクターはOnehouseの方が追加したのですが、DDLは実行できないなど機能としてはかなり制限されており今後の改善が必要な状態です。

以上、2022年にTrinoで追加された機能を紹介しました。時間があれば個別の機能に関する詳細なポストを書きたいと思います。

ここ数年は毎年Trinoに関するイベントを開催していたのですが、今年は自分が出張や組織変更等で忙しかったこともあり開催できませんでした...。来年はできればオフラインもしくはハイブリッドで開催したいと考えています。もし登壇に興味のある方はぜひお知らせください🐰