👌

Treasure DataのクエリエンジンHiveとTrino(Presto)

2024/12/09に公開

この記事はTreasureDataのドキュメントを翻訳・意訳したものです。
また独自の説明を加えた部分もあります。

Trino (Presto) クイックスタートガイド

https://api-docs.treasuredata.com/en/tools/presto/quickstart/

はじめに

Trino、以前はPrestoSQLまたは単にPrestoと呼ばれていたオープンソースの分散SQLクエリエンジンについて紹介します。2021年のブランド変更により、現在はTrinoとして知られていますが、Treasure Dataでは以前のPrestoのバージョンもサポートしています。現在サポートされているバージョンはPresto 350であり、Trino 423も新たにサポートされています。

分散SQLクエリエンジンについて

Trino(旧Presto)は、データを別の分析システムに移動させることなく、データが保存されている場所で直接クエリを実行できます。Treasure DataはTrinoをカスタマイズし、独自の分散カラムナストレージレイヤーと直接対話できるようにしています。

分析エンジンの選択

分析エンジンとしては、HiveとTrino(Presto)の2つが一般的です。

Hive

Hiveは、大規模データシステムを対象とするオープンソースのHadoopプラットフォーム上で動作します。Hive 2020.1はSQLライクなクエリをMapReduceジョブに変換し、大量のデータを効率的に処理します。

Trino(Presto)

Trino 423およびPresto 350は、HDFSなどのデータに対して高速かつインタラクティブなクエリを実行するために設計されています。Trino(Presto)はレイテンシーに最適化されており、プッシュモデルと説明されることが多いです。

特徴 Hive Trino(Presto)
最適化 スループット インタラクティブ
SQL規格準拠 HiveQL(共通のデータウェアハウジングSQLのサブセット) ANSI SQLに準拠
ウィンドウ関数 はい はい
大規模JOIN 大規模なファクト間のJOINに非常に優れている スター型スキーマJOIN(1つの大きなファクトテーブルと複数の小さなディメンションテーブル)に最適化
クエリの最大長 ハードリミットなし 1MB

Trino(Presto)の動作原理

Trinoは、クラシックな大規模並列処理(MPP)データベース管理システムに似たアーキテクチャを使用しています。1つのコーディネーターノードが複数のワーカーノードと連携して動作します。ユーザーはSQLクエリをコーディネーターに送信し、コーディネーターはカスタムクエリと実行エンジンを使用して、ワーカーノード全体に分散クエリプランを解析、計画、およびスケジュールします。

Trino(Presto)クエリエンジンの使用方法

Trinoを使用すると、任意のサイズのデータに対して高速な分析クエリを実行できます。Trinoはレイテンシーに最適化されているため、インタラクティブなクエリに適しています。

利用方法

Trinoは以下の方法でアクセスできます:

  • TDコンソール
  • Presto JDBC/ODBCドライバー
  • TD Toolbelt
  • REST API

JDBCドライバーの設定

以下の手順でJDBCドライバーを設定できます:

  1. presto jdbc driver をダウンロードします。
  2. セキュアなHTTPS接続を使用するためには、presto 0.148以降を使用します。
  3. 接続URLの例:
jdbc:trino://api-presto.treasuredata.com:443/td-presto/(database name)?SSL=true

サンプルコード

以下はサンプルコードです:

import java.sql.*;
class Sample {
  public static void main(String[] args) {
    if(args.length != 1) {
      System.err.println("Provide your TD API key as an argument");
      return;
    }
    String apikey = args[0];
    try {
      Connection conn = DriverManager.getConnection("jdbc:trino://api-presto.treasuredata.com:443/td-presto/sample_datasets?SSL=true", apikey, "dummy_password");
      Statement stmt = conn.createStatement();
      try {
        ResultSet rs = stmt.executeQuery("SELECT time, method, path from www_access limit 5");
        while(rs.next()) {
            long time = rs.getLong(1);
            String method = rs.getString(2);
            String path = rs.getString(3);
            System.out.println(String.format("time=%s, method=%s, path=%s", time, method, path));
        }
      }
      finally {
        stmt.close();
        conn.close();
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

ODBCドライバーの設定

Windows 64-bitプラットフォーム向けのPresto専用ODBCドライバーが提供されています。以下の手順でインストールおよび設定を行います:

  1. ODBCドライバーインストーラー TreasureDataPrestoODBC.msi をダウンロードし、インストールします。
  2. ODBCデータソースアドミニストレーターを開き、必要な情報を入力して設定します。

CLIツール

TD Toolbeltを使用してクエリを発行することも可能です:

$ td query -w -T presto -d testdb \
  "SELECT code, COUNT(1) 
   FROM www_access GROUP BY code"

REST API

REST APIを使用してPrestoにアクセスすることもできます:

/v3/job/issue/presto/:database

ストリームデータ処理

ストリームデータ処理では、中間テーブルを使用して新しいデータのみを処理し、残りの処理済みデータに追加します。

中間テーブルの作成

以下は中間テーブルを作成する例です:

CREATE TABLE visitor_country AS SELECT
  TD_DATE_TRUNK(day, time, ‘PST’) AS time,
  userid,
  TD_IP_TO_COUNTRY_CODE(ip) country
FROM visitor_raw
WHERE TD_TIME_RANGE(time, null,2017-07-01, ‘PST’)

中間テーブルへのデータ追加

INSERT INTO visitor_country
SELECT
  TD_DATE_TRUNK(day, time, ‘PST’) AS time,
  userid,
  TD_IP_TO_COUNTRY_CODE(ip) country
FROM visitor_raw
WHERE TD_TIME_RANGE(time, TD_TIME_ADD(TD_SCHEDULED_TIME(),-1d’), TD_SCHEDULED_TIME(), ‘PST’);

中間テーブルの集計

SELECT country, approx_distinct(userid) num_users
FROM vistitor_country
GROUP BY 1

Trino 423のアクセス方法

https://api-docs.treasuredata.com/en/tools/presto/trino/

トレジャーデータクエリで利用可能な最新バージョンのTrino 423(Presto)

現在、トレジャーデータのクエリで使用できる最新のTrino(旧Presto)バージョンはTrino 423です。このバージョンには、多くの新機能や改善点が含まれています。

パフォーマンス改善

Trino 423では、以下のようなパフォーマンスの向上が見られます:

  • 結合(JOIN)

    • ドライバー結合のパフォーマンスが向上しました(#5981, #8974, #13352)。
    • LEFT、RIGHT、FULL JOINを含む特定のクエリのパフォーマンスが改善されました(#7090)。
    • 異なる長さのvarcharキーを使用する結合のパフォーマンスが向上しました(#7644)。
    • 不等式結合のパフォーマンスが向上しました(#9307)。
    • 結合とUNION句を含むクエリのパフォーマンスが向上しました(#11935)。
  • INおよびEXISTS

    • 多数の定数を含むIN述語を使用するクエリのパフォーマンスが向上しました(#8833)。
    • IN (<subquery>) 式のパフォーマンスが向上しました(#8639)。
  • GROUP BY

    • 多数のグループを含むGROUP BYのパフォーマンスが向上しました(#11011, #11361)。
  • 関数

    • rank()ウィンドウ関数を使用するクエリのパフォーマンスが向上しました(#6333)。
    • array_distinct(array_sort(…)) 式を含むクエリのパフォーマンスが向上しました(#8777)。
    • timestamp型とdateリテラルを比較する特定のクエリのパフォーマンスが向上しました(#11170)。
    • LIKE式を含むクエリのパフォーマンスが向上しました(#15999)。

新しいUDF(ユーザー定義関数)

Trino 423では、以下の新しいUDFが利用可能です:

  • version()(#4627)
  • to_geojson_geometry()およびfrom_geojson_geometry()(#6355)
  • soundex()(#4022)
  • format_number()(#1878)
  • geometry_nearest_points()(#8280)
  • listagg()のサポート(#4835)
  • contains関数(CIDRがIPアドレスを含むかどうかをチェック)(#9654)
  • trim_array()(#11238)
  • to_base32()およびfrom_base32()(#11439)
  • JSON関数:json_exists, json_query, json_value, json_array, json_object(#9081)
  • sinh()(#16494)
  • quantile_at_value()(#16736)
  • array_histogram()(#14725)
  • any_value()のサポート(#17777)

新しいSQLサポート

Trino 423では、以下のSQLサポートが追加されました:

  • WINDOW句のサポート(#651)
  • MATCH_RECOGNIZEのサポート(#6111)
  • 標準SQLトリム構文のサポート(#11236)
  • DELETEクエリでの相関サブクエリのサポート(#9447)
  • JSON path言語への再帰メンバーアクセスのサポート(#16854)
  • 複合セットを使用したCUBEおよびROLLUPのサポート(#16981)
  • EXECUTE IMMEDIATEのサポート(#17341)
  • 数値リテラルにアンダースコアを使用するサポート(#17776)
  • 16進数、2進数、および8進数の数値リテラルのサポート(#17776)

JDBCの改善

Trino 423では、PreparedStatement.getParameterMetaData()が実装されました(#2978)。

tzdataバージョンの更新

この新しいバージョンでは、Pacific/Kantonタイムゾーンがサポートされましたが、US/Pacific-Newゾーンは参照できなくなりました(#6660, #10679)。

Trino 423の使用方法

現在のデフォルトのPrestoクエリエンジンはPresto 350です。Trino/Prestoのバージョンを指定するには、SQLクエリの前に"magic comment"を追加します:

-- Presto 350
-- Trino 423

多くの既存のPresto 350クエリはTrino 423と互換性がありますが、一部のクエリには変更が必要です。

変更点と注意点

  • ダブル型やリアル型からvarcharへのキャスト
    • SQL標準にしたがってキャストする必要があります。
  • unixtimeの戻り値の扱い
    • タイムゾーンを使用する場合、from_unixtime()およびfrom_unixtime_nanos()の戻り値がtimestamp(p) with time zoneに変更されました。
  • to_unixtimeの不一致の修正
    • to_unixtime(timestamp(p))およびto_unixtime(timestamp(p) with time zone)の2つのバリアントがあります。
  • rowからjsonへのキャスト
    • Trino 423ではJSON配列を返しません。
  • 無効なタイムスタンプリテラルのキャスト
    • 無効なタイムスタンプリテラルはキャストできません。
  • varchar(n)への数値のキャスト
    • Trino 423では、varchar型の長さが短すぎる場合、クエリが失敗します。

その他の変更点

  • CREATE TABLEおよびDROP TABLEは結果セットを返さなくなりました。
  • information_schema.role_authorization_descriptorsテーブルが削除されました。
  • カタログ名の変更
    • Trino 423ではカタログがtdに変更されましたが、後方互換性を保つためにtd-prestoはエイリアスとして残っています。
  • SHOW COLUMNSおよびinformation_schema.columnsから余分な情報が削除されました。

以上が、トレジャーデータで利用可能なTrino 423の新機能と改善点の概要です。Trino 423を活用して、より効率的なデータクエリを実現しましょう。

INCUDATA TechBlog

Discussion