导读:本文将介绍一个全新的基于 Greenplum 的R语言开发函数库 Greenplum R。Greenplum R 提供了 gpapply 和 gptapply 两个函数,可以把R语言的程序发送至 Greenplum 端并行执行,从而避免数据的移动和提高R语言的执行效率。

R语言是一个开源的专注于统计分析的程序设计语言,具有丰富的统计分析扩展,在大数据浪潮中,R语言也被数据分析师广泛的应用于大数据分析中。各大数据平台也加强了对R语言的支持。

Greenplum 大数据分析平台对R语言有良好的支持。在 Greenplum 中可以使用两种方式使用R语言进行数据分析:

  • 一种是使用 ODBC 连接到 Greenplum 数据库读取数据
  • 另一种是编写PL/R的用户定义函数(User Defined Function,UDF)

这两种方式各自有优缺点,第一种方式不需要学习 PL/R 的特殊的语法,仅仅需要编写标准的R语言程序,但是缺点也是很明显的,需要把数据从 Greenplum 读取到客户端进行计算,这样的话既需要做数据移动又无法发挥 Greenplum 并行计算的优势;第二种方式不需要移动数据,而且可以使R程序并行执行,但是用户需要学习PL/R的语法,并且使用PL/R编写的用户定义函数(UDF)不易于调试。

那么有没有一个两全其美的方法呢?既可以发挥 Greenplum 数据平台并行计算的优势,又不需要使用PL/R特有的语法呢?答案是有的,使用 Greenplum R library 可以在 Greenplum 中并行的执行R语言程序。

Greenplum R 简介

Greenplum R 的基本原理是把标准的R语言程序转换为R语言编写的UDF, 从而在 Greenplum 平台中并行执行。Greenplum R library 提供了两个重要的方法 gpapply 和 gptapply,这两个方法可以把一个R的函数转换为R的UDF,并且发送至 Greenplum 平台并行执行,然后将执行结果汇总返回给调用方。

Greenplum R执行R代码如下图所示:用户调用 gpapply 将R代码转换为UDF然后发送至 Greenplum 执行,Greenplum Master 节点将UDF分发到每个 Greenplum segmen t去执行,然后将每个 segment 返回的结果汇总返回调用方。




r语言经验分布图 r语言cumprod_r语言经验分布图


从R开发者的角度, Greenplum 中的表(Table)的数据被抽象为 db.data.frame 的数据结构,因此,R程序中操作的数据和返回的结果集也被抽象为 db.data.frame。


r语言经验分布图 r语言cumprod_数据库_02


Greenplum R 示例

下面通过一个简单的示例来看一下如何使用 Greenplum R library。

假设我们有这样一段R代码, 它对一个表(Table)的第一列求和,然后把所得结果和微调参数(adjust)一起加到第二列对应数值上。

# Input is a frame, sum the first column then add the sum vaule and adjust value to the each element in the second column and return as a new tablex

这段代码可以使用gpapply函数,发送至Greenplum端并行执行:

res

Greenplum R 的内部机制

Greenplum R library 把R代码转换成用户定义函数(UDF),从而实现R代码的并行执行。Greenplum 提供了2种执行UDF的的方式,一种是标准的PL/R机制,另外一种是使用PL/Container来执行R UDF。

使用 PL/R 机制来执行 R UDF 的流传如下图所示,Greenplum将创建一个Query Executor(QE)来执行R UDF,这种方式的优点是简洁高效,缺点是存在安全隐患。PL/R是一种Untrust Language,R UDF代码可能存在恶意代码,这些代码可能会对数据库产生严重的后果。


r语言经验分布图 r语言cumprod_数据_03


另一种方式是使用PL/Container 来执行R UDF。执行流程如下图所示,在执行过程中,Greenplum将在一个docker container中来执行R UDF,这种方式的优点是安全性较高,即使R UDF中存在恶意代码,因为它是在一个容器中执行,所以无法影响Greenplum数据库;同时,我们可以使用resource group来限制R UDF执行中需要的计算资源(CPU和Memory)。


r语言经验分布图 r语言cumprod_并行执行_04


参考资料:

  1. Greenplum R代码库:https://github.com/greenplum-db/GreenplumR
  2. Greenplum R文档:https://gpdb.docs.pivotal.io/6-6/analytics/greenplum_r_client.html

作者:吴疆: