Presto C++ 功能

端点

与任务相关的 HTTP 端点在 TaskResource.cpp 中注册到 Proxygen。实现的重要端点包括

  • POST: v1/task: 处理 TaskUpdateRequest

  • GET: v1/task: 返回序列化 TaskInfo(用于综合指标,可能不太频繁地报告)

  • GET: v1/task/status: 返回序列化 TaskStatus(用于查询进度跟踪,必须频繁报告)

其他 HTTP 端点包括

  • POST: v1/memory: 报告内存,但不调整分配,与 Java worker 不同

  • GET: v1/info/metrics: 返回 Prometheus 数据格式的 worker 级指标。有关更多信息,请参阅部分 Worker 指标收集。以下是此 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: 返回有关 worker 的基本信息。以下是一个示例

    {"coordinator":false,"environment":"testing","nodeVersion":{"version":"testversion"},"starting":false,"uptime":"49.00s"}
    
  • GET: v1/status: 返回内存池信息。

Presto C++ 的请求/响应流程与 Java worker 相同。任务或新拆分通过 TaskUpdateRequest 注册。资源利用率和查询进度通过任务端点发送到协调器。

远程函数执行

Presto C++ 支持对标量函数的远程执行。当函数代码不是用 C++ 编写的,或者出于安全或灵活性的原因,函数代码不能链接到与主引擎相同的可执行文件中时,此功能很有用。

远程函数签名需要使用 JSON 文件提供,该文件遵循由 JsonFileBasedFunctionNamespaceManager 实现的格式。以下属性允许配置远程函数执行

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

  • 类型: string

  • 默认值: ""

本地文件系统路径,其中包含包含远程函数签名的 JSON 文件。如果不为空,Presto 本地 worker 将递归搜索、打开、解析并从这些 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_pagespark_unsafe_row

remote-function-server.thrift.address

  • 类型: string

  • 默认值: ""

托管远程函数服务器的位置(IP 地址或主机名),如果使用 remote-function-server.signature.files.directory.path 注册了任何远程函数。如果未指定,则回退到环回接口 (::1)

remote-function-server.thrift.port

  • 类型: integer

  • 默认值: 0

托管远程函数服务器的端口。如果未指定,并且正在尝试注册远程函数,则会引发异常。

remote-function-server.thrift.uds-path

  • 类型: string

  • 默认值: ""

与本地远程函数服务器通信的 UDS(Unix 域套接字)路径。如果指定,则优先于 remote-function-server.thrift.addressremote-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 执行程序的大小。如果 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,此属性默认为 false,因为僵尸或卡住的任务由 Spark 通过推测性执行处理。

old-task-cleanup-ms

  • 类型 integer

  • 默认值: 60000

定义任务过时并符合清理条件的时间间隔。仅在 enable-old-task-cleanuptrue 时适用。过时任务是指至少 old-task-cleanup-ms 时间内未收到心跳,或未运行且结束时间早于 old-task-cleanup-ms 的 PrestoTask。

Worker 指标收集

用户可以通过设置属性来启用 Worker 级别的指标收集

runtime-metrics-collection-enabled

  • 类型: boolean

  • 默认值: false

    设置为 true 时,默认行为是无操作。在启用此标志之前,必须进行先前的设置。要以 Prometheus 数据格式启用指标收集,请参考 此处

会话属性

以下是基于 C++ 的 Presto 的原生会话属性。

driver_cpu_time_slice_limit_ms

  • 类型: integer

  • 默认值: 1000

仅限原生执行。定义驱动线程在必须让位于其他线程之前允许运行的最大 CPU 时间(毫秒),以实现跨多个线程的公平 CPU 使用率。

正值强制执行此限制,确保线程不会独占 CPU 资源。

负值被视为无效,并被视为请求使用系统默认设置,在本例中为 1000 毫秒。

注意:将属性设置为 0 允许线程无限期运行而不会让步,这在共享环境中不建议这样做,因为它会导致资源争用。

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

仅限原生执行。指定用于压缩溢出数据的压缩 CODEC。支持的压缩 CODEC 包括: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 行号溢出。

native_window_spill_enabled

  • 类型: boolean

  • 默认值: true

仅限原生执行。在原生引擎上启用窗口溢出。

native_writer_spill_enabled

  • 类型: boolean

  • 默认值: true

仅限原生执行。在原生引擎上启用写入器溢出。