云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

消息队列_网站建设中页面模板_企业0元试用

小七 141 0

apachespark和R之间的网桥速度提高了100倍,在databrick上有用户定义的函数

SparkR用户定义函数(UDF)API为运行在apachespark上的大数据工作负载提供了机会,以拥抱R的丰富包生态系统。我们的一些有R专家的客户使用SparkR UDF API将R的复杂包混合到他们的ETL管道中,应用的转换超出了Spark在分布式SparkDataFrame上的内置函数。其他一些客户使用R UDF进行并行模拟或超参数调整。总的来说,API功能强大,支持许多用例。sparkrudfapi在sparkjvm和R进程之间来回传输数据。在UDF函数中,用户可以访问整个R生态系统,得到一个奇妙的R岛。但不幸的是,R和JVM之间的桥梁远没有效率。它目前只允许一辆"车"在任何时候通过桥,而这里的"车"是SparkDataFrame中任何一行中的一个字段。这座桥上的交通非常缓慢,这一点也不奇怪。在这个博客中,我们提供了SparkR的udfapi的概述,然后展示了如何使R和Spark之间的桥梁变得高效。我们给出了一些基准结果。SparkR自定义函数API概述SparkR提供了四个api,它们在R中运行用户定义的函数到SparkDataFrame适应()dapplyCollect()盖普利()gapplyCollect()dapply()允许您在SparkDataFrame的每个分区上运行一个R函数,并将结果作为一个新的SparkDataFrame返回,您可以对其应用其他转换或操作。gapply()允许您将函数应用于每个分组分区,这些分区由一个键和SparkDataFrame中的相应行组成。如果要对结果调用collect(),则dapplyCollect()和gapplyCollect()是快捷方式。下图说明了在执行UDF期间执行的序列化和反序列化。数据被序列化两次,反序列化两次,所有这些都是按行排列的。通过在Databricks Runtime 4.3中对数据序列化和反序列化进行矢量化,我们可以同时对列的所有值进行编码和解码。这消除了行序列化的主要瓶颈,显著提高了SparkR的UDF性能。此外,矢量化对较大的数据集的好处更大。方法和基准结果我们使用航空公司的数据集作为基准。该数据集由24个整数字段和5个字符串字段组成,包括日期、出发时间、目的地和有关每个航班的其他信息。我们在Databricks Runtime(DBR)4.2和Databricks Runtime 4.3上测量sparkrudfapi在不同大小的数据子集上的运行时间和吞吐量,并报告20次运行的平均值和标准差。dbr4.3包含了新的优化工作,而dbr4.2没有。所有的测试都在集群上用8个i3.xlarge工作线程执行。SparkR::dapply()为了演示加速,我们使用了一个简单的用户函数和SparkR::dapply(),它只返回输入R数据帧.总的来说,改进是一到两个数量级,并且随着数据集中的行数而增加。对于800k行的数据,运行时间从100s以上减少到3s以下,dbr4.3的吞吐量超过30mb/s,而在优化前只有0.5mib/s左右。对于6M行的数据,运行时间仍然低于10秒,吞吐量约为70MIB/s—这是100倍的加速!SparkR::gapply()实际上,与dapply()相比,SparkR::gapply()的使用频率更高。在我们的基准测试中,我们通过按DayOfMonth字段对数据进行预分区,并使用gapply()中的相同键来计算每月每一天的航班总数,从而消除了洗牌成本。在我们的实验中,gapply()比dapply()运行得更快,因为UDF的输出数据是输入数据的聚合结果,这是很小的。因此,总的序列化和反序列化时间可以减半。摘要总之,我们的优化在所有典型数据大小的范围内都比以前的版本具有压倒性优势,对于更大的数据,我们观察到了一到两个数量级的改进。如此显著的改进可以赋予许多以前几乎无法接受的用例。另外,dbr4.3现在支持日期和时间戳数据类型,在以前的版本中,必须将其转换为double。阅读更多这种优化是Databricks一系列提高SparkR在Databricks运行时性能的努力之一。有关详细信息,请查看以下资产:加速数据块上的R工作流在Databricks上用apachesparkr并行化大型仿真随需应变网络研讨会和常见问题解答:使用apachespark并行化R代码免费试用Databricks。今天就开始吧