Hadoop의 외부 데이터에 액세스하도록 PDW(Analytics Platform System)에서 PolyBase 구성
이 문서에서는 PDW(Analytics Platform System) 또는 APS 어플라이언스 PolyBase를 사용하여 Hadoop에서 외부 데이터를 쿼리하는 방법을 설명합니다.
필수 조건
PolyBase는 HDP(Hortonworks Data Platform) 및 CDH(Cloudera Distributed Hadoop)의 두 Hadoop 공급자를 지원합니다. Hadoop은 새 릴리스의 "Major.Minor.Version" 패턴을 따르며, 지원되는 주/부 릴리스 내의 모든 버전이 지원됩니다. 지원되는 Hadoop 공급자는 다음과 같습니다.
- Linux/Windows Server의 Hortonworks HDP 1.3
- Linux의 Hortonworks HDP 2.1 - 2.6
- Linux의 Hortonworks HDP 3.0 - 3.1
- Windows Server의 Hortonworks HDP 2.1 - 2.3
- Linux의 Cloudera CDH 4.3
- Cloudera CDH 5.1 - 5.5, 5.9 - 5.13, 5.15 및 5.16 on Linux
Hadoop 연결 구성
먼저 특정 Hadoop 공급자를 사용하도록 APS를 구성합니다.
'hadoop 연결'을 사용하여 sp_configure 실행하고 공급자에 적절한 값을 설정합니다. 공급자의 값을 찾으려면 PolyBase 연결 구성을 참조하세요.
-- Values map to various external data sources. -- Example: value 7 stands for Hortonworks HDP 2.1 to 2.6 and 3.0 - 3.1 on Linux, -- 2.1 to 2.3 on Windows Server, and Azure Blob Storage sp_configure @configname = 'hadoop connectivity', @configvalue = 7; GO RECONFIGURE GO
어플라이언스 구성 관리자의 서비스 상태 페이지를 사용하여 APS 지역을 다시 시작합니다.
푸시다운 계산 사용
쿼리 성능을 향상하려면 Hadoop 클러스터에 대한 푸시다운 계산을 사용하도록 설정합니다.
APS PDW 제어 노드에 대한 원격 데스크톱 연결을 엽니다.
컨트롤 노드에서 파일을
yarn-site.xml
찾습니다. 일반적으로 경로는 다음과C:\Program Files\Microsoft SQL Server Parallel Data Warehouse\100\Hadoop\conf\
같습니다.Hadoop 컴퓨터의 Hadoop 구성 디렉터리에서 유사한 파일을 찾습니다. 파일에서 구성 키
yarn.application.classpath
의 값을 찾아 복사합니다.컨트롤 노드의
yarn.site.xml
파일에서 속성을 찾습니다yarn.application.classpath
. Hadoop 컴퓨터의 값을 값 요소에 붙여넣습니다.모든 CDH 5.X 버전의 경우 파일의 끝이나 파일에 구성 매개 변수를
mapred-site.xml
추가mapreduce.application.classpath
해야 합니다yarn.site.xml
. HortonWorks는 구성 내에 이러한 구성을yarn.application.classpath
포함합니다. 예제는 PolyBase 구성을 참조하세요.
CDH 5.X 클러스터 기본값에 대한 예제 XML 파일
Yarn-site.xml
구성을 mapreduce.application.classpath
사용합니다yarn.application.classpath
.
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>yarn.resourcemanager.connect.max-wait.ms</name>
<value>40000</value>
</property>
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>30000</value>
</property>
<!-- Applications' Configuration-->
<property>
<description>CLASSPATH for YARN applications. A comma-separated list of CLASSPATH entries</description>
<!-- Please set this value to the correct yarn.application.classpath that matches your server side configuration -->
<!-- For example: $HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/* -->
<name>yarn.application.classpath</name>
<value>$HADOOP_CLIENT_CONF_DIR,$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/,$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,$MR2_CLASSPATH*</value>
</property>
<!-- kerberos security information, PLEASE FILL THESE IN ACCORDING TO HADOOP CLUSTER CONFIG
<property>
<name>yarn.resourcemanager.principal</name>
<value></value>
</property>
-->
</configuration>
두 구성 설정을 다음으로 mapred-site.xml
yarn-site.xml
나누기로 선택한 경우 파일은 다음과 같습니다.
yarn-site.xml
의 경우:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>yarn.resourcemanager.connect.max-wait.ms</name>
<value>40000</value>
</property>
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>30000</value>
</property>
<!-- Applications' Configuration-->
<property>
<description>CLASSPATH for YARN applications. A comma-separated list of CLASSPATH entries</description>
<!-- Please set this value to the correct yarn.application.classpath that matches your server side configuration -->
<!-- For example: $HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/* -->
<name>yarn.application.classpath</name>
<value>$HADOOP_CLIENT_CONF_DIR,$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*</value>
</property>
<!-- kerberos security information, PLEASE FILL THESE IN ACCORDING TO HADOOP CLUSTER CONFIG
<property>
<name>yarn.resourcemanager.principal</name>
<value></value>
</property>
-->
</configuration>
mapred-site.xml
의 경우:
속성을 확인합니다 mapreduce.application.classpath
. CDH 5.x에서는 Ambari에서 동일한 명명 규칙에 따라 구성 값을 찾을 수 있습니다.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<property>
<name>mapred.min.split.size</name>
<value>1073741824</value>
</property>
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,$MR2_CLASSPATH</value>
</property>
<!--kerberos security information, PLEASE FILL THESE IN ACCORDING TO HADOOP CLUSTER CONFIG
<property>
<name>mapreduce.jobhistory.principal</name>
<value></value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value></value>
</property>
-->
</configuration>
HDP 3.X 클러스터 기본값에 대한 예제 XML 파일
yarn-site.xml
의 경우:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>yarn.resourcemanager.connect.max-wait.ms</name>
<value>40000</value>
</property>
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>30000</value>
</property>
<!-- Applications' Configuration-->
<property>
<description>CLASSPATH for YARN applications. A comma-separated list of CLASSPATH entries</description>
<!-- Please set this value to the correct yarn.application.classpath that matches your server side configuration -->
<!-- For example: $HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/* -->
<name>yarn.application.classpath</name>
<value>$HADOOP_CONF_DIR,/usr/hdp/3.1.0.0-78/hadoop/*,/usr/hdp/3.1.0.0-78/hadoop/lib/*,/usr/hdp/current/hadoop-hdfs-client/*,/usr/hdp/current/hadoop-hdfs-client/lib/*,/usr/hdp/current/hadoop-yarn-client/*,/usr/hdp/current/hadoop-yarn-client/lib/*,/usr/hdp/3.1.0.0-78/hadoop-mapreduce/*,/usr/hdp/3.1.0.0-78/hadoop-yarn/*,/usr/hdp/3.1.0.0-78/hadoop-yarn/lib/*,/usr/hdp/3.1.0.0-78/hadoop-mapreduce/lib/*,/usr/hdp/share/hadoop/common/*,/usr/hdp/share/hadoop/common/lib/*,/usr/hdp/share/hadoop/tools/lib/*</value>
</property>
<!-- kerberos security information, PLEASE FILL THESE IN ACCORDING TO HADOOP CLUSTER CONFIG
<property>
<name>yarn.resourcemanager.principal</name>
<value></value>
</property>
-->
</configuration>
외부 테이블 구성
Hadoop 데이터 원본의 데이터를 쿼리하려면 Transact-SQL 쿼리에서 사용할 외부 테이블을 정의해야 합니다. 다음 단계에서는 외부 테이블을 구성하는 방법을 설명합니다.
데이터베이스에 마스터 키를 만듭니다. 자격 증명 비밀을 암호화해야 합니다.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'S0me!nfo';
Kerberos 보안 Hadoop 클러스터의 데이터베이스 범위 자격 증명을 만듭니다.
-- IDENTITY: the Kerberos user name. -- SECRET: the Kerberos password CREATE DATABASE SCOPED CREDENTIAL HadoopUser1 WITH IDENTITY = '<hadoop_user_name>', Secret = '<hadoop_password>';
CREATE EXTERNAL DATA SOURCE를 사용하여 외부 데이터 원본을 만듭니다.
-- LOCATION (Required) : Hadoop Name Node IP address and port. -- RESOURCE MANAGER LOCATION (Optional): Hadoop Resource Manager location to enable pushdown computation. -- CREDENTIAL (Optional): the database scoped credential, created above. 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 );
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을 사용하여 Hadoop 에 저장된 데이터를 가리키는 외부 테이블을 만듭니다. 이 예제에서 외부 데이터에는 자동차 센서 데이터가 포함됩니다.
-- 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 = MyHadoopCluster, FILE_FORMAT = TextFileFormat );
외부 테이블에 대한 통계를 만듭니다.
CREATE STATISTICS StatsForSensors on CarSensor_Data(CustomerKey, Speed)
PolyBase 쿼리
PolyBase에 적합한 세 가지 함수가 있습니다.
- 외부 테이블에 대한 임시 쿼리입니다.
- 데이터 가져오기
- 데이터 내보내기
다음 쿼리는 가상의 자동차 센서 데이터와 함께 예제를 제공합니다.
임시 쿼리
다음 임시 쿼리는 Hadoop 데이터와 관계형 조인합니다. 35mph보다 빠르게 운전하는 고객을 선택하여 APS에 저장된 구조적 고객 데이터를 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)
데이터 가져오기
다음 쿼리는 외부 데이터를 APS로 가져옵니다. 이 예제에서는 더 자세한 분석을 수행하도록 빠른 드라이버의 데이터를 APS로 가져옵니다. 성능을 향상시키기 위해 APS에서 columnstore 기술을 활용합니다.
CREATE TABLE Fast_Customers
WITH
(CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = HASH (CustomerKey))
AS
SELECT DISTINCT
Insured_Customers.CustomerKey, Insured_Customers.FirstName, Insured_Customers.LastName,
Insured_Customers.YearlyIncome, Insured_Customers.MaritalStatus
from Insured_Customers INNER JOIN
(
SELECT * FROM CarSensor_Data where Speed > 35
) AS SensorD
ON Insured_Customers.CustomerKey = SensorD.CustomerKey
데이터 내보내기
다음 쿼리는 APS에서 Hadoop으로 데이터를 내보냅니다. 관계형 데이터를 Hadoop에 보관하는 동시에 쿼리하는 데 사용할 수 있습니다.
-- Export data: Move old data to Hadoop while keeping it query-able via an external table.
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009]
WITH (
LOCATION='/archive/customer/2009',
DATA_SOURCE = HadoopHDP2,
FILE_FORMAT = TextFileFormat
)
AS
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2
ON (T1.CustomerKey = T2.CustomerKey)
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;
SSDT에서 PolyBase 개체 보기
SQL Server Data Tools에서 외부 테이블은 별도의 외부 테이블 폴더에 표시됩니다. 외부 데이터 원본 및 외부 파일 형식은 외부 리소스 아래 의 하위 폴더에 있습니다.
관련 콘텐츠
- Hadoop 보안 설정은 Hadoop 보안 구성을 참조하세요.
- PolyBase에 대한 자세한 내용은 PolyBase란?을 참조하세요.