About Me

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

2023-06-21

Trino Fest Keynote: Trino for lakehouses, data oceans, and beyond

6月14, 15日に開催されたTrino FestのキーノートTrino for lakehouses, data oceans, and beyondを見たので日本語訳サマリーです。動画は以下のリンクで見ることができます。




By the numbers

  • 2022年11月から16回リリースされました
  • 2023年に入ってからのコミット数は約2,250
  • 合計のコントリビュータ数は660人以上
  • Slackメンバーは現在9,900人以上
  • 1,800社を超える2万人以上のコミュニティメンバー
  • db-enginesランキングは96位から69位へ

New maintainers

新しいメンテナが2人追加されました。AWSのJames Pettyと、StarburstのManfred Moserです🎉全体のメンテナのリストはhttps://trino.io/development/roles.html#maintainersに載っています。

Table function improvements

新たに以下のテーブル関数が追加されています。
  • exclude_columns
    • SELECT文で特定のカラムだけ除いて結果を返却
  • sequence
    • 指定された範囲の値を生成して返却。従来のスカラー関数は最大で10,000のエントリまでという制限がありましたがテーブル関数ではその制限は撤廃されています。
  • query/raw_query
    • リモートで実行するクエリを文字列として受け取って実行結果を返却します。queryテーブル関数はJDBC系のコネクタやBigQuery、Cassandra、MongoDB、raw_queryテーブル関数はElasticsearchコネクタでサポートされています。
  • procedure 
    • SQL Server内のストアドプロシージャを実行

Fault-tolerant execution

性能の改善やストレージとしてHDFSも対象となりました。MongoDB, BigQuery, Redshift and Oracleコネクタへの対応が追加されました。

Schema evolution, (meta)data, and tools

  • ALTER COLUMN … SET DATA TYPEが新しいシンタックスとして追加
  • ALTER TABLE … RENAME COLUMNの対応コネクタの追加
  • ALTER TABLE ... DROP COLUMNでROWタイプ内のフィールドを削除する機能が追加
  • Hudiコネクタで$timelineメタデータテーブルが追加
  • Delta LakeコネクタでChange Data Feedを返却するtable_changesテーブル関数が追加
  • IcebergコネクタでREST、JDBCおよびNessieカタログが追加

Lakehouse migration - table procedures

  • migrate
    • HiveテーブルをIcebergテーブルへファイルの書き換えなしに変換するプロシージャ
  • register_table / unregister_table
    • Iceberg, Delta Lakeテーブルをメタストアへ登録、もしくはメタストアから削除するプロシージャです。DROP TABLEはファイルを削除しますがunregister_tableではファイルは削除しません。

Tons of performance improvements

数が多すぎるのでスクリーンショットを添付します🐰

Tracing with OpenTelemetry

OpenTelemetryを使ったオブザーバビリティの向上を進めています。添付はDatadogでフレームグラフを表示しています。


Client tool news

PythonクライアントではSQLAlchemy 2.0やEXECUTE IMMEDIATE等々、継続的に開発が進めめられています。dbt Cloudのサポートも最近発表されました。

Roadmap

今後のロードマップは以下のようなタスクが予定されています。

Trino: The Definitive Guide

2ndエディションが発売されました。Starburstから無料でPDFをダウンロードできます🐸 https://www.starburst.io/info/oreilly-trino-guide/

Getting involved

2023-05-04

Migrate Hive tabes to Iceberg in Trino

Trino version 411 introduced 'migrate' procedure in Iceberg connector. This procedure coverts the existing Hive tables with ORC, Parquet & Avro format to Iceberg table. This article explains the details of the procedure. If you execute CREATE TABLE AS SELECT statement to convert Hive to Iceberg, I would recommend trying this procedure. The procedure will be much faster because it doesn't rewrite files. 

The procedure accepts 3 arguments (schema_name, table_name and optional recursive_directory). The possible values for recursive_directory argument are true, false and fail. The default value is fail that throws an exception if the nested directory exists under the table or partition location.  

CALL iceberg.system.migrate(schema_name => 'testdb', table_name => 'customer_orders', recursive_directory => 'true'); 

Let me explain the details of the implementation next. 

  1. Generate Iceberg schema object based on Hive table definition
  2. Iterate over the table or partition location to create Iceberg metadata files
    1. Build Iceberg Metrics 
    2. Build Iceberg DataFile
  3. Update the table definition in the metastore

All logic exists in MigrateProcedure.java if you want to check the code.

Limitation

  • The procedure scan files sequentially. If the target table has a lot of files, it will take a long time to complete. 
  • The PR to migrate Delta Lake tables to Iceberg is in progress https://github.com/trinodb/trino/pull/17131. There's no plan to support other format (e.g. Hudi) at this time. 

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

2022-11-07

Team Cat

10月9日からシンガプーラの男の子を飼い始めました。8月4日生まれなので約2ヶ月の仔猫です。初日に寝室にケージを置いて、鳴き声がひどい時に2回ほど出してあげたのですが、次の日にシーツが濡れていてなんだろうと思い匂いを嗅いでみるとおしっこでした...。幸い日曜日だったので熱湯でマットレスを殺菌したりコインランドリーで洗濯できたので不幸中の幸いでした。初日はケージから出さない方が良いというのは聞いてましたが、こういったことを防ぐためにも重要なんだなと感じました。2日目以降はトイレを失敗することはなく元気に暮らしています。性格は今のところとにかく遊びたがりでこちらが止めない限りずっと遊んでいます。

現在働いているStarburstでは入社時の自己紹介でTeam dogもしくはTeam cat(犬好きか猫好きか)を共有する文化があります。僕が入社した際はタイムゾーンの問題で自己紹介のスライドに間に合わず聞かれなかったのですが、この度晴れてTeam catに入りました。在宅勤務なので仕事中に遊んでスイッチが入ると大変な場面もありますが、大きくなったらこんなに遊んでくれないかもなという思いもあり出来るだけ一緒に遊んでいます🐱