PolyBase 的监视和故障排除

适用于:SQL Server

若要对 PolyBase 进行故障排除,请使用本主题中介绍的技术。

目录视图

使用此处列出的目录视图来管理 PolyBase 操作。

查看 说明
sys.external_tables (Transact-SQL) 标识外部表。
sys.external_data_sources (Transact-SQL) 标识外部数据源。
sys.external_file_formats (Transact-SQL) 标识外部文件格式。

动态管理视图

PolyBase 查询分为 sys.dm_exec_distributed_request_steps 中的一系列步骤。 下表提供了从步骤名称到关联的 DMV 的映射。

PolyBase 步骤 关联的 DMV
HadoopJobOperation sys.dm_exec_external_operations
RandomIdOperation sys.dm_exec_distributed_request_steps
HadoopRoundRobinOperation sys.dm_exec_dms_workers
StreamingReturnOperation sys.dm_exec_dms_workers
OnOperation sys.dm_exec_distributed_sql_requests

使用 DMV 监视 PolyBase 查询

使用以下 DMV 对 PolyBase 查询进行监视和故障排除。 此外还应考虑以下关于适用于 SQL Server 的 PolyBase 中的性能注意事项

  1. 查找运行时间最长的查询

    记录运行时间最长的查询的执行 ID。

     -- Find the longest running query  
    SELECT execution_id, st.text, dr.total_elapsed_time  
    FROM sys.dm_exec_distributed_requests  dr  
          cross apply sys.dm_exec_sql_text(sql_handle) st  
    ORDER BY total_elapsed_time DESC;  
    
  2. 查找分布式查询运行时间最长的步骤

    使用上一步中记录的执行 ID。 记录运行时间最长的步骤的索引。

    检查运行时间最长的步骤的 location_type

    • 头或计算:表示 SQL 操作。 继续执行步骤 3a。

      • DMS:表示 PolyBase 数据移动服务操作。 继续执行步骤 3b。
      -- Find the longest running step of the distributed query plan  
      SELECT execution_id, step_index, operation_type, distribution_type,   
      location_type, status, total_elapsed_time, command   
      FROM sys.dm_exec_distributed_request_steps   
      WHERE execution_id = 'QID4547'   
      ORDER BY total_elapsed_time DESC;  
      
  3. 查找运行时间最长的步骤的执行进度

    1. 查找 SQL 步骤的执行进度

      使用上一步中记录的执行 ID 和步骤索引。

      -- Find the execution progress of SQL step    
      SELECT execution_id, step_index, distribution_id, status,   
      total_elapsed_time, row_count, command   
      FROM sys.dm_exec_distributed_sql_requests   
      WHERE execution_id = 'QID4547' and step_index = 1;  
      
    2. 查找 DMS 步骤的执行进度

      使用上一步中记录的执行 ID 和步骤索引。

      -- Find the execution progress of DMS step    
      SELECT execution_id, step_index, dms_step_index, status,   
      type, bytes_processed, total_elapsed_time  
      FROM sys.dm_exec_dms_workers   
      WHERE execution_id = 'QID4547'   
      ORDER BY total_elapsed_time DESC;
      
  4. 查找有关外部 DMS 操作的详细信息

    使用上一步中记录的执行 ID 和步骤索引。

    SELECT execution_id, step_index, dms_step_index, compute_node_id,   
    type, input_name, length, total_elapsed_time, status   
    FROM sys.dm_exec_external_work   
    WHERE execution_id = 'QID4547' and step_index = 7   
    ORDER BY total_elapsed_time DESC;  
    

查看 PolyBase 查询计划

在 SQL Server 2019 (15.x) 中,可使用跟踪标志 6408 查看传递到外部数据源的执行计划。 有关详细信息,请参阅如何判断是否发生了外部下推

在 SQL Server 2016 (13.x) 或 SQL Server 2017 (14.x) 中,可采用下面的替代策略:

  1. 在 SQL Server Management Studio 中,启用“包含实际的执行计划”(Ctrl+M),并运行查询。

  2. 选择“执行计划”选项卡。

    Screenshot from SQL Server Management Studio of a PolyBase query execution plan.

  3. 右键单击“远程查询运算符”,然后选择“属性”

  4. 将“远程查询”值复制并粘贴到文本编辑器中,以查看 XML 远程查询计划。 下面显示了一个示例。

sql_operation 标记指示 SQL Server 内的操作。 如果 dsql_operationsoperation_types 不是“ON”,则表示这是 PolyBase 数据移动服务使用的外部操作符。

<dsql_query number_nodes="1" number_distributions="8" number_distributions_per_node="8">  
   <sql>ExecuteMemo explain query</sql>  
   <dsql_operations total_cost="0" total_number_operations="6">  
     <dsql_operation operation_type="RND_ID">  
       <identifier>TEMP_ID_74</identifier>  
     </dsql_operation>  
     <dsql_operation operation_type="ON">  
       <location permanent="false" distribution="AllDistributions" />  
       <sql_operations>  
         <sql_operation type="statement">CREATE TABLE [tempdb].[dbo].[TEMP_ID_74] ([SensorKey] INT NOT NULL, [CustomerKey] INT NOT NULL, [GeographyKey] INT, [Speed] FLOAT(53) NOT NULL, [YearMeasured] INT NOT NULL ) WITH(DATA_COMPRESSION=PAGE);</sql_operation>  
       </sql_operations>  
     </dsql_operation>  
     <dsql_operation operation_type="ON">  
       <location permanent="false" distribution="AllDistributions" />  
       <sql_operations>  
         <sql_operation type="statement">EXEC [tempdb].[sys].[sp_addextendedproperty] @name=N'IS_EXTERNAL_STREAMING_TABLE', @value=N'true', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'TEMP_ID_74'</sql_operation>  
       </sql_operations>  
     </dsql_operation>  
     <dsql_operation operation_type="ON">  
       <location permanent="false" distribution="AllDistributions" />  
       <sql_operations>  
         <sql_operation type="statement">UPDATE STATISTICS [tempdb].[dbo].[TEMP_ID_74] WITH ROWCOUNT = 2401, PAGECOUNT = 7</sql_operation>  
       </sql_operations>  
     </dsql_operation>  
     <dsql_operation operation_type="MULTI">  
       <dsql_operation operation_type="STREAMING_RETURN">  
         <operation_cost cost="1" accumulative_cost="1" average_rowsize="24" output_rows="5762.1" />  
         <location distribution="AllDistributions" />  
         <select>SELECT [T1_1].[SensorKey] AS [SensorKey],  
          [T1_1].[CustomerKey] AS [CustomerKey],  
          [T1_1].[GeographyKey] AS [GeographyKey],  
          [T1_1].[Speed] AS [Speed],  
          [T1_1].[YearMeasured] AS [YearMeasured]  
   FROM   (SELECT [T2_1].[SensorKey] AS [SensorKey],  
                  [T2_1].[CustomerKey] AS [CustomerKey],  
                  [T2_1].[GeographyKey] AS [GeographyKey],  
                  [T2_1].[Speed] AS [Speed],  
                  [T2_1].[YearMeasured] AS [YearMeasured]  
           FROM   [tempdb].[dbo].[TEMP_ID_74] AS T2_1  
           WHERE  ([T2_1].[Speed] > CAST (6.50000000000000000E+001 AS FLOAT))) AS T1_1</select>  
       </dsql_operation>  
       <dsql_operation operation_type="ExternalRoundRobinMove">  
         <operation_cost cost="16.594848" accumulative_cost="17.594848" average_rowsize="24" output_rows="19207" />  
         <external_uri>hdfs://<ip address>:8020/Demo/car_sensordata.tbl/</external_uri>  
         <destination_table>[TEMP_ID_74]</destination_table>  
       </dsql_operation>  
     </dsql_operation>  
     <dsql_operation operation_type="ON">  
       <location permanent="false" distribution="AllDistributions" />  
       <sql_operations>  
         <sql_operation type="statement">DROP TABLE [tempdb].[dbo].[TEMP_ID_74]</sql_operation>  
       </sql_operations>  
     </dsql_operation>  
   </dsql_operations>  
</dsql_query>  

监视 PolyBase 组中的节点

在将一组计算机配置为 PolyBase 扩展组的一部分后,便可以监视计算机的状态。 有关创建横向扩展组的详细信息,请参阅 PolyBase 横向扩展组

  1. 连接到组的头节点上的 SQL Server。

  2. 运行 DMV sys.dm_exec_compute_nodes (Transact-SQL) 以查看 PolyBase 组中的所有节点。

  3. 运行 DMV sys.dm_exec_compute_node_status (Transact-SQL) 以查看 PolyBase 组中所有节点的状态。

Hadoop 名称节点高可用性

当前 PolyBase 未通过接口连接到名称节点 HA 服务(如 Zookeeper 或 Knox)。 但是,有一个经过验证的解决方法可用于提供此功能。

解决方法:使用 DNS 名称重新路由与活动的名称节点的连接。 为完成此操作,需要确定外部数据源正在使用 DNS 名称与名称节点通信。 发生名称节点故障转移时,需要更改与外部数据源定义中使用的 DNS 名称相关联的 IP 地址。 此操作将所有新的连接重新路由到正确的名称节点。 故障转移发生时,现有连接将会失败。 若要自动化此过程,“检测信号”可以 ping 活动的名称节点。 如果检测信号失败,可以认为发生了故障转移,并且自动切换到辅助副本 IP 地址。

日志文件位置

在 Windows 服务器中,日志的默认位置为安装目录路径:c:\Program Files\Microsoft SQL Server\MSSQLnn.InstanceName\MSSQL\Log\PolyBase\

在 Linux 服务器中,日志的默认位置为 /var/opt/mssql/log/polybase

PolyBase 数据移动日志文件:

  • <INSTANCENAME>_<SERVERNAME>_Dms_errors.log
  • <INSTANCENAME>_<SERVERNAME>_Dms_movement.log

PolyBase 引擎服务日志文件:

  • <INSTANCENAME>_<SERVERNAME>_DWEngine_errors.log
  • <INSTANCENAME>_<SERVERNAME>_DWEngine_movement.log
  • <INSTANCENAME>_<SERVERNAME>_DWEngine_server.log

在 Windows 中,PolyBase Java 日志文件:

  • <SERVERNAME> Dms polybase.log
  • <SERVERNAME>_DWEngine_polybase.log

在 Linux 中,PolyBase Java 日志文件:

  • /var/opt/mssql-extensibility/hdfs_bridge/log/hdfs_bridge_pdw.log
  • /var/opt/mssql-extensibility/hdfs_bridge/log/hdfs_bridge_dms.log

错误消息和可能的解决方案

有关常见的故障排除方案,请参阅 PolyBase 错误和可能的解决方案