了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站
1. 前序
Greenplum 是一款优秀的 mpp 数据库产品,官方推荐了几种将外部数据写入 Greenplum 方式,包含:通用的 Jdbc,gpload 以及 Pivotal Greenplum-Spark Connector 等。
- Jdbc:Jdbc 方式,写大数据量会很慢。
- gpload:适合写大数据量数据,能并行写入。但其缺点是需要安装客户端,包括 gpfdist等依赖,安装起来很麻烦。需要了解可以参考 gpload。
- Greenplum-Spark Connector:基于 Spark并行处理,并行写入 Greenplum,并提供了并行读取的接口。也是接下来该文重点介绍的部分。
2. Greenplum-Spark Connector 读数据架构
一个 Spark application,是由 Driver 和 Executor 节点构成。当 Spark Application 使用 Greenplum-Spark Connector 加载 Greenplum 数据时,其 Driver 端会通过 JDBC 的方式请求 Greenplum 的 master 节点获取相关的元数据信息。Connector 将会根据这些元数据信息去决定 Spark 的 Executor 去怎样去并行的读取该表的数据。
Greenplum 数据库存储数据是按 segment 组织的,Greenplum-Spark Connector 在加载 Greenplum 数据时,需要指定 Greenplum 表的一个字段作为 Spark 的 partition 字段,Connector 会使用这个字段的值来计算,该 Greenplum 表的某个 segment 该被哪一个或多个 Spark partition 读取。
其读取过程如下:
- Spark Driver 通过 Jdbc 的方式连接 Greenplum master,并读取指定表的相关元数据信息。然后根据指定的分区字段以及分区个数去决定 segment 怎么分配。
- Spark Executor 端会通过 Jdbc 的方式连接 Greenplum master,创建 Greenplum 外部表。
- 然后 Spark Executor 通过 Http 方式连接 Greenplum 的数据节点,获取指定的 segment 的数据。该获取数据的操作在 Spark Executor 并行执行。
3. Greenplum-Spark Connector 写数据流程
1.GSC 在 Spark Executor 端通过 Jetty 启动一个 Http 服务,将该服务封装为支持 Greenplum 的 gpfdist 协议。
2.GSC 在 Spark Executor 端通过 Jdbc 方式连接 Greenplum master,创建 Greenplum 外部表,该外部表文件地址指向该 Executor 所启动的 gpfdist 协议地址。SQL示例如下:
CREATE READABLE EXTERNAL TABLE"public"."spark_9dc823a6fa48df60_3d9d854163f8f07a_1_42" (LIKE "public"."rank_a1")LOCATION ('gp