Greenplum中的过程化编程语言(2)

目录

一、PL/R简介

二、安装R包

2.1 安装Greenplum数据计算R包集合

三、PL/Container

3.1 PL/Container程序执行过程

3.2 PL/Container的优点

四、附录


一、PL/R简介

R是在数据科学(比如机器学习)领域中广泛使用的另外一种语言,有R语言背景的数据工程师可以利用PL/R编写代码,然后在所有的Greenplum节点上并行运行。和PL/Python一样,PL/R也是一种不受信的过程化编程语言。在创建PL/R之前,需要首先安装R安装包和PL/R安装包。由于软件许可证授权关系(R和PL/R是GPL协议,而Greenplum不是),Greenplum PL/R和Greenplum主代码库不在一起,而是放在以下地址:https://github.com/greenplum-db/plr这个代码库中包含了生成R和PL/R二进制文件的持续集成代码,读者可以部署CI,然后生成包含R和PL/R的gppkg格式包。当然,也可以到Pivotal官方网站下载编译好的二进制gppkg安装包。注意,Greenplum 5.X上的R使用的版本是3.3.3,这个版本经过了一定的测试。

使用gppkg在所有Greenplum节点上安装R和PL/R包的命令:

和PL/Python一样,在使用PL/R之前,我们需要调用createlang在postgres这个数据库上安装PL/R:

 bin]$ createlang plr -d postgres
createlang: language installation failed: ERROR:  could not open extension control file "/usr/local/greenplum-db-6.2.1/share/postgresql/extension/plr.control": No such file or directory

简单的PL/R例子 

调用PL/R函数生成指数分布表的例子:

PL/R提供一些辅助函数,缺省状态下不会安装这些辅助函数,因为不是所有的PL/R函数都需要这些函数。如果用户需要,可以自行安装和装载。安装这些辅助函数的命令如下:

在一个会话中安装需要的辅助函数。比如,下面的函数允许我们在PL/R函数中引用一些内部的TYPENAMEOID,比如INT4OID。

限于篇幅,本章不详细介绍PL/R支持的功能,感兴趣的读者可以参考以下资源:

  • https://gpdb.docs.pivotal.io/5180/ref_guide/extensions/pl_r.html
  • http://www.joeconway.com/doc/index.html

如果不再使用PL/R,可以调用下面命令在postgres数据库上将其删除。

如果需要从Greenplum包中彻底删除PL/R的包,就需要调用gppkg工具先删除PL/R和R的gppkg包,然后重启集群。

二、安装R包

2.1 安装Greenplum数据计算R包集合

为了方便用户使用,和PL/Python一样,Pivotal的Greenplum发行版中也提供了一个包含常用数据科学相关库的R语言包。其安装和卸载方式与Python包类似,此处不再赘述。Greenplum中的PL/R功能和PostgreSQL中的PL/R功能基本一致,和PL/Python类似,需要在函数入口和出口提供类型转换,同样也支持函数存储共享数据。比如:

只有install_rcmd()函数在Greenplum 5.X中暂不支持,但是Greenplum 6计划支持这个函数(这个功能依赖于Greenplum 6中的一个新功能replicated table,而这个功能目前已在Greenplum 6代码中实现了)

三、PL/Container

PL/Container是一种在Docker容器中运行多种编程语言UDF的过程化编程语言。用户在UDF代码中设置配置名,配置名对应了Docker容器运行镜像、容器启动后运行的解析程序(R、Python)、容器运行时配置等。当前支持的解析程序语言有Python和R。从功能上来说,PL/Container中的Python和R程序兼容很多PL/Python和PL/R的内部函数。目前PL/Container的版本号为1.2.0。PL/Container是由Pivotal开发并开源的,现在支持CentOS 6、CentOS 7、RedHat Enterprise Linux 6或者Red Hat Enterprise Linux 7。实现PL/Container的出发点是解决PL/Python和PL/R不是一种受信任的过程化编程语言的问题。由于不容易创建运行R或者Python代码的沙盒,所以当时考虑用容器技术在系统级别做一个沙盒。此外,PL/Container还有一些其他优点,后面我们会介绍。PL/Container当前支持Greenplum和PostgreSQL。

3.1 PL/Container程序执行过程

从图中可以看到,不同的语言对应于不同的处理程序。在初始阶段,执行器通过分析UDF代码提取运行环境配置项,然后通过Docker的API启动相应的容器。在容器启动后,执行器和容器中的程序通过PING/PONG握手后,再通过IPC或者网络建立连接,然后采用私有协议进行通信。对于语言(Python或者R)相关的代码,后端程序调用相应语言的解释器来解释执行,并最终把结果传递回执行器端。如果有必要(比如,对于SPI调用,这时后端程序无法处理),后端程序会把请求发回执行器执行,再把结果传回后端处理程序。注意整个容器的生命周期。容器在PL/Container的UDF第一次运行的时候启动,然后和执行器建立连接后被一直复用,直到这个会话退出(执行器进程退出)或者UDF主动退出(用户函数中主动调用退出代码)。这样会极大提高性能,因为启动和停止一个容器需要一定代价。也就是说,图中的步骤8到步骤10会一直重复,直到会话退出。

3.2 PL/Container的优点

1)PL/Container是一种安全的过程化编程语言:因为Python或者R的代码在Docker容器中运行,用户不能在Greenplum主机上访问或者在之上创建文件,也不可以直接访问Greenplum数据库,因此,数据库的普通用户可以安全地创建和运行基于R或者Python的函数。

2)对用户代码错误能良好隔离:在运行这些过程化编程语言的UDF时,因为用户代码有bug或者因为一些库不稳定,程序可能会崩溃,Greenplum数据库集群有时候需要重启来避免数据损坏。如果我们把用户的Python或者R代码放到一个单独的容器中运行,那么即使运行Python或者R代码的程序崩溃,SQL查询只会报告失败而不影响集群以及集群中的其他会话

3)Python/R多版本支持:PL/Python和PL/R在一个机器上同时部署多个不同版本并不方便。但是对于PL/Container,我们可以针对不同版本创建不同的镜像,轻松完成多版本支持。

4)资源控制:Greenplum支持Resource Group功能来实现资源(内存和CPU)控制,但是针对内存控制粒度无法触及过程化编程语言代码本身。因为Greenplum中的内存控制是通过自带的内存分配(包含统计)功能实现的,而过程化编程语言中的内存管理通常是由语言自己来实现的,这是Greenplum内核感知不到的。PL/Container解耦了数据库执行器部分和过程化编程语言解释代码部分,我们可以轻松地通过Docker的资源控制来控制过程化编程语言使用资源。

5)容易扩展:一种扩展是语言层面的,Greenplum已经尽量把不同语言的共有代码提取出来,这时如果增加一种语言的支持,我们就可以把更多精力放在语言本身的相关代码上面。另一种扩展是后端层面的。PL/Container代码虽然现在只支持Docker容器,但是其实现抽象化了后端API,使得PL/Container能更容易地支持不同接口。比如,可以写一个后端,不需要容器而只需要独立进程解释过程化编程语言函数(这样损失了安全性但是能很好地隔离用户代码错误);又或者实现一个基于容器的云操作系统的后端,这时资源管理控制又会是另外一种情况。

四、附录

进一步阅读

  • ❏https://gpdb.docs.pivotal.io/5190/ref_guide/extensions/pl_python.html
  • ❏https://gpdb.docs.pivotal.io/5190/ref_guide/extensions/pl_r.html
  • ❏http://www.joeconway.com/plr.html
  • ❏https://gpdb.docs.pivotal.io/5190/ref_guide/extensions/pl_container.html

猜你喜欢

转载自blog.csdn.net/MyySophia/article/details/113835841