Ошибки в PolyBase и возможные решения

Область применения:SQL Server

В этой статье описаны распространенные сценарии ошибок в PolyBase и способы их устранения.

Дополнительные сведения о мониторинге и устранении неполадок в PolyBase см. в статье Мониторинг PolyBase и устранение неполадок.

Сведения о стандартном расположении файлов журналов PolyBase в Windows и Linux см. в статье Мониторинг PolyBase и устранение неполадок.

Сообщения об ошибках и возможные решения

Не удалось установить обновление SQL Server 2022 из-за недопустимого имени столбца (с учетом регистра)

Эта ошибка может возникать при установке накопительных обновлений SQL Server на сервере с установленным компонентом PolyBase и чувствительной к регистру сортировкой; при этом отображается следующее сообщение об ошибке обновления:

Пример сообщения об ошибке: 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.

Причина.

В ходе процедуры обновления скрипту SQL Server не удаётся успешно завершиться из-за значений, чувствительных к регистру.

Решение. Эта проблема будет окончательно исправлена в предстоящем накопительном обновлении.

Решение:

  1. Включите флаг трассировки 902.
  2. Запустите SQL Server.
  3. Измените параметры сортировки базы данных DWConfiguration с CS (с учетом регистра) на CI (без учета регистра).
  4. Повторно выполните обновление.
  5. Отключите флаг трассировки 902.
  6. Перезапуск SQL Server.
  7. Измените параметры сортировки базы данных DWConfiguration обратно с CI (без учета регистра) на CS (с учетом регистра).

В качестве альтернативы флагам трассировки, чтобы предотвратить возникновение проблемы до установки накопительного обновления, проверьте, использует ли база данных "DWConfiguration" сортировку, учитывающую регистр (CS). Рассмотрите возможность изменить сортировку на сортировку без учета регистра (CI), применить накопительное обновление, а затем вернуть исходную сортировку.

Ошибка: "100001; Не удалось создать план запроса"

Ошибка "Не удалось создать план запроса" может возникать, если ядро СУБД SQL Server было обновлено как минимум до накопительного обновления 8 (15.0.4073), а компонент PolyBase не был обновлён до той же версии сборки. Это может произойти при добавлении компонента PolyBase в существующий экземпляр SQL Server. Дополнительные сведения см. в разделе, посвященном ошибке PolyBase 100001 (не удалось создать план запроса).

Всегда следуйте инструкциям по установке компонента PolyBase, переведя новый компонент на тот же уровень версии. При необходимости установите пакеты обновления (SP), накопительные обновления (CU) и (или) выпуски для общего распространения (GDR). Сведения о том, как определить версию PolyBase, см. в статье Определение уровня версий, выпусков и обновлений SQL Server и компонентов.

Изменение учетной записи службы

Пример сообщения об ошибке:

107035; Ошибка авторизации Dms, так как [DOMAIN\user] не является членом группы [PdwDataMovementAccess]
107017: недопустимый заголовок управления DMS:

Эта ошибка, скорее всего, вызвана изменением учетной записи службы PolyBase. Чтобы изменить учетные записи для служб PolyBase Engine и службы перемещения данных PolyBase, удалите и переустановите компонент PolyBase.

Ошибки разрешений для службы перемещения данных

Дополнительные сведения об устранении неполадок и решении проблем, связанных с разрешениями для службы перемещения данных, см. в статье Разрешения для учетной записи службы PolyBase и типичные ошибки, возникающие при их отсутствии.

Сбой аутентификации Windows

Дополнительные сведения об устранении неполадок и решении проблем, связанных со сбоем аутентификации Windows, см. в статье Разрешения для учетной записи службы PolyBase и типичные ошибки, возникающие при их отсутствии.

Невозможно выполнить запрос "Remote Query"

Пример сообщения об ошибке:

Сообщение 7320, уровень 16, состояние 110, строка 14
Не удалось выполнить запрос "Remote Query" при помощи поставщика OLE DB "SQLNCLI11" для связанного сервера "(NULL)". Запрос прерван — при чтении из внешнего источника достигнут максимальный порог отклонения (0 строк): отклонена 1 строка из 1 обработанной. (/nation/sensors.ldjson.txt) Порядковый номер столбца: 0, Ожидаемый тип данных: INT, Недопустимое значение: {"id":"S2740036465E2B","time":"2016-02-26T16:59:02.9300000Z","temp":23.3,"hum":0.77,"wind":17,"press":1032,"loc":[-76.90914996169623,38.8929314364726]} (Ошибка преобразования в столбце), Ошибка: ошибка преобразования типа данных NVARCHAR в INT.

Помните, что эта ошибка может иметь свои производные. Имя первого отклоненного файла отображается в SQL Server Management Studio (SSMS) с ошибочными типами данных или значениями.

Возможная причина
Причина этой ошибки заключается в том, что у файлов разные схемы. Если DDL внешней таблицы PolyBase указывает на каталог, он рекурсивно считывает все файлы в этом каталоге. При несоответствии столбца или типа данных эта ошибка может отображаться в SSMS.

Возможное решение
Если данные каждой таблицы содержатся в одном файле, в разделе LOCATION укажите имя файла с предваряющим его каталогом внешних файлов. Если у таблиц несколько файлов с данными, поместите каждый набор файлов в отдельный каталог в Хранилище BLOB-объектов Azure. Укажите LOCATION как каталог, а не как конкретный файл. Это рекомендуемое решение.

Пример:

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...);

Примечание.

SQL Server Native Client (SNAC) не поставляется с:

  • SQL Server 2022 (16.x) и более поздних версий
  • SQL Server Management Studio 19 и более поздних версий

Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений.

Для новых проектов используйте один из следующих драйверов:

Сведения о SQLNCLI, который поставляется в составе компонента ядра СУБД SQL Server (версии с 2012 по 2019), см. в этом исключении из политики жизненного цикла поддержки.

Поддержка Kerberos

SQL Server настроен для доступа к поддерживаемому кластеру Hadoop. Безопасность Kerberos не обеспечивается в кластере Hadoop.

При выборе из внешней таблицы возникает следующая ошибка:

Сообщение 105019, уровень 16, состояние 1, строка 55
EXTERNAL TABLE не удалось получить доступ из-за внутренней ошибки: "исключение Java, возникшее при вызове HdfsBridge_Connect: при доступе к внешнему файлу произошла ошибка [Не удалось создать экземпляр LoginClass]."
Сообщение 7320, уровень 16, состояние 110, строка 55
Не удалось выполнить запрос "Remote Query" при помощи поставщика OLE DB "SQLNCLI11" для связанного сервера "(NULL)". EXTERNAL TABLE не удалось получить доступ из-за внутренней ошибки: "при вызове HdfsBridge_Connect возникло исключение Java: произошла ошибка [не удалось создать экземпляр LoginClass] при обращении к внешнему файлу."

При опросе журнала сервера DWEngine отображается следующая ошибка:

[Thread:16432] [EngineInstrumentation:EngineQueryErrorEvent] (Ошибка, Высокий):
EXTERNAL TABLE сбой доступа из-за внутренней ошибки: "При вызове HdfsBridge_Connect создано исключение Java: ошибка [com.microsoft.polybase.client.KerberosSecureLogin] возникла при доступе к внешнему файлу." Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: EXTERNAL TABLE сбой доступа из-за внутренней ошибки: "При вызове HdfsBridge_Connect возникло исключение Java: ошибка [com.microsoft.polybase.client.KerberosSecureLogin] произошла при доступе к внешнему файлу." >--- Microsoft.SqlServer.DataWarehouse.DataMovement.Common.ExternalAccess.HdfsAccessException: исключение Java, возникающее при вызове HdfsBridge_Connect: ошибка [com.microsoft.polybase.client.KerberosSecureLogin] при доступе к внешнему файлу.

Возможная причина
Kerberos не включен в кластере Hadoop, но безопасность Kerberos включена в core-site.xml, yarn-site.xml или hdfs-site.xml, расположенную по умолчанию в разделе Program Files\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf. В Linux эти файлы по умолчанию расположены в папке /var/opt/mssql/binn/polybase/hadoop/conf/.

Возможное решение
Закомментируйте сведения о безопасности Kerberos из указанных выше файлов.

Дополнительные сведения об устранении неполадок с PolyBase и Kerberos см. в статье Устранение неполадок с подключением PolyBase к Kerberos.

Внутренняя ошибка обработчика запросов

При выполнении запросов к внешней таблице возникает следующая ошибка:

Сообщение 8680, уровень 17, состояние 5, строка 118
Внутренняя ошибка обработчика запросов: обработчик запросов обнаружил непредвиденную ошибку во время обработки удаленной фазы запроса.

Журнал сервера DWEngine содержит следующие сообщения:

[Поток:5216] [ControlNodeMessenger:ErrorEvent] (Ошибка, высокий): ***** Система DMS имеет отключённые узлы:
[Поток:5216] [ControlNodeMessenger:ErrorEvent] (Ошибка, высокий): ***** Система DMS содержит отключённые узлы:
[Поток:5216] [ControlNodeMessenger:ErrorEvent] (Ошибка, высокий уровень): ***** Система DMS имеет отключенные узлы :

Возможная причина
Причиной этой ошибки может быть то, что SQL Server не был перезапущен после настройки PolyBase.

Возможное решение
Перезапуск SQL Server. Проверьте журнал сервера DWEngine, чтобы убедиться в отсутствии отключений DMS после перезапуска.

Пользователь, необходимый для доступа к HDFS

Сценарий:
SQL Server подключен к незащищенному кластеру Hadoop (протокол Kerberos не включен). В PolyBase настроена принудительная отправка вычислений в кластер Hadoop.

Пример запроса

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

Появляется сообщение об ошибке примерно следующего содержания:

Сообщение 105019, уровень 16, состояние 1, строка 1
EXTERNAL TABLEСбой доступа из-за внутренней ошибки: "возникло исключение Java при вызове JobSubmitter_PollJobStatus: ошибка [java.net.ConnectException: вызов из big1506sql2016/172.16.1.4 к 0.0.0.0:10020 завершился сбоем из-за исключения подключения: java.net.ConnectException: в подключении отказано: дополнительные сведения отсутствуют; Дополнительные сведения см. в: http://wiki.apache.org/hadoop/ConnectionRefused] возникла при доступе к внешнему файлу."
Поставщик OLE DB "SQLNCLI11" для связанного сервера "(NULL)" вернул сообщение "Неопределенная ошибка".
Сообщение 7421, уровень 16, состояние 2, строка 1
Не удалось получить набор строк от поставщика OLE DB "SQLNCLI11" для связанного сервера "(NULL)". .

Ошибка журнала Hadoop YARN:

Не удалось настроить задание : org.apache.hadoop.security.AccessControlException: Доступ запрещён: 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) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:176) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5525)

Возможная причина
При отключенном протоколе Kerberos в PolyBase будет использоваться пользователь pdw_user для доступа к HDFS и отправки заданий MapReduce.

Возможное решение
В Hadoop создайте пользователя pdw_user и предоставьте ему необходимые разрешения для каталогов, используемых при обработке MapReduce. Также убедитесь, что pdw_user является владельцем каталога HDFS /user/pdw_user.

Ниже приведен пример создания домашнего каталога и назначения разрешений для pdw_user.

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

После этого убедитесь, что у pdw_user есть разрешения на чтение, запись и выполнение для каталога /user/pdw_user. Убедитесь, что у каталога/tmp есть разрешения 777.

Дополнительные сведения об устранении неполадок с PolyBase и Kerberos см. в статье Устранение неполадок с подключением PolyBase к Kerberos.

Ошибка памяти Java из-за UTF-8

Сценарий:
PolyBase в SQL Server настроен для работы с кластером Hadoop или хранилищем BLOB-объектов Azure. Любой запрос Select завершается со следующей ошибкой:

Сообщение 106000, уровень 16, состояние 1, строка 1
Пространство кучи Java

Возможная причина
Некорректные входные данные могут вызвать ошибку нехватки памяти в Java. Возможно, файл имеет формат, отличный от UTF-8. DMS пытается прочитать весь файл как одну запись, поскольку не может декодировать разделитель строк, и в результате возникает ошибка Java heap space.

Возможное решение
Преобразуйте файл в формат UTF-8, так как в настоящее время PolyBase требует использовать его для файлов с разделителями текста.

Настройка подключения Hadoop

При настройке подключения SQL Server PolyBase к Хранилищу BLOB-объектов Azure появляется следующее сообщение об ошибке в SQL Server:

Сообщение 105019, уровень 16, состояние 1, строка 74
EXTERNAL TABLE Не удалось получить доступ из-за внутренней ошибки: "исключение Java, возникшее при вызове HdfsBridge_Connect: ошибка [Файловая система для схемы wasbs не найдена] произошла при обращении к внешнему файлу."

Возможная причина
Для подключения к Hadoop не задано значение конфигурации для доступа к хранилищу BLOB-объектов Azure.

Возможное решение
Задайте для подключения Hadoop значение (желательно 7), которое поддерживает Хранилище BLOB-объектов Azure, и перезапустите SQL Server. Список значений для подключения и поддерживаемых типов см. в статье Конфигурация подключения к PolyBase (Transact-SQL).

Ошибка при выполнении инструкции Create Table As Select

Сценарий:
При попытке экспортировать данные в Хранилище BLOB-объектов Azure или файловую систему Hadoop из SQL Server с помощью синтаксиса PolyBase с CREATE EXTERNAL TABLE AS SELECT (CETAS) возникает следующая ошибка:

Сообщение 156, уровень 15, состояние 1, строка 177
Неправильный синтаксис около ключевого слова "WITH".
Сообщение 319, уровень 15, состояние 1, строка 177
Неправильный синтаксис рядом с ключевым словом "with". Если эта инструкция является обобщенным табличным выражением, предложением xmlnamespaces или предложением в контексте отслеживания изменений, предыдущую инструкцию необходимо завершить точкой с запятой.

Возможная причина
При экспорте данных в Hadoop или Хранилище BLOB-объектов Azure через PolyBase экспортируются только данные, а не имена столбцов (метаданные), как определено в командеCREATE EXTERNAL TABLE.

Возможное решение
Сначала создайте внешнюю таблицу, а затем используйте INSERT INTO SELECT для экспорта в внешнее расположение. Пример кода см. в статье Сценарии запросов PolyBase.

Не удаётся создать внешнюю таблицу из хранилища BLOB-объектов Azure

Сценарий:
Выделенный пул SQL (ранее — SQL DW) настроен на импорт данных из хранилища BLOB-объектов Azure. Не удается создать внешнюю таблицу. Появляется следующее сообщение.

Сообщение 105019, уровень 16, состояние 1, строка 34
Не удалось получить внешний TABLE доступ из-за внутренней ошибки: 'возникло исключение Java при вызове HdfsBridge_IsDirExist. Сообщение об исключении Java: com.microsoft.azure.storage.StorageException, серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. Ошибка [com.microsoft.azure.storage.StorageException: серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации правильно сформировано, включая подпись.] Произошла ошибка при доступе к внешнему файлу.

Возможная причина
При создании учетных данных с областью действия базы данных использовался неверный ключ хранилища Azure.

Возможное решение
Удалите все связанные объекты (т. е. источник данных, формат файла), а затем удалите и повторно создайте учетные данные для базы данных, используя подходящий ключ хранилища.

Использование прописных букв в конфигурации Kerberos

Сценарий:
В SQL Server заданы настройки для работы с кластером Cloudera, в котором включен протокол Kerberos. После всех изменений конфигурации SQL Server был перезагружен. Ядро PolyBase и служба перемещения данных PolyBase работают после перезагрузки. Возвращается следующее сообщение об ошибке:

Источник данных настроен без указания того, где расположено средство регистрации заданий:

org.apache.hadoop.fs.FileSystem: не удалось создать экземпляр поставщика org.apache.hadoop.fs.viewfs.ViewFileSystem

Источник данных настроен с указанием того, где расположено средство регистрации заданий:

Ошибка [не удается получить область Kerberos] при доступе к внешнему файлу.

Возможная причина
В файле Coresite.xml для свойства "hadoop.security.authentication" указано значение "kerberos".

Возможное решение
В файле Coresite.xml значением свойства "hadoop.security.authentication" должно быть KERBEROS (все буквы заглавные).

Дополнительные сведения об устранении неполадок с PolyBase и Kerberos см. в статье Устранение неполадок с подключением PolyBase к Kerberos.

В файле mapred-site.xml отсутствуют необходимые значения

Сценарий:
SQL Server или платформа APS настроены для работы с поддерживаемым кластером HDP. Запросы, не требующие применения pushdown, работают, но при использовании подсказки 'FORCE PUSHDOWN' происходит сбой с выводом следующих сообщений об ошибках:

Сообщение 7320, уровень 16, состояние 110, строка 35
Не удалось выполнить запрос "Remote Query" при помощи поставщика OLE DB "SQLNCLI11" для связанного сервера "(NULL)". EXTERNAL TABLEне удалось получить доступ из-за внутренней ошибки: 'возникло исключение Java при вызове JobSubmitter_PollJobStatus: ошибка [org.apache.hadoop.ipc.RemoteException(java.lang.NullPointerException): java.lang.NullPointerException
в org.apache.hadoop.mapreduce.v2.hs.HistoryClientService$HSClientProtocolHandler.getTaskAttemptCompletionEvents(HistoryClientService.java:277),
в org.apache.hadoop.mapreduce.v2.api.impl.pb.service.MRClientProtocolPBServiceImpl.getTaskAttemptCompletionEvents(MRClientProtocolPBServiceImpl.java:173),
в org.apache.hadoop.yarn.proto.MRClientProtocol$MRClientProtocolService$2.callBlockingMethod(MRClientProtocol.java:283),
в org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619),
в org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962),
в org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2127),
в org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2123),
в java.security.AccessController.doPrivileged(собственный метод),
в javax.security.auth.Subject.doAs(Subject.java:415),
в org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671),
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2121)
] произошла ошибка при доступе к внешнему файлу.

Возможная причина
В файле mapred-site.xml отсутствуют некоторые необходимые значения, которые проверяют промежуточные и конечные результаты.

Возможное решение
Добавьте следующие свойства и укажите для них правильные значения, как показано в Ambari в файле mapred-site.xml для 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>

Настройка доступа по имени узла

Сценарий:
В SQL Server настроен доступ к поддерживаемому кластеру Hadoop. При создании внешней таблицы возникает одна из следующих ошибок:

Не удалось выполнить запрос "Remote Query" при помощи поставщика OLE DB "SQLNCLI11" для связанного сервера "(NULL)". 110802: произошла внутренняя ошибка DMS, вызвавшая сбой операции. Сведения: Exception: Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.DmsSqlNativeException, Message: SqlNativeBufferReader.Run, ошибка в OdbcExecuteQuery: SqlState: 42000, NativeError: 8680, "Ошибка при вызове: SQLExecDirect(this->GetHstmt(), (SQLWCHAR *)statementText, SQL_NTS), код возврата SQL: -1 | Сведения об ошибке SQL: SrvrMsgState: 26, SrvrSeverity: 17, Ошибка <1>: ErrorMsg: [Microsoft][Драйвер ODBC 13 для SQL Server][SQL Server]Внутренняя ошибка обработчика запросов: обработчик запросов столкнулся с непредвиденной ошибкой при обработке этапа удаленного запроса. | Ошибка при вызове: pReadConn->ExecuteQuery(statementText, bufferFormat) | состояние: FFFF, номер: 24, активные подключения: 8', строка подключения: Driver={pdwodbc};APP=RCSmall-DmsNativeReader:WAD1D16HD2001\mpdwsvc (3600)-ODBC-PoolId1433;Trusted_Connection=yes;AutoTranslate=no;Server=\.\pipe\sql\query

[Поток:30544] [AbstractReaderWorker:ErrorEvent] (Ошибка, высокий): QueryId QID2433 PlanId 6c3a4551-e54c-4c06-a5ed-a8733edac691 StepId 7:
Не удалось получить блок: BP-1726738607-192.168.225.121-1443123675290:blk_1159687047_86196509 file=/user/hive/warehouse/u_data/000000_0
Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: Не удалось получить блок: BP-1726738607-192.168.225.121-1443123675290:blk_1159687047_86196509 file=/user/hive/warehouse/u_data/000000_0
в Microsoft.SqlServer.DataWarehouse.DataMovement.Common.ExternalAccess.HdfsBridgeReadAccess.Read(MemoryBuffer buffer, Boolean& isDone),
в Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.DataReader.ExternalMoveBufferReader.Read(),
в Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.ExternalMoveReaderWorker.ReadAndSendData()
в Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.ExternalMoveReaderWorker.Execute(Object status)

Возможная причина
Это сообщение об ошибке может отображаться, если конфигурация кластера Hadoop разрешает доступ к узлам данных за пределами кластера только при использовании имени узла, а не IP-адреса.

Возможное решение
Добавьте следующие сведения в файл hdfs-site.xml на стороне клиента (SQL Server). Эта конфигурация заставит NameNode возвращать URI для узлов данных с именем хоста вместо внутреннего IP-адреса.

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

Организация папок приводит к переполнению памяти

Сценарий:
SQL Server выполняет запрос PolyBase в каталоге с большим количеством файлов (>30 000 файлов в пути к каталогу рекурсивно), и возвращается одно из следующих сообщений об ошибке:

Сообщение 105019, уровень 16, состояние 1, строка 1
EXTERNAL TABLE ошибка доступа из-за внутренней ошибки: 'возникло исключение Java при вызове HdfsBridge_GetFileNameByIndex. Сообщение об исключении Java: превышен предел накладных расходов сборщика мусора: ошибка [превышен предел накладных расходов сборщика мусора] возникла при доступе к внешнему файлу.

Сообщение 105019, уровень 16, состояние 1, строка 1
EXTERNAL TABLEНе удалось получить доступ из-за внутренней ошибки: "возникло исключение Java при вызове HdfsBridge_GetDirectoryFiles. Сообщение об исключении Java: Java heap space: произошла ошибка [Java heap space] при доступе к внешнему файлу.

Возможная причина
При обработке пути PolyBase выполняет перечисление всех файлов по этому пути. При этом возникает переполнение фиксированной памяти сведениями о структуре данных, используемой для представления файлов. При большом количестве файлов переполнение становится заметным и может в конечном итоге исчерпать всю память, доступную для виртуальной машины Java.

Возможное решение
Разместите данные в нескольких каталогах так, чтобы каждый каталог содержал подмножество файлов. Запрос разделите на несколько запросов, чтобы каждый из них по очереди работал с частью исходного пути, а таблицы материализуйте как таблицы SQL Server (перед их объединением).

Пример. Предположим, что данные внешней таблицы находятся в следующем расположении: Orders/file1.txt,..., file30K.txt.

Измените структуру расположения файлов, разместив их в обычной структуре файловых разделов вида Orders/ГГГГ/ММ/ДД/file1.txt. Укажите для внешней таблицы путь к расположенному ниже уровню каталога, например "месяц" (ММ) или "день" (ДД), и импортируйте файлы в таблицы SQL Server по частям, а затем добавьте их как часть одной таблицы. Даже если у вас уже есть подходящая структура каталогов, выполните шаг 2, чтобы иметь возможность работать с большим количеством файлов, избегая переполнения памяти виртуальной машины Java.

Недопустимые символы в файлах конфигурации

Сценарий:
Настройка SQL Server или платформы APS для работы с кластером Hadoop предполагает внесение изменений в yarn-site.xml, hdfs-site.xml и другие файлы конфигурации. Отображается следующее сообщение об ошибке SQL Server:

Сообщение 105019, уровень 16, состояние 1, строка 1
Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: EXTERNAL TABLE сбой доступа из-за внутренней ошибки: 'Исключение Java при вызове HdfsBridge_Connect. Сообщение об исключении Java:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Недопустимый байт 1 в однобайтовой последовательности UTF-8.: Ошибка [com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Недопустимый байт 1 в однобайтовой последовательности UTF-8.] Произошла ошибка при доступе к внешнему файлу. --->

Возможная причина
Это может произойти при копировании текста на веб-сайте или в чате и его последующей вставке в файлы конфигурации. При этом в файлы конфигурации могут попасть лишние или непечатаемые символы.

Возможное решение
Откройте файлы в другом текстовом редакторе (не в Блокноте), найдите такие символы и удалите их. Перезапустите нужные службы.

Запрос разностной таблицы может завершиться ошибкой 2571 и 16513

Сценарий:
При запросе внешней таблицы Delta может возникнуть следующая ошибка:

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.

Возможная причина
Это может произойти, потому что существует QUERYTRACEON подсказка запроса, которую можно добавить в запрос метаданных файла Delta, и для выполнения которой требуется роль сервера sysadmin.

Возможное решение
Если это происходит, можно устранить проблему, глобально включив флаг трассировки 14073; это предотвратит добавление подсказки к запросу.

См. также