Polybase i SQL 2016 RC 2

Ten artykuł opisuje w jaki sposób podłączć Microsoft SQL Server 2016 do danych w Hadoop.

Czym jest Polybase?

Polybase to nowy mechanizm, który pozwala na bezpośrednie połączenie SQL Server z Hadoop. Pojawił się w wersji 2016, wcześniej dostępny był w PDW.

Co będzie potrzebne?

– SQL Server 2016 (RC 2) – zainstalowane database engine i polybase -> Pobierz
– Management Studio 2016 (March) -> Pobierz
– Hortonworks – korzystałem z sandbox w wersjach 2.0 i 2.2.4 -> Pobierz (2.2), Pobierz (2.0)

Jak to działa?

Dostęp do danych realizowany jest przez tzw. External Tables. Za ich pomocą można odczytywać dane z Hadoop. I tutaj pierwsza uwaga – na ten moment możliwe jest tylko odczytywanie, żadna operacja modyfikująca nie jest możliwa.

Krok po kroku:

1. Sprawdzamy, czy polybase jest zainstalowany:

SELECT SERVERPROPERTY ('IsPolybaseInstalled') AS IsPolybaseInstalled;

2. Jeśli tak (wynik zapytania z kroku 1 równy jest 1) konfigurujemy z która dystrybucją i w jakiej wersji będziemy się łączyli:

sp_configure @configname = 'hadoop connectivity', @configvalue = 7;
GO
RECONFIGURE
GO

Ten skrypt ustawia połączenie do Hortonworks w wersji 2.2.4

Na ten moment Polybase wspiera dystrybucje Hortonworks i Cloudera oraz oczywiście Azure. Zależnie od wybranej konfiguracji @configvalue przyjmuje wartości:

0: Disable Hadoop connectivity
1: Hortonworks HDP 1.3 on Windows Server
1: Azure blob storage (WASB[S])
2: Hortonworks HDP 1.3 on Linux
3: Cloudera CDH 4.3 on Linux
4: Hortonworks HDP 2.0 on Windows Server
4: Azure blob storage (WASB[S])
5: Hortonworks HDP 2.0 on Linux
6: Cloudera 5.1, 5.2, 5.3, 5.4, and 5.5 on Linux
7: Hortonworks 2.1, 2.2, and 2.3 on Linux
7: Hortonworks 2.1, 2.2, and 2.3 on Windows Server
7: Azure blob storage (WASB[S])

3. Po przeprowadzeniu tej konfiguracji należy zrestartować usługę Database Engine oraz obie usługi Polybase:

4. Teraz zajmiemy się ustawieniem faktycznego połączenia z danymi. W tym celu trzeba utworzyć data source, file format oraz table.

CREATE EXTERNAL DATA SOURCE hdp with (
TYPE = HADOOP,
-- Hortonworks 2.0, 2.1, 2.2, or Cloudera 5.1: =
-- LOCATION = 'hdfs://NameNode_IP:8020'
LOCATION ='hdfs://192.168.80.129:8020'
);

Mój sandbox ma adres IP 192.168.80.129

5. Czas na stworzenie file format. Ten obiekt mówi m.in. o tym jaka jest struktura naszego pliku i jak MS SQL powinien go odczytywać:

CREATE EXTERNAL FILE FORMAT TSV
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS (
FIELD_TERMINATOR = '\t',
DATE_FORMAT = 'MM/dd/yyyy'
)
);

6. Został nam ostatni obiekt do stworzenia czyli tabela. Jak się pewnie domyślacie łączy ona źródło, format oraz faktyczną lokalizację i strukturę odczytywanych danych:

create external table sample
(
code nvarchar(255),
description nvarchar(255),
total_emp int,
salary nvarchar(255)
)
WITH
(
LOCATION = '/apps/hive/warehouse/sample_07',
DATA_SOURCE = HDP129,
FILE_FORMAT = TSV,
REJECT_TYPE = value,
REJECT_VALUE=0
);

Po utworzeniu wykonaniu powyższych kroków możemy odczytywać zawartość za pomocą zapytać T-SQL:

SELECT * FROM sample

Dodatkowe uwagi:
1. Od wersji 2016 w Management Studio pojawiły się:

  • nowy węzeł External Tables (dla każdej bazy)
  • nowy węzeł External Resources (dla każdej bazy), a w nim węzły, ze zdefiniowanymi źródłami danych oraz formatami plików

2. Problemy jakie napotkałem podczas testów:

    W przypadku wyboru polskiego kodowania (Polish_CI_AS):

  • Instalacja Polybase na Windows Server 2012 R2 PL kończyła się błędem
  • Instalacja Polybase na Windows 10 PL kończyła sie ostrzeżeniem
  • Polybase nie działał właściwie, w logach widniał wpis o nieprawidłowym formacie
  • Po zainstalowaniu na Windows Server 2012 EN i wybraniu domyślnego kodowania (SQL_Latin_1_General_CP1_CI_AS) instalacja przebiegła poprawie
  • Po instalacji Polybase w instancji nazwanej należy:
  • After you install, repair, or upgrade to SQL Server 2016 RC2 with PolyBase, and the SQL Server instance is a named instance, PolyBase queries may fail with the following error:
    Internal Query Processor Error: The query processor encountered an unexpected error during the processing of a remote query phase.
    The SQL Error log has this text at the time of the query: Failed to attach to shm with name: Global\f96b4b1a3eec4a9d9e747cf8d64a1042. hr: -2147024891, resultcode : 5 - Message: (null)
    (The SQL Error log is typically found at %Program Files%\Microsoft SQL Server\\MSSQL\Log\ERRORLOG.)
    Workaround
    Add the SQL Server Virtual Account to PdwComputeNodeAccess Local Group using these steps.
    From a command line or from start screen, type lusrmgr.msc. This should open the local users and groups window.
    Open Groups, right click PdwComputeNodeAccess->Add to group->Add->Locations.
    In locations, select the local machine name.
    In Enter the object names to select box, type NT Service\MSSQL$. For example, if your instance name is MSSQL3, type NT Service\MSSQL$MSSQL3. Click OK.
    Click OK to finish.

Dodatkowe linki:

Release notes SQL 2016
Get started with Polybase