GreenPlum的gpfdist使用与原理流程分析

news2024/9/20 20:39:51

一、简介

GreenPlum 的数据导入功能作为对数据源的一种扩充,数据导入的方式有:

  • 1、insert 该方式通过 sql 语句,把数据一条一条插入至表中。这种方式,不仅读取数据慢(一条一条读取),且数据需要经过 master 节点后再分发给所有 segment,所以 master 制约着导入性能。
  • 2、copy 该方式实现了数据的批量读取,但数据依然需要通过 master 节点,所以 master 制约着导入性能,无法实现并行、高效的数据加载。
  • 3、gpfdist 该方式使用 gpfdist 协议,segment 与 数据源直连,数据读取后直接发送给每个 segment。这种方式,数据不再通过 master,真正实现了数据加载的并行、高效。

gpfdist 是 Greenplum 数据库并行文件分发程序。
它可以被外部表和 gpload 用来并行地将外部表文件提供给所有的 Greenplum 数据库 Segment。
它也可以被可写外部表使用,并行接受来自 Greenplum 数据库 Segment 的输出流,并将它们写出到文件中。
总的来说,可以并行读文件数据,通过 segment 将数据读取至 master 中, 可以并行写文件数据,通过 segment 将数据写入文件中。 gpfdist 本身是单进程单线程程序,所以如果需要实现服务端的并行,需要启动多个 gpfdist 服务。

二、架构部署


在这里插入图片描述

三、配置与使用

命令格式:

gpfdist [-d <directory>] [-p <http_port>] [-l <log_file>] [-t <timeout>] 
[-S] [-w <time>] [-v | -V] [-m <max_length>] [--ssl <certificate_path>]

gpfdist [-? | help] | --version

例如:gpfdist -p 9000

参数:

-d  <directory>   可以指定工作目录,如果没指定,则为当前目录
-l  <log_file>    指定 log 文件,如果没指定,则直接输出到屏幕中
-p  <http_port>   指定服务端口,默认是 8080
-m  <max_length>  指定最大一行数据的大小,单位是 byte,默认是 32768, 即 32K,可配范围是 32K ~ 256M
-S  <use O_SYNC>  写入文件的时候,同步等待数据写入至存盘后再返回
-v                      显示详细信息
-V                显示更详细信息,当使用这个 V 时,上面的 v 也会被显示出来
-s                    不显示头信息   (这个在 --help 中没有显示,但代码里面是支持的,可以用)
-c                指定一个配置文件,用来执行数据转换的 (这个在 --help 中没有显示,但代码是支持的)
--ssl <certificate_path>   指定 ssl 加密

使用示例

示例中主要使用的是 gpfdist 协议,使用的文件格式主要是 csv。

1、创建只读外部表基本语法

只读外部表

CREATE [READABLE] EXTERNAL [TEMPORARY | TEMP] TABLE table_name     
    ( column_name data_type [, ...] | LIKE other_table )
     LOCATION ('file://seghost[:port]/path/file' [, ...])
       | ('gpfdist://filehost[:port]/file_pattern[#transform=trans_name]'
           [, ...]
       | ('gpfdists://filehost[:port]/file_pattern[#transform=trans_name]'
           [, ...])
       | ('pxf://path-to-data?PROFILE=profile_name[&SERVER=server_name][&custom-option=value[...]]'))
       | ('s3://S3_endpoint[:port]/bucket_name/[S3_prefix] [region=S3-region] [config=config_file]')
     [ON MASTER]
     FORMAT 'TEXT' 
           [( [HEADER]
              [DELIMITER [AS] 'delimiter' | 'OFF']
              [NULL [AS] 'null string']
              [ESCAPE [AS] 'escape' | 'OFF']
              [NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
              [FILL MISSING FIELDS] )]
          | 'CSV'
           [( [HEADER]
              [QUOTE [AS] 'quote'] 
              [DELIMITER [AS] 'delimiter']
              [NULL [AS] 'null string']
              [FORCE NOT NULL column [, ...]]
              [ESCAPE [AS] 'escape']
              [NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
              [FILL MISSING FIELDS] )]
          | 'CUSTOM' (Formatter=<formatter_specifications>)
    [ ENCODING 'encoding' ]
      [ [LOG ERRORS [PERSISTENTLY]] SEGMENT REJECT LIMIT count
      [ROWS | PERCENT] ]

1.1、 使用csv 文件创建只读外部表示例

只读外部表

指定了csv格式的时候,默认的 分隔符(DELIMITER)为 ‘,’ ,默认的引号值(QUOTE)为 ‘"’,默认的换行符(NEWLINE)为\n。

create external table ext (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data.csv') 
    format 'csv';

   insert into a select * from ext;

create external table ext2 (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data.csv', 
              'gpfdist://gp_init:9000/data2.csv') 
    format 'csv';

create external table ext6 (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data*.csv') 
    format 'csv';

create external table ext7 (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data.csv', 
              'gpfdist://gp_init:9001/data2.csv') 
    format 'csv';

查看数据文件与外部表

数据文件的内容

[root@gp_init gpfdist]# cat data.csv 
0, asdfghjkl;
1, asdfghjkl;
[root@gp_init gpfdist]# cat data2.csv 
0, asdfghjkl;
1, asdfghjkl;

查询外部表

postgres=# select * from ext;
 id |         name         
----+----------------------
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
(2 rows)

postgres=# select * from ext2;
 id |         name         
----+----------------------
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
(4 rows)

postgres=# select * from ext6;
 id |         name         
----+----------------------
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
(4 rows)

postgres=# select * from ext7;
 id |         name         
----+----------------------
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
  0 |  asdfghjkl;         
  1 |  asdfghjkl;         
(4 rows)

1.2、使用 pipe管道创建只读外部表示例

只读外部表
gpfdist 支持从管道中读取数据流。

创建一个管道

[root@gp_init gpfdist]# mkfifo gpfdist_pipe

往管道里填写数据

cat data.csv  >  gpfdist_pipe

创建外部表

create external table ext_pipe(id int, name varchar(30))
location ('gpfdist://gp_init:9000/gpfdist_pipe')
format 'csv';

查询外部表

postgres=# select * from ext_pipe ;
 id |    name     
----+-------------
  0 |  asdfghjkl;
  1 |  asdfghjkl;

2、创建可写外部表

2.1、使用csv 文件创建可写外部表示例

目前可写的外部表只支持 gpfdist 协议。

CREATE WRITABLE EXTERNAL [TEMPORARY | TEMP] TABLE table_name
    ( column_name data_type [, ...] | LIKE other_table )
     LOCATION('gpfdist://outputhost[:port]/filename[#transform=trans_name]'
          [, ...])
      | ('gpfdists://outputhost[:port]/file_pattern[#transform=trans_name]'
          [, ...])
      FORMAT 'TEXT' 
               [( [DELIMITER [AS] 'delimiter']
               [NULL [AS] 'null string']
               [ESCAPE [AS] 'escape' | 'OFF'] )]
          | 'CSV'
               [([QUOTE [AS] 'quote'] 
               [DELIMITER [AS] 'delimiter']
               [NULL [AS] 'null string']
               [FORCE QUOTE column [, ...]] | * ]
               [ESCAPE [AS] 'escape'] )]

           | 'CUSTOM' (Formatter=<formatter specifications>)
    [ ENCODING 'write_encoding' ]
    [ DISTRIBUTED BY ({column [opclass]}, [ ... ] ) | DISTRIBUTED RANDOMLY ]

创建可写外部表

create writable external table extw (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data.csv')
    format 'csv';

create writable external table extw2 (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data.csv', 
              'gpfdist://gp_init:9000/data2.csv') 
    format 'csv';

 create writable external table extw3 (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/data.csv', 
              'gpfdist://gp_init:9001/data2.csv') 
    format 'csv';

插入数据

postgres=# create table abc(id int, name char(20));
postgres=# insert INTO abc select * from ext;
postgres=# select count(*) from abc;
 count  
--------
 100000
(1 row)

-- 写入文件
-- 基本上是会把数据平局分给各个文件里。
postgres=# insert INTO extw select * from abc ;
INSERT 0 100000
[root@gp_init gpfdist]# wc -l data.csv 
100000 data.csv


postgres=# insert INTO extw2 select * from abc ;
INSERT 0 100000
[root@gp_init gpfdist]# wc -l data.csv  data2.csv 
  50171 data.csv
  49829 data2.csv
 100000 total


postgres=# insert INTO extw3 select * from abc ;
INSERT 0 100000
[root@gp_init gpfdist]# wc -l data.csv  data2.csv 
  50135 data.csv
  49865 data2.csv
 100000 total

2.2、使用 pipe管道创建可写外部表示例

创建可写外部表

create writable external table extw4 (id int, name char(20)) 
    location ('gpfdist://gp_init:9000/gpfdist_pipe') 
    format 'csv';
-- 执行写入操作
postgres=# insert INTO extw4 select * from abc;
[root@gp_init opt]# bash read.sh gpfdist_pipe 
100000

主要函数代码解析

1、main

  • gpfdist_init :所有的处理都是在 gpfdist_init 函数中。
  • gpfdist_run:只有一个 event_dispatch。

2、gpfdist_init

  • 命令行输入参数解析:parse_command_line。
  • 注册信号处理signal_register:对信号的处理。捕获 SIGTERM 信号,设置最高优先级,注册 process_term_signal 回调函数,在回调函数中,关闭所有 socket 后,退出。
  • http服务配置http_setup:
    • 先根据配置的端口,获取地址信息,然后对地址进行端口绑定。这里获取的地址信息包含两个:ipv4 地址 和 ipv6 地址。gpfdist 优先使用ipv6进行绑定,因为IPv6的监听套接字能够同时监听v4客户端和v6客户端。
    • 遍历所有可用的套接字,设置监听事件:EV_READ | EV_PERSIST(持久属性),设置优先级,并绑定回调函数:do_accept。可用套接字个数保存在 gcb.listen_sock_count 中,可用的 socket 保存在 gcb.listen_socks 数组中。
    • do_accept:对请求进行 accept,记录了自己 accept 产生的 socket(r->sock),client 的 port(r->port),并对socket设置一些属性,例如:keepalive、reuseaeddr 等。
    • 并调用 setup_read 设置read事件。
      • setup_read设置可读事件的回调函数:do_read_request,并判断该请求中是否带 timeout 参数:
        • 如果没带 timeout 参数,则是普通请求,不需要设置 timeout。
        • 如果带 timeout 参数,则是超时事件,需要重新设置超时参数。
  • 看门狗初始化:watchdog_thread。

3、do_read_request
如果是超时事件,则直接发送http_end,后续会关闭连接。
读取socket,如果是返回0,发送 http_end。

  • gnet_parse_request :解析出请求的方法,以及后面跟的参数
  • request_validate :检测请求参数是否正确:必须是GET或POST,且使用协议必须是 HTTP/1.xx。
  • percent_encoding_to_char :检测path中的字符是否存在 %XX 的格式,如果有,则转化为 char 类型的字符。
    如果 path 为 “/gpfdist/status”,则直接返回 send_gpfdist_status。(该请求作为 debug 使用)
  • request_set_path: 将 path 相对路径转换为绝对路径。
  • request_parse_gp_headers:解析 header 中的信息,比如 xid / cid / sn / segcount / csvopt 等。
  • request_set_transform : 执行 transform 转换。
  • session_attach:根据文件名和 TID (由 xid/cid/sn 生成) 创建一个会话,对文件的处理都在会话中处理。根据 tid 和 path 组成 key,从 hash 表中获取该 session,如果没有则进行创建。如果 session 中没获取到 fstream,则直接返回错误。
    如果是 GET,则通过 handle_get_request 函数增加写事件监听(被监听的 fd 是在 do_accept 函数中 accept的 fd),如果是 POST,则调用 handle_post_request 函数。
  • do_write:
    • 1、如果上次读取的数据,都已经发送完成了(通过 block_t 里面的 bot == top 来判断),则再通过 session_get_block 读取一个 block。
    • 2、如果 gp_proto 的协议号为 1,则调用 local_send:发送头部数据,即 blockhdr_t 中的 hbyte
    • 3、调用 local_send:再发送真正的数据,即 block_t 中的 data
    • 4、通过 setup_write,再次添加当前 fd 的写事件

数据读取示意图

在这里插入图片描述
学习记录,原文

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

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

相关文章

我们学到的关于减少客户流失的 4 个经验教训

客户流失 – 这两个词会让任何企业主的脊背不寒而栗。用最简单的术语来说&#xff0c;它是在特定时间内停止使用您的服务的客户百分比。这很糟糕&#xff0c;但这并不全是厄运和阴霾。我们已经通过四个简单的步骤研究了如何减少客户流失&#xff0c;并与您分享这些秘密。请继续…

SP1545L肖特基二极管厂家

目前&#xff0c;市面上供应肖特基二极管的厂家、供应商特别地多&#xff0c;更多选择的背后&#xff0c;带来的却是更多的迷茫和不知所措。采购肖特基二极管&#xff0c;哪家好呢&#xff1f;提及“东沃电子DOWOSEMI”这个国产二极管品牌&#xff0c;很多客户可能第一想到他家…

部署Django报错-requires SQLite 3.8.3 or higher

记一次CentOS7部署Django项目时的报错 问题出现 在部署测试环境时&#xff0c;有需要用到一个python的后端服务&#xff0c;要部署到测试环境中去 心想这不是so easy吗&#xff0c;把本地调试时使用的python版本及Django版本在服务器上对应下载好&#xff0c;然后直接执行命…

AWS-数据库迁移工具DMS-场景:单账号跨区域迁移RDS for Mysql

参考文档&#xff1a; 分为几个环节&#xff1a; 要使用 AWS DMS 迁移至 Amazon RDS 数据库实例&#xff1a; 1.创建复制实例 有坑内存必须8g或者以上&#xff0c;我测试空库 都提示内存不足 2.创建目标和源终端节点 目标空库也得自己创建哈 3.刷新源终端节点架构 4.创建迁…

FrameWork的概述与启动过程

FrameWork框架 Framework定义了客户端组件和服务端组件功能及接口。以下阐述中&#xff0c;“应用程序”一般是指“.apk”程序。 框架中包含三个主要部分&#xff0c;分别为服务端、客户端和Linux驱动。 服务端 服务端主要包含两个重要类&#xff0c;分别是WindowManagerSe…

jsch网页版ssh

使用依赖 implementation com.jcraft:jsch:0.1.55Server端代码 import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.TimeUnit; import o…

django项目改名字后顺利运行、ModelSerializer使用、模块与包的使用、反序列化校验源码分析、断言、drf之请求、魔法方法之点(.)拦截

一 django项目改名字后顺利运行 1 先改文件夹名 2 改项目名 3 改 项目内的文件夹名 4 替换掉所有文件中的 drf_day04_02 ---》drf_day05 5 命令行中启动&#xff1a;python manage.py runserver 6 setting--->django--->指定项目根路径二 同时创建作者和作者详情表(一对…

Ros noetic 机器人坐标记录运动路径和发布 实战教程(A)

前言: 网上记录Path的写入文件看了一下还挺多的,有用yaml作为载体文件,也有用csv文件的路径信息,也有用txt来记录当前生成的路径信息,载体不重要,反正都是记录的方式,本文主要按yaml的方式写入,后文中将补全其余两种方式。 其中两种方式的主要区别在于,加载yaml所需要…

ASUS华硕VivoBook15笔记本V5200EA_X515EA原装出厂Win11预装OEM系统

华硕11代酷睿笔记本电脑VivoBook_ASUSLaptop X515EA_V5200EA原厂Windows11系统 自带显卡、声卡、网卡、蓝牙等所有驱动、出厂主题壁纸、Office办公软件、华硕电脑管家MyASUS、迈克菲等预装程序 链接&#xff1a;https://pan.baidu.com/s/1yAEdA7aiuHK4CTdGLlSOKw?pwdo45a …

【MySQL】一文带你搞懂MySQL中的各种锁

1.概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资&#xff08; CPU 、 RAM、 I/O &#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致 性、有 效性是所有数据库必须解决的一个…

posexplode函数实战总结

目录 1、建表和准备数据 2、炸裂实践 3、错误炸裂方式 4、当字段类型为string&#xff0c;需要split一下 对单列array类型的字段进行炸裂时&#xff0c;可以使用lateral view explode。 对多列array类型的字段进行炸裂时&#xff0c;可以使用lateral view posexplode。 1…

命令行编译VS工程

先输入以下命令&#xff0c;因为命令出错了&#xff0c;就会弹出帮助&#xff0c;如下&#xff1a; "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe" /help 反正就是Microsoft Visual Studio 的安装路径。 帮助界面如下&#xff1a…

新风机为什么会出现?

新风机之所以会出现&#xff0c;是因为人们对于室内空气质量的重视与需求。随着社会的进步和人们生活水平的提高&#xff0c;人们更加注重健康和舒适的居住环境&#xff0c;而室内空气质量是其中一个重要的方面。 空气污染问题&#xff1a;城市化进程加速&#xff0c;工业排放、…

vue3+ts+uniapp小程序端自定义日期选择器基于内置组件picker-view + 扩展组件 Popup 实现自定义日期选择及其他单列选择

vue3ts 基于内置组件picker-view 扩展组件 Popup 实现自定义日期选择及单列选择 vue3tsuniapp小程序端自定义日期选择器 1.先上效果图2.代码展示2.1 组件2.2 公共方法处理日期2.3 使用组件(全局自动导入的情况) 3.注意事项3.1refSelectDialog3.1 backgroundColor"#fff&q…

Python做数据分析更快,为什么很多人只学Excel,不学Python?

在当今信息时代&#xff0c;数据分析已经成为了各个行业不可或缺的工作内容。而在数据分析中&#xff0c;Excel一直是最常被使用的工具之一。然而&#xff0c;随着Python编程的兴起&#xff0c;越来越多的数据分析师开始转向Python进行数据分析。本文将从速度、灵活性、可视化和…

跳转语句(个人学习笔记黑马学习)

break语句 #include <iostream> using namespace std;int main() {cout << "请选择副本难度" << endl;cout << "1、普通" << endl;cout << "2、中等" << endl;cout << "3、困难" <…

gRPC-GateWay Swagger 实战

上一次我们分享了关于 gRPC-Gateway 快速实战 &#xff0c;可以查看地址来进行回顾 : 也可以查看关于 gRPC 的历史文章&#xff1a; gRPC介绍 gRPC 客户端调用服务端需要连接池吗&#xff1f; gRPC的拦截器 gRPC的认证 分享一下 gRPC- HTTP网关 I 今天主要是分享关于 gRPC-G…

zabbix安装部署

前期准备&#xff1a;安装mysql数据库和nginx 一、下载zabbix rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm yum-config-manager --enable rhel-7-server-optional-rpms yum install epel-release numactl yum install…

洞察商机,驱动创新:智能数据分析引领企业发展

“五度易链”产业大数据解决方案由产业经济、智慧招商、企业服务、数据服务四大应用解决方案组成&#xff0c;囊括了产业经济监测、产业诊断分析、企业监测预警、企业综合评估、大数据精准招商、招商智能管理、企业管理、企业培育、企业市场服务、企业金融服务、产业数据开放服…

Layer 2盛夏已至,StarkNet如何实现价值跃迁?

作者&#xff5c;Jason Jiang Layer 2概念在2023年夏天迎来爆发。Coinbase、ConsenSys等加密巨头纷纷下场&#xff0c;其部署的原生L2解决方案Base、Linea在过去两个月内相继完成主网上线&#xff1b;被誉为L2 四大天王之一的StarkNet也在夏天顺利完成“量子跃迁”升级&#x…