跳转到主要内容
工程的博客

快100倍之间的桥梁Apache火花和R砖的用户定义函数

2018年8月15日, 工程的博客

分享这篇文章

SparkR用户定义函数(UDF) API打开大数据上运行的工作负载的机会Apache火花拥抱R生态系统丰富的包。我们的一些客户,有R专家机上使用SparkR UDF API混合R的复杂的包到ETL管道应用转换,超越分布式SparkDataFrame火花的内置函数。其他客户使用R udf并行模拟或hyper-parameter调优。总的来说,API是强大,使许多用例。

SparkR UDF API火花JVM和R之间传输数据过程来回。UDF内部功能,用户将获得一个美妙的R与访问整个岛的生态系统。但不幸的是,R和JVM之间的桥梁是远离高效。目前只允许一个“车”在任何时候通过在桥上,这里的“车”是一个SparkDataFrame的任何行。它不应该是一个交通意外,在桥上速度非常慢。

在这个博客中,我们概述SparkR UDF的API,然后展示我们R和火花砖高效之间的桥梁。我们现在一些基准测试结果。

SparkR用户定义函数API的概述

SparkR提供四个api,运行一个用户定义函数R SparkDataFrame

  • 有斑纹的()
  • dapplyCollect ()
  • 新闻出版总署()
  • gapplyCollect ()

有斑纹的()允许您在每个分区上运行一个R函数SparkDataFrame和返回结果的新的SparkDataFrame,你可以申请其他转换或行动。新闻出版总署()允许您将一个函数应用到每个分组分区组成的一个关键SparkDataFrame和相应的行。dapplyCollect ()gapplyCollect ()快捷方式如果你要打电话给谁收集()的结果。

下图说明了序列化和反序列化期间执行的执行UDF。两次两次序列化和反序列化数据,一点都是行操作。

由vectorizing数据序列化和反序列化数据砖4.3运行时,我们都编码和解码一个列的值。这消除了一点主要瓶颈这行操作序列化,极大地提高了SparkR UDF的表现。同时,受益于向量化更激烈更大的数据集。

方法和基准测试结果

我们使用航空公司的基准数据集。数据集由24个整数字段和5字符串字段包括日期、起飞时间、目的地和其他每个航班的信息。我们测量的运行时间和吞吐量SparkR UDF api子集的数据与不同大小砖运行时(DBR) 4.2和砖4.3运行时,并报告平均值和标准偏差超过20分。DBR 4.3包含了新的优化工作,而DBR 4.2不。所有的测试与八i3在集群上执行。超大的工人。

SparkR:斑纹()

为了演示加速度,我们使用一个简单的用户功能SparkR:斑纹()仅返回输入Rdata.frame。

总的来说,提高一到两个数量级,并增加数据集的行数。与800 k行数据,运行时间减少了来自超过100年代不到3 s。DBR的吞吐量4.3是超过30 MB / s,而只有约0.5 MiB / s在我们优化。与6 m行数据,运行时间仍低于10秒,和吞吐量大约是70 MiB / s——即100 x加速!

SparkR:新闻出版总署()

在实践中SparkR:新闻出版总署()更常用相比有斑纹的()。在我们的基准测试中,我们删除了洗牌通过pre-partitioning数据的成本DayOfMonth字段,并使用相同的密钥新闻出版总署()数的总数航班的每一天。

在我们的实验中,新闻出版总署()运行速度比有斑纹的(),因为UDF的输出数据的聚合结果输入数据,这是小的。因此,总序列化和反序列化时间会减半。

总结

总之,我们对前一版本的优化有压倒性的优势在所有典型的数据大小的范围,对于较大的数据,我们观察到一到两个数量级的提高。这种显著的改善可以使许多用例之前勉强可以接受。另外,日期和时间戳数据类型现在支持在DBR 4.3中,曾在以前版本翻倍。

阅读更多

这种优化是一个系列,从砖的努力,促进SparkR砖上运行时的性能。看看下面的资产的更多信息:

免费试着砖
看到所有工程的博客的帖子