CREATE EXTERNAL DATA SOURCE(Transact-SQL)
SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, 분석 플랫폼 시스템(PDW) 또는 Azure SQL Edge를 사용하여 쿼리용 외부 데이터 원본을 만듭니다.
이 아티클에서는 원하는 SQL 제품에 대한 구문, 인수, 설명, 사용 권한 및 예제를 제공합니다.
제품 선택
다음 행에서 관심 있는 제품 이름을 선택하면 해당 제품의 정보만 표시됩니다.
* SQL Server *
개요: SQL Server 2016
적용 대상: SQL Server 2016(13.x) 이상 버전
PolyBase 쿼리에 대한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 다음과 같은 기본 사용 사례를 지원하는 데 사용됩니다.
- PolyBase를 사용하여 데이터 가상화 및 데이터 로드
BULK INSERT
또는OPENROWSET
를 사용한 대량 로드 작업
참고
이 구문은 SQL Server 버전마다 다릅니다. 버전 선택기 드롭다운을 사용하여 적절한 버전을 선택합니다.
SQL Server 2019(15.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
SQL Server 2022(16.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
SQL Server 2016용 구문
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = { HADOOP } ]
[ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 SQL Server의 데이터베이스 내에서 반드시 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 | 제품 / 서비스별로 지원되는 위치 | 인증 |
---|---|---|---|---|
Cloudera CDH 또는 Hortonworks HDP | hdfs |
<Namenode>[:port] |
SQL Server 2016(13.x)에서 SQL Server 2019(15.x)까지 | 익명 또는 기본 인증 |
Azure Storage 계정(V2) | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
SQL Server 2016(13.x)로 시작 계층 구조 네임스페이스는 지원되지 않음 |
Azure Storage 계정 키 |
위치 경로:
<Namenode>
= Hadoop 클러스터에 있는Namenode
의 머신 이름, 이름 서비스 URI 또는 IP 주소입니다. PolyBase는 Hadoop 클러스터에서 사용하는 모든 DNS 이름을 확인해야 합니다.port
= 외부 데이터 원본이 수신 대기 중인 포트입니다. Hadoop에서는fs.defaultFS
구성 매개 변수를 사용하여 포트를 찾을 수 있습니다. 기본값은 8020입니다.<container>
= 데이터를 보관하는 스토리지 계정의 컨테이너입니다. 루트 컨테이너는 읽기 전용이므로 데이터를 컨테이너에 다시 쓸 수 없습니다.<storage_account>
= Azure 리소스의 스토리지 계정 이름입니다.<server_name>
= 호스트 이름입니다.<instance_name>
= SQL Server 명명된 인스턴스의 이름입니다. 대상 인스턴스에서 SQL Server Browser Service가 실행 중인 경우에 사용됩니다.
위치 설정 시 추가 참고 사항 및 지침:
- SQL Server 데이터베이스 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
- 일관된 쿼리 의미 체계를 보장하기 위해 Hadoop을 쿼리할 때 모든 테이블에 대해 동일한 외부 데이터 원본을 사용합니다.
wasbs
는 선택 사항이지만, SQL Server 2016(13.x)에서 Azure Storage 계정에 액세스하는 데 권장됩니다. 데이터가 보안 TLS/SSL 연결을 사용하여 전송되기 때문입니다.- Hadoop
Namenode
장애 조치(failover) 중에 PolyBase 쿼리를 성공적으로 수행하려면 Hadoop 클러스터의Namenode
에 대한 가상 IP 주소 사용을 고려하세요. 그렇지 않은 경우 ALTER EXTERNAL DATA SOURCE 명령을 실행하여 새 위치를 가리킵니다.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는 CREDENTIAL
이 필요하지 않습니다.
데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
TYPE = [ HADOOP ]
구성 중인 외부 데이터 원본의 유형을 지정합니다. SQL Server 2016에서는 이 매개 변수가 항상 필요하며 HADOOP
으로만 지정되어야 합니다. Cloudera CDH, Hortonworks HDP 또는 Azure Storage 계정에 대한 연결을 지원합니다. 이 매개 변수의 동작은 이후 버전의 SQL Server와 다릅니다.
Azure Storage 계정에서 데이터를 로드하는 데 사용하는HADOOP
= TYPE
예제는 wasb:// 인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기를 참조하세요.
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
Cloudera CDH, Hortonworks HDP 또는 Azure Storage 계정에 연결할 때만 이 선택적 값을 구성합니다. 지원되는 Hadoop 버전의 전체 목록은 PolyBase 연결 구성(Transact-SQL)을 참조하세요.
RESOURCE_MANAGER_LOCATION
정의된 경우 쿼리 최적화 프로그램은 성능 향상을 위해 비용 기반 결정을 내립니다. MapReduce 작업을 사용하여 Hadoop으로 계산을 푸시 다운할 수 있습니다. RESOURCE_MANAGER_LOCATION
을 지정하면 Hadoop과 SQL Server 간에 전송되는 데이터 양을 크게 줄여 쿼리 성능을 향상시킬 수 있습니다.
리소스 관리자를 지정하지 않은 경우 Hadoop에 대한 푸시 컴퓨팅은 PolyBase 쿼리에 대해 비활성화됩니다. 푸시 다운이 활성화된 Hadoop을 참조하는 외부 데이터 원본 만들기는 구체적인 예제와 추가 지침을 제공합니다.
외부 데이터 원본을 만들 때 RESOURCE_MANAGER_LOCATION 값의 유효성이 검사되지 않습니다. 잘못된 값을 입력하면 제공된 값을 확인할 수 없으므로 푸시 다운을 시도할 때마다 실행 시 쿼리 오류가 발생할 수 있습니다.
PolyBase가 Hadoop 외부 데이터 원본에서 올바르게 작동하려면 다음 Hadoop 클러스터 구성 요소에 대한 포트가 열려 있어야 합니다.
- HDFS 포트
- Namenode
- Datanode
- Resource Manager
- 작업 제출
- 작업 기록
포트를 지정하지 않을 경우 기본값은 'hadoop 연결' 구성에 대한 현재 설정을 사용하여 선택됩니다.
Hadoop 연결 | 기본 Resource Manager 포트 |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
8 | 8032 |
다음 표에서는 이러한 구성 요소의 기본 포트를 보여 줍니다. Hadoop 버전 종속성뿐만 아니라 기본 포트 할당을 사용하지 않는 사용자 지정 구성도 가능합니다.
Hadoop 클러스터 구성 요소 | 기본 포트 |
---|---|
NameNode | 8020 |
DataNode(데이터 전송, 비 권한 IPC 포트) | 50010 |
DataNode(데이터 전송, 권한 IPC 포트) | 1019 |
Resource Manager 작업 제출(Hortonworks 1.3) | 50300 |
Resource Manager 작업 제출(Cloudera 4.3) | 8021 |
Resource Manager 작업 제출(Windows의 Hortonworks 2.0, Linux의 Cloudera 5.x) | 8032 |
Resource Manager 작업 제출(Linux의 Hortonworks 2.x, 3.0, Windows의 Hortonworks 2.1~3) | 8050 |
Resource Manager 작업 기록 | 10020 |
사용 권한
SQL Server의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
보안
PolyBase는 대부분의 외부 데이터 원본에 대해 프록시 기반 인증을 지원합니다. 데이터베이스 범위 자격 증명을 생성하여 프록시 계정을 만듭니다.
예
중요
PolyBase를 설치하고 사용하도록 설정하는 방법에 대한 자세한 내용은 Windows에 PolyBase 설치를 참조하세요.
A. Hadoop를 참조하는 외부 데이터 원본 만들기
Hortonworks HDP 또는 Cloudera CDH Hadoop 클러스터를 참조하는 외부 데이터 원본을 만들려면 머신 이름 또는 Hadoop Namenode
및 포트의 IP 주소를 지정합니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. 푸시 다운이 활성화된 상태에서 Hadoop를 참조하는 외부 데이터 원본 만들기
RESOURCE_MANAGER_LOCATION
옵션을 지정하여 PolyBase 쿼리에 대한 Hadoop 계산 푸시 다운을 활성화합니다. 활성화되면 PolyBase는 쿼리 계산을 Hadoop에 푸시해야 하는지 여부를 결정하기 위해 비용 기반 결정을 내립니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
C. Kerberos 보안 Hadoop를 참조하는 외부 데이터 원본 만들기
Hadoop 클러스터가 Kerberos 보안 방식인지 확인하려면 Hadoop core-site.xml에서 hadoop.security.authentication
속성의 값을 확인합니다. Kerberos 보안 Hadoop 클러스터를 확인하려면 Kerberos 사용자 이름과 암호를 포함한 데이터베이스 범위 자격 증명을 지정해야 합니다. 데이터베이스 범위 자격 증명 비밀을 암호화하는 데에는 데이터베이스 마스터 키가 사용됩니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
SECRET = '<hadoop_password>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
D. wasb://인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기
이 예제에서 외부 데이터 원본은 logs
라는 Azure V2 Storage 계정입니다. 스토리지 컨테이너를 daily
라고 합니다. Azure Storage 외부 데이터 원본은 데이터 전송 전용입니다. 조건자 푸시 다운을 지원하지 않습니다. 계층 구조 네임스페이스는 wasb://
인터페이스를 통해 데이터에 액세스하는 경우 지원되지 않습니다.
이 예제에서는 Azure V2 Storage 계정에 대한 인증을 위해 데이터베이스 범위 자격 증명을 만드는 방법을 보여 줍니다. 데이터베이스 자격 증명 비밀에 Azure Storage 계정 키를 지정합니다. Azure Storage에 대한 인증 중에는 사용되지 않으므로 데이터베이스 범위 지정 자격 증명 ID에 문자열을 지정할 수 있습니다. WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
SQL Server 2016(13.x)에서는 Azure Storage에 액세스하는 경우에도 TYPE
을 HADOOP
으로 설정해야 합니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
다음 단계
개요: SQL Server 2017
적용 대상: SQL Server 2017(14.x) 전용
PolyBase 쿼리에 대한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 다음과 같은 기본 사용 사례를 지원하는 데 사용됩니다.
- PolyBase를 사용하여 데이터 가상화 및 데이터 로드
BULK INSERT
또는OPENROWSET
를 사용한 대량 로드 작업
참고
이 구문은 SQL Server on Linux의 버전마다 다릅니다. 버전 선택기 드롭다운을 사용하여 적절한 버전을 선택합니다.
SQL Server 2019(15.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
SQL Server 2022(16.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
참고
이 구문은 SQL Server 버전마다 다릅니다. 버전 선택기 드롭다운을 사용하여 적절한 버전을 선택합니다.
SQL Server 2019(15.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
SQL Server 2022(16.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
SQL Server 2017용 구문
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = { HADOOP | BLOB_STORAGE } ]
[ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 SQL Server의 데이터베이스 내에서 반드시 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 | 제품 / 서비스별로 지원되는 위치 | 인증 |
---|---|---|---|---|
Cloudera CDH 또는 Hortonworks HDP | hdfs |
<Namenode>[:port] |
SQL Server 2016(13.x)에서 SQL Server 2019(15.x)까지만 | 익명 또는 기본 인증 |
Azure Storage 계정(V2) | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
SQL Server 2016(13.x)로 시작 계층 구조 네임스페이스는 지원되지 않음 |
Azure Storage 계정 키 |
대량 작업 | https |
<storage_account>.blob.core.windows.net/<container> |
SQL Server 2017(14.x)부터 | 공유 액세스 서명(SAS) |
위치 경로:
<
Namenode>
= Hadoop 클러스터에 있는Namenode
의 머신 이름, 이름서비스 URI 또는 IP 주소입니다. PolyBase는 Hadoop 클러스터에서 사용하는 모든 DNS 이름을 확인해야 합니다.port
= 외부 데이터 원본이 수신 대기 중인 포트입니다. Hadoop에서는fs.defaultFS
구성 매개 변수를 사용하여 포트를 찾을 수 있습니다. 기본값은 8020입니다.<container>
= 데이터를 보관하는 스토리지 계정의 컨테이너입니다. 루트 컨테이너는 읽기 전용이므로 데이터를 컨테이너에 다시 쓸 수 없습니다.<storage_account>
= Azure 리소스의 스토리지 계정 이름입니다.<server_name>
= 호스트 이름입니다.<instance_name>
= SQL Server 명명된 인스턴스의 이름입니다. 대상 인스턴스에서 SQL Server Browser Service가 실행 중인 경우에 사용됩니다.
위치 설정 시 추가 참고 사항 및 지침:
- SQL Server 데이터베이스 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
- 일관된 쿼리 의미 체계를 보장하기 위해 Hadoop을 쿼리할 때 모든 테이블에 대해 동일한 외부 데이터 원본을 사용합니다.
ODBC
를 통해 연결할 때Driver={<Name of Driver>}
를 지정합니다.wasbs
는 선택 사항이지만, SQL Server 2017(14.x)에서 Azure Storage 계정에 액세스하는 데 권장됩니다. 데이터가 보안 TLS/SSL 연결을 사용하여 전송되기 때문입니다.- Hadoop
Namenode
장애 조치(failover) 중에 PolyBase 쿼리를 성공적으로 수행하려면 Hadoop 클러스터의Namenode
에 대한 가상 IP 주소 사용을 고려하세요. 그렇지 않은 경우 ALTER EXTERNAL DATA SOURCE 명령을 실행하여 새 위치를 가리킵니다.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.TYPE
=BLOB_STORAGE
인 경우SHARED ACCESS SIGNATURE
를 ID로 사용하여 자격 증명을 만들어야 합니다.TYPE
=BLOB_STORAGE
는 대량 작업에만 사용할 수 있습니다.TYPE
=BLOB_STORAGE
를 사용하여 외부 데이터 원본에 대한 외부 테이블을 만들 수 없습니다.- WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
TYPE
=HADOOP
인 경우 스토리지 계정 키를SECRET
으로 사용하여 자격 증명을 만들어야 합니다.
공유 액세스 서명을 만드는 방법에는 여러 가지가 있습니다.
Azure Portal -><Your_Storage_Account> -> 공유 액세스 서명 -> 권한 구성 -> SAS 및 연결 문자열 생성으로 이동하여 SAS 토큰을 만들 수 있습니다. 자세한 내용은 공유 액세스 서명 생성을 참조하세요.
PowerShell, Azure CLI, .NET 및 REST API를 통해 프로그래밍 방식으로 SAS를 만들 수 있습니다. 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여를 참조하세요.
SAS 토큰은 다음과 같이 구성되어야 합니다.
- SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
?
제외 - 유효한 만료 기간을 사용합니다(모든 날짜는 UTC 시간임).
- 로드해야 하는 파일에 대해 적어도 읽기 권한을 승인해야 합니다(예:
srt=o&sp=r
). 다양한 사용 사례에 대해 여러 공유 액세스 서명을 만들 수 있습니다. 권한은 다음과 같이 부여되어야 합니다.
작업 사용 권한 파일에서 데이터 읽기 읽기 여러 파일 및 하위 폴더에서 데이터를 읽습니다. 읽기 및 목록 - SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
SHARED ACCESS SIGNATURE
및 TYPE
= BLOB_STORAGE
에서 CREDENTIAL
을 사용하는 예제는 대량 작업을 실행하고 Azure Storage에서 SQL Database로 데이터를 검색하기 위한 외부 데이터 원본 만들기를 참조하세요.
데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
TYPE = [ HADOOP | BLOB_STORAGE ]
구성 중인 외부 데이터 원본의 유형을 지정합니다. 이 매개 변수가 항상 필요한 것은 아니며, Cloudera CDH, Hortonworks HDP, Azure Storage 계정 또는 Azure Data Lake Storage Gen2에 연결할 때만 지정해야 합니다.
HADOOP
은 외부 데이터 원본이 Cloudera CDH, Hortonworks HDP, Azure Storage 계정 또는 Azure Data Lake Storage Gen2인 경우 사용합니다.BLOB_STORAGE
는 BULK INSERT 또는 OPENROWSET를 사용하여 Azure Storage 계정에서 대량 작업을 실행하는 경우 사용합니다. SQL Server 2017(14.x)에서 도입되었습니다. Azure Storage에 대해 CREATE EXTERNAL TABLE을 수행하려는 경우HADOOP
을 사용합니다.
참고
Azure Storage에 액세스하는 경우에도 TYPE
을 HADOOP
으로 설정해야 합니다.
Azure Storage 계정에서 데이터를 로드하는 데 사용하는HADOOP
= TYPE
예제는 wasb:// 인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기를 참조하세요.
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
Cloudera CDH, Hortonworks HDP 또는 Azure Storage 계정에 연결할 때만 이 선택적 값을 구성합니다. 지원되는 Hadoop 버전의 전체 목록은 PolyBase 연결 구성(Transact-SQL)을 참조하세요.
RESOURCE_MANAGER_LOCATION
이 정의되면 쿼리 최적화 프로그램은 성능 향상을 위해 비용 기반 결정을 내립니다. MapReduce 작업을 사용하여 Hadoop으로 계산을 푸시 다운할 수 있습니다. RESOURCE_MANAGER_LOCATION
을 지정하면 Hadoop과 SQL Server 간에 전송되는 데이터 양을 크게 줄여 쿼리 성능을 향상시킬 수 있습니다.
리소스 관리자를 지정하지 않은 경우 Hadoop에 대한 푸시 컴퓨팅은 PolyBase 쿼리에 대해 비활성화됩니다. 푸시 다운이 활성화된 Hadoop을 참조하는 외부 데이터 원본 만들기는 구체적인 예제와 추가 지침을 제공합니다.
외부 데이터 원본을 만들 때 RESOURCE_MANAGER_LOCATION 값의 유효성이 검사되지 않습니다. 잘못된 값을 입력하면 제공된 값을 확인할 수 없으므로 푸시 다운을 시도할 때마다 실행 시 쿼리 오류가 발생할 수 있습니다.
PolyBase가 Hadoop 외부 데이터 원본에서 올바르게 작동하려면 다음 Hadoop 클러스터 구성 요소에 대한 포트가 열려 있어야 합니다.
- HDFS 포트
- Namenode
- Datanode
- Resource Manager
- 작업 제출
- 작업 기록
포트를 지정하지 않을 경우 기본값은 'hadoop 연결' 구성에 대한 현재 설정을 사용하여 선택됩니다.
Hadoop 연결 | 기본 Resource Manager 포트 |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
8 | 8032 |
다음 표에서는 이러한 구성 요소의 기본 포트를 보여 줍니다. Hadoop 버전 종속성뿐만 아니라 기본 포트 할당을 사용하지 않는 사용자 지정 구성도 가능합니다.
Hadoop 클러스터 구성 요소 | 기본 포트 |
---|---|
NameNode | 8020 |
DataNode(데이터 전송, 비 권한 IPC 포트) | 50010 |
DataNode(데이터 전송, 권한 IPC 포트) | 1019 |
Resource Manager 작업 제출(Hortonworks 1.3) | 50300 |
Resource Manager 작업 제출(Cloudera 4.3) | 8021 |
Resource Manager 작업 제출(Windows의 Hortonworks 2.0, Linux의 Cloudera 5.x) | 8032 |
Resource Manager 작업 제출(Linux의 Hortonworks 2.x, 3.0, Windows의 Hortonworks 2.1~3) | 8050 |
Resource Manager 작업 기록 | 10020 |
사용 권한
SQL Server의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
보안
PolyBase는 대부분의 외부 데이터 원본에 대해 프록시 기반 인증을 지원합니다. 데이터베이스 범위 자격 증명을 생성하여 프록시 계정을 만듭니다.
HADOOP
유형의 SAS 토큰은 지원되지 않습니다. 스토리지 계정 액세스 키를 대신 사용하는 경우에만 BLOB_STORAGE
유형이 지원됩니다. HADOOP
유형 및 SAS 자격 증명으로 외부 데이터 원본을 만들려고 하면 다음 오류로 인해 실패합니다.
Msg 105019, Level 16, State 1 - EXTERNAL TABLE access failed due to internal error: 'Java exception raised on call to HdfsBridge_Connect. Java exception message: Parameters provided to connect to the Azure storage account are not valid.: Error [Parameters provided to connect to the Azure storage account are not valid.] occurred while accessing external file.'
예
중요
PolyBase를 설치하고 사용하도록 설정하는 방법에 대한 자세한 내용은 Windows에 PolyBase 설치를 참조하세요.
A. Hadoop를 참조하는 외부 데이터 원본 만들기
Hortonworks HDP 또는 Cloudera CDH Hadoop 클러스터를 참조하는 외부 데이터 원본을 만들려면 머신 이름 또는 Hadoop Namenode
및 포트의 IP 주소를 지정합니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. 푸시 다운이 활성화된 상태에서 Hadoop를 참조하는 외부 데이터 원본 만들기
RESOURCE_MANAGER_LOCATION
옵션을 지정하여 PolyBase 쿼리에 대한 Hadoop 계산 푸시 다운을 활성화합니다. 활성화되면 PolyBase는 쿼리 계산을 Hadoop에 푸시해야 하는지 여부를 결정하기 위해 비용 기반 결정을 내립니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
C. Kerberos 보안 Hadoop를 참조하는 외부 데이터 원본 만들기
Hadoop 클러스터가 Kerberos 보안 방식인지 확인하려면 Hadoop core-site.xml에서 hadoop.security.authentication
속성의 값을 확인합니다. Kerberos 보안 Hadoop 클러스터를 확인하려면 Kerberos 사용자 이름과 암호를 포함한 데이터베이스 범위 자격 증명을 지정해야 합니다. 데이터베이스 범위 자격 증명 비밀을 암호화하는 데에는 데이터베이스 마스터 키가 사용됩니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
SECRET = '<hadoop_password>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
D. wasb://인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기
이 예제에서 외부 데이터 원본은 logs
라는 Azure V2 Storage 계정입니다. 스토리지 컨테이너를 daily
라고 합니다. Azure Storage 외부 데이터 원본은 데이터 전송 전용입니다. 조건자 푸시 다운을 지원하지 않습니다. 계층 구조 네임스페이스는 wasb://
인터페이스를 통해 데이터에 액세스하는 경우 지원되지 않습니다. WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
이 예제에서는 Azure V2 Storage 계정에 대한 인증을 위해 데이터베이스 범위 자격 증명을 만드는 방법을 보여 줍니다. 데이터베이스 자격 증명 비밀에 Azure Storage 계정 키를 지정합니다. Azure Storage에 대한 인증 중에는 사용되지 않으므로 데이터베이스 범위 지정 자격 증명 ID에 문자열을 지정할 수 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
예제: 대량 작업
중요
대량 작업을 위해 외부 데이터 원본을 구성할 때 LOCATION
URL 끝에 추적 / , 파일 이름 또는 공유 액세스 서명 매개 변수를 추가하지 마세요.
E. Azure Storage에서 데이터를 검색하는 대량 작업을 위한 외부 데이터 원본 만들기
적용 대상: SQL Server 2017(14.x) 이상
BULK INSERT 또는 OPENROWSET을 사용하여 대량 작업에 대한 다음 데이터 원본을 만듭니다. 자격 증명은 SHARED ACCESS SIGNATURE
를 ID로 설정해야 하며 SAS 토큰에서 앞에 ?
가 없어야 하며, 적어도 로드할 파일에 대한 읽기 권한이 있어야 하고(예: srt=o&sp=r
) 만료 기간이 유효해야 합니다(모든 날짜는 UTC 시간임). 공유 액세스 서명에 대한 자세한 내용은 SAS(공유 액세스 서명) 사용을 참조하세요.
CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
-- Remove ? from the beginning of the SAS token
SECRET = '<azure_storage_account_key>';
CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
CREDENTIAL = AccessAzureInvoices,
TYPE = BLOB_STORAGE
);
이 예제를 사용하는 방법에 대한 자세한 내용은 BULK INSERT 예제를 참조하세요.
다음 단계
개요: SQL Server 2019
적용 대상: SQL Server 2019(15.x) 이상
PolyBase 쿼리에 대한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 다음과 같은 기본 사용 사례를 지원하는 데 사용됩니다.
- PolyBase를 사용하여 데이터 가상화 및 데이터 로드
BULK INSERT
또는OPENROWSET
를 사용한 대량 로드 작업
참고
이 구문은 SQL Server 버전마다 다릅니다. 버전 선택기 드롭다운을 사용하여 적절한 버전을 선택합니다.
SQL Server 2022(16.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
참고
이 구문은 SQL Server 버전마다 다릅니다. 버전 선택기 드롭다운을 사용하여 적절한 버전을 선택합니다.
SQL Server 2022(16.x)의 기능을 보려면 CREATE EXTERNAL DATA SOURCE를 참조하세요.
SQL Server 2019용 구문
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CONNECTION_OPTIONS = '<key_value_pairs>'[,...]]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] PUSHDOWN = { ON | OFF } ]
[ [ , ] TYPE = { HADOOP | BLOB_STORAGE } ]
[ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 SQL Server의 데이터베이스 내에서 반드시 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 | 제품 / 서비스별로 지원되는 위치 | 인증 |
---|---|---|---|---|
Cloudera CDH 또는 Hortonworks HDP | hdfs |
<Namenode>[:port] |
SQL Server 2016(13.x)에서 SQL Server 2019(15.x)까지 | 익명 또는 기본 인증 |
Azure Storage 계정(V2) | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
SQL Server 2016(13.x)로 시작 계층 구조 네임스페이스는 지원되지 않음 |
Azure Storage 계정 키 |
SQL Server | sqlserver |
<server_name>[\<instance_name>][:port] |
SQL Server 2019(15.x)부터 | SQL 인증 전용 |
Oracle | oracle |
<server_name>[:port] |
SQL Server 2019(15.x)부터 | 기본 인증 전용입니다. |
Teradata | teradata |
<server_name>[:port] |
SQL Server 2019(15.x)부터 | 기본 인증 전용입니다. |
MongoDB 또는 Cosmos DB API for MongoDB | mongodb |
<server_name>[:port] |
SQL Server 2019(15.x)부터 | 기본 인증 전용입니다. |
일반 ODBC | odbc |
<server_name>[:port] |
SQL Server 2019(15.x)부터 - Windows만 해당 | 기본 인증 전용입니다. |
대량 작업 | https |
<storage_account>.blob.core.windows.net/<container> |
SQL Server 2017(14.x)부터 | 공유 액세스 서명(SAS) |
Azure Data Lake Storage Gen2 | abfs[s] |
abfss://<container>@<storage _account>.dfs.core.windows.net |
SQL Server 2019(15.x) CU11+부터 | 스토리지 액세스 키 |
SQL Server 빅 데이터 클러스터 데이터 풀 | sqldatapool |
sqldatapool://controller-svc/default |
SQL Server 2019 빅 데이터 클러스터에서만 지원 | 기본 인증 전용입니다. |
SQL Server 빅 데이터 클러스터 스토리지 풀 | sqlhdfs |
sqlhdfs://controller-svc/default |
SQL Server 2019 빅 데이터 클러스터에서만 지원 | 기본 인증 전용입니다. |
위치 경로:
<Namenode>
= Hadoop 클러스터에 있는Namenode
의 머신 이름, 이름 서비스 URI 또는 IP 주소입니다. PolyBase는 Hadoop 클러스터에서 사용하는 모든 DNS 이름을 확인해야 합니다.port
= 외부 데이터 원본이 수신 대기 중인 포트입니다. Hadoop에서는fs.defaultFS
구성 매개 변수를 사용하여 포트를 찾을 수 있습니다. 기본값은 8020입니다.<container>
= 데이터를 보관하는 스토리지 계정의 컨테이너입니다. 루트 컨테이너는 읽기 전용이므로 데이터를 컨테이너에 다시 쓸 수 없습니다.<storage_account>
= Azure 리소스의 스토리지 계정 이름입니다.<server_name>
= 호스트 이름입니다.<instance_name>
= SQL Server 명명된 인스턴스의 이름입니다. 대상 인스턴스에서 SQL Server Browser Service가 실행 중인 경우에 사용됩니다.
위치 설정 시 추가 참고 사항 및 지침:
- SQL Server 데이터베이스 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
- 일관된 쿼리 의미 체계를 보장하기 위해 Hadoop을 쿼리할 때 모든 테이블에 대해 동일한 외부 데이터 원본을 사용합니다.
sqlserver
커넥터를 사용하여 SQL Server 2019(15.x)를 다른 SQL Server 또는 Azure SQL Database에 연결할 수 있습니다.ODBC
를 통해 연결할 때Driver={<Name of Driver>}
를 지정합니다.wasbs
또는abfss
사용은 선택 사항이지만, SQL Server 2019(15.x)에서 Azure Storage 계정에 액세스하는 데 권장됩니다. 데이터가 보안 TLS/SSL 연결을 사용하여 전송되기 때문입니다.abfs
또는abfss
API는 SQL Server 2019 (15.x) CU11 이상부터 Azure Storage 계정에 액세스할 때 지원되지 않습니다. 자세한 내용은 ABFS(Azure Blob 파일 시스템) 드라이버를 참조하세요.abfs[s]
를 사용하는 Azure Storage 계정(V2)의 계층 구조 네임스페이스 옵션은 SQL Server 2019 (15.x) CU11 이상부터 Azure Data Lake Storage Gen2를 통해 지원됩니다. 이외의 경우에는 계층 구조 네임스페이스 옵션이 지원되지 않으며 이 옵션은 사용하지 않도록 설정되어야 합니다.- Hadoop
Namenode
장애 조치(failover) 중에 PolyBase 쿼리를 성공적으로 수행하려면 Hadoop 클러스터의Namenode
에 대한 가상 IP 주소 사용을 고려하세요. 그렇지 않은 경우 ALTER EXTERNAL DATA SOURCE 명령을 실행하여 새 위치를 가리킵니다. sqlhdfs
와sqldatapool
형식은 빅 데이터 클러스터의 마스터 인스턴스와 스토리지 풀 간의 연결을 지원합니다. Cloudera CDH 또는 Hortonworks HDP의 경우hdfs
를 사용합니다. SQL Server 빅 데이터 클러스터 스토리지 풀 쿼리에sqlhdfs
사용에 대한 자세한 내용은 SQL Server 2019 빅 데이터 클러스터에서 HDFS 쿼리를 참조하세요.- HDFS Cloudera(CDP) 및 Hortonworks(HDP) 외부 데이터 원본에 대한 SQL Server 지원은 사용 중지되며 SQL Server 2022(16.x)에 포함되지 않습니다. 자세한 내용은 Microsoft SQL Server 플랫폼의 빅 데이터 옵션을 참조하세요.
CONNECTION_OPTIONS = key_value_pair
SQL Server 2019(15.x) 이상에 지정됩니다. ODBC
를 외부 데이터 원본에 연결할 때 추가 옵션을 지정합니다. 여러 연결 옵션을 사용하려면 세미콜론으로 구분합니다.
SQL Server, Oracle, Teradata, MongoDB 및 Azure Cosmos DB API for MongoDB용으로 기본 제공되는 ODBC
커넥터뿐만 아니라 일반 ODBC
연결에 적용됩니다.
key_value_pair
는 키워드이며 특정 연결 옵션 값입니다. 사용 가능한 키워드 및 값은 외부 데이터 원본 유형에 따라 달라집니다. 최소한 드라이버 이름이 필요하지만, 설정하면 유용하고 문제 해결에 도움이 되는 APP='<your_application_name>'
, ApplicationIntent= ReadOnly|ReadWrite
등의 다른 옵션도 있습니다.
가능한 키 값 쌍은 외부 데이터 원본 공급업체에 대한 공급자와 관련이 있습니다. 각 공급자에 대한 자세한 내용은 외부 데이터 원본 만들기(Transact-SQL) 연결 옵션을 참조하세요.
SQL Server 2019(15.x) 누적 업데이트 19부터 Oracle TNS 파일을 지원하기 위한 추가 키워드가 도입되었습니다.
- 키워드
TNSNamesFile
는 Oracle 서버에 있는 파일에 대한 파일 경로를tnsnames.ora
지정합니다. - 키워드
ServerName
는 호스트 이름과 포트를 바꾸는 데 사용할 내부tnsnames.ora
별칭을 지정합니다.
Pushdown = ON | OFF
SQL Server 2019(15.x)에만 지정됩니다. 외부 데이터 원본에 푸시 다운할 수 있는지 여부를 알려줍니다. 기본적으로 ON입니다.
PUSHDOWN
은 외부 데이터 원본 수준에서 SQL Server, Oracle, Teradata, MongoDB, Azure Cosmos DB API for MongoDB 또는 ODBC에 연결할 때 지원됩니다.
쿼리 수준에서 푸시 다운을 활성화 또는 비활성화는 힌트를 통해 구현됩니다.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.TYPE
=BLOB_STORAGE
인 경우SHARED ACCESS SIGNATURE
를 ID로 사용하여 자격 증명을 만들어야 합니다.TYPE
=BLOB_STORAGE
는 대량 작업에만 사용할 수 있습니다.TYPE
=BLOB_STORAGE
를 사용하여 외부 데이터 원본에 대한 외부 테이블을 만들 수 없습니다.
공유 액세스 서명을 만드는 방법에는 여러 가지가 있습니다.
Azure Portal -><Your_Storage_Account> -> 공유 액세스 서명 -> 권한 구성 -> SAS 및 연결 문자열 생성으로 이동하여 SAS 토큰을 만들 수 있습니다. 자세한 내용은 공유 액세스 서명 생성을 참조하세요.
PowerShell, Azure CLI, .NET 및 REST API를 통해 프로그래밍 방식으로 SAS를 만들 수 있습니다. 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여를 참조하세요.
SAS 토큰은 다음과 같이 구성되어야 합니다.
- SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
?
제외 - 유효한 만료 기간을 사용합니다(모든 날짜는 UTC 시간임).
- 로드해야 하는 파일에 대해 적어도 읽기 권한을 승인해야 합니다(예:
srt=o&sp=r
). 다양한 사용 사례에 대해 여러 공유 액세스 서명을 만들 수 있습니다. 권한은 다음과 같이 부여되어야 합니다.
작업 사용 권한 파일에서 데이터 읽기 읽기 여러 파일 및 하위 폴더에서 데이터를 읽습니다. 읽기 및 목록 - SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
SHARED ACCESS SIGNATURE
및 TYPE
= BLOB_STORAGE
에서 CREDENTIAL
을 사용하는 예제는 대량 작업을 실행하고 Azure Storage에서 SQL Database로 데이터를 검색하기 위한 외부 데이터 원본 만들기를 참조하세요.
데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
TYPE = [ HADOOP | BLOB_STORAGE ]
구성 중인 외부 데이터 원본의 유형을 지정합니다. 이 매개 변수가 항상 필요한 것은 아니며, Cloudera CDH, Hortonworks HDP, Azure Storage 계정 또는 Azure Data Lake Storage Gen2에 연결할 때만 지정해야 합니다.
- SQL Server 2019 (15.x)에서는 Cloudera CDH, Hortonworks HDP, Azure Storage 계정에 연결하지 않는 한 TYPE을 지정하지 마세요.
HADOOP
은 외부 데이터 원본이 Cloudera CDH, Hortonworks HDP, Azure Storage 계정 또는 Azure Data Lake Storage Gen2인 경우 사용합니다.BLOB_STORAGE
는 BULK INSERT를 사용하거나 SQL Server 2017(14.x)에서 OPENROWSET를 사용하여 Azure Storage 계정에서 대량 작업을 실행하는 경우 사용합니다. Azure Storage에 대해 CREATE EXTERNAL TABLE을 수행하려는 경우HADOOP
을 사용합니다.- HDFS Cloudera(CDP) 및 Hortonworks(HDP) 외부 데이터 원본에 대한 SQL Server 지원은 사용 중지되며 SQL Server 2022(16.x)에 포함되지 않습니다. 자세한 내용은 Microsoft SQL Server 플랫폼의 빅 데이터 옵션을 참조하세요.
Azure Storage 계정에서 데이터를 로드하는 데 사용하는HADOOP
= TYPE
예제는 wasb:// 인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기를 참조하세요.
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
SQL Server 2019 (15.x)에서는 Cloudera CDH, Hortonworks HDP, Azure Storage 계정에 연결하지 않는 한 RESOURCE_MANAGER_LOCATION을 지정하지 마세요.
Cloudera CDH, Hortonworks HDP 또는 Azure Storage 계정에 연결할 때만 이 선택적 값을 구성합니다. 지원되는 Hadoop 버전의 전체 목록은 PolyBase 연결 구성(Transact-SQL)을 참조하세요.
RESOURCE_MANAGER_LOCATION
정의된 경우 쿼리 최적화 프로그램은 성능 향상을 위해 비용 기반 결정을 내립니다. MapReduce 작업을 사용하여 Hadoop으로 계산을 푸시 다운할 수 있습니다. RESOURCE_MANAGER_LOCATION
을 지정하면 Hadoop과 SQL Server 간에 전송되는 데이터 양을 크게 줄여 쿼리 성능을 향상시킬 수 있습니다.
리소스 관리자를 지정하지 않은 경우 Hadoop에 대한 푸시 컴퓨팅은 PolyBase 쿼리에 대해 비활성화됩니다. 푸시 다운이 활성화된 Hadoop을 참조하는 외부 데이터 원본 만들기는 구체적인 예제와 추가 지침을 제공합니다.
외부 데이터 원본을 만들 때 RESOURCE_MANAGER_LOCATION 값의 유효성이 검사되지 않습니다. 잘못된 값을 입력하면 제공된 값을 확인할 수 없으므로 푸시 다운을 시도할 때마다 실행 시 쿼리 오류가 발생할 수 있습니다.
PolyBase가 Hadoop 외부 데이터 원본에서 올바르게 작동하려면 다음 Hadoop 클러스터 구성 요소에 대한 포트가 열려 있어야 합니다.
- HDFS 포트
- Namenode
- Datanode
- Resource Manager
- 작업 제출
- 작업 기록
포트를 지정하지 않을 경우 기본값은 'hadoop 연결' 구성에 대한 현재 설정을 사용하여 선택됩니다.
Hadoop 연결 | 기본 Resource Manager 포트 |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
8 | 8032 |
다음 표에서는 이러한 구성 요소의 기본 포트를 보여 줍니다. Hadoop 버전 종속성뿐만 아니라 기본 포트 할당을 사용하지 않는 사용자 지정 구성도 가능합니다.
Hadoop 클러스터 구성 요소 | 기본 포트 |
---|---|
NameNode | 8020 |
DataNode(데이터 전송, 비 권한 IPC 포트) | 50010 |
DataNode(데이터 전송, 권한 IPC 포트) | 1019 |
Resource Manager 작업 제출(Hortonworks 1.3) | 50300 |
Resource Manager 작업 제출(Cloudera 4.3) | 8021 |
Resource Manager 작업 제출(Windows의 Hortonworks 2.0, Linux의 Cloudera 5.x) | 8032 |
Resource Manager 작업 제출(Linux의 Hortonworks 2.x, 3.0, Windows의 Hortonworks 2.1~3) | 8050 |
Resource Manager 작업 기록 | 10020 |
사용 권한
SQL Server의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
보안
PolyBase는 대부분의 외부 데이터 원본에 대해 프록시 기반 인증을 지원합니다. 데이터베이스 범위 자격 증명을 생성하여 프록시 계정을 만듭니다.
SQL Server 2019 빅 데이터 클러스터의 스토리지 또는 데이터 풀에 연결하면 사용자의 자격 증명이 백 엔드 시스템을 통해 전달됩니다. 통과 인증을 사용하도록 설정하려면 데이터 풀 자체의 로그인을 만듭니다.
HADOOP
유형의 SAS 토큰은 지원되지 않습니다. 스토리지 계정 액세스 키를 대신 사용하는 경우에만 BLOB_STORAGE
유형이 지원됩니다. HADOOP
유형 및 SAS 자격 증명으로 외부 데이터 원본을 만들려고 하면 다음 오류로 인해 실패합니다.
Msg 105019, Level 16, State 1 - EXTERNAL TABLE access failed due to internal error: 'Java exception raised on call to HdfsBridge_Connect. Java exception message: Parameters provided to connect to the Azure storage account are not valid.: Error [Parameters provided to connect to the Azure storage account are not valid.] occurred while accessing external file.'
예
중요
PolyBase를 설치하고 사용하도록 설정하는 방법에 대한 자세한 내용은 Windows에 PolyBase 설치를 참조하세요.
A. Oracle을 참조하는 SQL Server 2019에서 외부 데이터 원본 만들기
Oracle을 참조하는 외부 데이터 원본을 만들려면 데이터베이스 범위 자격 증명이 있는지 확인합니다. 이 데이터 원본에 대한 계산 푸시 다운을 활성화하거나 비활성화할 수도 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL OracleProxyAccount
WITH IDENTITY = 'oracle_username',
SECRET = 'oracle_password';
CREATE EXTERNAL DATA SOURCE MyOracleServer
WITH (
LOCATION = 'oracle://145.145.145.145:1521',
CREDENTIAL = OracleProxyAccount,
PUSHDOWN = ON
);
필요에 따라 Oracle에 대한 외부 데이터 원본은 프록시 인증을 사용하여 세분화된 액세스 제어를 제공할 수 있습니다. 가장된 사용자에 비해 제한된 액세스 권한을 갖도록 프록시 사용자를 구성할 수 있습니다.
CREATE DATABASE SCOPED CREDENTIAL [OracleProxyCredential]
WITH IDENTITY = 'oracle_username',
SECRET = 'oracle_password';
CREATE EXTERNAL DATA SOURCE [OracleSalesSrvr]
WITH (
LOCATION = 'oracle://145.145.145.145:1521',
CONNECTION_OPTIONS = 'ImpersonateUser=%CURRENT_USER',
CREDENTIAL = [OracleProxyCredential]
);
또는 TNS 인증을 사용할 수 있습니다.
SQL Server 2019(15.x) 누적 업데이트 19 CREATE EXTERNAL DATA SOURCE
부터 이제 Oracle에 연결할 때 TNS 파일 사용을 지원합니다.
매개 변수가 CONNECTION_OPTIONS
확장되어 이제 파일을 찾아보 tnsnames.ora
고 ServerName
서버와의 연결을 설정하는 변수로 사용됩니다TNSNamesFile
.
아래 예제에서 런타임 동안 SQL Server는 지정된 TNSNamesFile
파일 위치를 검색 tnsnames.ora
하고 지정된 호스트 및 네트워크 포트ServerName
를 검색합니다.
CREATE EXTERNAL DATA SOURCE [external_data_source_name]
WITH (
LOCATION = N'oracle://XE',
CREDENTIAL = [OracleCredentialTest],
CONNECTION_OPTIONS = N'TNSNamesFile=C:\Temp\tnsnames.ora;ServerName=XE'
);
MongoDB와 같은 다른 데이터 원본에 대한 추가 예제는 MongoDB에서 외부 데이터에 액세스하도록 PolyBase 구성을 참조하세요.
B. Hadoop를 참조하는 외부 데이터 원본 만들기
Hortonworks HDP 또는 Cloudera CDH Hadoop 클러스터를 참조하는 외부 데이터 원본을 만들려면 머신 이름 또는 Hadoop Namenode
및 포트의 IP 주소를 지정합니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
C. 푸시 다운이 활성화된 상태에서 Hadoop를 참조하는 외부 데이터 원본 만들기
RESOURCE_MANAGER_LOCATION
옵션을 지정하여 PolyBase 쿼리에 대한 Hadoop 계산 푸시 다운을 활성화합니다. 활성화되면 PolyBase는 쿼리 계산을 Hadoop에 푸시해야 하는지 여부를 결정하기 위해 비용 기반 결정을 내립니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
D. Kerberos 보안 Hadoop를 참조하는 외부 데이터 원본 만들기
Hadoop 클러스터가 Kerberos 보안 방식인지 확인하려면 Hadoop core-site.xml에서 hadoop.security.authentication
속성의 값을 확인합니다. Kerberos 보안 Hadoop 클러스터를 확인하려면 Kerberos 사용자 이름과 암호를 포함한 데이터베이스 범위 자격 증명을 지정해야 합니다. 데이터베이스 범위 자격 증명 비밀을 암호화하는 데에는 데이터베이스 마스터 키가 사용됩니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
SECRET = '<hadoop_password>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
E. wasb://인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기
이 예제에서 외부 데이터 원본은 logs
라는 Azure V2 Storage 계정입니다. 스토리지 컨테이너를 daily
라고 합니다. Azure Storage 외부 데이터 원본은 데이터 전송 전용입니다. 조건자 푸시 다운을 지원하지 않습니다. 계층 구조 네임스페이스는 wasb://
인터페이스를 통해 데이터에 액세스하는 경우 지원되지 않습니다. WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
이 예제에서는 Azure V2 Storage 계정에 대한 인증을 위해 데이터베이스 범위 자격 증명을 만드는 방법을 보여 줍니다. 데이터베이스 자격 증명 비밀에 Azure Storage 계정 키를 지정합니다. Azure Storage에 대한 인증 중에는 사용되지 않으므로 데이터베이스 범위 지정 자격 증명 ID에 문자열을 지정할 수 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
F. Polybase 연결을 통해 SQL Server 명명된 인스턴스를 참조하는 외부 데이터 원본 만들기
적용 대상: SQL Server 2019(15.x) 이상
CONNECTION_OPTIONS
의 명명된 인스턴스를 참조하는 외부 데이터 원본을 만들려면 SQL Server를 사용하여 인스턴스 이름을 지정합니다.
다음 예제 WINSQL2019
에서는 호스트 이름이며 SQL2019
인스턴스 이름입니다. 'Server=%s\SQL2019'
는 키 값 쌍입니다.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019',
CONNECTION_OPTIONS = 'Server=%s\SQL2019',
CREDENTIAL = SQLServerCredentials
);
또는 포트를 사용하여 SQL Server 기본 인스턴스에 연결할 수 있습니다.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019:58137',
CREDENTIAL = SQLServerCredentials
);
G. Always On 가용성 그룹의 읽기 가능한 보조 복제본을 참조하는 외부 데이터 원본 만들기
적용 대상: SQL Server 2019(15.x) 이상
SQL Server의 읽기 가능한 보조 복제본을 참조하는 외부 데이터 원본을 만들려면 CONNECTION_OPTIONS
을(를) 사용하여 ApplicationIntent=ReadOnly
을(를) 지정합니다.
먼저 데이터베이스 범위 자격 증명을 만들고 SQL 인증된 로그인에 대한 자격 증명을 저장합니다. PolyBase용 SQL ODBC 커넥터는 기본 인증만 지원하고 Kerberos 인증은 지원하지 않습니다. 데이터베이스 범위 자격 증명을 만들기 전에 자격 증명을 보호하려면 데이터베이스에 마스터 키가 있어야 합니다. 자세한 내용은 CREATE MASTER KEY를 참조하세요. 다음 샘플에서는 데이터베이스 범위 자격 증명을 만들고 사용자 고유의 로그인 및 암호를 제공합니다.
CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
다음으로 새 외부 데이터 원본을 만듭니다.
ODBC Database
매개 변수는 필요하지 않습니다. 대신 LOCATION 매개 변수 내에서 CREATE EXTERNAL TABLE 문의 세 부분으로 된 이름을 통해 데이터베이스 이름을 제공합니다. 예제는 외부 테이블 만들기를 참조하세요.
다음 예제 WINSQL2019AGL
에서는 가용성 그룹 수신기 이름이며 dbname
CREATE EXTERNAL TABLE 문의 대상이 될 데이터베이스의 이름입니다.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly',
CREDENTIAL = SQLServerCredentials
);
시스템 뷰 sys.servers
에서 ApplicationIntent
을(를) 지정하고 외부 테이블을 만들어 가용성 그룹의 리디렉션 동작을 보여 줄 수 있습니다. 다음 샘플 스크립트에서는 두 개의 외부 데이터 원본이 만들어지고 각각에 대해 하나의 외부 테이블이 만들어집니다. 뷰를 사용하여 연결에 응답하는 서버를 테스트합니다. 읽기 전용 라우팅 기능을 통해 유사한 결과를 달성할 수도 있습니다. 자세한 내용은 Always On 가용성 그룹에 대한 읽기 전용 라우팅 구성을 참조하세요.
CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadOnlyIntent]
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly',
CREDENTIAL = [SQLServerCredentials]
);
GO
CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadWriteIntent]
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadWrite',
CREDENTIAL = [SQLServerCredentials]
);
GO
가용성 그룹의 데이터베이스 내에서 sys.servers
을(를) 반환할 뷰와 로컬 인스턴스의 이름을 만들어 쿼리에 응답하는 복제본을 식별할 수 있습니다. 자세한 내용은 sys.servers를 참조하세요.
CREATE VIEW vw_sys_servers
AS
SELECT [name]
FROM sys.servers
WHERE server_id = 0;
GO
그런 다음 원본 인스턴스에 외부 테이블을 만듭니다.
CREATE EXTERNAL TABLE vw_sys_servers_ro (name SYSNAME NOT NULL)
WITH (
DATA_SOURCE = [DataSource_SQLInstanceListener_ReadOnlyIntent],
LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO
CREATE EXTERNAL TABLE vw_sys_servers_rw (name SYSNAME NOT NULL)
WITH (
DATA_SOURCE = [DataSource_SQLInstanceListener_ReadWriteIntent],
LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO
SELECT [name]
FROM dbo.vw_sys_servers_ro;--should return secondary replica instance
SELECT [name]
FROM dbo.vw_sys_servers_rw;--should return primary replica instance
GO
예제: 대량 작업
중요
대량 작업을 위해 외부 데이터 원본을 구성할 때 LOCATION
URL 끝에 추적 / , 파일 이름 또는 공유 액세스 서명 매개 변수를 추가하지 마세요.
H. Azure Storage에서 데이터를 검색하는 대량 작업을 위한 외부 데이터 원본 만들기
적용 대상: SQL Server 2017(14.x) 및 SQL Server 2019(15.x)
BULK INSERT 또는 OPENROWSET을 사용하여 대량 작업에 대한 다음 데이터 원본을 만듭니다. 자격 증명은 SHARED ACCESS SIGNATURE
를 ID로 설정해야 하며 SAS 토큰에서 앞에 ?
가 없어야 하며, 적어도 로드할 파일에 대한 읽기 권한이 있어야 하고(예: srt=o&sp=r
) 만료 기간이 유효해야 합니다(모든 날짜는 UTC 시간임). 공유 액세스 서명에 대한 자세한 내용은 SAS(공유 액세스 서명) 사용을 참조하세요.
CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
-- Remove ? from the beginning of the SAS token
SECRET = '<azure_shared_access_signature>';
CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
CREDENTIAL = AccessAzureInvoices,
TYPE = BLOB_STORAGE
);
이 예제를 사용하는 방법에 대한 자세한 내용은 BULK INSERT 예제를 참조하세요.
9\. abfs://인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기
적용 대상: SQL Server 2019 (15.x) CU11 이상.
이 예제에서 외부 데이터 원본은 ABFS(Azure Blob Filesystem) 드라이버를 사용하는 Azure Data Lake Storage Gen2 계정 logs
입니다. 스토리지 컨테이너를 daily
라고 합니다. 조건자 푸시다운이 지원되지 않으므로 Azure Data Lake Storage Gen2 외부 데이터 원본은 데이터 전송에만 사용됩니다.
이 예제에서는 Azure Data Lake Storage Gen2 계정에 대한 인증을 위해 데이터베이스 범위 자격 증명을 만드는 방법을 보여 줍니다. 데이터베이스 자격 증명 비밀에 Azure Storage 계정 키를 지정합니다. Azure Storage에 대한 인증 중에는 사용되지 않으므로 데이터베이스 범위 지정 자격 증명 ID에 문자열을 지정할 수 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'abfss://daily@logs.dfs.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
J. 일반 ODBC에서 PostgreSQL로 외부 데이터 원본 만들기
이전 예제와 마찬가지로 먼저 데이터베이스 마스터 키 및 데이터베이스 범위 자격 증명을 만듭니다. 데이터베이스 범위 자격 증명은 외부 데이터 원본에 사용됩니다. 또한 이 예제에서는 PostgreSQL용 제네릭 ODBC 데이터 공급자가 서버에 설치되어 있다고 가정합니다.
이 예제에서는 일반 ODBC 데이터 공급자를 사용하여 동일한 네트워크의 PostgreSQL 데이터베이스 서버에 연결합니다. 여기서 PostgreSQL 서버의 정규화된 도메인 이름은 TCP 5432의 기본 포트를 사용하여 POSTGRES1
입니다.
CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
LOCATION = 'odbc://POSTGRES1.domain:5432',
CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
CREDENTIAL = postgres_credential
);
다음 단계
개요: SQL Server 2022
적용 대상: SQL Server 2022(16.x) 이상
PolyBase 쿼리에 대한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 다음과 같은 기본 사용 사례를 지원하는 데 사용됩니다.
- PolyBase를 사용하여 데이터 가상화 및 데이터 로드
BULK INSERT
또는OPENROWSET
를 사용한 대량 로드 작업
참고
이 구문은 SQL Server 버전마다 다릅니다. 버전 선택기 드롭다운을 사용하여 적절한 버전을 선택합니다. 이 콘텐츠는 SQL Server 2022(16.x) 이상에 적용됩니다.
SQL Server 2022 이상 구문
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CONNECTION_OPTIONS = '<key_value_pairs>'[,...]]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] PUSHDOWN = { ON | OFF } ]
)
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 SQL Server의 데이터베이스 내에서 반드시 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 | 제품 / 서비스별로 지원되는 위치 | 인증 |
---|---|---|---|---|
Azure Storage 계정(V2) | abs |
abs://<container_name>@<storage_account_name>.blob.core.windows.net/ 또는 abs://<storage_account_name>.blob.core.windows.net/<container_name> |
SQL Server 2022(16.x)부터 계층 구조 네임스페이스가 지원됩니다. |
공유 액세스 서명(SAS) |
Azure Data Lake Storage Gen2 | adls |
adls://<container_name>@<storage_account_name>.dfs.core.windows.net/ 또는 adls://<storage_account_name>.dfs.core.windows.net/<container_name> |
SQL Server 2022(16.x)부터 | 공유 액세스 서명(SAS) |
SQL Server | sqlserver |
<server_name>[\<instance_name>][:port] |
SQL Server 2019(15.x)부터 | SQL 인증 전용 |
Oracle | oracle |
<server_name>[:port] |
SQL Server 2019(15.x)부터 | 기본 인증 전용입니다. |
Teradata | teradata |
<server_name>[:port] |
SQL Server 2019(15.x)부터 | 기본 인증 전용입니다. |
MongoDB 또는 Cosmos DB API for MongoDB | mongodb |
<server_name>[:port] |
SQL Server 2019(15.x)부터 | 기본 인증 전용입니다. |
일반 ODBC | odbc |
<server_name>[:port] |
SQL Server 2019(15.x)부터 - Windows만 해당 | 기본 인증 전용입니다. |
대량 작업 | https |
<storage_account>.blob.core.windows.net/<container> |
SQL Server 2017(14.x)부터 | 공유 액세스 서명(SAS) |
S3 호환 개체 스토리지 | s3 |
- S3 호환: s3://<server_name>:<port>/ - AWS S3: s3://<bucket_name>.S3.amazonaws.com[:port]/<folder> 또는 s3://s3.amazonaws.com[:port]/<bucket_name>/<folder> |
SQL Server 2022(16.x)부터 | 기본 또는 통과(STS) * |
* IDENTITY가 하드 코딩 IDENTITY = 'S3 Access Key'
되고 SECRET 인수가 STS(통과) 권한 부여 형식 = '<AccessKeyID>:<SecretKeyID>'
이거나 사용하는 데이터베이스 범위 자격 증명이어야 합니다. 자세한 내용은 S3 호환 개체 스토리지의 외부 데이터에 액세스하도록 PolyBase 구성을 참조하세요.
위치 경로:
port
= 외부 데이터 원본이 수신 대기 중인 포트입니다. 대부분의 경우 네트워크 구성에 따라 선택 사항입니다.<container_name>
= 데이터를 보관하는 스토리지 계정의 컨테이너입니다. 루트 컨테이너는 읽기 전용이므로 데이터를 컨테이너에 다시 쓸 수 없습니다.<storage_account>
= Azure 리소스의 스토리지 계정 이름입니다.<server_name>
= 호스트 이름입니다.<instance_name>
= SQL Server 명명된 인스턴스의 이름입니다. 대상 인스턴스에서 SQL Server Browser Service가 실행 중인 경우에 사용됩니다.<ip_address>:<port>
= S3 호환 개체 스토리지인 경우에만(SQL Server 2022(16.x)부터) S3 호환 스토리지에 연결하는 데 사용되는 엔드포인트 및 포트입니다.<bucket_name>
= 스토리지 플랫폼과 관련된 S3 호환 개체 스토리지(SQL Server 2022(16.x)부터)만 해당합니다.<region>
= 스토리지 플랫폼과 관련된 S3 호환 개체 스토리지(SQL Server 2022(16.x)부터)만 해당합니다.<folder>
= 스토리지 URL 내의 스토리지 경로의 일부입니다.
위치 설정 시 추가 참고 사항 및 지침:
- SQL Server 데이터베이스 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
sqlserver
커넥터를 사용하여 SQL Server 2019(15.x)를 다른 SQL Server 또는 Azure SQL Database에 연결할 수 있습니다.ODBC
를 통해 연결할 때Driver={<Name of Driver>}
를 지정합니다.adls
접두사를 사용하는 Azure Storage 계정(V2)의 계층 구조 네임스페이스 옵션은 SQL Server 2022(16.x)에서 Azure Data Lake Storage Gen2를 통해 지원됩니다.
- HDFS Cloudera(CDP) 및 Hortonworks(HDP) 외부 데이터 원본에 대한 SQL Server 지원은 사용 중지되며 SQL Server 2022(16.x)에 포함되지 않습니다. SQL Server 2022(16.x)에서는 TYPE 인수를 사용할 필요가 없습니다.
- SQL Server 2022(16.x)부터 S3 호환 개체 스토리지 및 PolyBase에 대한 자세한 내용은 S3 호환 개체 스토리지의 외부 데이터에 액세스하도록 PolyBase 구성을 참조하세요. S3 호환 개체 스토리지 내에서 parquet 파일을 쿼리하는 예제는 PolyBase를 사용하여 S3 호환 개체 스토리지에서 parquet 파일 가상화를 참조하세요.
- 이전 버전과 달리 SQL Server 2022(16.x)에서 Azure Storage 계정(v2)에 사용되는 접두사는
wasb[s]
에서abs
로 변경되었습니다. - 이전 버전과 달리 SQL Server 2022(16.x)에서 Azure Data Lake Storage Gen2에 사용되는 접두사는
abfs[s]
에서adls
로 변경되었습니다. - PolyBase를 사용하여 Azure Storage에서 CSV 파일을 가상화하는 예제는 PolyBase를 사용하여 CSV 파일 가상화를 참조하세요.
- PolyBase를 사용하여 ADLS Gen2에서 델타 테이블을 가상화하는 예제는 PolyBase를 사용하여 델타 테이블 가상화를 참조하세요.
- SQL Server 2022(16.x)는 Azure Storage 계정 v2() 및 Azure Data Lake Gen2
adls
(abs
)에 대해 두 개의 URL 형식을 완전히 지원합니다.- LOCATION 경로는 형식
<container>@<storage_account_name>..
(권장) 또는<storage_account_name>../<container>
.를 사용할 수 있습니다. 예:- Azure Storage 계정 v2:
abs://<container>@<storage_account_name>.blob.core.windows.net
(권장) 또는abs://<storage_account_name>.blob.core.windows.net/<container>
. - Azure Data Lake Gen2는 다음을 지원합니다(
adls://<container>@<storage_account_name>.blob.core.windows.net
권장) 또는adls://<storage_account_name>.dfs.core.windows.net/<container>
.
- Azure Storage 계정 v2:
- LOCATION 경로는 형식
CONNECTION_OPTIONS = key_value_pair
SQL Server 2019(15.x) 이상에 지정됩니다. ODBC
를 외부 데이터 원본에 연결할 때 추가 옵션을 지정합니다. 여러 연결 옵션을 사용하려면 세미콜론으로 구분합니다.
SQL Server, Oracle, Teradata, MongoDB 및 Azure Cosmos DB API for MongoDB용으로 기본 제공되는 ODBC
커넥터뿐만 아니라 일반 ODBC
연결에 적용됩니다.
key_value_pair
는 키워드이며 특정 연결 옵션 값입니다. 사용 가능한 키워드 및 값은 외부 데이터 원본 유형에 따라 달라집니다. 최소한 드라이버 이름이 필요하지만, 설정하면 유용하고 문제 해결에 도움이 되는 APP='<your_application_name>'
, ApplicationIntent= ReadOnly|ReadWrite
등의 다른 옵션도 있습니다.
가능한 키 값 쌍은 드라이버에 따라 다릅니다. 각 공급자에 대한 자세한 내용은 외부 데이터 원본 만들기(Transact-SQL) 연결 옵션을 참조하세요.
적용 대상: SQL Server 2022(16.x) 누적 업데이트 2부터 Oracle TNS 파일을 지원하기 위한 추가 키워드가 도입되었습니다.
- 키워드
TNSNamesFile
는 Oracle 서버에 있는 파일에 대한 파일 경로를tnsnames.ora
지정합니다. - 키워드
ServerName
는 호스트 이름과 포트를 바꾸는 데 사용할 내부tnsnames.ora
별칭을 지정합니다.
PUSHDOWN = ON | OFF
적용 대상: SQL Server 2019(15.x) 이상. 외부 데이터 원본에 푸시 다운할 수 있는지 여부를 알려줍니다. 기본적으로 설정되어 있습니다.
PUSHDOWN
은 외부 데이터 원본 수준에서 SQL Server, Oracle, Teradata, MongoDB, Azure Cosmos DB API for MongoDB 또는 ODBC에 연결할 때 지원됩니다.
쿼리 수준에서 푸시 다운을 활성화 또는 비활성화는 힌트를 통해 구현됩니다.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.- Azure Storage 계정(V2) 또는 Azure Data Lake Storage Gen2 액세스할 때
IDENTITY
는SHARED ACCESS SIGNATURE
여야 합니다.
공유 액세스 서명을 만드는 방법에는 여러 가지가 있습니다.
Azure Portal -><Your_Storage_Account> -> 공유 액세스 서명 -> 권한 구성 -> SAS 및 연결 문자열 생성으로 이동하여 SAS 토큰을 만들 수 있습니다. 자세한 내용은 공유 액세스 서명 생성을 참조하세요.
PowerShell, Azure CLI, .NET 및 REST API를 통해 프로그래밍 방식으로 SAS를 만들 수 있습니다. 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여를 참조하세요.
SAS 토큰은 다음과 같이 구성되어야 합니다.
- SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
?
제외 - 유효한 만료 기간을 사용합니다(모든 날짜는 UTC 시간임).
- 로드해야 하는 파일에 대해 적어도 읽기 권한을 승인해야 합니다(예:
srt=o&sp=r
). 다양한 사용 사례에 대해 여러 공유 액세스 서명을 만들 수 있습니다. 권한은 다음과 같이 부여되어야 합니다.
작업 사용 권한 파일에서 데이터 읽기 읽기 여러 파일 및 하위 폴더에서 데이터를 읽습니다. 읽기 및 목록 CETAS(Create External Table as Select) 사용 읽기, 만들기, 나열 및 쓰기 - SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
Azure Blob Storage 및 Azure Data Lake Gen 2의 경우:
- 허용되는 서비스:
Blob
SAS 토큰을 생성하려면 선택해야 합니다. - 허용되는 리소스 종류:
Container
Object
SAS 토큰을 생성하려면 선택해야 합니다.
- 허용되는 서비스:
S3 호환 개체 스토리지 및 PolyBase에서 CREDENTIAL
을 사용하는 예제는 S3 호환 개체 스토리지의 외부 데이터에 액세스하도록 PolyBase 구성을 참조하세요.
데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
사용 권한
SQL Server의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
보안
PolyBase는 대부분의 외부 데이터 원본에 대해 프록시 기반 인증을 지원합니다. 데이터베이스 범위 자격 증명을 생성하여 프록시 계정을 만듭니다.
SQL Server 2022로 업그레이드
2022년 SQL Server(16.x)부터 Hadoop 외부 데이터 원본은 지원되지 않습니다. TYPE = HADOOP
를 이용해 이전에 만든 외부 데이터 원본 및 이 외부 데이터 원본을 사용하는 외부 테이블을 수동으로 다시 만들어야 합니다.
또한 사용자는 Azure Storage에 연결할 때 새 커넥터를 사용하도록 외부 데이터 원본도 구성해야 합니다.
외부 데이터 원본 | 시작 | 대상 |
---|---|---|
Azure Blob Storage | wasb[s] | abs |
ADLS Gen2 | abfs[s] | adls |
예
중요
PolyBase를 설치하고 사용하도록 설정하는 방법에 대한 자세한 내용은 Windows에 PolyBase 설치를 참조하세요.
A. Oracle을 참조하는 SQL Server에서 외부 데이터 원본 만들기
Oracle을 참조하는 외부 데이터 원본을 만들려면 데이터베이스 범위 자격 증명이 있는지 확인합니다. 이 데이터 원본에 대한 계산 푸시 다운을 활성화하거나 비활성화할 수도 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL OracleProxyAccount
WITH IDENTITY = 'oracle_username',
SECRET = 'oracle_password';
CREATE EXTERNAL DATA SOURCE MyOracleServer
WITH (
LOCATION = 'oracle://145.145.145.145:1521',
CREDENTIAL = OracleProxyAccount,
PUSHDOWN = ON
);
필요에 따라 Oracle에 대한 외부 데이터 원본은 프록시 인증을 사용하여 세분화된 액세스 제어를 제공할 수 있습니다. 가장된 사용자에 비해 제한된 액세스 권한을 갖도록 프록시 사용자를 구성할 수 있습니다.
CREATE DATABASE SCOPED CREDENTIAL [OracleProxyCredential]
WITH IDENTITY = 'oracle_username',
SECRET = 'oracle_password';
CREATE EXTERNAL DATA SOURCE [OracleSalesSrvr]
WITH (
LOCATION = 'oracle://145.145.145.145:1521',
CONNECTION_OPTIONS = 'ImpersonateUser=%CURRENT_USER',
CREDENTIAL = [OracleProxyCredential]
);
또는 TNS를 사용하여 인증할 수 있습니다.
적용 대상: SQL Server 2022(16.x) 누적 업데이트 2
CREATE EXTERNAL DATA SOURCE
부터 이제 Oracle에 연결할 때 TNS 파일 사용을 지원합니다.
매개 변수가 CONNECTION_OPTIONS
확장되어 이제 파일을 찾아보 tnsnames.ora
고 ServerName
서버와의 연결을 설정하는 변수로 사용됩니다TNSNamesFile
.
아래 예제에서 런타임 동안 SQL Server는 지정된 TNSNamesFile
파일 위치를 검색 tnsnames.ora
하고 지정된 호스트 및 네트워크 포트ServerName
를 검색합니다.
CREATE EXTERNAL DATA SOURCE [external_data_source_name]
WITH (
LOCATION = N'oracle://XE',
CREDENTIAL = [OracleCredentialTest],
CONNECTION_OPTIONS = N'TNSNamesFile=C:\Temp\tnsnames.ora;ServerName=XE'
);
B. Polybase 연결을 통해 SQL Server 명명된 인스턴스를 참조하는 외부 데이터 원본 만들기
적용 대상: SQL Server 2019(15.x) 이상
CONNECTION_OPTIONS
의 명명된 인스턴스를 참조하는 외부 데이터 원본을 만들려면 SQL Server를 사용하여 인스턴스 이름을 지정합니다.
먼저 데이터베이스 범위 자격 증명을 만들고 SQL 인증된 로그인에 대한 자격 증명을 저장합니다. PolyBase용 SQL ODBC 커넥터는 기본 인증만 지원하고 Kerberos 인증은 지원하지 않습니다. 데이터베이스 범위 자격 증명을 만들기 전에 자격 증명을 보호하려면 데이터베이스에 마스터 키가 있어야 합니다. 자세한 내용은 CREATE MASTER KEY를 참조하세요. 다음 샘플에서는 데이터베이스 범위 자격 증명을 만들고 사용자 고유의 로그인 및 암호를 제공합니다.
CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
다음 예제 WINSQL2019
에서는 호스트 이름이며 SQL2019
인스턴스 이름입니다. 'Server=%s\SQL2019'
는 키 값 쌍입니다.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019',
CONNECTION_OPTIONS = 'Server=%s\SQL2019',
CREDENTIAL = SQLServerCredentials
);
또는 포트를 사용하여 SQL Server 기본 인스턴스에 연결할 수 있습니다.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019:58137',
CREDENTIAL = SQLServerCredentials
);
C. Always On 가용성 그룹의 읽기 가능한 보조 복제본을 참조하는 외부 데이터 원본 만들기
적용 대상: SQL Server 2019(15.x) 이상
SQL Server의 읽기 가능한 보조 복제본을 참조하는 외부 데이터 원본을 만들려면 CONNECTION_OPTIONS
을(를) 사용하여 ApplicationIntent=ReadOnly
을(를) 지정합니다.
먼저 데이터베이스 범위 자격 증명을 만들고 SQL 인증된 로그인에 대한 자격 증명을 저장합니다. PolyBase용 SQL ODBC 커넥터는 기본 인증만 지원하고 Kerberos 인증은 지원하지 않습니다. 데이터베이스 범위 자격 증명을 만들기 전에 자격 증명을 보호하려면 데이터베이스에 마스터 키가 있어야 합니다. 자세한 내용은 CREATE MASTER KEY를 참조하세요. 다음 샘플에서는 데이터베이스 범위 자격 증명을 만들고 사용자 고유의 로그인 및 암호를 제공합니다.
CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
다음으로 새 외부 데이터 원본을 만듭니다.
ODBC Database
매개 변수는 필요하지 않습니다. 대신 LOCATION 매개 변수 내에서 CREATE EXTERNAL TABLE 문의 세 부분으로 된 이름을 통해 데이터베이스 이름을 제공합니다. 예제는 외부 테이블 만들기를 참조하세요.
다음 예제 WINSQL2019AGL
에서는 가용성 그룹 수신기 이름이며 dbname
CREATE EXTERNAL TABLE 문의 대상이 될 데이터베이스의 이름입니다.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly',
CREDENTIAL = SQLServerCredentials
);
시스템 뷰 sys.servers
에서 ApplicationIntent
을(를) 지정하고 외부 테이블을 만들어 가용성 그룹의 리디렉션 동작을 보여 줄 수 있습니다. 다음 샘플 스크립트에서는 두 개의 외부 데이터 원본이 만들어지고 각각에 대해 하나의 외부 테이블이 만들어집니다. 뷰를 사용하여 연결에 응답하는 서버를 테스트합니다. 읽기 전용 라우팅 기능을 통해 유사한 결과를 달성할 수도 있습니다. 자세한 내용은 Always On 가용성 그룹에 대한 읽기 전용 라우팅 구성을 참조하세요.
CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadOnlyIntent]
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly',
CREDENTIAL = [SQLServerCredentials]
);
GO
CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadWriteIntent]
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadWrite',
CREDENTIAL = [SQLServerCredentials]
);
GO
가용성 그룹의 데이터베이스 내에서 sys.servers
을(를) 반환할 뷰와 로컬 인스턴스의 이름을 만들어 쿼리에 응답하는 복제본을 식별할 수 있습니다. 자세한 내용은 sys.servers를 참조하세요.
CREATE VIEW vw_sys_servers AS
SELECT [name] FROM sys.servers
WHERE server_id = 0;
GO
그런 다음 원본 인스턴스에 외부 테이블을 만듭니다.
CREATE EXTERNAL TABLE vw_sys_servers_ro (name SYSNAME NOT NULL)
WITH (
DATA_SOURCE = [DataSource_SQLInstanceListener_ReadOnlyIntent],
LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO
CREATE EXTERNAL TABLE vw_sys_servers_rw (name SYSNAME NOT NULL)
WITH (
DATA_SOURCE = [DataSource_SQLInstanceListener_ReadWriteIntent],
LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO
SELECT [name]
FROM dbo.vw_sys_servers_ro;--should return secondary replica instance
SELECT [name]
FROM dbo.vw_sys_servers_rw;--should return primary replica instance
GO
D. S3 호환 개체 스토리지에서 PolyBase를 통해 parquet 파일을 쿼리하기 위한 외부 데이터 원본 만들기
적용 대상: SQL Server 2022(16.x) 이상
다음 샘플 스크립트는 SQL Server의 원본 사용자 데이터베이스에 s3_ds
외부 데이터 원본을 만듭니다. 외부 데이터 원본은 s3_dc
데이터베이스 범위 자격 증명을 참조합니다.
CREATE DATABASE SCOPED CREDENTIAL s3_dc
WITH IDENTITY = 'S3 Access Key', -- for S3-compatible object storage the identity must always be S3 Access Key
SECRET = '<access_key_id>:<secret_key_id>' -- provided by the S3-compatible object storage
GO
CREATE EXTERNAL DATA SOURCE s3_ds
WITH (
LOCATION = 's3://<ip_address>:<port>/',
CREDENTIAL = s3_dc
);
GO
sys.external_data_sources를 사용하여 새 외부 데이터 원본을 확인합니다.
SELECT * FROM sys.external_data_sources;
다음 예제에서는 T-SQL을 사용하여 OPENROWSET 쿼리를 통해 S3 규격 개체 스토리지에 저장된 parquet 파일을 쿼리하는 방법을 보여 줍니다. 자세한 내용은 PolyBase를 사용하여 S3 호환 개체 스토리지에서 parquet 파일 가상화를 참조하세요.
SELECT *
FROM OPENROWSET (
BULK '/<bucket>/<parquet_folder>',
FORMAT = 'PARQUET',
DATA_SOURCE = 's3_ds'
) AS [cc];
E. 일반 ODBC에서 PostgreSQL로 외부 데이터 원본 만들기
이전 예제와 마찬가지로 먼저 데이터베이스 마스터 키 및 데이터베이스 범위 자격 증명을 만듭니다. 데이터베이스 범위 자격 증명은 외부 데이터 원본에 사용됩니다. 또한 이 예제에서는 PostgreSQL용 제네릭 ODBC 데이터 공급자가 서버에 설치되어 있다고 가정합니다.
이 예제에서는 일반 ODBC 데이터 공급자를 사용하여 동일한 네트워크의 PostgreSQL 데이터베이스 서버에 연결합니다. 여기서 PostgreSQL 서버의 정규화된 도메인 이름은 TCP 5432의 기본 포트를 사용하여 POSTGRES1
입니다.
CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
LOCATION = 'odbc://POSTGRES1.domain:5432',
CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
CREDENTIAL = postgres_credential
);
Azure Storage
공유 액세스 서명 만들기
Azure Blob Storage와 Azure Data Lake Gen2의 경우 지원되는 인증 방법은 SAS(공유 액세스 서명)입니다. 공유 액세스 서명 토큰을 생성하는 간단한 방법 중 하나는 다음 단계를 따릅니다. 자세한 내용은 CREDENTIAL을 참조하세요.
- Azure Portal의 원하는 스토리지 계정으로 이동합니다.
- 데이터 스토리지 메뉴에서 원하는 컨테이너로 이동합니다.
- 공유 액세스 토큰을 선택합니다.
- 원하는 작업에 따라 적절한 권한을 선택합니다. 아래 테이블을 참조합니다.
작업 | 사용 권한 |
---|---|
파일에서 데이터 읽기 | 읽기 |
여러 파일 및 하위 폴더에서 데이터를 읽습니다. | 읽기 및 목록 |
CETAS(Create External Table as Select) 사용 | 읽기, 만들기 및 쓰기 |
- 토큰 만료 날짜를 선택합니다.
- SAS 토큰 및 URL을 생성합니다.
- SAS 토큰을 복사합니다.
F. abs://인터페이스를 사용하여 Azure Blob Storage의 데이터에 액세스하는 외부 데이터 원본을 만듭니다.
적용 대상: SQL Server 2022(16.x) 이상
SQL Server 2022(16.x)부터 Azure Storage 계정 v2에 새 접두사 abs
를 사용합니다. abs
접두사는 SHARED ACCESS SIGNATURE
를 사용한 인증을 지원합니다. abs
접두사는 이전 버전에서 사용된 wasb
접두사를 대체합니다. HADOOP가 더 이상 지원되지 않으므로 TYPE = BLOB_STORAGE
는 사용하지 않아도 됩니다.
다음 예제에서 볼 수 있듯 Azure Storage 계정 키가 더 이상 필요하지 않고 대신 SAS 토큰을 사용합니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredentialv2
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', -- to use SAS the identity must be fixed as-is
SECRET = '<Blob_SAS_Token>';
GO
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredentialv2,
);
Azure Blob Storage에 저장된 CSV 파일에 액세스하는 방법에 대한 자세한 예제는 PolyBase를 사용하여 CSV 파일 가상화를 참조하세요.
G. Azure Data Lake Gen2에서 데이터에 액세스하는 외부 데이터 원본 만들기
적용 대상: SQL Server 2022(16.x) 이상 버전
SQL Server 2022(16.x)부터 Azure Data Lake Gen2에 대해 새 접두사 adls
를 abfs
(이전 버전에서 사용됨) 대신 사용합니다. 접두사는 adls
다음 예제와 같이 SAS 토큰을 인증 방법으로 지원합니다.
--Create a database scoped credential using SAS Token
CREATE DATABASE SCOPED CREDENTIAL datalakegen2
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<DataLakeGen2_SAS_Token>';
GO
CREATE EXTERNAL DATA SOURCE data_lake_gen2_dfs
WITH (
LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
CREDENTIAL = datalakegen2
);
Azure Data Lake Gen2에 저장된 델타 파일에 액세스하는 방법에 대한 자세한 예제는 PolyBase를 사용하여 델타 테이블 가상화를 참조하세요.
예제: 대량 작업
중요
대량 작업을 위해 외부 데이터 원본을 구성할 때 LOCATION
URL 끝에 추적 / , 파일 이름 또는 공유 액세스 서명 매개 변수를 추가하지 마세요.
H. Azure Storage에서 데이터를 검색하는 대량 작업을 위한 외부 데이터 원본 만들기
적용 대상: SQL Server 2022(16.x) 이상
BULK INSERT 또는 OPENROWSET을 사용하여 대량 작업에 대한 다음 데이터 원본을 만듭니다. 자격 증명은 SHARED ACCESS SIGNATURE
를 ID로 설정해야 하며 SAS 토큰에서 앞에 ?
가 없어야 하며, 적어도 로드할 파일에 대한 읽기 권한이 있어야 하고(예: srt=o&sp=r
) 만료 기간이 유효해야 합니다(모든 날짜는 UTC 시간임). 공유 액세스 서명에 대한 자세한 내용은 SAS(공유 액세스 서명) 사용을 참조하세요.
CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
-- Remove ? from the beginning of the SAS token
SECRET = '<azure_shared_access_signature>';
CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
CREDENTIAL = AccessAzureInvoices,
);
다음 단계
* SQL Database *
개요: Azure SQL Database
적용 대상: Azure SQL Database
탄력적 쿼리에 대한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 다음과 같은 기본 사용 사례를 지원하는 데 사용됩니다.
BULK INSERT
또는OPENROWSET
를 사용한 대량 로드 작업- 탄력적 쿼리로 SQL Database를 사용하여 원격 SQL Database 또는 Azure Synapse 인스턴스 쿼리
- 탄력적 쿼리를 사용하여 분할된 SQL Database 쿼리
Syntax
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = { BLOB_STORAGE | RDBMS | SHARD_MAP_MANAGER } ]
[ [ , ] DATABASE_NAME = '<database_name>' ]
[ [ , ] SHARD_MAP_NAME = '<shard_map_manager>' ] )
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 SQL 데이터베이스의 데이터베이스 내에서 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 | 가용성 |
---|---|---|---|
대량 작업 | https |
<storage_account>.blob.core.windows.net/<container> |
|
탄력적 쿼리(분할) | 필요하지 않음 | <shard_map_server_name>.database.windows.net |
|
탄력적 쿼리(원격) | 필요하지 않음 | <remote_server_name>.database.windows.net |
|
EdgeHub | edgehub |
edgehub:// |
Azure SQL Edge에서만 사용할 수 있습니다. EdgeHub는 항상 Azure SQL Edge 인스턴스에 대해 로컬입니다. 따라서 경로 또는 포트 값을 지정할 필요가 없습니다. |
Kafka | kafka |
kafka://<kafka_bootstrap_server_name_ip>:<port_number> |
Azure SQL Edge에서만 사용할 수 있습니다. |
위치 경로:
<shard_map_server_name>
= 분할된 맵 관리자를 호스팅하는 Azure의 논리 서버 이름입니다.DATABASE_NAME
인수는 분할된 맵을 호스트하는 데 사용되는 데이터베이스를 제공하고SHARD_MAP_NAME
은 분할된 맵 자체에 사용됩니다.<remote_server_name>
= 탄력적 쿼리에 대한 대상 논리 서버 이름입니다. 데이터베이스 이름은DATABASE_NAME
인수를 사용하여 지정됩니다.
위치 설정 시 추가 참고 사항 및 지침:
- 데이터베이스 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
- Azure Storage에서 Azure SQL Database로 데이터를 로드하려면 SAS 토큰(공유 액세스 서명)을 사용합니다.
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.TYPE
=BLOB_STORAGE
인 경우SHARED ACCESS SIGNATURE
를 ID로 사용하여 자격 증명을 만들어야 합니다.- WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
TYPE
=HADOOP
인 경우 스토리지 계정 키를SECRET
으로 사용하여 자격 증명을 만들어야 합니다.TYPE
=BLOB_STORAGE
는 대량 작업에만 사용할 수 있습니다.TYPE
=BLOB_STORAGE
를 사용하여 외부 데이터 원본에 대한 외부 테이블을 만들 수 없습니다.
공유 액세스 서명을 만드는 방법에는 여러 가지가 있습니다.
Azure Portal -><Your_Storage_Account> -> 공유 액세스 서명 -> 권한 구성 -> SAS 및 연결 문자열 생성으로 이동하여 SAS 토큰을 만들 수 있습니다. 자세한 내용은 공유 액세스 서명 생성을 참조하세요.
PowerShell, Azure CLI, .NET 및 REST API를 통해 프로그래밍 방식으로 SAS를 만들 수 있습니다. 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여를 참조하세요.
SAS 토큰은 다음과 같이 구성되어야 합니다.
- SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
?
제외 - 유효한 만료 기간을 사용합니다(모든 날짜는 UTC 시간임).
- 로드해야 하는 파일에 대해 적어도 읽기 권한을 승인해야 합니다(예:
srt=o&sp=r
). 다양한 사용 사례에 대해 여러 공유 액세스 서명을 만들 수 있습니다. 권한은 다음과 같이 부여되어야 합니다.
작업 사용 권한 파일에서 데이터 읽기 읽기 여러 파일 및 하위 폴더에서 데이터를 읽습니다. 읽기 및 목록 CETAS(Create External Table as Select) 사용 읽기, 만들기 및 쓰기 - SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
SHARED ACCESS SIGNATURE
및 TYPE
= BLOB_STORAGE
에서 CREDENTIAL
을 사용하는 예제는 대량 작업을 실행하고 Azure Storage에서 SQL Database로 데이터를 검색하기 위한 외부 데이터 원본 만들기를 참조하세요.
데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
TYPE = [ BLOB_STORAGE | RDBMS | SHARD_MAP_MANAGER]
구성 중인 외부 데이터 원본의 유형을 지정합니다. 이 매개 변수가 항상 필요한 것은 아닙니다.
- SQL Database에서 탄력적 쿼리를 통해 데이터베이스 간 쿼리에
RDBMS
를 사용합니다. - 분할된 SQL Database에 연결할 때 외부 데이터 원본을 만드는 경우
SHARD_MAP_MANAGER
를 사용합니다. - BULK INSERT 또는 OPENROWSET를 통해 대량 작업을 실행하는 경우
BLOB_STORAGE
를 사용합니다.
중요
기타 외부 데이터 원본을 사용하는 경우 TYPE
을 설정하지 마세요.
DATABASE_NAME = database_name
TYPE
이 RDBMS
또는 SHARD_MAP_MANAGER
로 설정된 경우 이 인수를 구성합니다.
TYPE | DATABASE_NAME의 값 |
---|---|
RDBMS | LOCATION 을 사용하여 제공된 서버의 원격 데이터베이스 이름 |
SHARD_MAP_MANAGER | 분할된 맵 관리자로 작동하는 데이터베이스의 이름 |
TYPE
= RDBMS
에서 외부 데이터 원본을 만드는 방법을 보여주는 예제는 RDBMS 외부 데이터 원본 만들기를 참조하세요.
SHARD_MAP_NAME = shard_map_name
TYPE
인수가 SHARD_MAP_MANAGER
로 설정된 경우에만 분할된 맵의 이름을 설정하는 데 사용됩니다.
TYPE
= SHARD_MAP_MANAGER
에서 외부 데이터 원본을 만드는 방법을 보여주는 예제는 분할된 맵 관리자 외부 데이터 원본 만들기를 참조하세요.
사용 권한
Azure SQL Database의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
예제
A. 분할된 맵 관리자 외부 데이터 원본 만들기
SHARD_MAP_MANAGER
를 참조하는 외부 데이터 원본을 만들려면 가상 머신의 SQL Database 또는 SQL Server 데이터베이스에서 분할된 맵 관리자를 호스트하는 SQL Database 서버 이름을 지정합니다.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred
WITH IDENTITY = '<username>',
SECRET = '<password>';
CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc
WITH (
TYPE = SHARD_MAP_MANAGER,
LOCATION = '<server_name>.database.windows.net',
DATABASE_NAME = 'ElasticScaleStarterKit_ShardMapManagerDb',
CREDENTIAL = ElasticDBQueryCred,
SHARD_MAP_NAME = 'CustomerIDShardMap'
);
단계별 자습서는 분할을 위한 탄력적 쿼리 시작(수평 분할)을 참조하세요.
B. RDBMS 외부 데이터 원본 만들기
RDBMS를 참조하는 외부 데이터 원본을 만들려면 SQL Database에 있는 원격 데이터베이스의 SQL Database 서버 이름을 지정합니다.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL SQL_Credential
WITH IDENTITY = '<username>',
SECRET = '<password>';
CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc
WITH (
TYPE = RDBMS,
LOCATION = '<server_name>.database.windows.net',
DATABASE_NAME = 'Customers',
CREDENTIAL = SQL_Credential
);
RDBMS에 대한 단계별 자습서는 데이터베이스 간 쿼리 시작(수직 분할)을 참조하세요.
예제: 대량 작업
중요
대량 작업을 위해 외부 데이터 원본을 구성할 때 LOCATION
URL 끝에 추적 / , 파일 이름 또는 공유 액세스 서명 매개 변수를 추가하지 마세요.
C. Azure Storage에서 데이터를 검색하는 대량 작업을 위한 외부 데이터 원본 만들기
BULK INSERT 또는 OPENROWSET을 사용하여 대량 작업에 대한 다음 데이터 원본을 만듭니다. 자격 증명은 SHARED ACCESS SIGNATURE
를 ID로 설정해야 하며 SAS 토큰에서 앞에 ?
가 없어야 하며, 적어도 로드할 파일에 대한 읽기 권한이 있어야 하고(예: srt=o&sp=r
) 만료 기간이 유효해야 합니다(모든 날짜는 UTC 시간임). 공유 액세스 서명에 대한 자세한 내용은 SAS(공유 액세스 서명) 사용을 참조하세요.
CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
-- Remove ? from the beginning of the SAS token
SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';
CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
CREDENTIAL = AccessAzureInvoices,
TYPE = BLOB_STORAGE
);
사용 중인 이 예제를 보려면 BULK INSERT를 참조하세요.
예제: Azure SQL Edge
중요
Azure SQL Edge의 외부 데이터를 구성하는 방법에 대한 자세한 내용은 Azure SQL Edge에서 데이터 스트리밍을 참조하세요.
A. Kafka를 참조하는 외부 데이터 원본 만들기
적용 대상: Azure SQL Edge만 해당
이 예제에서 외부 데이터 원본은 IP 주소가 xxx.xxx.xxx.xxx이고 포트 1900에서 수신 대기하는 Kafka 서버입니다. Kafka 외부 데이터 원본은 데이터 스트리밍 전용이며 조건자 푸시다운을 지원하지 않습니다.
-- Create an External Data Source for Kafka
CREATE EXTERNAL DATA SOURCE MyKafkaServer
WITH (LOCATION = 'kafka://xxx.xxx.xxx.xxx:1900');
B. EdgeHub를 참조하는 외부 데이터 원본 만들기
적용 대상: Azure SQL Edge만 해당
이 예제에서 외부 데이터 원본은 Azure SQL Edge와 동일한 에지 디바이스에서 실행되는 EdgeHub입니다. EdgeHub 외부 데이터 원본은 데이터 스트리밍 전용이며 조건자 푸시다운을 지원하지 않습니다.
-- Create an External Data Source for Kafka
CREATE EXTERNAL DATA SOURCE MyEdgeHub
WITH (LOCATION = 'edgehub://');
다음 단계
* Azure Synapse
Analytics *
개요: Azure Synapse Analytics
적용 대상: Azure Synapse Analytics
데이터 가상화를 위한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 외부 데이터 원본에서 데이터 가상화 및 데이터 로드의 기본 사용 사례를 지원하는 데 사용됩니다. 자세한 내용은 Synapse SQL에서 외부 테이블 사용을 참조하세요.
Important
탄력적 쿼리로 Azure SQL Database를 사용하여 Azure Synapse Analytics 리소스를 쿼리하는 외부 데이터 원본을 만들려면 SQL Database를 참조하세요.
구문
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = HADOOP ]
)
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이 이름은 Azure Synapse Analytics의 Azure SQL Database 내에서 고유해야 합니다.
LOCATION = '<prefix>://<path>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 |
---|---|---|
Data Lake Storage* Gen1 | adl |
<storage_account>.azuredatalake.net |
Data Lake Storage Gen2 | abfs[s] |
<container>@<storage_account>.dfs.core.windows.net |
Azure Blob Storage | wasbs |
<container>@<storage_account>.blob.core.windows.net |
Azure Blob Storage | https |
<storage_account>.blob.core.windows.net/<container>/subfolders |
Data Lake Storage Gen1 | http[s] |
<storage_account>.azuredatalakestore.net/webhdfs/v1 |
Data Lake Storage Gen2 | http[s] |
<storage_account>.dfs.core.windows.net/<container>/subfolders |
Data Lake Storage Gen2 | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
* Microsoft Azure Data Lake Storage Gen1은 제한된 지원을 받고 있으며, Gen2는 모든 새 개발에 권장됩니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 전용 SQL 풀: PolyBase | 전용 SQL 풀: 네이티브* | 서버리스 SQL 풀 |
---|---|---|---|---|
Data Lake Storage** Gen1 | adl |
아니요 | 아니요 | 예 |
Data Lake Storage Gen2 | abfs[s] |
예 | 예 | 예 |
Azure Blob Storage | wasbs |
예 | 예*** | 예 |
Azure Blob Storage | https |
아니요 | 예 | 예 |
Data Lake Storage Gen1 | http[s] |
아니요 | 아니요 | 예 |
Data Lake Storage Gen2 | http[s] |
예 | 예 | 예 |
Data Lake Storage Gen2 | wasb[s] |
예 | 예 | 예 |
* Azure Synapse Analytics의 서버리스 및 전용 SQL 풀은 데이터 가상화에 서로 다른 코드 베이스를 사용합니다. 서버리스 SQL 풀은 네이티브 데이터 가상화 기술을 지원합니다. 전용 SQL 풀은 네이티브 및 PolyBase 데이터 가상화를 모두 지원합니다. PolyBase 데이터 가상화는 EXTERNAL DATA SOURCE를 사용하여 TYPE=HADOOP
만들 때 사용됩니다.
** Microsoft Azure Data Lake Storage Gen1은 지원이 제한되어 있으며, Gen2는 모든 새 개발에 권장됩니다.
보다 안전한 wasbs
커넥터를 사용하는 것이 좋습니다.wasb
전용 SQL 풀의 네이티브 데이터 가상화만 지원됩니다(TYPE이 HADOOP와 같지 않음) wasb
.
위치 경로:
<container>
= 데이터를 보관하는 스토리지 계정의 컨테이너입니다. 루트 컨테이너는 읽기 전용이므로 데이터를 컨테이너에 다시 쓸 수 없습니다.<storage_account>
= Azure 리소스의 스토리지 계정 이름입니다.
위치 설정 시 추가 참고 사항 및 지침:
- Azure Data Lake Storage Gen2를 프로비저닝할 때 기본 옵션은
enable secure SSL connections
를 사용하는 것입니다. 이 기능을 사용하도록 설정한 경우 보안 TLS/SSL 연결을 선택할 때abfss
를 사용해야 합니다.abfss
안전하지 않은 TLS 연결에도 작동합니다. 자세한 내용은 ABFS(Azure Blob 파일 시스템) 드라이버를 참조하세요. - Azure Synapse는 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
- 일관된 쿼리 의미 체계를 보장하기 위해 Hadoop을 쿼리할 때 모든 테이블에 대해 동일한 외부 데이터 원본을 사용합니다.
https:
접두사를 통해 경로에 하위 폴더를 사용할 수 있습니다.https
는 모든 데이터 액세스 메서드에 사용할 수 없습니다.wasbs
는 데이터가 보안 TLS 연결을 사용하여 전송되므로 권장됩니다.- 계층 구조 네임스페이스는 레거시
wasb://
인터페이스를 사용하여 데이터에 액세스할 때 Azure V2 Storage 계정에서 지원되지 않지만 계층 구조 네임스페이스를 사용합니다wasbs://
.
CREDENTIAL = credential_name
선택 사항. 외부 데이터 원본에 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다. 자격 증명이 없는 외부 데이터 원본은 공용 스토리지 계정에 액세스하거나 호출자의 Microsoft Entra ID를 사용하여 Azure Storage의 파일에 액세스할 수 있습니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
- Azure Storage 또는 ADLS(Azure Data Lake Store) Gen2에서 Azure Synapse Analytics로 데이터를 로드하려면 Azure Storage 키를 사용합니다.
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.
데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
서버리스 SQL 풀에서 데이터베이스 범위 자격 증명은 작업 영역 관리 ID, 서비스 주체 이름 또는 SAS(공유 액세스 서명) 토큰을 지정할 수 있습니다. Microsoft Entra 통과라고도 하는 사용자 ID를 통한 액세스는 공개적으로 사용 가능한 스토리지에 대한 익명 액세스와 마찬가지로 데이터베이스 범위 자격 증명에서도 가능합니다. 자세한 내용은 지원되는 스토리지 권한 부여 유형을 참조 하세요.
전용 SQL 풀에서 데이터베이스 범위 자격 증명은 SAS(공유 액세스 서명) 토큰, 스토리지 액세스 키, 서비스 주체, 작업 영역 관리 ID 또는 Microsoft Entra 통과를 지정할 수 있습니다.
TYPE = HADOOP
선택 사항입니다. 권장되지 않습니다.
전용 SQL 풀을 사용하여 TYPE만 지정할 수 있습니다. HADOOP
는 지정된 경우 허용되는 유일한 값입니다. TYPE=HADOOP
인 외부 데이터 원본은 전용 SQL 풀에서만 사용할 수 있습니다.
레거시 구현에는 HADOOP를 사용하고, 그렇지 않으면 최신 네이티브 데이터 액세스를 사용하는 것이 좋습니다. 최신 네이티브 데이터 액세스를 사용하도록 TYPE 인수를 지정하지 마세요.
TYPE = HADOOP
을 사용하여 Azure Storage에서 데이터를 로드하는 방법에 대한 예제를 보려면 서비스 주체를 사용하여 Azure Data Lake Store Gen 1 또는 2를 참조하는 외부 데이터 원본 만들기를 참조하세요.
Azure Synapse Analytics의 서버리스 및 전용 SQL 풀은 데이터 가상화에 서로 다른 코드 베이스를 사용합니다. 서버리스 SQL 풀은 네이티브 데이터 가상화 기술을 지원합니다. 전용 SQL 풀은 네이티브 및 PolyBase 데이터 가상화를 모두 지원합니다. PolyBase 데이터 가상화는 EXTERNAL DATA SOURCE를 사용하여 TYPE=HADOOP
만들 때 사용됩니다.
사용 권한
데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
보안
대부분의 외부 데이터 원본은 데이터베이스 범위 자격 증명을 사용하여 프록시 계정을 만드는 프록시 기반 인증을 지원합니다.
SAS(공유 액세스 서명) 키는 Azure Data Lake Store Gen 2 Storage 계정에 인증하는 데 지원됩니다. 공유 액세스 서명을 사용하여 인증하려는 고객은 IDENTITY = "Shared Access Signature"
에서 SAS 토큰을 비밀로 입력할 데이터베이스 범위 자격 증명을 만들어야 합니다.
IDENTITY = "Shared Access Signature"
에서 데이터베이스 범위 자격 증명을 만들고 스토리지 키 값을 비밀로 사용하는 경우 다음 오류 메시지가 표시됩니다.
'HdfsBridge::isDirExist - Unexpected error encountered checking whether directory exists or not: AbfsRestOperationException: Operation failed: "Server failed to authenticate the request. Please refer to the information in the www-authenticate header.", 401, HEAD, [Storage path URL]'
예제
A. wasb://인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기
이 예제에서 외부 데이터 원본은 이름이 logs
Azure Storage 계정 V2입니다. 스토리지 컨테이너를 daily
라고 합니다. Azure Storage 외부 데이터 원본은 데이터 전송 전용입니다. 조건자 푸시 다운을 지원하지 않습니다. 계층 구조 네임스페이스는 wasb://
인터페이스를 통해 데이터에 액세스하는 경우 지원되지 않습니다. WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
이 예제에서는 레거시 HADOOP Java 기반 액세스 방법을 사용합니다. 다음 샘플에서는 Azure Storage에 대한 인증을 위해 데이터베이스 범위 자격 증명을 만드는 방법을 보여 줍니다. 데이터베이스 자격 증명 비밀에 Azure Storage 계정 키를 지정합니다. Azure 스토리지에 대한 인증 중에는 사용되지 않으므로 데이터베이스 범위 지정 자격 증명 ID에 문자열을 지정할 수 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
B. Azure Data Lake Store Gen 1 또는 2를 참조하거나 서비스 주체를 사용하여 외부 데이터 소스를 생성합니다.
Azure Data Lake Store 연결은 ADLS URI 및 Microsoft Entra 애플리케이션의 서비스 주체를 기반으로 할 수 있습니다. 이 애플리케이션을 만들기 위한 설명서는 Microsoft Entra ID를 사용하여 Data Lake Store 인증에서 찾을 수 있습니다.
-- If you do not have a Master Key on your DW you will need to create one.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- These values come from your Microsoft Entra application used to authenticate to ADLS
CREATE DATABASE SCOPED CREDENTIAL ADLS_credential
WITH
-- IDENTITY = '<clientID>@<OAuth2.0TokenEndPoint>' ,
IDENTITY = '536540b4-4239-45fe-b9a3-629f97591c0c@https://login.microsoftonline.com/42f988bf-85f1-41af-91ab-2d2cd011da47/oauth2/token',
-- SECRET = '<KEY>'
SECRET = 'BjdIlmtKp4Fpyh9hIvr8HJlUida/seM5kQ3EpLAmeDI=';
-- For Gen 1 - Create an external data source
-- TYPE: HADOOP - PolyBase uses Hadoop APIs to access data in Azure Data Lake Storage.
-- LOCATION: Provide Data Lake Storage Gen 1 account name and URI
-- CREDENTIAL: Provide the credential created in the previous step
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
LOCATION = 'adl://newyorktaxidataset.azuredatalakestore.net',
CREDENTIAL = ADLS_credential,
TYPE = HADOOP
);
-- For Gen2 - Create an external data source
-- TYPE: HADOOP - PolyBase uses Hadoop APIs to access data in Azure Data Lake Storage.
-- LOCATION: Provide Data Lake Storage Gen2 account name and URI
-- CREDENTIAL: Provide the credential created in the previous step
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
-- Note the abfss endpoint when your account has secure transfer enabled
LOCATION = 'abfss://data@newyorktaxidataset.dfs.core.windows.net',
CREDENTIAL = ADLS_credential,
TYPE = HADOOP
);
C. Azure Data Lake Store Gen2를 참조하거나 스토리지 계정 키를 사용하여 외부 데이터 원본을 생성합니다.
-- If you do not have a Master Key on your DW you will need to create one.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL ADLS_credential
WITH
-- IDENTITY = '<storage_account_name>' ,
IDENTITY = 'newyorktaxidata',
-- SECRET = '<storage_account_key>'
SECRET = 'yz5N4+bxSb89McdiysJAzo+9hgEHcJRJuXbF/uC3mhbezES/oe00vXnZEl14U0lN3vxrFKsphKov16C0w6aiTQ==';
-- Note this example uses a Gen2 secured endpoint (abfss)
CREATE EXTERNAL DATA SOURCE < data_source_name >
WITH (
LOCATION = 'abfss://2013@newyorktaxidataset.dfs.core.windows.net',
CREDENTIAL = ADLS_credential,
TYPE = HADOOP
);
D. abfs:// 사용하여 Azure Data Lake Store Gen2에 대한 외부 데이터 원본 만들기
관리 ID 메커니즘으로 Azure Data Lake Store Gen2 계정에 연결할 경우 SECRET을 지정할 필요가 없습니다.
-- If you do not have a Master Key on your DW you will need to create one
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
--Create database scoped credential with **IDENTITY = 'Managed Service Identity'**
CREATE DATABASE SCOPED CREDENTIAL msi_cred
WITH IDENTITY = 'Managed Service Identity';
--Create external data source with abfss:// scheme for connecting to your Azure Data Lake Store Gen2 account
CREATE EXTERNAL DATA SOURCE ext_datasource_with_abfss
WITH (
TYPE = HADOOP,
LOCATION = 'abfss://myfile@mystorageaccount.dfs.core.windows.net',
CREDENTIAL = msi_cred
);
다음 단계
* Analytics
플랫폼 시스템(PDW) *
개요: 분석 플랫폼 시스템
적용 대상: 분석 플랫폼 시스템(PDW)
PolyBase 쿼리에 대한 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 연결을 설정하고 다음과 같은 사용 사례를 지원하는 데 사용됩니다. PolyBase를 사용하여 데이터 가상화 및 데이터 로드.
Syntax
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = HADOOP ]
[ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 Analytics Platform System(PDW)의 서버 내에서 반드시 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 커넥터 위치 접두사 | 위치 경로 |
---|---|---|
Cloudera CDH 또는 Hortonworks HDP | hdfs |
<Namenode>[:port] |
Azure Storage 계정 | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
위치 경로:
<Namenode>
= Hadoop 클러스터에 있는Namenode
의 머신 이름, 이름 서비스 URI 또는 IP 주소입니다. PolyBase는 Hadoop 클러스터에서 사용하는 모든 DNS 이름을 확인해야 합니다.port
= 외부 데이터 원본이 수신 대기 중인 포트입니다. Hadoop에서는fs.defaultFS
구성 매개 변수를 사용하여 포트를 찾을 수 있습니다. 기본값은 8020입니다.<container>
= 데이터를 보관하는 스토리지 계정의 컨테이너입니다. 루트 컨테이너는 읽기 전용이므로 데이터를 컨테이너에 다시 쓸 수 없습니다.<storage_account>
= Azure 리소스의 스토리지 계정 이름입니다.
위치 설정 시 추가 참고 사항 및 지침:
- PDW 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
- 일관된 쿼리 의미 체계를 보장하기 위해 Hadoop을 쿼리할 때 모든 테이블에 대해 동일한 외부 데이터 원본을 사용합니다.
wasbs
는 데이터가 보안 TLS 연결을 사용하여 전송되므로 권장됩니다.- 계층 구조 네임스페이스는 wasb://를 통해 Azure Storage 계정에서 사용하는 경우 지원되지 않습니다.
- Hadoop
Namenode
장애 조치(failover) 중에 PolyBase 쿼리를 성공적으로 수행하려면 Hadoop 클러스터의Namenode
에 대한 가상 IP 주소 사용을 고려하세요. 그렇지 않은 경우 ALTER EXTERNAL DATA SOURCE 명령을 실행하여 새 위치를 가리킵니다.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
- Azure Storage에서 Azure Synapse 또는 PDW로 데이터를 로드하려면 Azure Storage 키를 사용합니다.
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.
TYPE = [ HADOOP ]
구성 중인 외부 데이터 원본의 유형을 지정합니다. 이 매개 변수가 항상 필요한 것은 아닙니다.
- 외부 데이터 원본이 Cloudera CDH, Hortonworks HDP 또는 Azure Storage이면 HADOOP을 사용합니다.
TYPE
= HADOOP
을 사용하여 Azure Storage에서 데이터를 로드하는 예제는 Hadoop을 참조하는 외부 데이터 원본 만들기를 참조하세요.
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
SQL Server 2019 (15.x)에서는 Cloudera CDH, Hortonworks HDP, Azure Storage 계정에 연결하지 않는 한 RESOURCE_MANAGER_LOCATION을 지정하지 마세요.
Cloudera CDH, Hortonworks HDP 또는 Azure Storage 계정에 연결할 때만 이 선택적 값을 구성합니다. 지원되는 Hadoop 버전의 전체 목록은 PolyBase 연결 구성(Transact-SQL)을 참조하세요.
RESOURCE_MANAGER_LOCATION
정의된 경우 쿼리 최적화 프로그램은 성능 향상을 위해 비용 기반 결정을 내립니다. MapReduce 작업을 사용하여 Hadoop으로 계산을 푸시 다운할 수 있습니다. RESOURCE_MANAGER_LOCATION
을 지정하면 Hadoop과 SQL 간에 전송되는 데이터 양을 크게 줄여 쿼리 성능을 향상시킬 수 있습니다.
리소스 관리자를 지정하지 않은 경우 Hadoop에 대한 푸시 컴퓨팅은 PolyBase 쿼리에 대해 비활성화됩니다. 푸시 다운이 활성화된 Hadoop을 참조하는 외부 데이터 원본 만들기는 구체적인 예제와 추가 지침을 제공합니다.
외부 데이터 원본을 만들 때 RESOURCE_MANAGER_LOCATION 값의 유효성이 검사되지 않습니다. 잘못된 값을 입력하면 제공된 값을 확인할 수 없으므로 푸시 다운을 시도할 때마다 실행 시 쿼리 오류가 발생할 수 있습니다.
PolyBase가 Hadoop 외부 데이터 원본에서 올바르게 작동하려면 다음 Hadoop 클러스터 구성 요소에 대한 포트가 열려 있어야 합니다.
- HDFS 포트
- Namenode
- Datanode
- Resource Manager
- 작업 제출
- 작업 기록
포트를 지정하지 않을 경우 기본값은 'hadoop 연결' 구성에 대한 현재 설정을 사용하여 선택됩니다.
Hadoop 연결 | 기본 Resource Manager 포트 |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
다음 표에서는 이러한 구성 요소의 기본 포트를 보여 줍니다. Hadoop 버전 종속성뿐만 아니라 기본 포트 할당을 사용하지 않는 사용자 지정 구성도 가능합니다.
Hadoop 클러스터 구성 요소 | 기본 포트 |
---|---|
NameNode | 8020 |
DataNode(데이터 전송, 비 권한 IPC 포트) | 50010 |
DataNode(데이터 전송, 권한 IPC 포트) | 1019 |
Resource Manager 작업 제출(Hortonworks 1.3) | 50300 |
Resource Manager 작업 제출(Cloudera 4.3) | 8021 |
Resource Manager 작업 제출(Windows의 Hortonworks 2.0, Linux의 Cloudera 5.x) | 8032 |
Resource Manager 작업 제출(Linux의 Hortonworks 2.x, 3.0, Windows의 Hortonworks 2.1~3) | 8050 |
Resource Manager 작업 기록 | 10020 |
사용 권한
PDW(Analytics Platform System)의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
참고
PDW의 이전 릴리스에서는 외부 데이터 원본을 만들려면 ALTER ANY EXTERNAL DATA SOURCE
권한이 필요했습니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
보안
PolyBase는 대부분의 외부 데이터 원본에 대해 프록시 기반 인증을 지원합니다. 데이터베이스 범위 자격 증명을 생성하여 프록시 계정을 만듭니다.
HADOOP
유형의 SAS 토큰은 지원되지 않습니다. 스토리지 계정 액세스 키를 대신 사용하는 경우에만 BLOB_STORAGE
유형이 지원됩니다. HADOOP
유형 및 SAS 자격 증명으로 외부 데이터 원본을 만들려고 하면 다음 오류로 인해 실패합니다.
Msg 105019, Level 16, State 1 - EXTERNAL TABLE access failed due to internal error: 'Java exception raised on call to HdfsBridge_Connect. Java exception message: Parameters provided to connect to the Azure storage account are not valid.: Error [Parameters provided to connect to the Azure storage account are not valid.] occurred while accessing external file.'
예
A. Hadoop를 참조하는 외부 데이터 원본 만들기
Hortonworks HDP 또는 Cloudera CDH를 참조하는 외부 데이터 원본을 만들려면 머신 이름 또는 Hadoop Namenode
및 포트의 IP 주소를 지정합니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. 푸시 다운이 활성화된 상태에서 Hadoop를 참조하는 외부 데이터 원본 만들기
RESOURCE_MANAGER_LOCATION
옵션을 지정하여 PolyBase 쿼리에 대한 Hadoop 계산 푸시 다운을 활성화합니다. 활성화되면 PolyBase는 쿼리 계산을 Hadoop에 푸시해야 하는지 여부를 결정하기 위해 비용 기반 결정을 내립니다.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
C. Kerberos 보안 Hadoop를 참조하는 외부 데이터 원본 만들기
Hadoop 클러스터가 Kerberos 보안 방식인지 확인하려면 Hadoop core-site.xml에서 hadoop.security.authentication
속성의 값을 확인합니다. Kerberos 보안 Hadoop 클러스터를 확인하려면 Kerberos 사용자 이름과 암호를 포함한 데이터베이스 범위 자격 증명을 지정해야 합니다. 데이터베이스 범위 자격 증명 비밀을 암호화하는 데에는 데이터베이스 마스터 키가 사용됩니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
SECRET = '<hadoop_password>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);
D. wasb://인터페이스를 사용하여 Azure Storage의 데이터에 액세스하는 외부 데이터 원본 만들기
이 예제에서 외부 데이터 원본은 logs
라는 Azure V2 Storage 계정입니다. 스토리지 컨테이너를 daily
라고 합니다. Azure Storage 외부 데이터 원본은 데이터 전송 전용입니다. 조건자 푸시 다운을 지원하지 않습니다. 계층 구조 네임스페이스는 wasb://
인터페이스를 통해 데이터에 액세스하는 경우 지원되지 않습니다. WASB 커넥터를 통해 Azure Storage에 연결할 때는 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.
이 예제에서는 Azure Storage에 대한 인증을 위해 데이터베이스 범위 자격 증명을 만드는 방법을 보여 줍니다. 데이터베이스 자격 증명 비밀에 Azure Storage 계정 키를 지정합니다. Azure 스토리지에 대한 인증 중에는 사용되지 않으므로 데이터베이스 범위 지정 자격 증명 ID에 문자열을 지정할 수 있습니다.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
다음 단계
* SQL Managed Instance *
개요: Azure SQL Managed Instance
적용 대상: Azure SQL Managed Instance
외부 데이터 원본 Azure SQL Managed Instance를 만듭니다. 자세한 내용은 Azure SQL Managed Instance를 사용한 데이터 가상화를 참조하세요.
Azure SQL Managed Instance 데이터 가상화는 OPENROWSET T-SQL 구문 또는 CREATE EXTERNAL TABLE T-SQL 구문을 통해 다양한 파일 형식의 외부 데이터에 대한 액세스를 제공합니다.
Syntax
구문 표기 규칙에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
)
[ ; ]
인수
data_source_name
데이터 원본에 대한 사용자 정의 이름을 지정합니다. 이름은 반드시 데이터베이스 내에서 고유해야 합니다.
LOCATION = '<prefix>://<path[:port]>'
외부 데이터 원본에 대한 연결 프로토콜 및 경로를 제공합니다.
외부 데이터 원본 | 위치 접두사 | 위치 경로 |
---|---|---|
Azure Blob Storage | abs |
abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name> |
Azure Data Lake Service Gen2 | adls |
adls://<container>@<storage_account>.dfs.core.windows.net/<path>/<file_name> |
데이터베이스 엔진은 개체가 생성될 때 외부 데이터 원본이 존재하는지 확인하지 않습니다. 유효성을 검사하려면 외부 데이터 원본을 사용하여 외부 테이블을 만듭니다.
대량 작업을 위해 외부 데이터 원본을 구성할 때 LOCATION
URL 끝에 추적 / , 파일 이름 또는 공유 액세스 서명 매개 변수를 추가하지 마세요.
CREDENTIAL = credential_name
외부 데이터 원본에 대해 인증하기 위한 데이터베이스 범위 자격 증명을 지정합니다.
자격 증명 생성 시 추가 참고 사항 및 지침:
- Azure Storage에서 Azure SQL Managed Instance로 데이터를 로드하려면 SAS 토큰(공유 액세스 서명)을 사용합니다.
CREDENTIAL
은 데이터 보안이 설정된 경우에만 필요합니다. 익명 액세스를 허용하는 데이터 세트에는CREDENTIAL
이 필요하지 않습니다.- 자격 증명이 필요한 경우
Managed Identity
또는SHARED ACCESS SIGNATURE
를 IDENTITY로 사용하여 자격 증명을 만들어야 합니다. 데이터베이스 범위 지정 자격 증명을 만들려면 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.
데이터베이스 범위 자격 증명에 관리 서비스 ID를 사용하려면 다음을 수행합니다.
WITH IDENTITY = 'Managed Identity'
지정- 이 용도로 사용하려면 사용하도록 설정해야 하는 Azure SQL Managed Instance 시스템 할당 관리 서비스 ID를 사용합니다.
필요한 Azure Blob Storage 컨테이너에 Azure SQL Managed Instance 시스템 할당 관리 서비스 ID에 대한 읽기 Azure RBAC 역할을 부여합니다. 예를 들어 Azure Portal을 사용하는 경우 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.
데이터베이스 범위 자격 증명에 대한 SAS(공유 액세스 서명)를 만들려면 다음을 수행합니다.
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = ...
지정공유 액세스 서명을 만드는 방법에는 여러 가지가 있습니다.
- Azure Portal -><Your_Storage_Account> -> 공유 액세스 서명 -> 권한 구성 -> SAS 및 연결 문자열 생성으로 이동하여 SAS 토큰을 가져올 수 있습니다. 자세한 내용은 공유 액세스 서명 생성을 참조하세요.
- Azure Storage Explorer를 사용하여 SAS를 만들고 구성할 수 있습니다.
- PowerShell, Azure CLI, .NET 및 REST API를 통해 프로그래밍 방식으로 SAS를 만들 수 있습니다. 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여를 참조하세요.
SAS 토큰은 다음과 같이 구성되어야 합니다.
- SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
?
제외 - 유효한 만료 기간을 사용합니다(모든 날짜는 UTC 시간임).
- 로드해야 하는 파일에 대해 적어도 읽기 권한을 승인해야 합니다(예:
srt=o&sp=r
). 다양한 사용 사례에 대해 여러 공유 액세스 서명을 만들 수 있습니다. 권한은 다음과 같이 부여되어야 합니다.
작업 사용 권한 파일에서 데이터 읽기 읽기 여러 파일 및 하위 폴더에서 데이터를 읽습니다. 읽기 및 목록 CETAS(Create External Table as Select) 사용 읽기, 만들기 및 쓰기 - SAS 토큰이 생성되면 토큰의 시작 부분에 물음표('?')가 포함됩니다. 비밀로 구성된 경우 앞에 오는
사용 권한
Azure SQL Managed Instance의 데이터베이스에 대한 CONTROL
권한이 필요합니다.
잠금
EXTERNAL DATA SOURCE
개체에 대한 공유 잠금을 수행합니다.
예제
더 많은 예시는 Azure SQL Managed Instance를 사용한 데이터 가상화를 참조하세요.
A. OPENROWSET 또는 외부 테이블을 사용하여 Azure SQL Managed Instance 외부 데이터 쿼리
자세한 예제는 외부 데이터 원본 만들기를 참조하거나 Azure SQL Managed Instance 사용하여 데이터 가상화를 참조하세요.
데이터베이스 마스터 키가 없는 경우 만듭니다.
-- Optional: Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>' GO
SAS 토큰을 사용하여 데이터베이스 범위 자격 증명을 만듭니다. 관리 ID도 사용할 수 있습니다.
CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<KEY>' ; --Removing leading '?' GO
자격 증명을 사용하여 외부 데이터 원본을 만듭니다.
--Create external data source pointing to the file path, and referencing database-scoped credential: CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource WITH ( LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest', CREDENTIAL = [MyCredential] );
스키마를 모르고 데이터를 빠르게 탐색하려면 스키마 유추를 사용하여 OPENROWSET T-SQL 구문을 사용하고 외부 데이터 원본에서 parquet 데이터 파일을 쿼리합니다.
--Query data with OPENROWSET, relying on schema inference. SELECT TOP 10 * FROM OPENROWSET ( BULK 'bing_covid-19_data.parquet', DATA_SOURCE = 'MyExternalDataSource', FORMAT = 'parquet' ) AS filerows;
또는 실행 비용을 쿼리할 수 있는 스키마 유추에 의존하는 대신 OPENROWSET WITH 절을 사용하여 데이터를 쿼리합니다. CSV에서 스키마 유추는 지원되지 않습니다.
--Or, query data using the WITH clause on a CSV, where schema inference is not supported SELECT TOP 10 id, updated, confirmed, confirmed_change FROM OPENROWSET ( BULK 'bing_covid-19_data.csv', DATA_SOURCE = 'MyExternalDataSource', FORMAT = 'CSV', FIRSTROW = 2 ) WITH ( id INT, updated DATE, confirmed INT, confirmed_change INT ) AS filerows;
또는 EXTERNAL FILE FORMAT 및 EXTERNAL TABLE을 만들어 데이터를 로컬 테이블로 쿼리합니다.
-- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE --Create external file format CREATE EXTERNAL FILE FORMAT DemoFileFormat WITH (FORMAT_TYPE = PARQUET) GO --Create external table: CREATE EXTERNAL TABLE tbl_TaxiRides ( vendorID VARCHAR(100) COLLATE Latin1_General_BIN2, tpepPickupDateTime DATETIME2, tpepDropoffDateTime DATETIME2, passengerCount INT, tripDistance FLOAT, puLocationId VARCHAR(8000), doLocationId VARCHAR(8000), startLon FLOAT, startLat FLOAT, endLon FLOAT, endLat FLOAT, rateCodeId SMALLINT, storeAndFwdFlag VARCHAR(8000), paymentType VARCHAR(8000), fareAmount FLOAT, extra FLOAT, mtaTax FLOAT, improvementSurcharge VARCHAR(8000), tipAmount FLOAT, tollsAmount FLOAT, totalAmount FLOAT ) WITH ( LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet', DATA_SOURCE = NYCTaxiExternalDataSource, FILE_FORMAT = MyFileFormat\.\./\.\./\.\./azure-sql/ ); GO --Then, query the data via an external table with T-SQL: SELECT TOP 10 * FROM tbl_TaxiRides; GO