采用alluxio提升MR job和Spark job性能的注意点
1. 介绍
相信很多使用alluxio的同学,都是冲着其memory speed的加速效果而来。我也一样,认为只要用上了alluxio,整合了spark和hadoop就可以轻松把以前的JOB提升数倍的性能。然而,事实并不是这么顺利的。
今天主要就来总结下alluxio在提升MR job和Spark job性能上存在的问题和挑战。
2. 实验说明
2.1 实验环境
后面在说明问题的时候会贴一些实验结果。为了排除网络IO的影响,我这边的实验将hadoop、spark还有alluxio都部署在一台机器上。这台机器内存120G,40核。
2.2 实验方法
主要是做对比实验,一个使用alluxio,一个不使用alluxio,查看效果。
2.3 实验负载
为了让对比实验的结果差异尽量明显,在设计实验负载的时候,我们选取了能最大化发挥alluxio内存存储优势的实验负载。
我们运行一个只进行读取文本文件的job,来作为实验负载。这样的job主要性能瓶颈都是在IO上,可以保证内存存储带来最大效果。
3. MapReduce on alluxio
3.1 读取10G文件(1G split)


3.2 读取20G文件(1G split)

3.3 读取60G文件(1G split)

3.4 读取60G文件(512MB split)

4. Spark on Alluxio
这个可以拿Spark shell来测试,实验结果也是:alluxio没法带来成倍的性能提升。实际用alluxio和不用alluxio效果差不多。
5. 关于使用alluxio来提升性能的注意点
5.1 alluxio是否以memory speed来进行读写?
alluxio是否以内存的速度来进行读写?答案肯定是:YES。 当然前提是没有其他干扰(比如和hadoop这样的分布式计算引擎集成在一起,影响性能的因素是非常多的)。这里主要是单纯利用文件操作API读写和以MR JOB或者SPARK JOB形式读写的差别。这里给下结论:
纯文件系统下的测试和以JOB形式进行测试的区别
a. 纯文件系统的API去读取文本文件,可以有预期的性能提升(8倍左右)。这时候是比较纯粹的测试,没干扰。
b. job形式进行测试。生产使用的MR JOB修改后进行测试,都是基本差不多的(无论文本文件还是seq file)。因此需要分析其原因。JOB形式测试依赖 配置、JOB任务负载(不同的JOB,产生性能瓶颈的地方不同。要确保是IO密集型的JOB)
PS: 还有个坑,就是alluxio利用文件系统API来操作的时候,如果是sequence file格式的话,也是不会以memory speed来进行读写的。我怀疑开销可能是在解压缩上。因为我实验的sequence file data是有压缩的。欢迎大家反馈。
5.2 如何使用alluxio提升MR job性能?
要使用alluxio来提升性能也是可以,确保如下要求:
- 任务是IO密集型的JOB
- 参数配置符合要求
- split size要大(也就是说map个数要少),最起码split size 大于1G的纯IO密集型才可能体会到有性能提升
以上结论可以看我第三节的实验结果。但是实际操作中你会发现有很多问题,比如控制split size特别大,在调整配置的时候会引发各种问题。而且即使split size变大了,提升了单个map任务的读取速度了,但是却会在集群角度降低map的并发性能。
而且即使在完美情况下,恐怕也无法有成倍的性能提升(第三节的实验是纯粹的IO类JOB,也尽量采用了比较大的split size,也仍然只有50%左右性能提升)。至于为什么我没有采用更大的split size,是因为这样配置会引发其他的一些问题,导致集群不能正常工作。
5.3 如何使用alluxio提升Spark job性能?
实验跑了下line count job,统计数G文件的行数。不过测试出来也是性能差不多。耗时应该都在任务分片上了。所以使用spark on alluxio来提升性能也有如下要求:
- spark job是IO密集型的
- 最好是有很多spark job,并且不同job之间有RDD共享(alluxio提供的内存数据管理可以很好的管理热数据,从而增加内存命中率来改进性能)
- spark sql这种大表关联查询的场景貌似比较适合。因为查询的时候经常有一些中间结果集的共享。因此这种spark的大表的关联查询job估计使用alluxio能有效果~
6. 综上
想用alluxio来提升单个job的性能,基本上是比较难的,不建议。如果你们的使用场景,job比较多,内存资源比较有限的情况下,通过alluxio合理管理热数据,能有效改进性能。还有spark或者hive之类的大表关联查询,估计也有效果。其他场景应该比较难看到什么性能提升。
关于alluxio的应用场景,alluxio的作者其实也给出了总结:专访范斌,谈开源三年后的Alluxio
范斌: Alluxio作为一个内存级的虚拟分布式存储系统有几个常见的使用场景:
- 计算层需要反复访问远程(比如在云端,或跨机房)的数据;
- 计算层需要同时访问多个独立的持久化数据源(比如同时访问S3和HDFS中的数据);
- 多个独立的大数据应用(比如不同的Spark Job)需要高速有效的共享数据;
- 当计算层有着较为严重的内存资源、以及JVM GC压力,或者较高的任务失败率时,Alluxio作为输入输出数据的Off heap存储可以极大缓解这一压力,并使计算消耗的时间和资源更可控可预测。
实际例子:
Alluxio的目的就是想要让计算层和存储层可以再次轻装上阵,让它们独立的优化和发展自己,而不用担心破坏两者之间的依赖。具体说来,Alluxio提供一层文件系统的抽象给计算层。这层抽象之上的计算只需要和Alluxio交互来访问数据;而这层抽象之下可以同时对接多个不同的持久化存储(比如一个S3加上一个HDFS部署),而这层抽象本身又是由部署在靠近计算的内存级Alluxio存储系统来实现。一个典型的场景比如在百度,Spark不在需要关心数据是否是在本机房还是远程的数据中心,它只需要通过Alluxio中读写数据,而Alluxio可以聪明的帮助应用在需要时把数据同步到远端。
百度应用alluxio提升性能的主要原因:经过更深层次的发掘,我们发现了问题所在。由于数据分散分布在多个数据中心,有很大的可能是:数据的查询需要到达远程数据中心以提取数据——这应该是在用户运行查询时遇到延迟的最大原因。
这个可以参考文章:为了应对数据大爆炸 百度投向了这个开源新项目
我想alluxio之所以作为acceleration layer来说不够称职,其原因可能就是并没有去为MapReduce和Spark去实现自己的alluxio native acceleration layer. 说到希望给计算JOB做这种即插即用的内存加速,可以考虑使用ignite。 我也写了相关文章比较了ignite和alluxio,可以关注下。
再做个友情提醒: 使用alluxio需要仔细看看上述场景是否符合你们的使用场景。想和MR和Spark集成,利用内存来加速job处理的,不妨考虑下Apache ignite,我最近会玩玩试试效果
采用alluxio提升MR job和Spark job性能的注意点的更多相关文章
- Spark的性能调优杂谈
下面这些关于Spark的性能调优项,有的是来自官方的,有的是来自别的的工程师,有的则是我自己总结的. 基本概念和原则 <1> 每一台host上面可以并行N个worker,每一个worke ...
- Spark实践 -- 性能优化基础
性能调优相关的原理讲解.经验总结: 掌握一整套Spark企业级性能调优解决方案:而不只是简单的一些性能调优技巧. 针对写好的spark作业,实施一整套数据倾斜解决方案:实际经验中积累的数据倾斜现象的表 ...
- SparkSQL的一些用法建议和Spark的性能优化
1.写在前面 Spark是专为大规模数据处理而设计的快速通用的计算引擎,在计算能力上优于MapReduce,被誉为第二代大数据计算框架引擎.Spark采用的是内存计算方式.Spark的四大核心是Spa ...
- 【转载】Apache Spark Jobs 性能调优(二)
调试资源分配 Spark 的用户邮件邮件列表中经常会出现 "我有一个500个节点的集群,为什么但是我的应用一次只有两个 task 在执行",鉴于 Spark 控制资源使用的参数 ...
- Spark:性能调优
来自:http://blog.csdn.net/u012102306/article/details/51637366 资源参数调优 了解完了Spark作业运行的基本原理之后,对资源相关的参数就容易理 ...
- Apache Spark Jobs 性能调优
当你开始编写 Apache Spark 代码或者浏览公开的 API 的时候,你会遇到各种各样术语,比如transformation,action,RDD(resilient distributed d ...
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...
- Spark常规性能调优
1.1.1 常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行 ...
- Spark Streaming性能调优详解
Spark Streaming性能调优详解 Spark 2015-04-28 7:43:05 7896℃ 0评论 分享到微博 下载为PDF 2014 Spark亚太峰会会议资料下载.< ...
随机推荐
- iOS App转让流程详情教程篇
最近对公司旗下两款app进行转让,正好记一下操作流程: 1.登录iTunes发布网站,找到app,查看App信息下方有个[转让 App] 按钮. 2.点进去,是如下界面,里面包含是否满足转让条件,理论 ...
- 对Java的常用对象(POJO、DTO、PO、BO、VO、DAO)详细解释及应用场景
首先这些对象都应用都是一些单词的简称,也是一种应用思想,故其他语言也可以使用,在Java里比较常见这些对象吧.下面来一一解释. 一.POJO(Plain Ordinary Java Object). ...
- JSP弹出对话框方式小结
转自:http://blog.csdn.net/ithomer/article/details/8033002 该博主(创业)另一博客地址: http://blog.mimvp.com JSP 网页在 ...
- HDUOJ-----Computer Transformation
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- Python实现:十进制数与(2~16进制数)之间的互相转换
(最开始源于牛客网上的一道编程题 : [编程题] 数制转换) 将X进制转为int十进制的功能函数:(乘X次方各位数的加和法) # 将X进制转为int十进制的功能函数:(乘X次方各位数的加和法) def ...
- linux下网络配置小节[from 老男孩的linux运维笔记]
对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太多的初学者徘徊在门外就不奇怪了, 这里,老男孩老师花了一些时间总结了这个文档小结,也还不够完善,欢迎大家补充,交流. ...
- C++ map,set内部数据结构
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据.它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序.每个元素的值不能直接被改变.[重点]内部结构采用红黑树的平衡二叉 ...
- linux达人养成计划学习笔记(一)——命令基本格式及文件处理命令
一.shell终端初始 快捷键Ctrl + Alt + T,可以快速打开终端 bluemoutain 当前用户名 bluemoutain-CN155 本机名 ~ 当前目录(家目录,root用户为/ro ...
- 【HTML】网页中如何让DIV在网页滚动到特定位置时出现
用js或者jquery比较好实现.但你要知道,滚动到哪个特定位置,例如滚动到一个标题h3那显示这个div,那么可以用jquery算这个h3距离网页顶部的距离:$("h3").off ...
- iOS UTI
UTI全拼Uniform Type Identifier,直接翻译过来就是统一类型标示符. 这个东西可以实现的功能就是设备之间或者app之间的文件传输. 有兴趣的领个支付宝红包再走, ^_^ 全套相关 ...