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 のパフォーマンスに関する考慮事項 も考慮してください。
実行時間が最長のクエリを検索する
実行時間が最長のクエリの実行 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;
分散クエリの実行時間が最長の手順を検索する
前の手順で記録した実行 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;
実行時間が最長の手順の実行の進行状況を検索する
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;
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;
外部の 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) では、この代替戦略が機能します。
SQL Server Management Studio で、[ 実際の実行プランを含める ] (Ctrl + M) を有効にし、クエリを実行します。
[実行プラン] タブを選択します。
[ Remote Query 操作 ] を右クリックし、[ プロパティ] を選択します。
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 スケールアウト グループ」を参照してください。
グループのヘッド ノードの SQL Server に接続します。
DMV sys.dm_exec_compute_nodes (Transact-SQL) を実行し、PolyBase グループのすべてのノードを表示します。
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 のエラーと考えられる解決策」を参照してください。