Настройка PolyBase для доступа к внешним данным в Hadoop

Применимо к:SQL Server в Windows Управляемый экземпляр SQL Azure

В этой статье объясняется, как использовать PolyBase на экземпляре SQL Server для запроса внешних данных в Hadoop.

Примечание.

Начиная с SQL Server 2022 (16.x), Hadoop больше не поддерживается в PolyBase.

Требования

  • PolyBase поддерживает два поставщика Hadoop — Hortonworks Data Platform (HDP) и Cloudera Distributed Hadoop (CDH). Hadoop использует схему «Major.Minor.Version» для своих новых релизов, и поддерживаются все версии, входящие в поддерживаемые крупные и минорные версии. Для получения информации о поддерживаемых версиях Hortonworks Data Platform (HDP) и Cloudera Distributed Hadoop (CDH) см. конфигурацию подключения PolyBase.

Примечание.

PolyBase поддерживает зоны шифрования Hadoop начиная с SQL Server 2016 SP1 CU7 и SQL Server 2017 CU3. Если вы используете группы масштабирования PolyBase, все вычислительные узлы должны быть в сборке с поддержкой зон шифрования Hadoop.

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

Сначала необходимо настроить SQL Server PolyBase для использования определенного поставщика Hadoop.

  1. Запустите sp_configurehadoop connectivity и установите стоимость для вашего провайдера. Чтобы найти ценность для вашего провайдера, смотрите конфигурацию подключения PolyBase.

    -- 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;
    GO
    
  2. Перезагрузите SQL Server, используя services.msc. Перезагрузка SQL Server также перезапускает следующие сервисы:

    • Служба перемещения данных SQL Server PolyBase
    • Движок SQL Server PolyBase

    Скриншот, показывающий, как остановить и запустить сервисы PolyBase в services.msc.

Включение вычислений с оптимизацией вниз

Чтобы улучшить производительность при выполнении запроса, активируйте вычисление pushdown для кластера Hadoop.

  1. Найдите файл yarn-site.xml в каталоге установки SQL Server. Как правило, путь выглядит следующим образом:

    C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf\
    
  2. Найдите аналогичный файл на компьютере с Hadoop в каталоге конфигурации. В файле найдите и скопируйте значение ключа yarn.application.classpathконфигурации.

  3. На компьютере SQL Server в файле yarn-site.xml найдите свойство yarn.application.classpath. Вставьте значение, скопированное на компьютере с Hadoop, в качестве значения элемента.

  4. Для всех версий CDH 5.x добавьте параметры конфигурации mapreduce.application.classpath либо в конец файла yarn-site.xml, либо в файл mapred-site.xml. HortonWorks включает эти настройки в конфигурации yarn.application.classpath. Например, см. конфигурацию и безопасность PolyBase для Hadoop.

Внимание

Чтобы использовать функцию переноса вычислений с Hadoop, целевой кластер Hadoop должен включать основные компоненты HDFS, YARN и MapReduce, при этом сервер истории заданий должен быть включен. PolyBase отправляет запрос на выполнение через MapReduce и получает статус выполнения с сервера истории заданий. Без любого из этих компонентов запрос завершится сбоем.

Настройка внешней таблицы

Чтобы запросить данные из источника данных Hadoop, необходимо определить внешнюю таблицу для использования в запросах Transact-SQL. Далее указаны шаги по настройке внешней таблицы.

  1. Создайте мастер-ключ в базе данных, если он ещё не существует. Вам нужен этот ключ для шифрования секрета учетных данных.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
    
    • PASSWORD = <пароль>

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

  2. Создайте учетные данные с ограниченной областью действия базы данных для кластеров Hadoop, защищенных с помощью Kerberos.

    CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
    WITH
        IDENTITY = '<kerberos_user_name>',
        SECRET = '<kerberos_password>';
    
  3. Создайте внешний источник данных с помощью CREATE EXTERNAL DATA SOURCE.

    • LOCATION (Обязательно): IP-адрес и порт узла NameNode Hadoop.
    • RESOURCE_MANAGER_LOCATION (Необязательно): местоположение диспетчера ресурсов Hadoop для включения pushdown-вычислений.
    • CREDENTIAL (Необязательно): Учетные данные области базы данных, созданные ранее.
    CREATE EXTERNAL DATA SOURCE MyHadoopCluster
    WITH (
        TYPE = HADOOP,
        LOCATION = 'hdfs://10.xxx.xx.xxx:xxxx',
        RESOURCE_MANAGER_LOCATION = '10.xxx.xx.xxx:xxxx',
        CREDENTIAL = HadoopUser1
    );
    
  4. Создайте формат внешнего файла с помощью CREATE EXTERNAL FILE FORMAT.

    • FORMAT_TYPE: Тип формата в Hadoop (DELIMITEDTEXT, RCFILE, ORC, или PARQUET).
    CREATE EXTERNAL FILE FORMAT TextFileFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (FIELD_TERMINATOR = '|', USE_TYPE_DEFAULT = TRUE)
    );
    
  5. Создайте внешнюю таблицу, ссылающуюся на данные, хранящиеся в Hadoop, с помощью CREATE EXTERNAL TABLE. В этом примере внешние данные представляют собой данные датчика автомобиля.

    • LOCATION: Путь к файлу или каталогу, содержащему данные (относительно корня HDFS).
    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 = MyHadoopCluster,
        LOCATION = '/Demo/',
        FILE_FORMAT = TextFileFormat
    );
    
  6. Создайте статистику для внешней таблицы.

    CREATE STATISTICS StatsForSensors
    ON CarSensor_Data(CustomerKey, Speed);
    

Запросы PolyBase

PolyBase подходит для следующих сценариев:

  • Нерегламентированные запросы к внешним таблицам.
  • импорт данных;
  • экспорт данных.

Следующие запросы приводят пример с вымышленными автомобильными сенсорными данными.

Нерегламентированные запросы

Следующий ad hoc запрос объединяет реляционные данные с данными Hadoop. Он выбирает клиентов, которые ездят быстрее 35 миль/ч, объединяя структурированные данные клиента, хранящиеся в 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)

Импорт данных

Следующий запрос позволяет импортировать внешние данные в 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;

Экспорт данных

Следующий запрос позволяет экспортировать данные из SQL Server в Hadoop. Во-первых, включите экспорт PolyBase. Затем создайте внешнюю целевую таблицу, прежде чем экспортировать в нее данные.

-- Enable INSERT into external table
EXECUTE 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 (
    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

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

Снимок экрана: объекты PolyBase в SSMS.