开发者社区> 百遇> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用Alluxio高效存储Spark RDD

简介: 在这篇文章中,我们将介绍如何使用Alluxio帮助Spark变得更高效,介绍多种将Alluxio应用在Spark上的方法。
+关注继续查看
更多精彩内容参见云栖社区大数据频道https://yq.aliyun.com/big-data;此外,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.aliyun.com/product/odps

越来越多的公司和组织开始将Alluxio和Spark一起部署从而简化数据管理,提升数据访问性能。Qunar最近将Alluxio部署在他们的生产环境中,从而将Spark streaming作业的平均性能提升了15倍,峰值甚至达到300倍左右。在未使用Alluxio之前,他们发现生产环境中的一些Spark作业会变慢甚至无法完成。而在采用Alluxio后这些作业可以很快地完成。在这篇文章中,我们将介绍如何使用Alluxio帮助Spark变得更高效,介绍多种将Alluxio应用在Spark上的方法。Alluxio可以使Spark执行得更快,使多个Spark job以内存级速度共享相同的数据。具体地,我们将展示如何使用Alluxio高效存储Spark RDD,并在Spark和Alluxio上做一些性能测试。

1. Alluxio 和Spark RDD缓存

Spark用户通常调用Spark RDD cache() API来提高计算性能。cache() API将RDD数据存储在Spark Executor中,下一次调用相同RDD时,RDD数据可以直接从内存载入。然而,RDD数据容量可能会非常大,为数据分配的内存总量会计算得不准确,所以在Spark Executor上存储RDD数据会导致计算所需内存不足。之前的博客提到,去哪儿网在生产环境中遇到了以下问题:Spark job所需的数据经常不在内存中,所以Spark job不能及时完成。另外,如果job崩溃,Spark中的数据将不会被持久化到内存中,下次job恢复,再次访问相同数据,将无法从内存中获取。

该问题的解决方案是将RDD数据存储在Alluxio中,Spark job不需要配置存储数据所需的额外内存,只需配置数据计算所需的内存大小。Alluxio提供了数据存储所需内存,所以RDD数据仍然在内存中。如果Spark job崩溃,数据将仍然存储在Alluxio的内存中,可以被接下来的任务调用。

用户使用Alluxio存储Spark RDD非常简单:将RDD以文件形式存储在Alluxio中。将RDD文件存储有两种方式:saveAsTextFilesaveAsObjectFile。在RDD对应的文件被写入Alluxio后,在Spark中可以使用sc.textFile或者sc.objectFile (从内存中)读取。为了分析理解使用Alluxio存储RDD和使用Spark内置缓存存储RDD在性能上差异,我们进行了如下的一些实验。
实验相关设置如下:
  • 硬件配置:单个Worker安装在一个r3.2 Amazon EC2节点上,节点配置:61 GB内存 + 8核CPU。
  • 软件版本:Spark 2.0.0和Alluxio1.2.0,参数均为缺省配置。
  • 运行方式:以standalone模式运行Spark和Alluxio。
在本次实验中,我们使用Spark内置的不同缓存级别存储RDD对比测试使用Alluxio存储RDD,然后收集分析性能测试结果。同时通过改变RDD的大小来展示存储的RDD的规模对性能的影响。

2. 存储RDD

Spark RDD可以使用persist() API存储到Spark缓存中。persist()可以缓存RDD数据到不同的存储媒介。本次实验使用了以下Spark缓存存储级别(StorageLevel)
  • MEMORY_ONLY:在Spark JVM内存中存储Java对象。
  • MEMORY_ONLY_SER:在Spark JVM内存中存储序列化后的Java对象。
  • DISK_ONLY:将数据存储在本地磁盘。
下面是一段应用persist()API存储RDD的代码示例。

Rdd.persist(MEMORY_ONLY)
Rdd.count()

除了persist()API,另一种存储RDD的方式是将RDD写入Alluxio中。常见的API是:
  • saveAsTextFile:将RDD以文本文件的形式存储。文件里的一行数据存储为一个元素。
  • saveAsObjectFile:将RDD每一个元素通过java序列化的方式存储为文件。
下面是一段将RDD以文件方式存储在Alluxio中的代码示例:

rdd.saveAsTextFile(alluxioPath)
Rdd = sc.textFile(alluxioPath)
Rdd.count()

3. 查询存储在Alluxio上的RDDs

RDD被保存后(无论存储在Spark内存还是Alluxio中),应用可以读取RDD以进行后续的计算任务。本次实验利用缓存RDD或者以文件形式存储的RDD运行count()函数,并分别统计运行时间。下图展示了在不同存储方式下操作的完成时间。

14158a6e884f7ae5bbbe745a83f398b1ea688436

从上图可以看出,读取存储在alluxio中的RDD数据具有比较稳定的执行性能。对于从Spark缓存中读取持久化数据,在数据集规模较小时执行性能具有一定优势,但是随着数据集规模的增长,性能急剧下降。例如,Spark程序在配了61GB内存的节点上调用persist(MEMORY_ONLY) API,当数据集超过10GB时,Spark内存无法全部存放job所需数据,执行时间会下降。

另一方面,相比使用Spark内置缓存,使用Alluxio存储RDD并执行count()函数,其性能在小规模数据上略有劣势。然而,随着数据规模的增长,从Alluxio中读取文件性能更好,因为这种方式耗时几乎始终随着数据规模线性增长。因此,对于一个给定内存大小的节点,Alluxio可以使应用以读取内存的速率处理更多数据。

4. 使用Alluxio共享存储的RDD

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

为了验证采用Alluxio共享内存的优势,我们应用相同的配置运行一个简单实验。应用50GB大小的数据集,我们在RDD上执行不同Spark job,并且记录count()操作的耗时。没有使用Alluxio时,Spark应用需要每次都从数据源读取数据(在本次实验中是一个本地SSD)。在使用Alluxio时,数据可以直接从Alluxio内存中读取。下图展示了程序在这两种情况下,运行count()函数完成时间性能对比。

159ddb979b771498e9d7b2d9d92da9f8181943fe
结果显示了Spark程序如果不使用Alluxio,必须从数据源处重新读取RDD,本例中是本地SSD。然而,将Alluxio和Spark一起使用时,数据已经存储在Alluxio内存中,所以Spark可以快速地读取RDD。当Spark从Alluxio中读取RDD时,读取速度可以提升4倍。如果RDD来自访问起来更慢或不稳定的数据源,Alluxio的优势就更加明显了。下图显示了RDD位于某公有云存储时程序的执行时间。

e1cbe45564d2e55cf50c5d9c3bd69b355430c9ac

在这种情况下,RDD数据集远离计算程序,读取数据花费更多时间,当应用Alluxio时,数据仍然在Alluxio内存中,所以计算可以快速完成。在这种情况下,应用Alluxio可以加速16倍。
这个实验证明了通过Alluxio共享RDD这一方式,可以在多个Spark应用读取相同数据时提升性能。

6. 总结

Alluxio可以在多个方面帮助Spark变得更高效。这篇文章介绍了如何使用Alluxio存储Spark RDD,并且实验验证了采用Alluxio带来的优势:
  • Alluxio可将RDD以文件形式存储,使Spark应用以可预测的高效的方读取数据。
  • Alluxio可以将大规模数据集保存在内存中,提高Spark应用的执行速度。
  • Alluxio可以使多个Spark应用共享内存数据集,从而提高整个集群性能。
版权申明:本文由南京大学顾荣、黄志翻译整理自Alluxio公司技术博客,由Alluxio公司授权云栖社区及CSDN首发(联合),版权归Alluxio公司所有,未经版权所有者同意请勿转载。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spark RDD编程(二)
打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.
791 0
Spark RDD编程(Python和Scala版本)
Spark中的RDD就是一个不可变的分布式对象集合,是一种具有兼容性的基于内存的集群计算抽象方法,Spark则是这个方法的抽象。 Spark的RDD操作分为转化操作(transformation)和行动操作(action),两者的区别在于:        a.
814 0
Spark学习之RDD编程(2)
Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合。 2. 在Spark中数据的操作不外乎创建RDD、转化已有的RDD以及调用RDD操作进行求值。 3. 创建RDD:1)读取一个外部数据集2)在驱动器程序里分发驱动器程序中的对象集合。 4. RDD支持的操作: 1)转换操作,由一个RDD生成一个新的RDD。 2)行动
1501 0
【Spark Summit East 2017】Spark中的容错:从生产实践中获取的经验
本讲义出自Jose Soltren在Spark Summit East 2017上的演讲,主要介绍了Spark容错中的螺母和螺栓,他首先简述了Spark中的各种容错机制,然后讨论了YARN上的Spark、调度与资源分配,在演讲中还对于一些用户案例进行了探讨研究并给出了一些需要的工具,最后分享了未来Spark中容错未来的发展方向比如调度器和检查点的变化。
1926 0
【Spark Summit East 2017】从容器化Spark负载中获取的经验
本讲义出自Tom Phelan在Spark Summit East 2017上的演讲,Tom Phelan探讨了如何实现高可用性的分布式大数据应用和数据中心主机,并分享了学到的经验教训,并对于如何在一个可靠的、可伸缩的、高性能的环境将大数据应用程序容器化给出了一些提示。
1838 0
【Spark Summit East 2017】用于数据分析的基于Kerberos的安全的Spark Notebook
本讲义出自Joy Chakraborty在Spark Summit East 2017上的演讲,主要介绍了为了使用Spark构建基于Kerberos的安全的JupyterHub笔记本所提出的技术设计和开发思想。
1973 0
【Spark Summit EU 2016】Spark的性能,过去、现在与未来
本讲义出自Sameer Agarwal在Spark Summit EU 2016上的演讲,他首先从机器的存储、网络以及CPU等硬件的性能发展变化讲起,再谈到软件中Spark IO的优化、数据格式的改进提升,并介绍了Tungsten项目,该项目的目标是大幅度地提升Spark集群的内存和CPU的执行效率,推动Spark的性能最大可能地接近硬件性能的极限。
1745 0
【Spark Summit EU 2016】使用Flame Graphs提升Spark 2.0性能的研究
本讲义出自Luca Canali在Spark Summit EU 2016上的演讲,他首先对于Spark 1.6版本和Spark 2.0版本的区别进行了分析,并介绍了Spark SQL的相关内容,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,他还着重介绍了对于使用Flame Graphs提升Spark 2.0性能的相关研究。
1922 0
【Spark Summit EU 2016】使用Spark和StreamSets构建数据通道
本讲义出自Pat Patterson在Spark Summit EU上的演讲,他首先介绍了数据工程中的一个难点就是数据漂流(Data Drift),以及应对数据漂流所出现的一些解决方案。之后详细介绍了开发和操作复杂数据流的开源软件StreamSets,并分享了当前在Spark上比较流行的数据通道。
6731 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
基于HBase和Spark构建企业级数据处理平台
立即下载
Spark介绍及Spark多数据源分析
立即下载
Apache Spark系列技术直播# 第七讲 【 大数据列式存储之 Parquet/ORC 】
立即下载