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

经过项目的验证测试以及初步商用化,本篇将进一步讲解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.rhkb.cn/news/100063.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何批量加密PDF文件并设置不同密码 - 批量PDF加密工具使用教程

如果你正在寻找一种方法来批量加密和保护你的PDF文件&#xff0c;批量PDF加密工具是一个不错的选择。 它是一个体积小巧但功能强大的Windows工具软件&#xff0c;能够批量给多个PDF文件加密和限制&#xff0c;包括设置打印限制、禁止文字复制&#xff0c;并增加独立的打开密码。…

【Django】Task4 序列化及其高级使用、ModelViewSet

【Django】Task4 序列化及其高级使用、ModelViewSet Task4主要了解序列化及掌握其高级使用&#xff0c;了解ModelViewSet的作用&#xff0c;ModelViewSet 是 Django REST framework&#xff08;DRF&#xff09;中的一个视图集类&#xff0c;用于快速创建处理模型数据的 API 视…

C++ 网络编程项目fastDFS分布式文件系统(四)-fastCGI项目相关技术以及linux搜狗输入法相关问题。

目录 1. Nginx作为web服务器处理请求 2. http协议复习 Get方式提交数据 Post方式提交数据 3. fastCGI 3.1 CGI 3.2 fastCGI 3.3 fastCGI和spawn-fcgi安装 1. 安装fastCGI 2. 安装spawn-fcgi 3.4 nginx && fastcgi 4其他知识点 1. fastCGI环境变量 - fas…

滑动验证码-elementui实现

使用elementui框架实现 html代码 <div class"button-center"><el-popoverplacement"top":width"imgWidth"title"安全验证"trigger"manual"v-model"popoverVisible"hide"popoverHide"show&quo…

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主…

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有&#xff1a;FairyGUI&#xff0c;VSCode 代码环境涉及到了&#xff1a;Lua VSCode插件&#xff1a;EmmyLua 在编写FairyGUI编辑器菜单前&#xff0c;了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…

面试-快速学习计算机网络-UDP/TCP

1. OSI四层和七层映射 区别&#xff1a; 应用层&#xff0c;表示层&#xff0c;会话层合并为了应用层数据链路层和物理层合并为了网络接口层 2. TCP和UDP的区别&#xff1f; 总结&#xff1a; 1 . TCP 向上层提供面向连接的可靠服务 &#xff0c;UDP 向上层提供无连接不可靠服…

Lnton羚通算法算力云平台在环境配置中Windows10终端和VSCode下如何打开Anaconda-Prompt

在Windows 10的终端和VSCode中&#xff0c;可以直接打开Anaconda Prompt。下面是两种方法&#xff1a; Windows 10终端&#xff1a;在开始菜单中搜索"Anaconda Prompt"&#xff0c;然后点击打开。这将启动Anaconda Prompt终端&#xff0c;你可以在其中执行conda相关命…

2337. 移动片段得到字符串

题目描述&#xff1a; 给你两个字符串 start 和 target &#xff0c;长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成&#xff0c;其中&#xff1a; 字符 ‘L’ 和 ‘R’ 表示片段&#xff0c;其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动&a…

通过Matlab编程分析微分方程、SS模型、TF模型、ZPK模型的关系

微分方程、SS模型、TF模型、ZPK模型的关系 一、Matlab编程 微分方程、SS模型、TF模型、ZPK模型的关系二、对系统输出进行微分计算三、对系统输出进行积分计算四、总结五、系统的零点与极点的物理意义参考 &#xff1a;[https://www.zhihu.com/question/22031360/answer/3073452…

SpringCloud Gateway服务网关的介绍与使用

目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route&#xff08;路由&#xff09;3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…

ubuntu 20.04 安装 高版本cuda 11.7 和 cudnn最新版

一、安装显卡驱动 参考另一篇文章&#xff1a;Ubuntu20.04安装Nvidia显卡驱动教程_ytusdc的博客-CSDN博客 二、安装CUDA 英伟达官网&#xff08;最新版&#xff09;&#xff1a;CUDA Toolkit 12.2 Update 1 Downloads | NVIDIA Developer CUDA历史版本下载地址&#xff1a;C…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

统一git使用方法,git状态变迁图,git commit提交规范

目录 说明 统一git使用方法 git状态变迁图 git commit 提交规范 说明 多次工作中多名员工不懂git多次技术分享&#xff0c;自行查资料学习git并使用&#xff0c;会出现使用各种偏僻的命令&#xff0c;异常问题无法解决&#xff1b;或出现带url的git合并提交。主要是学的不…

EasyPOI 实战总结

EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…

2022年06月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;制作蛋糕 小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉&#xff0c;250个单位的面粉&#xff0c;75个单位的糖&#xff0c;100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉&#xff0c;200个单位的面粉&#xff0c;150个单…

Docker的数据管理及端口映射与容器互联(使用centos镜像)

目录 Docker数据管理 1&#xff0e;数据卷 2&#xff0e;数据卷容器 Docker端口映射 Docker容器互联 Docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&…

蓝凌OA custom.jsp 任意文件读取

​曾子曰&#xff1a;“慎终追远&#xff0c;民德归厚矣。” 漏洞复现 访问漏洞url&#xff1a; 出现漏洞的文件为 custom.jsp&#xff0c;构造payload&#xff1a; /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…

vue2+element-ui+springboot编写一个简单的CRUD和上传页面

1.0先看效果图 2.0主功能页面展示 3.0新增功能 4.0更新功能 5.0接口错误提示 前端码云链接:https://gitee.com/xiaojianr/management/tree/master/ 前端拷贝完成需要使用:npm install 命令完成package.json依赖的下载 后端码云链接:https://gitee.com/xiaojianr/manage

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…