View a markdown version of this page

了解经过编辑的日志 - AWS Clean Rooms

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

了解经过编辑的日志

AWS Clean Rooms 在导出 Spark 日志之前对其进行编辑,这样导出的日志就不会泄露成员数据的内容,也不会识别源数据的表和存储位置。 AWS Clean Rooms 重构日志记录并仅发出已知可以安全共享的字段。一些信息是故意保留的,包括查询读取的列的名称。

编辑不区分成员。期望按照与其他成员信息相同的条款,从您为自己的查询导出的日志中删除自己的表名和查询值。空字段和占位符字段是正常的,并不表示导出有问题。

导出的日志包含什么

导出的日志保留了诊断故障和性能问题所需的信息:

  • 时间 — 任务和阶段持续时间、运行时间、CPU 时间、垃圾收集时间、反序列化和结果序列化时间、洗牌等待时间以及随机写入时间都被精确保留。时机是性能分析的主要信号。

  • Spark 执行标识符和计数 — 作业、阶段、任务和尝试 ID、分区计数、任务计数、执行者 ID、主机名和端口。

  • 查询计划结构 -物理计划树,包括HashAggregateSortMergeJoin、和等操作员名称Exchange,因此您可以查看计划的形状以及引擎选择如何执行查询。不是 Spark 自己的操作员名称显示为[REDACTED]。

  • 源列名称 -来自正在扫描的表的列名,因此您可以查看筛选器、联接和聚合中使用了哪些列。查询创建的名称(例如别名)不会被保留。有关更多信息,请参阅 如何处理列名和表名。

  • 扫描类型和文件格式 — 扫描操作员通常包括正在读取的表格的名称。该名称将替换为仅识别扫描类型和文件格式的表单,例如Scan parquet,因此您仍然可以知道如何读取数据。如果文件格式无法 AWS Clean Rooms 识别,则运算符将显示为Scan没有格式。

  • 错误类别 -当查询失败时,日志会识别错误的种类,但不会识别导致错误的数据。它们报告 Spark 的错误类别、其 SQLSTATE 代码以及 Spark 为该类定义的标准消息,但消息的<placeholder>令牌未填充,因为填充它们的值来自数据。例如,失败的转换报告[CAST_INVALID_INPUT]和一条消息,描述一种类型的值如果不显示该值就无法转换为另一种类型。当一个故障导致另一个故障时,链中的错误类别会一起报告,最多几个级别。并非源于 Spark 的故障仅报告为非 Spark 错误,没有类别。

    单个任务失败仅报告失败的种类,例如ExceptionFailure。他们没有自己的错误类别。

  • Spark 配置 — 其值始终为数字、大小或固定关键字且最常用于诊断性能问题的设置:驱动程序和执行器内核和内存、内存分数和堆外设置、动态分配设置、自适应查询执行设置、默认并行度和随机分区数、广播加入阈值、最大分区大小、随机压缩设置、调度器模式和序列化器。大多数其他配置都已删除,因为设置可能包含路径、标识符和查询文本。如果其值不是普通数字、大小或关键字,则其中一个设置也会被省略。

  • 内存利用率和数据量 — 峰值执行内存、内存和磁盘溢出、执行器 JVM 内存、缓存数据大小、洗牌块数以及读取和写入的字节数和记录数,包括随机读写量。这些数字是向下舍入的,而不是精确的。有关更多信息,请参阅 编辑后的日志与标准 Spark 日志有何不同。

  • 为什么执行器停止 — 每个停止的执行程序的类别,例如内存不足、被驱动程序关闭、停用或无法响应。这通常是解释查询失败原因的最快方法。这些日志还记录了 Spark 停止调度工作的所有执行器或主机,这在失败在一个地方反复出现时很有用。有关更多信息,请参阅 编辑后的日志与标准 Spark 日志有何不同。

  • 随机提取失败详情 — 当任务无法获取 shuffle 输出时,保留 shuffle、map、map 索引和 reduce 标识符,以及尝试提取的执行者和主机。这使您可以区分针对单一来源的重复故障(通常表示执行者没有响应)和分布在多个来源的故障(通常表示暂时的网络问题)。

编辑了什么

  • 数据值 -来自查询的文字值和来自任何表的数据值。过滤器谓词显示筛选了哪一列,但不显示与之比较的值。

  • 表名和存储位置 — 表标识符、数据库名称和 Amazon S3 路径。

  • 查询文本 -SQL 语句和与查询相关的任何描述。

  • 错误消息文本和堆栈跟踪 -由于错误消息可以引用导致错误的值,因此删除了消息文本和堆栈跟踪。底层异常类的名称也会被删除,因为用户定义函数引发的异常带有查询作者选择的名称。改为保留 Spark 错误类,用于查询和作业。还删除了阶段失败的原因和任务被终止的原因。

  • Spark 为自己的工作记录的名称 — 阶段和缓存数据集的名称和调用站点,以及应用程序名称。这些是自由文本字段,可以回显表名或存储路径。因此,在 Spark History Server 中,阶段显示时没有通常可以识别它们的描述,而您可以改为按阶段的 ID 及其在计划中的位置来定位阶段。

  • 计算列名和别名列名 -查询创建的而不是从表中读取的名称,因为查询引擎从表达式中生成这样的名称,并且该名称可以包含一个值。它们以数字标识符的形式出现,例如#42。有关更多信息,请参阅 如何处理列名和表名。

  • 扫描详情 — 读取架构、每次扫描时应用的过滤器谓词(向下推式筛选器、分区筛选器和数据筛选器)以及数据位置。

  • 驱动程序和执行器日志的链接 — Spark 为每个执行者和驱动程序记录的日志 URL。在 Spark 历史服务器中,通常会打开驱动程序或执行器日志的链接并未填充。

  • 资源标识符和服务终端节点 — AWS 账户 ID、ARN(例如 IAM 角色和 AWS KMS 密钥的 ARN)以及为运行您的查询而 AWS Clean Rooms 调用的服务的终端节点 URL。

  • AWS 服务详细信息 — AWS Clean Rooms 类名、类路径条目、JVM 配置以及 Hadoop 和系统属性。除了Spark History Server为了将任务与其所属的查询执行关联所需的标识符外,还会对作业属性进行编辑。

如何处理列名和表名

导出的日志保留查询读取的列的名称。查询中创建的表名和列别名会被删除。查询创建的名称由其命名的表达式生成,生成的名称可以包含查询中的值:SELECT 'confidential'生成一个名为的列confidential。因此,只有当名称可以追溯到扫描表中的一列时才会出现。所有其他名称都替换为数字标识符。

例如,请考虑以下查询。

SELECT user_id, SUM(amount) AS total FROM sales WHERE region = 'us-west' GROUP BY user_id

导出的日志表示如下。

查询的元素 在导出的日志中
列user_idamount、和 region 按名称显示,这样您就可以看到查询的分组、汇总和和筛选依据
表sales、其数据库及其存储位置 不存在
价值 'us-west' 替换为 [REDACTED]
别名 total 替换为数字标识符,因为查询创建了名称,而不是从表中读取名称

编辑后的日志与标准 Spark 日志有何不同

行数和数据量是近似值

记录数、字节量、溢出大小和峰值内存测量值向下舍入到一个数量级,因为精确的计数可以揭示另一个成员的数据的大小。读取 1,342 条记录的任务会报告 1,000 条记录。低于 100 的测量值报告为 0。

由于每个数字都是向下舍入,因此报告 100 的任务和报告 1,000 的任务读取的记录数可能几乎相同。谨慎对待仅相差一个数量级的数字;较大的差异,例如 1,000 与 10,000,000,仍然可靠地表明存在偏差。

编辑后的值采用多种形式

在查询计划中,编辑后的值以文字文本的形式出现。[REDACTED]相反,在日志的其他地方,编辑后的字段通常为空。它可能是空字符串、空列表或完全不存在的值,因此 Spark History Server 仍然可以读取该记录。两种形式的含义相同。

查询计划不使用熟悉的运算符语法

计划中的表达式以函数调用形式编写,而不是用数学表示法编写。比较显示为EqualTo(#12, [REDACTED])而不是(a = 5)。函数名称也以这种形式出现,用户定义的函数名称根本不出现。

仅包括物理计划

导出的日志包含物理计划。它们不包含通常附带的经过解析、分析或优化的逻辑计划。

Per-task 指标已编辑

计划图列出了每个操作员报告的指标,例如输出行数。单个任务报告的指标根本没有显示任何价值,因为这些指标背后的每项任务数据已被删除。对于任务级别数字,请改用舞台视图中的每项任务指标。

Spark 驱动程序指标向下舍入

Spark 在驱动程序上计算的指标,包括广播、扫描和写入的指标,确实会报告一个值,但它被四舍五入到一个数量级,其原因与记录数量和数据量相同:精确的数字可以揭示其他成员的数据规模。

仅导出事件日志

导出包含 Spark 事件日志。它不包含 Spark 在它旁边写入的自由格式驱动程序和执行器输出,因为该输出的单行可以包含表名、存储路径或数据值。必须从事件日志中进行诊断。

执行器失败显示通用错误消息

由于执行程序停止的自由形式原因可能包含 AWS Clean Rooms 服务详细信息,因此日志会报告一般错误消息,例如内存不足退出、驱动程序启动的关闭、执行器停用或进程丢失。此记录特定于 Spark 事件 AWS Clean Rooms ,不是标准的 Spark 事件,因此 Spark 历史服务器和其他工具可能不会显示它。如果看不到,可以在导出的事件日志文件中找到它。

默认情况下,无法识别的记录会被编辑

如果日志记录无法 AWS Clean Rooms 识别,则其所有文本都将替换为[REDACTED],包括其字段名称,并且其所有数字都替换为零。仅保留记录类型。这样的记录没有诊断信息。