greenplum gpfdist外部表(只读)的实现---理论

news2024/12/25 23:50:15

经过项目的验证测试以及初步商用化,本篇将进一步讲解greenplum外部表的实现原理,包括设计原则、交互协议与实现流程。gpfdist工具的简介与使用见回顾greenplum gpfdist工具。

1 设计原则

  greenplum作为分布式分析型数据库,其每个节点都是独立的计算单元,因此充分利用多节点的优势进行并发高效加载是gpfdist设计的首要目标。

1.1 将耗时任务并行化

如果master节点进行copy操作时并对其进行性能分析,会发现绝大部分的时间都花费在分隔符的判定和行列数据解析上。随着segment数目的增多,master节点解析数据的速度会成为明显的单点瓶颈;虽然master将100%的CPU时间花在数据解析上,但是所有的segment都在等待master分发数据。对此,gpfdist采用的策略是“有难同当”,即所有的节点做同样的事情:数据解析,分发和持久化。为达这一目的,gpfdist首要工作是对文件进行高效切分。

1.2 最小化单节点瓶颈

当所有的源数据都保存在同一个文件中时,文件的读取速度便成为制约性能的关键因素。为尽可能保证保证读取速度,gpfdist采用的单进程数据读取模式,避免随机磁盘访问导致的性能下降。此外,gpfdist对文件中行边界进行准确切分,以保证每个segment节点收到完整的数据行。gpfdist并不解析文件中的每一行,而是以文件块为单位进行查找。在读取一个数据块之后,gpfdist只需找到最后一个行分隔符即可,它不知道也不关心这个数据块中有多少行数据,进一步解析是每个segment的职责。gpfdist准备好数据以后,将其发送给各个segment节点。为保证性能,gpfdist采用libevent的单进程程模式避免进程切换所带来的开销,进而最大限度地利用单个CPU资源。

1.3 支持水平扩展

gpfdist利用单个CPU读取单个文件文本,通常情况是gpfdist将单个CPU资源打满,但对整个ETL服务器而言仍然有很多空闲资源。gpfdist可以通过多进程的方式,充分利用整个ETL服务器的物理资源。gpfdist进程之间是独立,因此也完全可以运行在多个ETL服务器上。需要注意的是这种多进程方式有一个前提,即在加载前要预先将数据切分成多个文件文本,同事为了保证加载效率。文件不应该多余系统中磁盘的数目,并尽量保证不同文件放在不同的物理硬盘上。

2 gpfdist协议

greenplum中gpfdist外部表由两部分组成,一部分是外部表的gpfdist服务器,另一部分是与greenplum在一起的gpfdist外部表模块。二者之间通过gpfdist协议通信,而gpfdist协议是HTTP的扩展协议。
gpfdist外部表的工作方式是外部的gpfdist进程向segment节点发送数据或者是从segment节点接收数据。gpfdist进程与数据库间通过HTTP方式进行通信,外部表的gpfdist进程是HTTP服务端,segment是HTTP的客户端。
简答来说,对制度的外部表执行select操作时,gpfdist会从磁盘读取文件,将其内容分发到各个segment,从而实现数据并行加载,对只写外部表执行insert操作时,gpfdist将segment分发的数据保存至相应的文件。此外,gpfdist还支持压缩文件(gzip,bzip2)。

3 gpfdist外部表的工作流程

gpfdist是通过每个segment节点并行加载数据,在数据传输过程中不需要Master节点的参与(只需要协调控制)。如图,假定greenplum集群有一个master和四个segment以及单独部署的ETL服务器,该ETL服务器上运行一个gpfdist进程。工作流程:
1)客户端工具向Master节点发送命令;
2)Master节点对SQL进行解析,生成查询计划分发至所有segment节点;
3)每个segment节点开始执行查询,并向gpfdist进行发起HTTP请求;
4)对于只读外部表,gpfdist读取文件,将文件分块,确定行边界位置;对于只写外部表,gpfdist将收到的数据写入磁盘;
5)gpfdist将数据块或者是执行结果分发给segment;
6)segment将处理结果返回给master;
7)master将查询结果返回给客户端。
在这里插入图片描述

4 gpfdist只读外部表

gpfdist只读外部表通过gpfdist进程,接收来自各个segment节点的HTTP GET请求,将数据大致均匀分布在各个segment上,其协议与具体工作方式如下:

(1)只读外部表的HTTP头解析

segment节点通过HTTP头协议与gpfdist进程进行传递信息,主要HTTP头信息如下:
在这里插入图片描述

(2)gpfdist进程的请求处理

对于只读外部表执行SELECT操作时,gpfdist服务进程的工作方式与HTTP服务器响应GET请求的过程类似。参与处理的segment会同时向gpfdist进程发送数据请求;gpfdist根据<X-GP-XID,X-GP-CID, X-GP-SN>三元组确定那些请求属于同一个会话,来自同一会话的segment共同完成一次数据扫描。gpfdist进程按顺序依次从文件中读取一个数据分块,并保证分块中包含完整数据行。然后,将这个数据分块通过HTTP响应的方式发送给一个segment。gpfdist重复此过程,直至读取完所有的文件。

(3)分快处理

  由于gpfdist事先不知道发送给每个segment的数据总长度,无法在HTTP响应报文提前设置ContentLength参数,因此gpfdist的HTTP响应报文是以chunked的方式发送。首先在HTTP响应头中设置”Transfer-Encoding:chunked”告知segment节点数据将以分块的形式传输。在每个数据块之前都会包含该数据块的长度,当传输结束时,发送长度为0的空数据块表示数据结尾。chunked模式的传输数据包示例如下:
在这里插入图片描述
  由于采用Chunked的方式传输数据,每个segment向gpfdist进程发送GET请求后,gpfdist会将数据不停发往segment节点,直到gpfdist显示地告知segment传输数据结束为止。
  gpfdist以数据块为单位,按照segment请求的先后顺序将数据块发送给不同的segment。因此可以认为数据近似随机的分发到每个segment上。每个segment会对收到的数据进行行和列的解析,从而完成一次读取工作。

(4)数据重分布

  利用外部表执行数据加载,是通过对目标表进行INSERT操作,将外部表返回的结果插入到数据库中。执行INSERT操作时,segment上的QE进程会根据目标表的分布键将接收到的外部表数据进行重分布。
在这里插入图片描述
  Redistribute表示数据需要重分布。在上例中,数据重分布发生在2个segment节点之间,在没有数据倾斜的情况下,各个segment节点可以并行、高效地完成数据交换。数据重分布之后,每个segment节点会将收到的数据写入磁盘,从而实现加载。

(5)多实例加载

gpfdist采用的是基于libevent的单进程事件驱动模型,在同一个进程中按照先来后到的顺序,轮流响应收到的GET请求。在处理某一个请求时,其他请求就会被阻塞。为了提高加载速度,可以采用运行多个gpfdist实例的方式,利用多个CPU处理能力。在网络和磁盘IO允许的情况下,每增加一个gpfdist实例,就可以充分利用一个CPU的计算资源,从而提高数据加载的速度。可以通过设置不同的监听端口地址来实现多gpfdist实例。

参考:greenplum从大数据战略到实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/909837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ChatGPT-4优化编程效率:高效查询代码示例和解决方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

python中(限小白,大佬勿入)python开发中的trick:常量

开场白 我是小白&#xff0c;今天被前端骂了一顿&#xff1a;我们交接不是说好了就给你四个变量&#xff1a;A&#xff0c;B。C。D。你这命名的这么具体&#xff0c;我这边给你传值不是很方便啊&#xff08;因为不同模块有复用的图片路径&#xff09;&#xff0c;我说“那我改&…

Laravel 模型的作用域 模型的访问器和修改器 ⑨

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

LC-路径总和

LC-路径总和 链接&#xff1a;https://leetcode.cn/problems/path-sum/description/ 描述&#xff1a;给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。…

SQL有关表的左连接,右连接,以及内连接

首先我们需要想一下&#xff0c;我们为什么需要将表连接在一起呢&#xff1f;换种说法&#xff0c;即我们需要查询的数据不在同一张表里面&#xff0c;而是在A表中查出一部分&#xff0c;然后再去B表中查出一部分&#xff0c;然后两者结合在一起&#xff0c;才是我们需要的部分…

java面试基础 -- 深克隆 浅克隆

引例 说到java的克隆你还记得多少? 一说到克隆你可能就会想起来那个接口, 没错, 他就是Cloneable Cloneable是java里面内置的很常用的接口, 我们说 Object类中也有一个clone方法: 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedEx…

二、8.系统调用、可变参数和堆内存管理

系统调用&#xff1a;让用户进程申请操作系统的帮助 一个系统功能调用分为两部分&#xff0c; 一部分是暴露给用户进程的接口函数&#xff0c;它属于用户空间&#xff0c;此部分只是用户进程使用系统调用的途径&#xff0c;只负责发需求。另一部分是与之对应的内核具体实现&am…

记一次oracle数据库迁移至mysql数据库(表同步)

目录 一、利用Navicat将oracle迁移至mysql数据库 1、建立数据传输 2、选择需要迁移的数据库跟目标库 3、数据传输选项 4、选择需要迁移表信息 二、迁移之后遇到的一些问题 1、大小写问题 2、数据库函数问题 3、sql语句是否使用空格隔开问题 4、关于子查询别命名问题 …

SpringMVC-2-Spring MVC拦截器详解:从入门到精通

SpringMVC-2-Spring MVC拦截器详解&#xff1a;从入门到精通 今日目标 能够编写拦截器并配置拦截器 1.拦截器【理解】 1 拦截器介绍 1.1 拦截器概念和作用 拦截器&#xff08;Interceptor&#xff09;是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方…

SOFARPC(笔记)

文章目录 一、快速开始1.1 SOFARPC1.2 基于SOFABoot 二、注册中心三、通讯协议2.1 Bolt基本发布调用方式超时控制协议泛化调用序列化协议自定义线程池 2.2 RESTful基本使用 2.3 其他协议四、架构 附录 官方样例下载地址-sofa-boot-guides 可查看 SOFARPC 方式快速入门 一、快…

Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理

一、前言 本节主要学习ES匹配查询中的布尔查询以及布尔查询中比较特殊的filter查询及其原理。 复合搜索&#xff0c;顾名思义是一种在一个搜索语句中包含一种或多种搜索子句的搜索。 布尔查询是常用的复合查询&#xff0c;它把多个子查询组合成一个布尔表达式&#xff0c;这些…

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…

最新AI系统ChatGPT网站程序源码/搭建教程/支持GPT4.0/Dall-E2绘画/支持MJ以图生图/H5端/自定义训练知识库

一、正文 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

Redis系列(四):哨兵机制详解

首发博客地址 https://blog.zysicyj.top/ 前面我们说过&#xff0c;redis采用了读写分离的方式实现高可靠。后面我们说了&#xff0c;为了防止主节点压力过大&#xff0c;优化成了主-从-从模式 思考一个问题&#xff0c;主节点此时挂了怎么办 这里主从模式下涉及到的几个问题&a…

华为OD-整数对最小和

题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c;并对取出的所有元素求和&#xff0c;计算和的最小值 代码实现 # coding:utf-8 class Solution:…

ISVE2023展商 | 皮克智能:零售及互联网领域数字化变革开拓者

ISVE2023展商 | 皮克智能&#xff1a;零售及互联网领域数字化变革开拓者 01 公司介绍 Exhibitor Profile 皮克智能是优质的智能硬件产品及系统解决方案提供商&#xff0c;具备自主研发创新、软硬件方案集成及全产业链资源整合的能力。 公司总部位于中国深圳&#xff0c;主要服…

小程序中通过canvas生成并保存图片

1. html <canvas class"canvas" id"photo" type"2d" style"width:200px;height: 300px;"></canvas> <button bindtap"saveImage">保存</button> <!-- 用来展示生成的那张图片 --> <image…

构建 NodeJS 影院预订微服务并使用 docker 部署(03/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 你好社区&#xff0c;这是&#x1f3f0;“构建 NodeJS 影院微服务”系列的第三篇文章。本系列文章演示了…

Ae 效果:CC Line Sweep

过渡/CC Line Sweep Transition/CC Line Sweep CC Line Sweep&#xff08;CC 线条扫描&#xff09;通过线条的扫描动作来制作一个过渡效果&#xff0c;线条可以根据设定的方向、厚度、倾斜度和方向翻转来扫过画面&#xff0c;从而将一个场景过渡到另一个。 ◆ ◆ ◆ 效果属性…