다음을 통해 공유


Azure Blob Storage의 외부 데이터에 액세스하도록 PolyBase 구성

적용 대상: SQL Server(Windows에만 해당) 지원되지 않습니다. Azure SQL Database 지원되지 않습니다. Azure Synapse Analytics 지원되지 않습니다. PDW(Analytics Platform System)

이 문서에서는 SQL Server 인스턴스에서 PolyBase를 사용하여 Azure Blob Storage에서 외부 데이터를 쿼리하는 방법을 설명합니다.

필수 조건

PolyBase를 설치하지 않은 경우 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를 구성합니다.

  1. 'hadoop connectivity'를 Azure Blob Storage 공급자로 설정하여 sp_configure를 실행합니다. 공급자의 값을 찾으려면 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  
    sp_configure @configname = 'hadoop connectivity', @configvalue = 7;
    GO
    
    RECONFIGURE
    GO
    
  2. services.msc를 사용하여 SQL Server를 다시 시작합니다. SQL Server를 다시 시작하면 다음 서비스가 다시 시작됩니다.

    • SQL Server PolyBase 데이터 이동 서비스
    • SQL Server PolyBase 엔진

    services.msc에서 PolyBase 서비스 중지 및 시작

  1. services.msc를 사용하여 SQL Server를 다시 시작합니다. SQL Server를 다시 시작하면 다음 서비스가 다시 시작됩니다.

    • SQL Server PolyBase 데이터 이동 서비스
    • SQL Server PolyBase 엔진

    services.msc에서 PolyBase 서비스 중지 및 시작

외부 테이블 구성

Hadoop 데이터 원본의 데이터를 쿼리하려면 Transact-SQL 쿼리에 사용할 외부 테이블을 정의해야 합니다. 다음 단계에서는 외부 테이블을 구성하는 방법을 설명합니다.

  1. 데이터베이스에 마스터 키를 만듭니다. 마스터 키는 자격 증명 비밀을 암호화하는 데 필요합니다.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';  
    
  2. 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>';
    
  3. 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  
    );  
    
  4. 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))  
    
  5. 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 (LOCATION='/Demo/',
          DATA_SOURCE = AzureStorage,  
          FILE_FORMAT = TextFileFormat  
    );  
    
  6. 외부 테이블에 대한 통계를 생성합니다.

    CREATE STATISTICS StatsForSensors on CarSensor_Data(CustomerKey, Speed)  
    
  1. 데이터베이스에 마스터 키를 만듭니다. 마스터 키는 자격 증명 비밀을 암호화하는 데 필요합니다.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';  
    
  2. 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>' ;
    
  3. CREATE EXTERNAL DATA SOURCE를 사용하여 외부 데이터 원본을 만듭니다. WASB 커넥터를 통해 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  
    );  
    
  4. 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))  
    
  5. 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 (LOCATION='/Demo/',
          DATA_SOURCE = AzureStorage,  
          FILE_FORMAT = TextFileFormat  
    );  
    
  6. 외부 테이블에 대한 통계를 생성합니다.

    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  
sp_configure 'allow polybase export', 1;  
reconfigure  
  
-- 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 (  
      LOCATION='/old_data/2009/customerdata',  
      DATA_SOURCE = HadoopHDP2,  
      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 T1 JOIN CarSensor_Data T2  
ON (T1.CustomerKey = T2.CustomerKey)  
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;  

이 방법을 사용하여 PolyBase 내보내기로 여러 파일을 만들 수 있습니다.

SSMS에서 PolyBase 개체 보기

SSMS에서 외부 테이블은 별도의 외부 테이블 폴더에 표시됩니다. 외부 데이터 원본 및 외부 파일 형식은 외부 리소스 아래의 하위 폴더에 있습니다.

SSMS의 PolyBase 개체

다음 단계

다양한 데이터 원본에 외부 데이터 원본 및 외부 테이블을 만드는 방법에 대한 자세한 자습서는 PolyBase Transact-SQL 참조를 참조하세요.

다음 문서에서 PolyBase를 사용하고 모니터링하는 더 많은 방법을 알아보세요.