Errori di PolyBase e possibili soluzioni

Si applica a:SQL Server

Questo articolo contiene scenari di errore e soluzioni comuni per PolyBase.

Per ulteriori informazioni sul monitoraggio e sulla risoluzione dei problemi di PolyBase, consultare Monitorare e risolvere i problemi di PolyBase.

Per i percorsi comuni dei file di resoconto di PolyBase in Windows e Linux, consultare Monitorare e risolvere i problemi di PolyBase.

Messaggi di errore e possibili soluzioni

Aggiornamento di SQL Server 2022 non riuscito a causa del nome di una colonna non valido (distinzione tra maiuscole e minuscole)

Questo errore può verificarsi quando si effettua l'installazione degli aggiornamenti cumulativi di SQL Server in un server con la funzionalità PolyBase installata. Usando regole di confronto con distinzione tra maiuscole e minuscole, il messaggio di aggiornamento dell'errore segnalato è il seguente:

Messaggio di errore di esempio: Error: 912, Severity: 21, State: 2. Script level upgrade for database 'master' failed because upgrade step 'polybase_database_upgrade.sql' encountered error 200, state 7, severity 25. This is a serious error condition which might interfere with regular operation and the database will be taken offline. If the error happened during upgrade of the 'master' database, it will prevent the entire SQL Server instance from starting. Examine the previous errorlog entries for errors, take the appropriate corrective actions and re-start the database so that the script upgrade steps run to completion.

Motivo:

Durante la procedura di aggiornamento lo script di SQL Server ha esito negativo a causa di valori con distinzione tra maiuscole e minuscole.

Soluzione: questo problema verrà risolto in modo permanente nell'aggiornamento cumulativo successivo.

Soluzione alternativa:

  1. Abilitare i flag di traccia 902.
  2. Avviare SQL Server.
  3. Modificare le regole di confronto del database 'DWConfiguration' da CS (con distinzione tra maiuscole e minuscole) a CI (senza distinzione tra maiuscole e minuscole).
  4. Eseguire di nuovo l'aggiornamento.
  5. Disabilitare il flag di traccia 902.
  6. Riavviare SQL Server.
  7. Modificare le regole di confronto del database 'DWConfiguration', da CI (senza distinzione tra maiuscole e minuscole) a CS (con distinzione tra maiuscole e minuscole).

In alternativa ai flag di traccia, per evitare che il problema si verifichi prima di un aggiornamento cumulativo, verificare se il database "DWConfiguration" usa regole di confronto con distinzione tra maiuscole e minuscole. Prendere in considerazione la possibilità di modificarlo in base alle regole di confronto senza distinzione tra maiuscole e minuscole (CI), applicare l'aggiornamento cumulativo, riportarlo all'originale.

Errore: "100001; Impossibile generare il piano di query"

L'errore "Impossibile generare il piano di query" può verificarsi quando al motore di database di SQL Server sono state applicate delle patch almeno fino all'aggiornamento cumulativo 8 (15.0.4073), ma la funzionalità PolyBase non è stata aggiornata alla stessa build. Ciò può avvenire quando si aggiunge la funzionalità PolyBase a un'istanza di SQL Server esistente. Per ulteriori informazioni, vedere Errore di PolyBase - 100001; Impossibile generare il piano di query.

Eseguire sempre l'installazione della funzionalità PolyBase portandola allo stesso livello di versione. Installare Service Pack (SP), aggiornamenti cumulativi e/o versioni di distribuzione generale in base alle esigenze. Per determinare la versione di PolyBase, vedere Determinare la versione, l'edizione e il livello di aggiornamento di SQL Server e dei relativi componenti.

Modifica dell'account del servizio

Messaggio di errore di esempio:

107035;L'autorizzazione Dms non è riuscita perché [DOMAIN\user] non è membro del gruppo [PdwDataMovementAccess]
107017;Intestazione del controllo DMS non valida:

questo errore è probabilmente dovuto alla modifica dell'account del servizio PolyBase. Per modificare gli account del servizio per il motore PolyBase e PolyBase Data Movement Service, disinstallare e reinstallare la funzionalità PolyBase.

Errori di autorizzazioni del servizio di spostamento dati

Per altre informazioni sulla risoluzione dei problemi relativi alle autorizzazioni con il servizio di spostamento dati, vedere Autorizzazioni dell'account del servizio PolyBase ed errori comuni rilevati quando mancano.

Errore di autenticazione di Windows

Per altre informazioni sulla risoluzione dei problemi relativi alle autorizzazioni legate alla mancata autenticazione di Windows, vedere Autorizzazioni dell'account del servizio PolyBase ed errori comuni rilevati quando mancano.

Impossibile eseguire la query "Remote Query"

Messaggio di errore di esempio:

messaggio 7320, livello 16, stato 110, riga 14
Impossibile eseguire la query "Remote Query" sul provider OLE DB "SQLNCLI11" per il server collegato "(null)". Query interrotta: è stata raggiunta la soglia massima di rifiuto (0 righe) nella lettura da un'origine esterna: 1 righe rifiutate per un totale di 1 righe elaborate. (/nation/sensors.ldjson.txt)Ordinale di colonna: 0, tipo di dati previsto: INT, Valore offensivo: {"id":"S2740036465E2B","time":"2016-02-26T16:59:02.9300000Z","temp":23.3,"hum":0.77,"wind":17,"press":1032,"loc":[-76.90914996169623,38.8929314364726]} (Errore di conversione colonna), Errore: Errore di conversione del tipo di dati NVARCHAR in INT.

Tenere presente che potrebbero esserci derivazioni di questo errore. Il nome del primo file rifiutato viene visualizzato in SQL Server Management Studio (SSMS) con tipi di dati o valori errati.

Possibile motivo:
il motivo per cui questo errore si verifica è dovuto al fatto che ogni file ha uno schema diverso. Il DDL della tabella esterna PolyBase quando punta a una directory legge in modo ricorsivo tutti i file in quella directory. Quando si verifica una mancata corrispondenza di una colonna o di un tipo di dati, questo errore potrebbe essere visualizzato in SSMS.

Possibile soluzione:
se i dati per ogni tabella sono costituiti da un file, usare il nome file nella sezione LOCATION preceduto dalla directory dei file esterni. Se sono presenti più file per tabella, inserire ogni insieme di file in directory diverse in Archiviazione BLOB di Azure. Puntare LOCATION alla directory anziché a un file specifico. Questa soluzione è consigliata.

Esempio:

Create External Table foo
(col1 int)WITH (LOCATION='/bar/foobar.txt',DATA_SOURCE…); OR
Create External Table foo
(col1 int) WITH (LOCATION = '/bar/', DATA_SOURCE…);

Nota

SQL Server Native Client (spesso abbreviato SNAC) è stato rimosso da SQL Server 2022 (16.x) e da SQL Server Management Studio 19 (SSMS). SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider Microsoft OLE DB legacy per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni. Passare al nuovo Microsoft OLE DB Driver (MSOLEDBSQL) per SQL Server o alla versione più recente di Microsoft ODBC Driver for SQL Server. Per SQLNCLI fornito come componente del motore di database di SQL Server (versioni da 2012 a 2019), vedere questa eccezione relativa al ciclo di vita del supporto.

Supporto per Kerberos

SQL Server è configurato per accedere a un cluster Hadoop supportato. La sicurezza Kerberos non viene applicata nel cluster Hadoop.

Se si seleziona da una tabella esterna, viene restituito l'errore seguente:

messaggio 105019, livello 16, stato 1, riga 55
Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_Connessione: Errore [Impossibile creare un'istanza di LoginClass] durante l'accesso al file esterno.”
messaggio 7320, livello 16, stato 110, riga 55
Impossibile eseguire la query "Remote Query" sul provider OLE DB "SQLNCLI11" per il server collegato "(null)". Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_Connessione: Errore [Impossibile creare un'istanza di LoginClass] durante l'accesso al file esterno.”

L'interrogazione del log del server DWEngine mostra l'errore seguente:

[Thread:16432] [EngineInstrumentation:EngineQueryErrorEvent] (Errore, Alto):
Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_Connessione: Errore [com.microsoft.polybase.client.KerberosSecureLogin] durante l'accesso al file esterno.” Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_Connessione: Errore [Impossibile creare un'istanza di LoginClass] durante l'accesso al file esterno.” ---> Microsoft.SqlServer.DataWarehouse.DataMovement.Common.ExternalAccess.HdfsAccessException: Eccezione Java generata alla chiamata a HdfsBridge_Connect: Errore [com.microsoft.polybase.client.KerberosSecureLogin] durante l'accesso al file esterno.

Possibile motivo:
Kerberos non è abilitato nel cluster Hadoop, ma la sicurezza Kerberos è abilitata in core-site.xml, yarn-site.xml o il hdfs-site.xml che si trova per impostazione predefinita in Programmi\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf. In Linux, i file si trovano per impostazione predefinita in /var/opt/mssql/binn/polybase/hadoop/conf/.

Possibile soluzione:
impostare come commento le informazioni di sicurezza Kerberos dai file indicati in precedenza.

Per altre informazioni sulla risoluzione dei problemi relativi a PolyBase e Kerberos, vedere Risolvere i problemi di connettività di Kerberos e PolyBase.

Errore interno di Query Processor

L'esecuzione di query su una tabella esterna restituisce l'errore seguente:

messaggio 8680, livello 17, stato 5, riga 118
Errore interno di Query Processor: errore imprevisto durante l'elaborazione di una fase di query remota.

Il log del server DWEngine contiene i messaggi seguenti:

[Thread:5216] [ControlNodeMessenger:ErrorEvent] (Errore, Alto): ***** il sistema del Servizio Migrazione del database ha nodi disconnessi:
[Thread:5216] [ControlNodeMessenger:ErrorEvent] (Errore, Alto): ***** il sistema del Servizio Migrazione del database ha nodi disconnessi:
[Thread:5216] [ControlNodeMessenger:ErrorEvent] (Errore, Alto): ***** il sistema del Servizio Migrazione del database ha nodi disconnessi:

Possibile motivo:
Il motivo di questo errore potrebbe essere che SQL Server non è stato riavviato dopo la configurazione di PolyBase.

Possibile soluzione:
Riavviare SQL Server. Controllare Il log del server DWEngine per verificare che non siano presenti disconnessioni del Servizio Migrazione del database dopo il riavvio.

Utente necessario per l'accesso HDFS

Scenario:
SQL Server è connesso a un cluster Hadoop non protetto (Kerberos non è abilitato). PolyBase è configurato per eseguire il push del calcolo nel cluster Hadoop.

Query di esempio:

select count(*) from foo WITH (FORCE EXTERNALPUSHDOWN);

Viene restituito un messaggio di errore simile al seguente:

messaggio 105019, livello 16, stato 1, riga 1
Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a JobSubmitter_PollJobStatus: Errore [java.net.ConnessioneEccezione: chiamata da big1506sql2016/172.16.1.4 a 0.0.0.0:10020 non riuscita per l'eccezione di connessione: java.net ConnectException: Connessione rifiutata: nessuna informazione ulteriore; Per altre informazioni, vedere: http://wiki.apache.org/hadoop/ConnectionRefused] si è verificato durante l'accesso al file esterno."
Il provider OLE DB "SQLNCLI11" per il server collegato "(null)" ha restituito il messaggio "Errore non specificato".
Messaggio 7421, livello 16, stato 2, riga 1
Impossibile recuperare il set di righe dal provider OLE DB "SQLNCLI11" per il server collegato "(null)". .

Errore del log di Hadoop Yarn:

Installazione del lavoro non riuscita: org.apache.hadoop.security.AccessControlException: Autorizzazione negata: user=pdw_user, access=WRITE, inode="/user":hdfs:hdfs:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:265) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:251) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:232) org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:176) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5525)

Possibile motivo:
con Kerberos disabilitato, PolyBase userà pdw_user come utente per accedere a HDFS e inviare processi MapReduce.

Possibile soluzione:
creare pdw_user in Hadoop e concedere autorizzazioni sufficienti alle directory usate durante l'elaborazione mapreduce. Assicurarsi anche che pdw_user sia il proprietario della directory /user/pdw_user HDFS.

Di seguito è riportato un esempio di come creare la home directory e assegnare le autorizzazioni per pdw_user:

sudo -u hdfs hadoop fs -mkdir /user/pdw_user
sudo -u hdfs hadoop fs -chown pdw_user /user/pdw_user

Quindi, verificare che pdw_user abbia autorizzazioni di lettura, scrittura ed esecuzione nella directory /user/pdw_user. Assicurarsi che la directory /tmp disponga delle autorizzazioni 777.

Per altre informazioni sulla risoluzione dei problemi relativi a PolyBase e Kerberos, vedere Risolvere i problemi di connettività di Kerberos e PolyBase.

Errore di memoria Java dovuto a UTF-8

Scenario:
PolyBase di SQL Server è configurato con cluster Hadoop o Archiviazione BLOB di Azure. Qualsiasi query ha esito negativo con l'errore seguente:

messaggio 106000, livello 16, stato 1, riga 1
Spazio dell'heap di Java

Possibile motivo:
l'input non valido può causare l'errore java memoria insufficiente. Il file potrebbe non essere in formato UTF-8. Il Servizio Migrazione del database tenta di leggere l'intero file come una riga perché non è in grado di decodificare il delimitatore di riga e si verifica un errore di spazio heap Java.

Possibile soluzione:
convertire il file in formato UTF-8 perché PolyBase richiede attualmente il formato UTF-8 per i file delimitati da testo.

Configurazione della connettività Hadoop

La configurazione di SQL Server PolyBase per la connessione ad Archiviazione BLOB di Azure restituisce il seguente messaggio di errore in SQL Server:

messaggio 105019, livello 16, stato 1, riga 74
Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_Connect: Errore [Nessun FileSystem per lo schema: wasbs] durante l'accesso al file esterno.”

Possibile motivo:
la connettività Hadoop non è impostata sul valore di configurazione per l'accesso all'archiviazione BLOB di Azure.

Possibile soluzione:
impostare la connettività Hadoop su un valore (preferibilmente 7) che supporta Archiviazione BLOB di Azure e riavviare SQL Server. Per un elenco dei valori di connettività e dei tipi supportati, vedere Configurazione della connettività PolyBase.

Errore Create Table As Select

Scenario:
il tentativo di esportare dati in Archiviazione BLOB di Azure o nel file system Hadoop usando PolyBase con la sintassi CREATE EXTERNAL TABLE AS SELECT (CETAS) da SQL Server ha esito negativo e viene visualizzato il messaggio di errore seguente:

messaggio 156, livello 15, stato 1, riga 177
Sintassi non corretta in prossimità della parola chiave “WITH”.
Messaggio 319, livello 15, stato 1, riga 177
Sintassi non corretta in prossimità della parola chiave 'with'. Se l'istruzione è un'espressione di tabella comune, una clausola xmlnamespaces o una clausola context per il rilevamento delle modifiche, l'istruzione precedente deve terminare con un punto e virgola (;).

Possibile motivo:
Quando si esportano dati in Hadoop o in Archiviazione BLOB di Azure tramite PolyBase, vengono esportati solo i dati e non i nomi di colonne (metadati) definiti nel comando CREATE EXTERNAL TABLE.

Possibile soluzione:
creare prima la tabella esterna e quindi usare INSERT INTO SELECT per esportare nella posizione esterna. Per un esempio di codice, vedere Scenari di query PolyBase.

Creare una tabelle esterna a partire da errori di archiviazione BLOB di Azure

Scenario:
il pool SQL dedicato (in precedenza SQL DW) è configurato per importare dati da Archiviazione BLOB di Azure. La creazione di una tabella esterna ha esito negativo con il messaggio seguente.

messaggio 105019, livello 16, stato 1, riga 34
Accesso alla tabella esterna non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_IsDirExist. Messaggio di eccezione Java:com.microsoft.azure.storage.StorageException: il server non è riuscito ad autenticare la richiesta. Assicurarsi che il valore dell'intestazione di autorizzazione sia formato correttamente, inclusa la firma.: Errore [com.microsoft.azure.storage.StorageException: Il server non è riuscito ad autenticare la richiesta. Assicurarsi che il formato dell'intestazione dell'autorizzazione, firma inclusa, sia corretto.] durante l'accesso al file esterno."

Possibile motivo:
è stata usata una chiave di archiviazione di Azure errata per creare le credenziali con ambito database.

Possibile soluzione:
eliminare tutti gli oggetti correlati (ad esempio origine dati, formato di file) e quindi eliminare e ricreare le credenziali con ambito database con la chiave di archiviazione corretta.

Capitalizzazione di configurazione Kerberos

Scenario:
SQL Server è configurato con il cluster Cloudera abilitato per Kerberos. SQL Server è stato riavviato dopo tutte le modifiche alla configurazione. I servizi Motore di PolyBase e PolyBase Data Movement vengono eseguiti dopo il riavvio. Vengono restituiti i seguenti messaggi di errore:

Origine dati configurata senza percorso di rilevamento processi:

Impossibile creare un'istanza di org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.fs.viewfs.ViewFileSystem

Origine dati configurata con il percorso di rilevamento processi:

Errore [Non è possibile ottenere l'area di autenticazione Kerberos] durante l'accesso al file esterno

Possibile motivo:
Il valore della proprietà "hadoop.security.authentication" indica kerberos nel Coresite.xml.

Possibile soluzione:
la proprietà "hadoop.security.authentication" di Coresite.xml deve essere KERBEROS (maiuscola) come valore.

Per altre informazioni sulla risoluzione dei problemi relativi a PolyBase e Kerberos, vedere Risolvere i problemi di connettività di Kerberos e PolyBase.

Mapred-site.xml ha valori necessari mancanti

Scenario:
SQL Server o piattaforma di strumenti analitici è configurato con il cluster HDP supportato. Le query che non richiedono il lavoro di pushdown, ma hanno esito negativo con il messaggio seguente quando viene usato l'hint “FORCE PUSHDOWN” con i messaggi di errore seguenti:

messaggio 7320, livello 16, stato 110, riga 35
Impossibile eseguire la query "Remote Query" sul provider OLE DB "SQLNCLI11" per il server collegato "(null)". Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a JobSubmitter_PollJobStatus: Errore [org.apache.hadoop.ipc.RemoteException(java.lang.NullPointerException): java.lang.NullPointerException
all'indirizzo org.apache.hadoop.mapreduce.v2.hs.HistoryClientService$HSClientProtocolHandler.getTaskAttemptCompletionEvents(HistoryClientService.java:277)
all'indirizzo org.apache.hadoop.mapreduce.v2.api.impl.pb.service.MRClientProtocolPBServiceImpl.getTaskAttemptCompletionEvents(MRClientProtocolPBServiceImpl.java:173)
all'indirizzo org.apache.hadoop.yarn.proto.MRClientProtocol$MRClientProtocolService$2.callBlockingMethod(MRClientProtocol.java:283)
all'indirizzo org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619)
all'indirizzo org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962)
all'indirizzo org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2127)
all'indirizzo org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2123)
all'indirizzo java.security.AccessController.doPrivileged(Native Method)
all'indirizzo javax.security.auth.Subject.doAs(Subject.java:415)
all'indirizzo org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
all'indirizzo org.apache.hadoop.ipc.Server$Handler.run(Server.java:2121)
] durante l'accesso al file esterno."

Possibile motivo:
in Mapred-site.xml mancano alcuni valori necessari che controllano i risultati intermedi e finali.

Possibile soluzione:
aggiungere le seguenti proprietà e associare i valori corretti come illustrato in Ambari nel file mapred-site.xml in SQL Server.

<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/mr-history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/mr-history/tmp</value>
</property>

Configurazione dell'accesso in base al nome host

Scenario:
SQL Server è configurato per accedere a un cluster Hadoop supportato. La creazione di una tabella esterna restituisce uno degli errori seguenti:

Impossibile eseguire la query "Remote Query" sul provider OLE DB "SQLNCLI11" per il server collegato "(null)". 110802;Si è verificato un errore interno del Servizio Migrazione del database che ha causato l'esito negativo di questa operazione. Dettagli: Eccezione: Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.DmsSqlNativeException, Messaggio: SqlNativeBufferReader.Run, errore in OdbcExecuteQuery: SqlState: 42000, NativeError: 8680, “Error di chiamata: SQLExecDirect(this-GetHstmt>(), (SQLWCHAR *)statementText, SQL_NTS), codice restituito SQL: -1 | Informazioni errore SQL: SrvrMsgState: 26, SrvrSeverity: 17, Errore <1>: ErrorMsg: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Internal Query Processor Error: Query Processor ha rilevato un errore imprevisto durante l'elaborazione di una fase di query remota. | Errore durante la chiamata: pReadConn->ExecuteQuery(statementText, bufferFormat) | state: FFFF, number: 24, active connections: 8', Connection String: Driver={pdwodbc};APP=RCSmall-DmsNativeReader:WAD1D16HD2001\mpdwsvc (3600)-ODBC-PoolId1433;Trusted_Connection=yes;AutoTranslate=no;Server=\.\pipe\sql\query

[Thread:30544] [AbstractReaderWorker:ErrorEvent] (Errore, Alto): QueryId QID2433 PlanId 6c3a4551-e54c-4c06-a5ed-a8733edac691 StepId 7:
Impossibile ottenere il blocco: BP-1726738607-192.168.225.121-1443123675290:blk_1159687047_86196509 file=/user/hive/warehouse/u_data/000000_0
Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: Impossibile ottenere il blocco: BP-1726738607-192.168.225.121-1443123675290:blk_1159687047_86196509 file=/user/hive/warehouse/u_data/000000_0
all’indirizzo Microsoft.SqlServer.DataWarehouse.DataMovement.Common.ExternalAccess.HdfsBridgeReadAccess.Read(MemoryBuffer buffer, Boolean& isDone)
all’indirizzo Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.DataReader.ExternalMoveBufferReader.Read()
all’indirizzo Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.ExternalMoveReaderWorker.ReadAndSendData()
all’indirizzo Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.ExternalMoveReaderWorker.Execute(Object status)

Possibile motivo:
questo messaggio di errore può essere visualizzato quando il cluster Hadoop è configurato in una configurazione in cui i nodi dati sono accessibili solo all'esterno del cluster usando il nome host e non l'indirizzo IP.

Possibile soluzione:
aggiungere quanto segue al file hdfs-site.xml sul lato client (SQL Server). Questa configurazione impone al nodo del nome di restituire un URI per i nodi dati con il nome host anziché l'indirizzo IP interno.

<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>

L'organizzazione delle cartelle forza l'overhead di memoria in eccesso

Scenario:
SQL Server esegue una query PolyBase in una directory con un numero elevato di file (>30.000 file nel percorso della directory in modo ricorsivo) e viene restituito uno dei seguenti messaggi di errore:

messaggio 105019, livello 16, stato 1, riga 1
Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_GetFileNameByIndex. Messaggio di eccezione Java: il limite di overhead GC è stato superato: si è verificato un errore [limite di overhead GC superato] durante l'accesso al file esterno."

messaggio 105019, livello 16, stato 1, riga 1
Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_GetDirectoryFiles. Messaggio di eccezione Java: spazio heap Java: errore [spazio heap Java] durante l'accesso al file esterno."

Possibile motivo:
durante l'elaborazione di un percorso, PolyBase enumera tutti i file in tale percorso e si verifica un sovraccarico di memoria fisso associato alla struttura di dati usata per rappresentare i file. Con un numero elevato di file, questo sovraccarico diventa evidente e può infine esaurire tutta la memoria disponibile per la JVM.

Possibile soluzione:
ridisporre i dati in più directory in modo che ogni directory contenga un sottoinsieme di file, quindi suddividere la query in più directory che operano su una parte del percorso originale alla volta e materializzare le tabelle come tabelle di SQL Server (prima di unirle).

Esempio: si supponga che i dati della tabella esterna si trovino nella posizione seguente: Orders/file1.txt,...,file30K.txt.

Modificare il layout in modo che i dati vengano disposti in una struttura di partizione di file convenzionale in Orders/yyyy/mm/dd/file1.txt. Puntare la tabella esterna a un percorso di directory inferiore, ad esempio month(mm) o day(dd) e importare i file nelle tabelle di SQL Server in parti e quindi aggiungerli all’interno di una tabella. Anche se si dispone della struttura di directory corretta per iniziare, seguire il passaggio 2 per poter lavorare con quel numero di file senza esaurire la memoria JVM.

Caratteri imprevisti nei file di configurazione

Scenario:
configurazione di SQL Server o della piattaforma di strumenti analitici con un cluster Hadoop, che comporta la modifica di yarn-site.xml, hdfs-site.xml e altri file di configurazione. Viene visualizzato il seguente messaggio di errore di SQL Server:

messaggio 105019, livello 16, stato 1, riga 1
Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: Accesso EXTERNAL TABLE non riuscito a causa di un errore interno: “Eccezione Java generata alla chiamata a HdfsBridge_Connect. Messaggio di eccezione Java:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.: Error [com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.] durante l'accesso al file esterno." --->

Possibile motivo:
ciò può verificarsi se il testo è stato copiato e incollato in file di configurazione da un sito Web o una finestra chat. È possibile che i caratteri indesiderati/non stampabili si trovino nei file di configurazione.

Possibile soluzione:
aprire i file in un editor di testo diverso (diverso dal Blocco note), cercare questi caratteri ed eliminarli. Riavviare i servizi necessari.

La query di tabella delta potrebbe non riuscire con gli errori 2571 e 16513

Scenario:
quando si esegue una query su una tabella Delta esterna, è possibile che si verifichi l'errore seguente:

Msg 2571, Level 14, State 3, Line 1
User '<user>' does not have permission to run DBCC TRACEON.
Msg 16513, Level 16, State 0, Line 1
Error reading external metadata.

Possibile motivo:
questo problema può verificarsi perché è presente un hint per la query QUERYTRACEON che si può aggiungere alla query sui metadati del file Delta che richiede il ruolo del server sysadmin per l'esecuzione.

Possibile soluzione:
in tal caso, è possibile risolvere il problema abilitando globalmente il flag di traccia 14073 e impedire così l'aggiunta dell'hint per la query.

Vedi anche