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 のクエリを監視する

PolyBase のクエリを監視およびトラブルシューティングするには、次の DMV を使用します。 また、次の 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 を確認します。

    • Head または Compute: 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. [ Remote Query 操作 ] を右クリックし、[ プロパティ] を選択します。

  4. Remote Query の値をコピーし、テキスト エディターに貼り付け、XML リモート クエリ プランを表示します。 例として以下に表示します。

sql_operation タグは、SQL Server 内の操作を示します。 dsql_operations が "ON" ではない operation_types は、PolyBase Data Movement Service によって使用される外部の演算子を示します。

<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 は現在、Zookeeper や Knox などの Name Node HA サービスとやり取りしません。 ただし、この機能を提供するための実績のある回避策を使用できます。

回避策: DNS 名を使用して、アクティブな Name Node への接続を再ルーティングします。 これを行うためには、外部データ ソースが DNS 名を使用して Name Node と通信していることを確認する必要があります。 Name Node のフェールオーバーが発生したときには、外部データ ソースの定義で使用される DNS 名に関連付けられている IP アドレスを変更する必要があります。 これには、すべての新しい接続を適切な Name Node に再ルーティングします。 フェールオーバーが発生したときに、既存の接続は失敗します。 このプロセスを自動化するために、"ハートビート" が、アクティブな Name Node の 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 のエラーと考えられる解決策」を参照してください。