Monitorare e risolvere i problemi relativi a PolyBase

Si applica a:SQL Server

Per risolvere i problemi relativi a PolyBase, usare le tecniche illustrate in questo argomento.

Viste del catalogo

Usare le viste del catalogo elencate di seguito per gestire le operazioni di PolyBase.

Visualizza Descrizione
sys.external_tables (Transact-SQL) Identifica le tabelle esterne.
sys.external_data_sources (Transact-SQL) Identifica le origini dati esterne.
sys.external_file_formats (Transact-SQL) Identifica i formati di file esterni.

DMV

Le query PolyBase vengono suddivise in una serie di passaggi all'interno di sys.dm_exec_distributed_request_steps. Nella tabella seguente è illustrato il mapping tra il nome del passaggio per la vista a gestione dinamica associata.

Passaggio PolyBase Vista a gestione dinamica associata
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

Monitorare le query di PolyBase con DMV

Per eseguire il monitoraggio e risolvere i problemi relativi alle query di PolyBase, usare le viste DMV seguenti. Considerare anche le considerazioni sulle prestazioni seguenti in PolyBase per SQL Server.

  1. Individuare le query con il tempo di esecuzione più lungo

    Prendere nota dell'ID esecuzione della query con il tempo di esecuzione più lungo.

     -- 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. Individuare il passaggio della query distribuita con il tempo di esecuzione più lungo

    Usare l'ID esecuzione annotato nel passaggio precedente. Prendere nota dell'indice del passaggio con il tempo di esecuzione più lungo.

    Verificare il valore di location_type per il passaggio con il tempo di esecuzione più lungo:

    • Head o Compute: implica un'operazione SQL. Procedere con il passaggio 3a.

      • DMS: implica un'operazione di PolyBase Data Movement Service. Procedere con il passaggio 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. Individuare lo stato di esecuzione del processo con tempo di esecuzione più lungo

    1. Individuare lo stato di esecuzione di un passaggio SQL

      Usare l'ID esecuzione e l'indice passaggio annotati nei passaggi precedenti.

      -- 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. Individuare lo stato di esecuzione di un passaggio DMS

      Usare l'ID esecuzione e l'indice passaggio annotati nei passaggi precedenti.

      -- 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. Individuare le informazioni su operazioni DMS esterne

    Usare l'ID esecuzione e l'indice passaggio annotati nei passaggi precedenti.

    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;  
    

Visualizzare il piano di query di PolyBase

In SQL Server 2019 (15.x) è possibile visualizzare il piano di esecuzione passato all'origine dati esterna usando il flag di traccia 6408. Per altre informazioni, vedere Come stabilire se si è verificato un pushdown esterno.

In SQL Server 2016 (13.x) o SQL Server 2017 (14.x), questa strategia alternativa funziona:

  1. In SQL Server Management Studio, abilitare Includi piano di esecuzione effettivo (CTRL+M) ed eseguire la query.

  2. Selezionare la scheda Piano di esecuzione.

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

  3. Fare clic con il pulsante destro del mouse sull' operatore Remote Query e selezionare Proprietà.

  4. Copiare e incollare il valore di Remote Query in un editor di testo per visualizzare il piano di query remota XML. Di seguito è illustrato un esempio.

I tag sql_operation indicano operazioni all'interno di SQL Server. dsql_operations con operation_types che non sono "ON" indicano gli operatori esterni usati dal servizio PolyBase Data Movement.

<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>  

Monitorare i nodi in un gruppo PolyBase

Dopo aver configurato un set di computer come appartenenti al gruppo con scalabilità orizzontale PolyBase, è possibile eseguire il monitoraggio dello stato dei computer. Per informazioni dettagliate sulla creazione di un gruppo con scalabilità orizzontale, vedere Gruppi con scalabilità orizzontale di PolyBase.

  1. Connettersi a SQL Server sul nodo head di un gruppo.

  2. Eseguire DMV sys.dm_exec_compute_nodes (Transact-SQL) per visualizzare tutti i nodi del gruppo PolyBase.

  3. Eseguire DMV sys.dm_exec_compute_node_status (Transact-SQL) per visualizzare lo stato di tutti i nodi del gruppo PolyBase.

Disponibilità elevata del nodo del nome Hadoop

PolyBase non interagisce con i servizi Name Node HA come Zookeeper o Knox. Tuttavia, esiste una soluzione alternativa comprovata che può essere usata per realizzare la funzionalità.

Soluzione alternativa: utilizzare il nome DNS per reindirizzare le connessioni al Name Node attivo. A questo scopo, è necessario assicurarsi che l'origine dati esterna utilizzi un nome DNS per comunicare con il Name Node. Quando si verifica un failover del Name Node, è necessario modificare l'indirizzo IP associato al nome DNS utilizzato nella definizione dell'origine dati esterna. Ciò reindirizza tutte le nuove connessioni al Name Node corretto. Le connessioni esistenti avranno esito negativo quando si verifica il failover. Per automatizzare questo processo, un "heartbeat" può eseguire il ping del Name Node attivo. Se si verifica un errore di heartbeat, si può presupporre che si sia verificato un failover e si può passare automaticamente all'indirizzo IP secondario.

Percorsi dei file di registro

Nei server Windows, i log si trovano nel percorso della directory di installazione, per impostazione predefinita: c:\Program Files\Microsoft SQL Server\MSSQLnn.InstanceName\MSSQL\Log\PolyBase\.

Nei server Linux, i log si trovano per impostazione predefinita in /var/opt/mssql/log/polybase.

File di log di PolyBase Data Movement:

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

File di log del servizio del motore PolyBase:

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

In Windows, file di log Java PolyBase:

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

In Linux, file di log Java PolyBase:

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

Messaggi di errore e possibili soluzioni

Per suggerimenti comuni sulla risoluzione dei problemi, vedere Errori di PolyBase e possibili soluzioni