最近看了关于 SQL Server 的分布式处理方面的论文,觉得它提出的 Polybase 跟之前看过的 HadoopDB 有些神似,这里做个小总结(抽空再把 HadoopDB 的总结贴出来)。

不算翻译,只是挑出自己认为是重点的部分。详细情况,还请论文查阅原文,引用中有写明出处。文章末尾有我总结的 slides,可以辅助查阅。

由于缺乏实践经验,很多东西未必能理解其本质。如有其他观点,还请多指教。

当下的计划就是开始自己搭环境,实践起来!~

背景

商业应用中,越来越多的需要将结构化数据和非结构化数据存储、处理混合起来。
目前,已经有很多公司、产品致力于这部分的研究,微软发的这篇论文,也正是基于 PDW V2 的这一新功能提出的新的解决方案。

Polybase 简介:

是 SQL Server PDW V2 的一个新功能:通过使用 SQL 来管理和查询 hadoop 集群中的数据。
它同时能处理结构化和非结构化的数据,特点是结合了 HDFS 的外部表,使用基于开销的查询优化器来做分裂查询处理。

相关研究

  • sqoop:用于在 hadoop 和结构化数据 9 比如关系型数据库之间传输数据。

  • teradata& Asterdata& Greenplum& Vertica:通过外部表(external table)实现基于 SQL 的对 hadoop 中所存数据的操作。

  • Orable:基本机制也是建立外部表;另外还开发了用于加载 hadoop 的大数据到 Oracle 自家数据库的工具 OLH(Oracle loader for Hadoop)。

  • IBM、Netezza:使用 mapreduce 方法获取分布式环境下各个节点的数据执行处理。

  • Hadapt: (HadoopDB):HadoopDB 是来自耶鲁大学的创意,并商业化为 Hadapt 项目。这是首个提出使用类 SQL 语言、集合 Hadoop 系统实现对 RDBMS 的操作的想法。实现相对简单,源代码 3 千多行,在 Hadoop 中对其中的几个模块做了二次开发。

PDW

Polybase 是 PDW V2 的一个新 feature,那么,首先,让我们来看一下所谓的 PDW 是什么。

PDW 是一个基于 SQL Server 的 shared-nothing 的并行数据库系统。

PDW(Parallel Data Warehouse)架构图:

PDW 系统中的组件:

节点
  • control node:

类似于 Hadoop 中的 master 节点。运行着 PDW Engine,负责:查询语法分析,优化,生成分布式执行计划 DSQL,控制计划实施

  • compute node:

类似于 Hadoop 中的 slave 节点。数据存储和查询执行

DMS

Data Moving Service,起功能有:

  • 1.repartition rows of a table among SQL Server instances on PDW compute nodes

  • 2.针对 ODBC 的类型转换。

Polybase

Polybase 使用场景

如图

(a)中 PDW 与 Hadoop 一起完成了数据处理任务,并输出结果;

(b)中处理数据后,结果直接存储到 HDFS 中

充分利用 SQL Server PDW 的性能优势,特别是它的基于开销的并行查询优化器和执行引擎。

Polybase 的环境需求

  • 1.PDW 与 Hadoop 集群可以重叠,也可以分离。
  • 2.windows 和 linux 部署的 hadoop 集群都支持。
  • 3.支持所有标准的 HDFS 文件格式,包括文本、序列化文件、RCFiles。只要定义好对应的 Inputformat 和 outputFormat,所有定制文件格式也支持。

核心组件

  • 1.外部表:用于在 PDW 中实现对数据的操作语义。
  • 2.HDFS Bridge:DMS 中的组件,用于实现 PDW 节点域 Hadoop 的通信。
  • 3.基于开销的查询优化器:将常规 SQL 查询语句转化为 DSQL(分布式 SQL 查询语句),并结合集群状况(比如 Hadoop 和 PDW 集群规模,运行状况等),合理选择优化方式。

1.外部表

PDW 需要了解到 Hadoop 集群中数据的模型。于是就有了这个外部表。
实例如下:

创建集群:

1
2
3
4
5
CREATE HADOOP_CLUSTER GSL_CLUSTER

      WITH (namenode=‘hadoop-head’,namenode_port=9000,

      jobtracker=‘hadoop-head’,jobtracker_port=9010);

创建文件格式:

1
2
3
4
5
6
7
CREATE HADOOP_FILEFORMAT TEXT_FORMAT

  WITH (INPUT_FORMAT=‘polybase.TextInputFormat’,

  OUTPUT_FORMAT = ‘polybase.TextOutputFormat’,

  ROW_DELIMITER = '\n', COLUMN_DELIMITER = ‘|’);

根据集群和文件信息,创建外部表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 中的数据处理时,处理过程如下:

  • 1.跟 namenode 通信,获得 hdfs 中文件的信息

  • 2.hdfs 中文件信息 + DMS 实例个数 -> 每个 DMS 的输入文件(offset、长度) #力求负载均衡

  • 3.将 DMS 的输入文件信息传递给各个 DMS,DMS 通过 openRecordReader()方法构建 RecordReader 实例,直接与对应的 datanode 通信,获取数据,并转换为 ODBC 格式(有时候类型转换提前到 mapreduce 中以利用 hadoop 集群的计算能力)。读取过程中,使用了 buffer 机制提高效率。有时候数据会被提前到从 HDFS 中读出时执行,而不是到 DMS 中执行。这是为了充分利用 hadoop 集群的计算能力,节约 CPU 秘籍的 DMS shuffle 的计算。

写入 hadoop 的过程与此类似。

3.查询优化

  • 1.PDW Parser(在 PDW Engine 的进程中完成)。

  • 2.SQL Server Query Optimizer(在 control node 的 SQL Server 的进程中完成):使用 bottom-up 的方式进行查询优化,并在合理的位置插入数据迁移的操作符(用于分布式环境的数据迁移指令),:生成查询计划,存储在 Memo 数据结构(http://www.benjaminnevarez.com/2012/04/inside-the-query-optimizer-memo-structure/)中 。

  • 3.XML geneator(在 control node 的 SQL Server 的进程中完成)。接收 Memo,并转换格式,往下传递。

  • 4.Query Optimizer(在 PDW Engine 的进程中完成):根据 Memo 生成 DSQL。

  • 5.基于开销的查询优化:判定是否将 SQL 语句推送到 Hadoop 中执行。

    考虑外部表的样本数据的直方图、集群的规模等因素…选择最优优化方案。

样本数据处理:

定义对应外部表列的详细样本数据:

1
2
CREATE STATISTICS hdfsCustomerStats ON
hdfsCustomer (c_custkey);

对样本数据的处理的方式如下:

  • 1.通过 DMS 或者 map job 读取 sample 数据,
  • 2.分发到不同的 comute 节点的暂存表。
  • 3.每个节点分别计算直方图。
  • 4.汇总直方图,存储到 control node 数据库的 catalog 中

缺点是在此过程中没有利用好 hadoop 集群的计算能力。

语义兼容

涉及到 Java 和 SQL 以及之间的转换。包括这三个方面:

  • 数据类型的语义.
  • 表达式的语义
  • 异常处理机制

例如:”a+b”,其中 a,b 都为 null,SQL 结果为 NULL,而 Java 则会抛出 NullException。

处理原则是:能转化的类型则做好转化包装;不能转换的则标记为无法实现,仅限 PDW 实现。

举例:

1
2
3
   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 下载链接,点击获取

引用

PDW中的Split Querying Process的更多相关文章

  1. 举例详解Python中的split()函数的使用方法

    这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下   函数:sp ...

  2. freemarker中的split字符串分割

    freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  3. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  4. java基础---->String中的split方法的原理

    这里面主要介绍一下关于String类中的split方法的使用以及原理. split函数的说明 split函数java docs的说明: When there is a positive-width m ...

  5. pytorch 中的 split

    Pytorch中的split问题: 1.使用torch.nn.Conv2d中有个参数是groups会将输入的feature map分组,此处需要注意的一点是分组之后各组的feature map的cha ...

  6. (转)Python中的split()函数的用法

    Python中的split()函数的用法 原文:https://www.cnblogs.com/hjhsysu/p/5700347.html Python中有split()和os.path.split ...

  7. Java中的split函数的用法

    Java中的 split  函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回: 例如: String str="1234@abc"; String[] a ...

  8. PL/SQL实现JAVA中的split()方法的小例子

    众所周知,java中为String类提供了split()字符串分割的方法,所以很容易将字符串以指定的符号分割为一个字符串数组.但是在pl/sql中并没有提供像java中的split()方法,所以要想在 ...

  9. python自带的split VS numpy中的split比较

    Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串 str1.split() 里面的参数,可以是空格,逗号,字符串啥的,具体应用与 ...

随机推荐

  1. WebApi自定义返回类型和命名空间实现

    1.自定义ContentNegotiator /// <summary> /// 返回json的ContentNegotiator /// </summary> public ...

  2. Spring Boot系列二 Spring @Async异步线程池用法总结

    1. TaskExecutor Spring异步线程池的接口类,其实质是java.util.concurrent.Executor Spring 已经实现的异常线程池: 1. SimpleAsyncT ...

  3. ORACLE中的Net Configuration Assistant 点击后无反应, sqlplus登录数据库提示Oracle11g ORA-12560: TNS: 协议适配器错误

    首先是对于点击无反应问题: 如果是客户端下的Net Configuration Assistant可用,而服务器端的Net Configuration Assistant等工具不可用的原因如下. 环境 ...

  4. 关于浏览器不能执行JavaScrip问题的反思

    今天在一篇博客(http://blog.csdn.net/u011043843/article/details/27959563)的时候,写着用于演示的Javascript代码不能再浏览器执行,非常是 ...

  5. KDE Plasma 5.8 的 LTS 周期正好与其所采用的 Qt 5.6 的 LTS 周期一致

    在 KDE Plasma 5.7 刚刚发布不久,KDE 开发团队就宣布了 KDE Plasma 5.8 的开发计划.这个版本将是一个 LTS 版本,据我所知,这应该是 KDE 历史上第一个 LTS 版 ...

  6. aspcms产品详情页调取相关产品

    产品详情页调用相关产品最常见的应用就是装饰公司网站,设计师页面要求调取设计师做过的案例.aspcms本身有这个功能,但不能完全符合要求,看代码 {aspcms:content sort={aspcms ...

  7. POJ 3090 Visible Lattice Points (ZOJ 2777)

    http://poj.org/problem?id=3090 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1777 题目大意: ...

  8. 【Codeforces Round #185 (Div. 2) B】Archer

    [链接] 链接 [题意] 在这里输入题意 [题解] 概率水题. 枚举它是第几轮成功的. 直到满足精度就好 [错的次数] 1 [反思] long double最让人安心. [代码] #include & ...

  9. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

    风过无痕 原文  arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...

  10. php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性)

    php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性) 一.总结 链表反转两 ...