如何在Greenplum中并行运行R程序——Greenplum R library介绍
本文将介绍一个全新的基于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 segment去执行,然后将每个segment返回的结果汇总返回调用方。
从R开发者的角度, Greenplum中的表(Table)的数据被抽象为db.data.frame的数据结构,因此,R程序中操作的数据和返回的结果集也被抽象为db.data.frame。
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 table
x <- function(frame, adjust)
{
sum <- 0
for (row in table)
{
sum <- sum + row$column1
}
table$column2 <- table$column2 + sum + adjust
res <- data.frame(column1 = table$column1, column2 = table$column2)
return(r)
}
复制代码
这段代码可以使用gpapply函数,发送至Greenplum端并行执行:
res <- list(c(column1 = 'int', column2 = 'int'))
inputTable <- db.data.frame('test1')
db.gpapply(inputTable, output.name = 'results', FUN = x, output.signature = 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代码可能存在恶意代码,这些代码可能会对数据库产生严重的后果。
另一种方式是使用PL/Container 来执行R UDF。执行流程如下图所示,在执行过程中,Greenplum将在一个docker container中来执行R UDF,这种方式的优点是安全性较高,即使R UDF中存在恶意代码,因为它是在一个容器中执行,所以无法影响Greenplum数据库;同时,我们可以使用resource group来限制R UDF执行中需要的计算资源(CPU和Memory)。
参考资料
Greenplum R代码库:
github.com/greenplum-d…
Greenplum R文档:
gpdb.docs.pivotal.io/6-6/analyti…
相关文章