Presto C++ の機能

エンドポイント

タスクに関連する HTTP エンドポイントは、TaskResource.cpp 内の Proxygen に登録されます。実装されている重要なエンドポイントは次のとおりです。

  • POST: v1/task: TaskUpdateRequest を処理します

  • GET: v1/task: シリアライズされた TaskInfo を返します(包括的なメトリクスに使用され、報告頻度は低くなる場合があります)

  • GET: v1/task/status: シリアライズされた TaskStatus を返します(クエリの進捗追跡に使用され、頻繁に報告する必要があります)

その他の HTTP エンドポイントは次のとおりです。

  • POST: v1/memory: メモリを報告しますが、Java ワーカーとは異なり、割り当ては調整されません

  • GET: v1/info/metrics: ワーカーレベルのメトリクスを Prometheus データ形式で返します。詳細については、ワーカーメトリクスの収集 セクションを参照してください。これは、この API によって返されるサンプルメトリクスデータです。

    # TYPE presto_cpp_num_http_request counter
    presto_cpp_num_http_request{cluster="testing",worker=""} 0
    # TYPE presto_cpp_num_http_request_error counter
    presto_cpp_num_http_request_error{cluster="testing",worker=""} 0
    # TYPE presto_cpp_memory_pushback_count counter
    presto_cpp_memory_pushback_count{cluster="testing",worker=""} 0
    # TYPE velox_driver_yield_count counter
    velox_driver_yield_count{cluster="testing",worker=""} 0
    # TYPE velox_cache_shrink_count counter
    velox_cache_shrink_count{cluster="testing",worker=""} 0
    # TYPE velox_memory_cache_num_stale_entries counter
    velox_memory_cache_num_stale_entries{cluster="testing",worker=""} 0
    # TYPE velox_arbitrator_requests_count counter
    velox_arbitrator_requests_count{cluster="testing",worker=""} 0
    
  • GET: v1/info: ワーカーに関する基本情報を返します。次に例を示します。

    {"coordinator":false,"environment":"testing","nodeVersion":{"version":"testversion"},"starting":false,"uptime":"49.00s"}
    
  • GET: v1/status: メモリプール情報を返します。

Presto C++ のリクエスト/レスポンスフローは、Java ワーカーと同じです。タスクまたは新しい分割は、TaskUpdateRequest を介して登録されます。リソース使用率とクエリの進捗状況は、タスクエンドポイントを介してコーディネーターに送信されます。

リモート関数実行

Presto C++ は、スカラー関数のリモート実行をサポートしています。この機能は、関数コードが C++ で記述されていない場合、またはセキュリティまたは柔軟性の理由から、関数コードをメインエンジンと同じ実行ファイルにリンクできない場合に役立ちます。

リモート関数のシグネチャは、JsonFileBasedFunctionNamespaceManager によって実装された形式に従って、JSON ファイルを使用して提供する必要があります。次のプロパティにより、リモート関数実行を設定できます。

remote-function-server.signature.files.directory.path

  • **タイプ:** string

  • **デフォルト値:** ""

リモート関数のシグネチャを含む JSON ファイルが配置されているローカルファイルシステムのパス。空でない場合、Presto ネイティブワーカーは、これらの JSON ファイルから関数定義を再帰的に検索、開き、解析、および登録します。

remote-function-server.catalog-name

  • **タイプ:** string

  • **デフォルト値:** ""

Velox に登録されている関数名にプレフィックスとして追加されるカタログ名。登録される関数名のパターンは catalog.schema.function_name です。ここで、catalog はこのパラメーターで定義され、schemafunction_name は入力 JSON ファイルから読み取られます。

空の場合、関数は schema.function_name として登録されます。

remote-function-server.serde

  • **タイプ:** string

  • **デフォルト値:** "presto_page"

リモート関数サーバーと通信するときに使用するシリアル化/逆シリアル化方式。サポートされる値は、presto_page または spark_unsafe_row です。

remote-function-server.thrift.address

  • **タイプ:** string

  • **デフォルト値:** ""

remote-function-server.signature.files.directory.path を使用してリモート関数が登録されている場合、リモート関数サーバーをホストする場所(IP アドレスまたはホスト名)。指定されていない場合、ループバックインターフェース(::1)にフォールバックします。

remote-function-server.thrift.port

  • **タイプ:** integer

  • **デフォルト値:** 0

リモート関数サーバーをホストするポート。指定されておらず、リモート関数を登録しようとしている場合は、例外がスローされます。

remote-function-server.thrift.uds-path

  • **タイプ:** string

  • **デフォルト値:** ""

ローカルリモート関数サーバーと通信するための UDS (Unix ドメインソケット) パス。指定されている場合、remote-function-server.thrift.address および remote-function-server.thrift.port よりも優先されます。

JWT 認証のサポート

C++ ベースの Presto は、内部通信に JWT 認証をサポートしています。一般的にサポートされているパラメーターの詳細については、JWT を参照してください。

追加パラメーターもあります。

internal-communication.jwt.expiration-seconds

  • **タイプ** integer

  • **デフォルト値:** 300

クライアントで JWT を作成してからサーバーで検証するまでの間に時間があります。期間がこのパラメーター値以下の場合、リクエストは有効です。期間がこのパラメーター値を超える場合、リクエストは認証失敗として拒否されます (HTTP 401)。

非同期データキャッシュとプリフェッチ

connector.num-io-threads-hw-multiplier

  • double

  • デフォルト値: 1.0

  • Presto on Spark デフォルト値: 0.0

コネクタがプリロード/プリフェッチを実行するためのIO executorのサイズ。 connector.num-io-threads-hw-multiplier がゼロに設定されている場合、プリフェッチは無効になります。

async-data-cache-enabled

  • bool

  • デフォルト値: true

  • Presto on Spark デフォルト値: false

非同期データキャッシュが有効かどうか。

async-cache-ssd-gb

  • **タイプ** integer

  • **デフォルト値:** 0

非同期データキャッシュが有効な場合のSSDキャッシュのサイズ。

enable-old-task-cleanup

  • bool

  • デフォルト値: true

  • Presto on Spark デフォルト値: false

古いタスクの定期的なクリーンアップを有効にします。デフォルト値は、Presto C++ では true です。 Presto on Spark では、ゾンビタスクまたはスタックしたタスクは Spark によって投機的実行によって処理されるため、このプロパティはデフォルトで false になります。

old-task-cleanup-ms

  • **タイプ** integer

  • デフォルト値: 60000

タスクが古くなったと見なされ、クリーンアップの対象となるまでの期間。 enable-old-task-cleanuptrue の場合にのみ適用されます。古いタスクは、少なくとも old-task-cleanup-ms の間ハートビートを受信していない PrestoTask、または実行中でなく、終了時刻が old-task-cleanup-ms 以上前のものとして定義されます。

ワーカーメトリクスの収集

ユーザーは、プロパティを設定することで、ワーカーレベルのメトリクスの収集を有効にできます

runtime-metrics-collection-enabled

  • 型: boolean

  • デフォルト値: false

    trueの場合、デフォルトの動作は何もしません。このフラグを有効にする前に、事前に行う必要があるセットアップがあります。Prometheusデータ形式でのメトリクス収集を有効にするには、こちらを参照してください。

セッションプロパティ

C++ベースのPrestoのネイティブセッションプロパティを以下に示します。

driver_cpu_time_slice_limit_ms

  • **タイプ:** integer

  • デフォルト値: 1000

ネイティブ実行のみ。ドライバースレッドが他のスレッドにyieldする前に実行を許可される最大CPU時間(ミリ秒)を定義し、複数のスレッド間でのCPU使用率の公平性を促進します。

正の値は、この制限を強制し、スレッドがCPUリソースを独占しないようにします。

負の値は無効と見なされ、システムのデフォルト設定(この場合は1000ミリ秒)を使用するリクエストとして扱われます。

注:プロパティを 0 に設定すると、スレッドが無期限にyieldせずに実行できるようになります。これは、共有環境ではリソースの競合につながる可能性があるため、お勧めできません。

legacy_timestamp

  • 型: boolean

  • デフォルト値: true

ネイティブ実行のみ。従来のTIMEおよびTIMESTAMPセマンティクスを使用します。

native_aggregation_spill_memory_threshold

  • **タイプ:** integer

  • **デフォルト値:** 0

ネイティブ実行のみ。最終集計操作がディスクへのスピルを開始する前に使用できる最大メモリ(バイト単位)を指定します。0 に設定すると、制限がなくなり、集計が無制限のメモリリソースを消費できるようになり、システムのパフォーマンスに影響を与える可能性があります。

native_debug_validate_output_from_operators

  • 型: boolean

  • デフォルト値: false

true に設定すると、タスクの実行中に、すべての演算子の出力ベクトルの一貫性が検証されます。不正な形式のベクトルが障害またはクラッシュを引き起こす問題を特定するのに役立ち、演算子の出力問題のデバッグを容易にします。

注:これはコストのかかるチェックであり、デバッグの目的でのみ使用する必要があります。

native_join_spill_enabled

  • 型: boolean

  • デフォルト値: true

ネイティブ実行のみ。ネイティブエンジンでの結合スピルを有効にします。

native_join_spill_memory_threshold

  • **タイプ:** integer

  • **デフォルト値:** 0

ネイティブ実行のみ。ハッシュ結合操作がディスクへのスピルを開始する前に使用できる最大メモリ(バイト単位)を指定します。0 の値は制限がないことを示し、結合操作が無制限のメモリリソースを使用することを許可しますが、システム全体のパフォーマンスに影響を与える可能性があります。

native_join_spiller_partition_bits

  • **タイプ:** integer

  • デフォルト値: 2

ネイティブ実行のみ。ハッシュ結合およびRowNumber操作のスピルパーティション番号を計算するために使用されるビット数(N)を指定します。パーティション番号は 2 のN乗として決定され、スピルプロセス中にデータがどのようにパーティション分割されるかを定義します。

native_max_spill_file_size

  • **タイプ:** integer

  • **デフォルト値:** 0

スピルファイルの最大許容サイズをバイト単位で指定します。0 に設定すると、スピルファイルのサイズに制限がなくなり、使用可能なディスク容量に基づいてスピルファイルが必要なだけ大きくなることができます。ディスクへのスピルが必要な操作中にディスク容量の使用量を管理するには、native_max_spill_file_size を使用します。

native_max_spill_level

  • **タイプ:** integer

  • デフォルト値: 4

ネイティブ実行のみ。ハッシュ結合ビルドの最大許容スピルレベル。0 は初期スピルレベル、-1 は無制限を意味します。

native_order_by_spill_memory_threshold

  • **タイプ:** integer

  • **デフォルト値:** 0

ネイティブ実行のみ。ORDER BY 操作がデータをディスクにスピルし始める前に使用できる最大メモリ量(バイト単位)を指定します。0 に設定すると、メモリ使用量に制限がなくなり、並べ替え操作に大量のメモリが割り当てられる可能性があります。ORDER BY 操作中のメモリ使用量をより効率的に管理するには、このしきい値を使用します。

native_row_number_spill_enabled

  • 型: boolean

  • デフォルト値: true

ネイティブ実行のみ。ネイティブエンジンで行番号のスピルを有効にします。

native_simplified_expression_evaluation_enabled

  • 型: boolean

  • デフォルト値: false

ネイティブ実行のみ。式評価の簡略化されたパスを有効にします。

native_spill_compression_codec

  • **型:** varchar

  • **デフォルト値:** none

ネイティブ実行のみ。スピルされたデータを圧縮するために使用される圧縮コーデックを指定します。サポートされている圧縮コーデックは、ZLIB、SNAPPY、LZO、ZSTD、LZ4、およびGZIPです。このプロパティを none に設定すると、圧縮が無効になります。

native_spill_file_create_config

  • **型:** varchar

  • **デフォルト値:** ""

ネイティブ実行のみ。スピルファイルの作成に使用される構成パラメータを指定します。これらのパラメータは基盤となるファイルシステムに提供され、環境の要件に基づいてカスタマイズ可能なスピルファイルの作成を可能にします。これらのパラメータの形式とオプションは、基盤となるファイルシステムの機能によって決定され、ファイルの場所、サイズ制限、ファイルシステム固有の最適化などの設定が含まれる場合があります。

native_spill_write_buffer_size

  • 型: bigint

  • デフォルト値: 1048576

ネイティブ実行のみ。IO効率のためにディスクに書き込む前に、シリアル化されたスピルデータをバッファリングする最大サイズ(バイト単位)。0 に設定すると、バッファリングは無効になります。

native_topn_row_number_spill_enabled

  • 型: boolean

  • デフォルト値: true

ネイティブ実行のみ。ネイティブエンジンで topN row_number スピリングを有効にします。

native_window_spill_enabled

  • 型: boolean

  • デフォルト値: true

ネイティブ実行のみ。ネイティブエンジンでウィンドウスピリングを有効にします。

native_writer_spill_enabled

  • 型: boolean

  • デフォルト値: true

ネイティブ実行のみ。ネイティブエンジンでライタースピリングを有効にします。