다음을 통해 공유


PolyBase 오류 및 가능한 해결 방법

적용 대상: SQL Server

이 문서에는 PolyBase에 대한 일반적인 오류 시나리오 및 솔루션이 포함되어 있습니다.

PolyBase 모니터링 및 문제 해결에 대한 자세한 내용은 PolyBase 모니터링 및 문제 해결을 참조하세요.

Windows 및 Linux의 일반적인 PolyBase 로그 파일 위치는 PolyBase 모니터링 및 문제 해결을 참조하세요.

오류 메시지 및 가능한 해결 방법

잘못된 열 이름(대/소문자 구분)으로 인해 SQL Server 2022 업데이트에 실패함

이 오류는 PolyBase 기능이 설치된 서버에 SQL Server 누적 업데이트 설치를 적용하고 대/소문자 구분 데이터 정렬을 사용할 때 발생할 수 있습니다. 보고된 오류 업그레이드 메시지는 다음과 같습니다.

예제 오류 메시지: 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 기능이 동일한 빌드로 업데이트되지 않은 경우 "쿼리 계획을 생성하지 못함" 오류가 발생할 수 있습니다. 이는 기존 SQL Server 인스턴스에 PolyBase 기능을 추가할 때 발생할 수도 있습니다. 자세한 내용은 PolyBase 오류 - 100001, 쿼리 계획을 생성하지 못함을 참조하세요.

항상 같은 버전 수준에 새 기능을 도입하여 PolyBase 기능을 설치해야 합니다. 필요하다면 SP(서비스 팩), 누적 업데이트(CU) 및.또는 GDR(일반 배포 릴리스)를 설치하세요. PolyBase 버전을 확인하려면 SQL Server 및 관련 구성 요소의 버전, 에디션, 업데이트 수준 확인을 참조하세요.

서비스 계정 변경

예제 오류 메시지:

107035, [DOMAIN\user]이(가) [PdwDataMovementAccess] 그룹의 구성원이 아니어서 Dms 권한 부여에 실패했습니다.
107017;DMS 컨트롤 헤더가 올바르지 않습니다.

이 오류는 PolyBase 서비스 계정 변경으로 발생할 수 있습니다. PolyBase 엔진 및 PolyBase 데이터 이동 서비스에 대한 서비스 계정을 변경하려면 PolyBase 기능을 제거하고 다시 설치합니다.

데이터 이동 서비스 권한 오류

데이터 이동 서비스 관련 문제 해결과 권한 문제 해결에 관한 자세한 내용은 PolyBase 서비스 계정 권한 및 권한 누락 시 자주 발생하는 오류를 참조하세요.

Windows 인증 실패

Windows 인증 실패와 관련된 권한 문제 및 해결에 대한 자세한 내용은 PolyBase 서비스 계정 권한 및 권한 누락 시 자주 발생하는 오류를 참조하세요.

‘Remote Query’ 쿼리를 실행할 수 없음

예제 오류 메시지:

메시지 7320, 수준 16, 상태 110, 줄 14
연결된 서버 ‘(null)’의 OLE DB 공급자 ‘SQLNCLI11’에 대해 쿼리 ‘Remote Query’를 실행할 수 없습니다. 쿼리가 중단되었습니다. 외부 원본에서 읽는 동안 최대 거부 임계값(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로 변환하는 동안 오류가 발생했습니다.

이 오류의 파생이 있을 수 있습니다. 거부된 첫 번째 파일의 이름은 잘못된 데이터 형식 또는 값이 있는 SSMS(SQL Server Management Studio)에 표시됩니다.

가능한 원인:
이 오류가 발생하는 이유는 각 파일에 스키마가 다르기 때문입니다. 디렉터리를 가리키는 경우 PolyBase 외부 테이블 DDL은 해당 디렉터리의 모든 파일을 재귀적으로 읽습니다. 열 또는 데이터 형식 불일치가 발생하는 경우 이 오류는 SSMS에서 볼 수 있습니다.

가능한 해결 방법:
각 테이블의 데이터가 하나의 파일로 구성된 경우 외부 파일의 디렉터리가 접두사로 지정된 LOCATION 섹션의 파일 이름을 사용합니다. 테이블당 파일이 여러 개 있는 경우 각 파일 집합을 Azure Blob Storage의 서로 다른 디렉터리에 배치합니다. 위치가 특정 파일이 아닌 디렉터리를 가리키게 하세요. 이 솔루션은 권장됩니다.

예제:

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

참고 항목

SNAC(SQL Server Native Client)는 다음과 함께 제공되지 않습니다.

  • SQL Server 2022(16.x) 이상 버전
  • SQL Server Management Studio 19 이상 버전

SQL Server Native Client(SQLNCLI 또는 SQLNCLI11)와 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 새로운 응용 프로그램 개발에 권장되지 않습니다.

새 프로젝트의 경우 다음 드라이버 중 하나를 사용합니다.

SQL Server 데이터베이스 엔진(버전 2012부터 2019까지)의 구성 요소로 제공되는 SQLNCLI의 경우 이 수명 주기 예외 지원을 참조하세요.

Kerberos 지원

SQL Server가 지원되는 Hadoop 클러스터에 액세스하도록 구성되었습니다. Kerberos 보안은 Hadoop 클러스터에 적용되지 않습니다.

외부 테이블에서 선택하면 다음 오류가 반환됩니다.

메시지 105019, 수준 16, 상태 1, 줄 55
내부 오류 때문에 외부 테이블에 액세스하지 못했습니다. 'HdfsBridge_Connect에 대한 호출에서 Java 예외가 발생했습니다. 외부 파일에 액세스하는 동안 [Unable to instantiate LoginClass] 오류가 발생했습니다.'
메시지 7320, 수준 16, 상태 110, 줄 55
연결된 서버 ‘(null)’의 OLE DB 공급자 ‘SQLNCLI11’에 대해 쿼리 ‘Remote Query’를 실행할 수 없습니다. 내부 오류 때문에 외부 테이블에 액세스하지 못했습니다. 'HdfsBridge_Connect에 대한 호출에서 Java 예외가 발생했습니다. 외부 파일에 액세스하는 동안 [Unable to instantiate LoginClass] 오류가 발생했습니다.'

DWEngine 서버 로그의 심문은 다음 오류를 표시합니다.

[스레드:16432] [EngineInstrumentation:EngineQueryErrorEvent] (오류, 높음):
내부 오류 때문에 외부 테이블에 액세스하지 못했습니다. ‘HdfsBridge_Connect에 대한 호출에서 Java 예외가 발생했습니다. 외부 파일에 액세스하는 동안 [com.microsoft.polybase.client.KerberosSecureLogin] 오류가 발생했습니다.' Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: 내부 오류 때문에 외부 테이블 액세스에 실패했습니다. 'HdfsBridge_Connect에 대한 호출에서 Java 예외가 발생했습니다. 외부 파일에 액세스하는 동안 [com.microsoft.polybase.client.KerberosSecureLogin] 오류가 발생했습니다.' ---> Microsoft.SqlServer.DataWarehouse.DataMovement.Common.ExternalAccess.HdfsAccessException: HdfsBridge_Connect에 대한 호출에서 Java 예외가 발생했습니다. 외부 파일에 액세스하는 동안 [com.microsoft.polybase.client.KerberosSecureLogin] 오류가 발생했습니다.

가능한 원인:
Hadoop 클러스터에서는 Kerberos를 사용할 수 없지만 Kerberos 보안은 core-site.xml, yarn-site.xml 또는 Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf에 기본적으로 있는 hdfs-site.xml을 사용하도록 설정됩니다. Linux에서 파일은 기본적으로 /var/opt/mssql/binn/polybase/hadoop/conf/에 있습니다.

가능한 해결 방법:
위에서 언급한 파일에서 Kerberos 보안 정보를 주석으로 처리합니다.

PolyBase 및 Kerberos 문제 해결에 대한 자세한 내용은 PolyBase Kerberos 연결 문제 해결을 참조하세요.

내부 쿼리 프로세서 오류

외부 테이블을 쿼리하면 다음 오류가 반환됩니다.

메시지 8680, 수준 17, 상태 5, 줄 118
내부 쿼리 프로세서 오류: 원격 쿼리 단계를 처리하는 동안 쿼리 프로세서에서 예기치 않은 오류가 발생했습니다.

DWEngine 서버 로그에는 다음 메시지가 포함됩니다.

[스레드:5216] [ControlNodeMessenger:ErrorEvent] (오류, 높음): ***** DMS System에 연결 해제된 노드가 있음 :
[스레드:5216] [ControlNodeMessenger:ErrorEvent] (오류, 높음): ***** DMS System에 연결 해제된 노드가 있음 :
[스레드:5216] [ControlNodeMessenger:ErrorEvent] (오류, 높음): ***** DMS System에 연결 해제된 노드가 있음 :

가능한 원인:
이 오류의 원인은 PolyBase를 구성한 후 SQL Server가 다시 시작되지 않았기 때문입니다.

가능한 해결 방법:
SQL Server를 다시 시작하십시오. DWEngine Server 로그를 확인하여 다시 시작한 후 DMS 연결 해제가 발생하지 않았는지 확인하세요.

HDFS 액세스에 필요한 사용자

시나리오:
SQL Server는 보안되지 않은 Hadoop 클러스터에 연결됩니다(Kerberos를 사용할 수 없음). PolyBase는 Hadoop 클러스터에 계산을 푸시하도록 구성됩니다.

샘플 쿼리:

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

다음과 비슷한 오류 메시지가 반환됩니다.

메시지 105019, 수준 16, 상태 1, 줄 1
내부 오류 때문에 외부 테이블에 액세스하지 못했습니다. 'JobSubmitter_PollJobStatus에 대한 호출에서 Java 예외가 발생했습니다. 오류 [java.net.ConnectException: 연결 예외로 인해 big1506sql2016/172.16.1.4에서 0.0.0.0:10020으로 호출하지 못했습니다. java.net ConnectException: 연결이 거부됨: 추가 정보 없음, 자세한 내용은 http://wiki.apache.org/hadoop/ConnectionRefused] 외부 파일에 액세스하는 동안 발생했습니다.를 참조하세요.’
연결된 서버 "(null)"에 대한 OLE DB 공급자 "SQLNCLI11"이 "지정되지 않은 오류" 메시지를 반환했습니다.
메시지 7421, 수준 16, 상태 2, 줄 1
연결된 서버 "(null)"에 대한 OLE DB 공급자 "SQLNCLI11"에서 행 집합을 가져올 수 없습니다. .

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) 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는 HDFS에 액세스하고 MapReduce 작업을 제출하는 사용자로 pdw_user를 사용합니다.

가능한 해결 방법:
Hadoop에서 pdw_user를 만들고 mapreduce 처리 중에 사용되는 디렉터리에 충분한 권한을 부여합니다. 또한 pdw_user이 /user/pdw_user HDFS 디렉터리의 소유자인지 확인합니다.

다음은 홈 디렉터리를 만들고 pdw_user에 대한 권한을 할당하는 방법의 예입니다.

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

그런 다음 /user/pdw_user 디렉터리에 대한 읽기, 쓰기 및 실행 권한이 있는지 확인합니다. /tmp 디렉터리에 777개의 권한이 있는지 확인합니다.

PolyBase 및 Kerberos 문제 해결에 대한 자세한 내용은 PolyBase Kerberos 연결 문제 해결을 참조하세요.

UTF-8로 인한 Java 메모리 오류

시나리오:
SQL Server PolyBase는 Hadoop 클러스터 또는 Azure Blob Storage를 사용하여 설정됩니다. 다음 오류와 함께 선택 쿼리가 실패합니다.

메시지 106000, 수준 16, 상태 1, 줄 1
Java 힙 공간

가능한 원인:
잘못된 입력 때문에 Java에서 메모리 오류가 발생할 수 있습니다. 파일이 UTF-8 형식이 아닐 수 있습니다. DMS는 행 구분 기호를 디코딩할 수 없고 Java 힙 공간 오류로 실행되므로 전체 파일을 하나의 행으로 읽으려고 합니다.

가능한 해결 방법:
PolyBase는 현재 텍스트 구분 파일에 대해 UTF-8 형식을 요구하므로 파일을 UTF-8 형식으로 변환합니다.

Hadoop 연결 구성

Azure Blob Storage에 연결하도록 SQL Server PolyBase를 구성하면 SQL Server에서 다음 오류 메시지가 반환됩니다.

메시지 105019, 수준 16, 상태 1, 줄 74
내부 오류 때문에 외부 테이블에 액세스하지 못했습니다. 'HdfsBridge_Connect에 대한 호출에서 Java 예외가 발생했습니다. 외부 파일에 액세스하는 동안 [No FileSystem for scheme: wasbs] 오류가 발생했습니다.'

가능한 원인:
Hadoop 연결은 Azure Blob Storage에 액세스하기 위한 구성 값으로 설정되지 않습니다.

가능한 해결 방법:
Hadoop 연결을 Azure Blob Storage를 지원하는 값(가급적 7)으로 설정하고 SQL Server를 다시 시작합니다. 연결 값 및 지원되는 형식의 목록은 PolyBase 연결 구성을 참조하세요.

Create Table As Select 오류

시나리오:
SQL Server에서 CREATE EXTERNAL TABLE AS SELECT(CETAS) 구문과 함께 PolyBase를 사용하여 Azure Blob Storage 또는 Hadoop 파일 시스템으로 데이터를 내보내려고 하면 다음 오류 메시지와 함께 실패합니다.

메시지 156, 수준 15, 상태 1, 줄 177
키워드 'WITH' 근처의 구문이 잘못되었습니다.
메시지 319, 수준 15, 상태 1, 줄 177
키워드 'with' 근처의 구문이 잘못되었습니다. 이 문이 공통 테이블 식인 xmlnamespaces 절 또는 변경 내용 추적 컨텍스트 절인 경우 이전 문을 세미콜론으로 종료해야 합니다.

가능한 원인:
PolyBase를 통해 데이터를 Hadoop 또는 Azure Blob Storage로 내보낼 때 CREATE EXTERNAL TABLE 명령에서 정의된 열 이름(메타데이터)이 아닌 데이터만 내보내집니다.

가능한 해결 방법:
먼저 외부 테이블을 만든 다음 INSERT INTO SELECT를 사용하여 외부 위치로 내보냅니다. 코드 샘플은 PolyBase 쿼리 시나리오를 참조하세요.

Azure Blob Storage에 있는 외부 테이블 만들기 실패

시나리오:
전용 SQL 풀(이전의 SQL DW)은 Azure Blob Storage에서 데이터를 가져오기 위해 설정됩니다. 다음 메시지가 표시되며 외부 테이블 만들기가 실패합니다.

메시지 105019, 수준 16, 상태 1, 줄 34
내부 오류로 인해 외부 테이블에 액세스하지 못했습니다. 'HdfsBridge_IsDirExist에 대한 호출에서 Java 예외가 발생했습니다. Java 예외 메시지:com.microsoft.azure.storage.StorageException: 서버에서 요청을 인증하지 못했습니다. 서명을 비롯한 인증 헤더 값이 올바르게 구성되어 있는지 확인합니다. 오류 [com.microsoft.azure.storage.StorageException: 서버가 요청을 인증하지 못했습니다. 서명을 비롯한 인증 헤더 값이 올바르게 구성되어 있는지 확인합니다.] 외부 파일에 액세스하는 동안 발생했습니다.'

가능한 원인:
잘못된 Azure Storage 키가 데이터베이스 범위 자격 증명을 만드는 데 사용되었습니다.

가능한 해결 방법:
모든 관련 개체(예: 데이터 원본, 파일 형식)를 삭제한 다음 올바른 스토리지 키를 사용하여 데이터베이스 범위 자격 증명을 삭제하고 다시 만듭니다.

Kerberos 구성 대문자

시나리오:
SQL Server는 Kerberos 지원 Cloudera 클러스터를 사용하여 설정됩니다. 모든 구성이 변경된 후 SQL Server가 다시 시작되었습니다. 재시작 후 PolyBase Engine 및 PolyBase 데이터 이동 서비스가 실행 중입니다. 다음 오류 메시지가 반환됩니다.

작업 추적기 위치 없이 구성된 데이터 원본:

org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.fs.viewfs.ViewFileSystem을 인스턴스화할 수 없습니다.

작업 추적기 위치로 구성된 데이터 원본:

외부 파일에 액세스하는 동안 [Kerberos 영역을 가져올 수 없음] 오류가 발생했습니다.

가능한 원인:
‘hadoop.security.authentication’ 속성의 값이 Coresite.xml의 kerberos를 언급합니다.

가능한 해결 방법:
Coresite.xml의 ‘hadoop.security.authentication’ 속성은 KERBEROS(모두 대문자) 값이어야 합니다.

PolyBase 및 Kerberos 문제 해결에 대한 자세한 내용은 PolyBase Kerberos 연결 문제 해결을 참조하세요.

Mapred-site.xml에 필수 값 누락

시나리오:
SQL Server 또는 APS는 지원되는 HDP 클러스터를 사용하여 설정됩니다. 쿼리에 푸시다운 작업이 필요하지 않지만 'FORCE PUSHDOWN' 힌트를 사용하면 다음 오류 메시지가 표시되며 실패하게 됩니다.

메시지 7320, 수준 16, 상태 110, 줄 35
연결된 서버 ‘(null)’의 OLE DB 공급자 ‘SQLNCLI11’에 대해 쿼리 ‘Remote Query’를 실행할 수 없습니다. 내부 오류 때문에 외부 테이블에 액세스하지 못했습니다. 'JobSubmitter_PollJobStatus 호출 시 Java 예외 발생: 외부 파일에 액세스하는 도중 [org.apache.hadoop.ipc.RemoteException(java.lang.NullPointerException): java.lang.NullPointerException
at org.apache.hadoop.mapreduce.v2.hs.HistoryClientService$HSClientProtocolHandler.getTaskAttemptCompletionEvents(HistoryClientService.java:277)
at org.apache.hadoop.mapreduce.v2.api.impl.pb.service.MRClientProtocolPBServiceImpl.getTaskAttemptCompletionEvents(MRClientProtocolPBServiceImpl.java:173)
at org.apache.hadoop.yarn.proto.MRClientProtocol$MRClientProtocolService$2.callBlockingMethod(MRClientProtocol.java:283)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2127)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2123)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2121)
] 외부 파일에 액세스하는 동안 발생했습니다.'

가능한 원인:
Mapred-site.xml에 중간 및 최종 결과를 확인하는 데 필요한 값이 일부 누락되었습니다.

가능한 해결 방법:
다음 속성을 추가하고 SQL Server의 mapred-site.xml 파일에서 Ambari에 표시된 대로 올바른 값을 연결합니다.

<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 클러스터에 액세스하도록 구성되었습니다. 외부 테이블을 만들면 다음 오류 중 하나가 반환됩니다.

연결된 서버 ‘(null)’의 OLE DB 공급자 ‘SQLNCLI11’에 대해 쿼리 ‘Remote Query’를 실행할 수 없습니다. 110802, 내부 DMS 오류가 발생하여 이 작업이 실패했습니다. 세부 정보: 예외: Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.DmsSqlNativeException, 메시지: 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 Driver 13 for 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
at Microsoft.SqlServer.DataWarehouse.DataMovement.Common.ExternalAccess.HdfsBridgeReadAccess.Read(MemoryBuffer buffer, Boolean& isDone)
at Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.DataReader.ExternalMoveBufferReader.Read()
at Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.ExternalMoveReaderWorker.ReadAndSendData()
at Microsoft.SqlServer.DataWarehouse.DataMovement.Workers.ExternalMoveReaderWorker.Execute(Object status)

가능한 원인:
이 오류 메시지는 Hadoop 클러스터가 IP 주소가 아닌 호스트 이름을 사용하여 클러스터 외부에서만 데이터 노드에 액세스할 수 있는 구성에서 설정되면 표시될 수 있습니다.

가능한 해결 방법:
클라이언트(SQL Server) 쪽의 hdfs-site.xml 파일에 다음을 추가합니다. 이 구성은 이름 노드가 내부 IP 주소 대신 호스트 이름을 사용하여 데이터 노드에 대한 URI를 반환하도록 강제합니다.

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

폴더 조직에서 과도한 메모리 오버헤드를 강제로 발생

시나리오:
SQL Server에서 대량의 파일(재귀적 디렉터리 경로에 파일 >30,000개)이 있는 디렉터리에서 PolyBase 쿼리를 실행 중이며, 다음 오류 메시지 중 하나가 반환됩니다.

메시지 105019, 수준 16, 상태 1, 줄 1
내부 오류로 인해 외부 테이블에 액세스하지 못했습니다. 'HdfsBridge_GetFileNameByIndex에 대한 호출에서 Java 예외가 발생했습니다. Java 예외 메시지: GC 오버헤드 제한을 초과했습니다. 외부 파일에 액세스하는 동안 [GC 오버헤드 한도 초과] 오류가 발생했습니다.'

메시지 105019, 수준 16, 상태 1, 줄 1
내부 오류로 인해 외부 테이블에 액세스하지 못했습니다. 'HdfsBridge_GetDirectoryFiles에 대한 호출에서 Java 예외가 발생했습니다. Java 예외 메시지: Java 힙 공간: 외부 파일에 액세스하는 동안 [Java 힙 공간] 오류가 발생했습니다.'

가능한 원인:
경로를 처리할 때 PolyBase는 해당 경로 아래의 모든 파일을 열거하고 파일을 나타내는 데 사용되는 데이터 구조와 연결된 고정 메모리 오버헤드가 있습니다. 많은 수의 파일을 사용하면 이 오버헤드가 눈에 띄게 되고 결국 JVM에서 사용할 수 있는 모든 메모리를 사용할 수 있습니다.

가능한 해결 방법:
각 디렉터리에 파일의 하위 집합이 포함되도록 여러 디렉터리에서 데이터를 다시 정렬한 다음, 한 번에 원래 경로의 일부에서 작동하는 여러 디렉터리에서 쿼리를 세분화하고 테이블을 SQL Server 테이블로 구체화합니다(조인하기 전에).

예: 외부 테이블 데이터가 Orders/file1.txt,...,file30K.txt 위치에 있다고 가정해 보겠습니다.

Orders/yyyy/mm/dd/file1.txt의 기존 파일 파티션 구조에 데이터가 배치되도록 레이아웃을 변경합니다. 외부 테이블이 월(mm) 또는 일(dd)과 같은 하위 디렉터리 경로를 가리키고 파일을 SQL Server 테이블에 조각으로 가져온 다음 한 테이블의 일부로 추가합니다. 시작할 올바른 디렉터리 구조가 있더라도 JVM 메모리가 부족하지 않고 많은 파일을 사용할 수 있도록 2단계를 수행합니다.

구성 파일의 예기치 않은 문자

시나리오:
Yarn-site.xml, hdfs-site.xml 및 기타 구성 파일을 수정하는 Hadoop 클러스터를 사용하여 SQL Server 또는 APS를 설정합니다. 다음 SQL Server 오류 메시지가 관찰됩니다.

메시지 105019, 수준 16, 상태 1, 줄 1
Microsoft.SqlServer.DataWarehouse.Common.ErrorHandling.MppSqlException: 내부 오류 때문에 외부 테이블 액세스에 실패했습니다. 'HdfsBridge_Connect 호출에서 Java 예외가 발생했습니다. Java 예외 메시지:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.: 오류 [com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.] 외부 파일에 액세스하는 동안 발생했습니다.' , ,

가능한 원인:
이 오류는 웹사이트 또는 채팅 창에서 텍스트를 복사하여 구성 파일에 붙여넣을 때 발생할 수 있습니다. 원치 않는/인쇄할 수 없는 문자가 구성 파일에 있는 것일 수 있습니다.

가능한 해결 방법:
(메모장이 아닌) 다른 텍스트 편집기에서 파일을 열고 해당 문자를 찾아 제거합니다. 필요한 서비스를 다시 시작합니다.

델타 테이블 쿼리가 오류 2571 및 16513으로 실패할 수 있음

시나리오:
외부 델타 테이블을 쿼리할 때 다음 오류가 발생할 수 있습니다.

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 서버 역할을 실행해야 하는 sysadmin 쿼리 힌트가 있기 때문에 발생할 수 있습니다.

가능한 해결 방법:
이 경우 추적 플래그 14073을 전역적으로 사용하도록 설정하여 문제를 해결할 수 있으며 이로 인해 쿼리 힌트가 추가되지 않습니다.

참고 항목