적용 대상: Windows의 SQL Server 2016(13.x) 이상 버전
이 문서에서는 SQL Server 인스턴스에서 PolyBase를 사용하여 Azure Blob Storage에서 외부 데이터를 쿼리하는 방법을 설명합니다.
필수 조건
PolyBase를 설치하지 않은 경우 Windows에 PolyBase 설치를 참조하세요. 설치 문서에서는 필수 구성 요소를 설명합니다.
SQL Server 2022
SQL Server 2022(16.x)에서, Azure Storage에 연결할 때 새 커넥터를 사용하도록 외부 데이터 원본을 구성합니다. 다음 테이블에 변경 내용이 요약되어 있습니다.
| 외부 데이터 원본 | 부터 | 에 |
|---|---|---|
| Azure Blob Storage | wasb[s] | abs |
| ADLS Gen 2 | abfs[s] | adls |
Azure Blob Storage 연결을 구성합니다.
먼저 Azure Blob Storage를 사용하도록 SQL Server PolyBase를 구성합니다.
Azure Blob Storage 공급자로 설정된
'hadoop connectivity'실행합니다. 공급자에 대한 값을 찾으려면 PolyBase 연결 구성을 참조하세요. 기본적으로 Hadoop 연결은 .로 설정됩니다7.-- Values map to various external data sources. -- Example: value 7 stands for Hortonworks HDP 2.1 to 2.6 on Linux, -- 2.1 to 2.3 on Windows Server, and Azure Blob Storage EXECUTE sp_configure @configname = 'hadoop connectivity', @configvalue = 7; GO RECONFIGURE;services.msc를 사용하여 SQL Server를 다시 시작합니다. SQL Server를 다시 시작하면 다음 서비스가 다시 시작됩니다.
- SQL Server PolyBase 데이터 이동 서비스
- SQL Server PolyBase 엔진
services.msc를 사용하여 SQL Server를 다시 시작합니다. SQL Server를 다시 시작하면 다음 서비스가 다시 시작됩니다.
- SQL Server PolyBase 데이터 이동 서비스
- SQL Server PolyBase 엔진
외부 테이블 구성
Hadoop 데이터 원본의 데이터를 쿼리하려면 Transact-SQL 쿼리에 사용할 외부 테이블을 정의해야 합니다. 다음 단계에서는 외부 테이블을 구성하는 방법을 설명합니다.
데이터베이스에 DMK(데이터베이스 마스터 키)를 만듭니다. DMK는 자격 증명 비밀을 암호화하는 데 필요합니다.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';Azure Blob Storage의 데이터베이스 범위 자격 증명을 만듭니다.
IDENTITY는 사용되지 않으므로 무엇이든 가능합니다.-- IDENTITY: any string (this is not used for authentication to Azure storage). -- SECRET: your Azure storage account key. CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential WITH IDENTITY = 'user', SECRET = '<azure_storage_account_key>';CREATE EXTERNAL DATA SOURCE를 사용하여 외부 데이터 원본을 만듭니다. 커넥터를 통해
wasb[s]Azure Storage에 연결하는 경우 SAS(공유 액세스 서명)가 아닌 스토리지 계정 키를 사용하여 인증을 수행해야 합니다.-- LOCATION: Azure account storage account name and blob container name. -- CREDENTIAL: The database scoped credential created above. CREATE EXTERNAL DATA SOURCE AzureStorage WITH ( TYPE = HADOOP, LOCATION = 'wasbs://<blob_container_name>@<azure_storage_account_name>.blob.core.windows.net', CREDENTIAL = AzureStorageCredential );CREATE EXTERNAL FILE FORMAT을 사용하여 외부 파일 형식을 만듭니다.
-- FORMAT TYPE: Type of format in Hadoop (DELIMITEDTEXT, RCFILE, ORC, PARQUET). CREATE EXTERNAL FILE FORMAT TextFileFormat WITH ( FORMAT_TYPE = DELIMITEDTEXT, FORMAT_OPTIONS (FIELD_TERMINATOR = '|', USE_TYPE_DEFAULT = TRUE) );CREATE EXTERNAL TABLE을 사용하여 Azure Storage에 저장된 데이터를 가리키는 외부 테이블을 만듭니다. 이 예제에서는 외부 데이터에 자동차 센서 데이터가 포함됩니다.
LOCATION은/가 될 수 없지만 이 예에서/Demo/는 이전에 존재할 필요가 없었기 때문에 가능합니다.-- LOCATION: path to file or directory that contains the data (relative to HDFS root). CREATE EXTERNAL TABLE [dbo].[CarSensor_Data] ( SensorKey INT NOT NULL, CustomerKey INT NOT NULL, GeographyKey INT NULL, Speed FLOAT NOT NULL, YearMeasured INT NOT NULL ) WITH ( DATA_SOURCE = AzureStorage, LOCATION = '/Demo/', FILE_FORMAT = TextFileFormat );외부 테이블에 대한 통계를 생성합니다.
CREATE STATISTICS StatsForSensors ON CarSensor_Data(CustomerKey, Speed);
데이터베이스에 DMK(데이터베이스 마스터 키)를 만듭니다. DMK는 자격 증명 비밀을 암호화하는 데 필요합니다.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';SAS(공유 액세스 서명)을 사용하여 Azure Blob Storage의 데이터베이스 범위 자격 증명을 만듭니다.
IDENTITY는 사용되지 않으므로 무엇이든 가능합니다.CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', -- Remove ? from the beginning of the SAS token SECRET = '<azure_shared_access_signature>';CREATE EXTERNAL DATA SOURCE를 사용하여 외부 데이터 원본을 만듭니다. WASB[s] 커넥터를 통해 Azure Storage에 연결하는 경우 SAS(공유 액세스 서명)를 사용하여 인증합니다.
-- LOCATION: Azure account storage account name and blob container name. -- CREDENTIAL: The database scoped credential created above. CREATE EXTERNAL DATA SOURCE AzureStorage WITH ( LOCATION = 'wasbs://<blob_container_name>@<azure_storage_account_name>.blob.core.windows.net', CREDENTIAL = AzureStorageCredential );CREATE EXTERNAL FILE FORMAT을 사용하여 외부 파일 형식을 만듭니다.
-- FORMAT TYPE: Type of format in Hadoop (DELIMITEDTEXT, RCFILE, ORC, PARQUET). CREATE EXTERNAL FILE FORMAT TextFileFormat WITH ( FORMAT_TYPE = DELIMITEDTEXT, FORMAT_OPTIONS (FIELD_TERMINATOR = '|', USE_TYPE_DEFAULT = TRUE) );CREATE EXTERNAL TABLE을 사용하여 Azure Storage에 저장된 데이터를 가리키는 외부 테이블을 만듭니다. 이 예제에서는 외부 데이터에 자동차 센서 데이터가 포함됩니다.
LOCATION은/가 될 수 없지만 이 예에서/Demo/는 이전에 존재할 필요가 없었기 때문에 가능합니다.-- LOCATION: path to file or directory that contains the data (relative to HDFS root). CREATE EXTERNAL TABLE [dbo].[CarSensor_Data] ( SensorKey INT NOT NULL, CustomerKey INT NOT NULL, GeographyKey INT NULL, Speed FLOAT NOT NULL, YearMeasured INT NOT NULL ) WITH ( DATA_SOURCE = AzureStorage, LOCATION = '/Demo/', FILE_FORMAT = TextFileFormat );외부 테이블에 대한 통계를 생성합니다.
CREATE STATISTICS StatsForSensors ON CarSensor_Data(CustomerKey, Speed);
PolyBase 쿼리
PolyBase에 적합한 세 가지 함수가 있습니다.
- 외부 테이블에 대한 임시 쿼리
- 데이터 가져오기
- 데이터 내보내기
다음 쿼리는 가상의 자동차 센서 데이터를 사용한 예제를 제공합니다.
임시 쿼리
다음 임시 쿼리는 관계형 데이터와 Hadoop 데이터를 조인합니다. 이 쿼리는 35mph보다 빠르게 주행하는 고객을 선택하고 SQL Server에 저장된 구조화된 고객 데이터를 Hadoop에 저장된 차량 센서 데이터와 조인합니다.
SELECT DISTINCT Insured_Customers.FirstName,
Insured_Customers.LastName,
Insured_Customers.YearlyIncome,
CarSensor_Data.Speed
FROM Insured_Customers,
CarSensor_Data
WHERE Insured_Customers.CustomerKey = CarSensor_Data.CustomerKey
AND CarSensor_Data.Speed > 35
ORDER BY CarSensor_Data.Speed DESC
OPTION (FORCE EXTERNALPUSHDOWN); -- or OPTION (DISABLE EXTERNALPUSHDOWN)
PolyBase를 사용하여 데이터 가져옹기
다음 쿼리는 외부 데이터를 SQL Server로 가져옵니다. 이 예제에서는 더 자세한 분석을 수행하도록 빠른 드라이버의 데이터를 SQL Server로 가져옵니다. 성능을 향상시키기 위해 columnstore 기술을 사용합니다.
SELECT DISTINCT Insured_Customers.FirstName,
Insured_Customers.LastName,
Insured_Customers.YearlyIncome,
Insured_Customers.MaritalStatus
INTO Fast_Customers
FROM Insured_Customers
INNER JOIN (SELECT *
FROM CarSensor_Data
WHERE Speed > 35
) AS SensorD
ON Insured_Customers.CustomerKey = SensorD.CustomerKey
ORDER BY YearlyIncome;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FastCustomers
ON Fast_Customers;
PolyBase를 사용하여 데이터 내보내기
다음 쿼리는 SQL Server에서 Azure Blob Storage로 데이터를 내보냅니다. 먼저 PolyBase 내보내기를 사용합니다. 그런 다음 데이터를 내보내기 전에 대상의 외부 테이블을 만듭니다.
-- Enable INSERT into external table
EXECUTE sp_configure 'allow polybase export', 1;
RECONFIGURE;
GO
-- Create an external table.
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009]
(
FirstName CHAR (25) NOT NULL,
LastName CHAR (25) NOT NULL,
YearlyIncome FLOAT NULL,
MaritalStatus CHAR (1) NOT NULL
)
WITH (
DATA_SOURCE = HadoopHDP2,
LOCATION = '/old_data/2009/customerdata',
FILE_FORMAT = TextFileFormat,
REJECT_TYPE = VALUE,
REJECT_VALUE = 0
);
-- Export data: Move old data to Hadoop while keeping it query-able via an external table.
INSERT INTO dbo.FastCustomer2009
SELECT T.*
FROM Insured_Customers AS T1
INNER JOIN CarSensor_Data AS T2
ON (T1.CustomerKey = T2.CustomerKey)
WHERE T2.YearMeasured = 2009
AND T2.Speed > 40;
이 메서드를 사용하여 PolyBase 내보내기에서 여러 파일을 만들 수 있습니다.
SSMS에서 PolyBase 개체 보기
SSMS에서 외부 테이블은 별도의 외부 테이블 폴더에 표시됩니다. 외부 데이터 원본 및 외부 파일 형식은 외부 리소스 아래의 하위 폴더에 있습니다.