最近看了关于SQL Server的分布式处理方面的论文,觉得它提出的Polybase跟之前看过的HadoopDB有些神似,这里做个小总结(抽空再把HadoopDB的总结贴出来)。
不算翻译,只是挑出自己认为是重点的部分。详细情况,还请论文查阅原文,引用中有写明出处。文章末尾有我总结的slides,可以辅助查阅。
由于缺乏实践经验,很多东西未必能理解其本质。如有其他观点,还请多指教。
当下的计划就是开始自己搭环境,实践起来!~
欢迎访问我正在搬迁的新家(有更整洁的排版噢~)点击打开链接
背景
商业应用中,越来越多的需要将结构化数据和非结构化数据存储、处理混合起来。 目前,已经有很多公司、产品致力于这部分的研究,微软发的这篇论文,也正是基于PDW V2的这一新功能提出的新的解决方案。
Polybase简介:
是SQL Server PDW V2的一个新功能:通过使用SQL来管理和查询hadoop集群中的数据。 它同时能处理结构化和非结构化的数据,特点是结合了HDFS的外部表,使用基于开销的查询优化器来做分裂查询处理。
相关研究
PDW
Polybase是PDW V2的一个新feature,那么,首先,让我们来看一下所谓的PDW是什么。
PDW是一个基于SQL Server的shared-nothing的并行数据库系统。
PDW(Parallel Data Warehouse)架构图:
PDW系统中的组件:
节点
类似于Hadoop中的master节点。运行着PDW Engine,负责:查询语法分析,优化,生成分布式执行计划DSQL,控制计划实施
类似于Hadoop中的slave节点。数据存储和查询执行
DMS
Data Moving Service,起功能有:
Polybase
Polybase使用场景
如图
(a)中PDW与Hadoop一起完成了数据处理任务,并输出结果;
(b)中处理数据后,结果直接存储到HDFS中
充分利用SQL Server PDW的性能优势,特别是它的基于开销的并行查询优化器和执行引擎。
Polybase的环境需求
核心组件
1.外部表
PDW需要了解到Hadoop集群中数据的模型。于是就有了这个外部表。 实例如下:
创建集群:
CREATE HADOOP_CLUSTER GSL_CLUSTER WITH (namenode=‘hadoop-head’,namenode_port=9000, jobtracker=‘hadoop-head’,jobtracker_port=9010);
创建文件格式:
CREATE HADOOP_FILEFORMAT TEXT_FORMAT WITH (INPUT_FORMAT=‘polybase.TextInputFormat’, OUTPUT_FORMAT = ‘polybase.TextOutputFormat’, ROW_DELIMITER = '\n', COLUMN_DELIMITER = ‘|’);
根据集群和文件信息,创建外部表
CREATE EXTERNAL TABLE hdfsCustomer ( c_custkey bigint not null, c_name varchar(25) not null, ....... ) WITH (LOCATION='/tpch1gb/customer.tbl', FORMAT_OPTIONS (EXTERNAL_CLUSTER = GSL_CLUSTER, EXTERNAL_FILEFORMAT = TEXT_FORMAT));
2.HDFS Bridge
结构如图:
HDFS shuffle阶段:通过DMS从hadoop读取数据的阶段。 涉及到hdfs中的数据处理时,处理过程如下:
写入hadoop的过程与此类似。
3.查询优化
样本数据处理:
定义对应外部表列的详细样本数据:
CREATE STATISTICS hdfsCustomerStats ON hdfsCustomer (c_custkey);
对样本数据的处理的方式如下:
缺点是在此过程中没有利用好hadoop集群的计算能力。
语义兼容
涉及到Java和SQL以及之间的转换。包括这三个方面:
例如:"a+b",其中a,b都为null,SQL结果为NULL,而Java则会抛出NullException。
处理原则是:能转化的类型则做好转化包装;不能转换的则标记为无法实现,仅限PDW实现。
举例:
SELECT count (*) from Customer WHERE acctbal < 0 GROUP BY nationkey
如图所示为处理过程
Polybase的MapReduce Join实现
使用distributed hash join实现(只有equi-join能被在mapreduce中完成)
小表作为build side ,并被物化(materialized)到HDFS,大表作为probe side。
在Hadoop的Map任务中:读取物化好的build side到内存,构成hash table。
probe side经过hash后对比hash表,做正确的链接。
为了让build side置于内存中,需要计算build side的大小、每个task拥有的内存大小,task中执行其他操作需要的内存空间。 当然,build side也可能被复制多分,以提高效率。
本文演示slides下载链接,点击获取
引用