Greenplum-Spark连接器(GSC)简介

前言

我司算是Greenplum大户,虽然笔者不负责数仓,但是也少不得和它打交道。除了写pgSQL查询之外,Spark SQL能够使可用性更加丰富。Pivotal官方提供了Greenplum-Spark Connector(GSC)以打通GP和Spark,本文做个概述。

简单架构与配置

极简的架构图如下所示。

http://greenplum-spark.docs.pivotal.io/1-6/overview.html

使用GSC访问GP数据库时,Spark Driver首先与GP Master连接,以获取数据库和表的元数据。读取或写入表时,每个GP Segment会对应到一个或多个Spark Task(即Partition),每个Partition会对应建立一个GP外部表(external table)作为传输数据的媒介。Spark Executor与GP Segment之间的HTTP通信是完全并行的。

要放心使用GSC,需要预先配置好Greenplum:

  • 配置GSC使用的用户,并在pg_hba.conf中允许Spark集群各个节点与GP集群连接;
  • 对GSC用户连接的各GP Schema授予USAGE和CREATE权限:
GRANT USAGE, CREATE ON SCHEMA <schema_name> TO <user_name>;
  • 对GSC用户读写的各GP表授予SELECT和INSERT权限:
GRANT SELECT, INSERT ON <schema_name>.<table_name> TO <user_name>;
  • 允许GSC用户使用gpfdist协议创建可写外部表(用于卸载表数据到Spark)和可读外部表(用于从Spark装载表数据):
ALTER USER <user_name> CREATEEXTTABLE(type = 'writable', protocol = 'gpfdist');
ALTER USER <user_name> CREATEEXTTABLE(type = 'readable', protocol = 'gpfdist');

关于gpfdist和外部表的介绍请见这里,GP的外部表和Hive的外部表比较类似。GSC产生的外部表表名格式是spark_<app-specific-id>_<spark-node>_<num>,如下图所示。

在Spark App正常退出时,这些外部表会自动清理。如果App一直不终止(比如Streaming程序)或者异常终止,就需要我们手动drop掉那些不再使用的外部表:

DROP EXTERNAL TABLE <schema_name>.<external_table_name> CASCADE;

引入GSC JAR包到Maven项目

在Pivotal服务器上下载GSC JAR包。当前最新的版本为1.6.2,支持的GP版本为4.3.x、5.x和6.x,支持的Spark版本则为2.1.2及以上。

将下载好的greenplum-spark_2.11-1.6.2.jar放到项目中(如lib目录),然后修改pom文件添加依赖:

    <scala.bin.version>2.11</scala.bin.version>
    <gsc.version>1.6.2</gsc.version>

    <dependency>
      <groupId>io.pivotal.greenplum.spark</groupId>
      <artifactId>greenplum-spark_${scala.bin.version}</artifactId>
      <version>${gsc.version}</version>
      <type>jar</type>
      <scope>system</scope>
      <systemPath>${basedir}/lib/greenplum-spark_${scala.bin.version}-${gsc.version}.jar</systemPath>
    </dependency>

从GP读取数据

读取数据需要传入如下参数:

  • url:连接GP数据库的JDBC串;
  • dbschema:源表所在的Schema;
  • dbtable:源表名;
  • user:GSC用户名;
  • password:用户对应的密码(可选);
  • partitionColumn:表内分区列的列名。该列数据用来确定GP表的行如何划分到Spark Partition,所以要尽量保证均匀,防止数据倾斜。这一列的数据类型必须是integer、bigint、serial、bigserial四者之一;
  • partitions:手动指定分区数(可选),如果不指定,默认分区数就是GP集群内主Segment的数量,当并行度不够时可以增大。

直接上示例代码吧。

    val userInfoReadOptions = Map(
      "url" -> "jdbc:postgresql://gp-master:5432/my_db",
      "user" -> "lmagics",
      "password" -> "changeme",
      "dbschema" -> "cpts",
      "dbtable" -> "app_user_info",
      "partitionColumn" -> "user_id"
    )

    val userInfoDf = session.read.format("greenplum")
      .options(userInfoReadOptions)
      .load()

然后就可以对产生的DataFrame进行操作了。

向GP写入数据

写入数据需要传入的参数与读取数据基本相同,只是不需要指定partitionColumn和partitions两个域,并多了一个truncate域。示例代码如下。

    val userInfoWriteOptions = Map(
      "url" -> "jdbc:postgresql://gp-master:5432/my_db",
      "user" -> "lmagics",
      "password" -> "changeme",
      "dbschema" -> "cpts",
      "dbtable" -> "app_user_info",
      "truncate" -> "false"
    )

   userInfoDf.write.format("greenplum")
     .mode(SaveMode.Overwrite)
     .options(userInfoWriteOptions)
     .save()

若指定的表不存在,GSC会根据DataFrame中的各个字段名和数据类型自动创建表。Spark与GP数据类型的映射关系详见这里

写入时建议调用mode()方法指定存储模式:

  • Append:向表追加数据;
  • Ignore:如果表已经存在,就忽略这批写入数据;
  • Overwrite:如果表已经存在,就清空该表并写入目标数据。清空表的动作由上述truncate参数指定,false表示会drop掉表,并重新create之;true则表示执行truncate操作。

The End

民那晚安。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容