基于Alluxio系统的Spark DataFrame高效存储管理技术

  • 时间:
  • 浏览:1
  • 来源:神彩排列三_彩神排列三官方

Alluxio都需要在多个方面帮助Spark变得更高效。这篇文章介绍了怎样使用Alluxio存储Spark DataFrame,可是实验验证了采用Alluxio带来的优势:

此人 面,相比使用Spark内置缓存,使用Alluxio存储DataFrame并进行聚合操作,其性能在小规模数据上略有劣势。然而,随着DataFrame数据规模的增长,从Alluxio中读取DataFrame性能更好,意味分析从Alluxio中读取DataFrame的耗时几乎始终随着数据规模线性增长。意味分析使用Alluxio存储DataFrame的读写性能具有较好的线性可扩展性,上层应用都需要稳定地以内存传输效率正确处理更大规模的数据。



1. Alluxio和Spark缓存

5. 结论

Alluxio都需要直接在内存中保存大规模的数据来加速Spark应用

DataFrame被保存后(无论存储在Spark内存还是Alluxio中),应用都需要读取DataFrame以进行后续的计算任务。本次实验中,亲戚亲戚亲戚亲戚朋友创建了一个涵盖2列的DataFrame(这2列的数据类型均为浮点型),计算任务则是分别计算这2列数据之和。

使用Alluxio存储DataFrame的另一大优势是都需要在不同Spark应用或作业之间共享存储在Alluxio中的数据。当一个DataFrame文件被写入Alluxio后,它都需要被不同的作业、SparkContext、甚至不同的计算框架共享。可是,意味分析一个存储在Alluxio中的DataFrame被多个应用频繁地访问,如此所有的应用均都需要从Alluxio内存中直接读取数据,不需要需要重新计算意味分析从另外的底层内部内部结构数据源中读取数据。

在本次实验中,亲戚亲戚亲戚亲戚朋友使用Spark内置的不同缓存级别存储DataFrame对比测试使用Alluxio存储DataFrame,可是架构设计 分析性能测试结果。同去通过改变DataFrame的大小来展示存储的DataFrame的规模对性能的影响。

这张图显示是执行7次聚合操作的平均完成时间。图中的红色的误差范围(error bar)代表完成时间的最大和最小范围。那此结果清晰地显示出Alluxio都需要显著提升操作的平均性能。这是意味分析使用Alluxio缓存DataFrame时,Spark都需要直接从Alluxio内存中读取DataFrame,而都不 从远程的公有云存储中。平均而言,Alluxio都需要加速上述DataFrame的聚集操作性能超过10倍。

从上图都需要看出,从Alluxio中读取DataFrame进行聚合操作具有比较稳定的执行性能。对于从Spark缓存中读取DataFrame,在DataFrame规模较小时执行性能具有一定优势,可是随着DataFrame规模的增长,性能急剧下降。在本文的实验环境中,对于各种Spark内置的存储级别, DataFrame规模达到20 GB然后,聚合操作的性能下降比较明显。

不需要 的公司和组织现在结束了了将Alluxio和Spark同去部署从而复杂性数据管理,提升数据访问性能。Qunar最近将Alluxio部署在亲戚亲戚亲戚朋友的生产环境中,从而将Spark streaming作业的平均性能提升了15倍,峰值甚至达到80倍左右。在未使用Alluxio然后,亲戚亲戚亲戚朋友发现生产环境中的其他Spark作业会调慢甚至无法完成。而在采用Alluxio后那此作业都需要调慢地完成。在这篇文章中,亲戚亲戚亲戚亲戚朋友将介绍怎样使用Alluxio帮助Spark变得更高效,具体地,亲戚亲戚亲戚亲戚朋友将展示怎样使用Alluxio高效存储Spark DataFrame。

在上图的实验中,数据源是本地SSD。意味分析DataFrame来自访问起来调慢或不稳定的数据源,Alluxio的优势就更加明显了。举例而言,下图是DataFrame数据源由本地SSD替换为某公有云存储的实验结果。



此人 面,意味分析数据源是公有云系统,Spark需要跨网络远程读取数据。复杂性性的网络情况报告会意味读取性能难以预测。一种生活性能的不稳定性从上图中的误差范围(error bar)都需要很明显地看出。在不使用Alluxio的情况报告下,Spark作业的完成时间变化范围超过180秒。当使用Alluxio然后,完成时间的变化范围只有10秒。在本实验中,Alluxio也能将数据读取造成的不稳定性降低超过80倍。

Spark DataFrame都需要使用persist() API存储到Spark缓存中。persist()都需要缓存DataFrame数据到不同的存储媒介。

当DataFrame存储在Alluxio时,Spark读取DataFrame就像从Alluxio中读取文件一样简单。下面是一个从Alluxio中读取DataFrame的例子:

下面是一个将DataFrame写入Alluxio的例子:

实验相关设置如下:

下面是一个怎样使用persist() API缓存DataFrame的例子:

3. 查询存储在Alluxio上的DataFrame

亲戚亲戚亲戚亲戚朋友分别从Alluxio中 parquet文件以及各种Spark存储级别缓存中读取DataFrame,并进行上述的聚合计算操作。下图显示了不同存储方案中的聚合操作的完成时间。

为了验证采用Alluxio共享内存的优势,亲戚亲戚亲戚亲戚朋友在如上述的同样的实验环境中进行相同规模的DataFrame聚合操作。当使用80 GB规模的DataFrame时,亲戚亲戚亲戚亲戚朋友在单个Spark应用中进行聚合操作,可是记录该聚合操作的耗时。如此使用Alluxio时,Spark应用需要每次都从数据源读取数据(在本次实验中是一个本地SSD)。在使用Alluxio时,数据都需要直接从Alluxio内存中读取。下图显示了2次聚合操作的完成时间性能对比。使用Alluxio的情况报告下,聚合操作快了约2.5倍。

更多精彩内容参见云栖社区大数据频道https://yq.aliyun.com/big-data;此外,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.aliyun.com/product/odps。

用户使用Alluxio存储Spark DataFrame非常简单:通过Spark DataFrame write API将DataFrame作为一个文件写入Alluxio。通常的做法是使用df.write.parquet()将DataFrame写成parquet文件。在DataFrame对应的parquet文件被写入Alluxio后,在Spark中都需要使用sqlContext.read.parquet()读取。为了分析理解使用Alluxio存储DataFrame和使用Spark内置缓存存储DataFrame在性能上差异,亲戚亲戚亲戚亲戚朋友进行了如下的其他实验。

Alluxio也能在多个Spark应用之间快速共享存储在内存中的数据

4. 使用Alluxio共享存储的DataFrame

意味分析共有云存储系统的网络访问性能不可预测性,最慢的Spark作业执行时间超过1700秒, 比平均慢2倍。然而,当使用Alluxio时,最慢的Spark作业执行时间离米 比平均时间只慢6秒。可是,意味分析以最慢的Spark作业执行时间来评估,Alluxio都需要加速DataFrame聚合操作超过17倍。

版权申明:本文由南京大学顾荣、黄志翻译架构设计 自Alluxio公司技术博客,由Alluxio公司授权云栖社区及CSDN首发(联合),版权归Alluxio公司所有,未经版权所有者同意请勿转载。

2. 存储DataFrame

将DataFrame保占据 内存中的另一种生活法律最好的办法是将DataFrame作为一个文件写入Alluxio。Spark支持将DataFrame写成多种不同的文件格式,在本次实验中,亲戚亲戚亲戚亲戚朋友将DataFrame写成parquet文件。

Alluxio都需要提供稳定和可预测的数据访问性能