采用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中tableview的移动添加删除
// // MJViewController.m // UITableView-编辑模式 // // Created by mj on 13-4-11. // Copyright (c) 2013年 ...
- SpringMVC框架学习
2012-03-21 衡量一个MVC框架模式,主要通过三种web模式,本人认为springMVC是一个很好的MVC 模式,对模式的支持如下: (1)派遣器模式 Spring有一个统一集中的派遣器org ...
- hibernate注解note
@Id标识主键属性 1.hibernate5.2 mysql5.7 不需要实现 serializable也可以? 2.主键255的长度我生成了? @GeneratedValue主键生成策略 1.主键设 ...
- 给你出道题---N个数字的静态决策区分问题
决策,是世界上最重要的事情. 走路分两步:看准方向,大步前进.看准方向的过程就是决策. 任何一个问题,都对应两个空间:解空间和决策空间.我们所要做的就是使用决策空间去划分解空间. 决策可以分成两类:单 ...
- MATLAB 的条件分支语句
MATLAB 的条件分支语句: 1)if...end 2)if...else...end 3) if...elseif...elseif...else...end a=; fprintf('\n ...
- Quick Touch – 在 iOS 设备运行的 “Touch Bar”
关于 Quick Touch & Touch Bar Touch Bar 其实就是在原来 MBP 的按键区顶部新增了一个长条形的OLED触控屏,提供一些常用的快捷键.(iMessage 选表情 ...
- android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法
今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚 ...
- MVC2 扩展Models和自定义验证(学习笔记)
当我们利用Visual Studio生成实体类以后,难免会用到验证功能(例如,用户登录时验证用户名是否为空,并加以显示). Visual Studio实体类:实体类 如果直接去编辑Visual Stu ...
- FFmpeg 滤镜及其效果
原文地址:https://blog.csdn.net/dangxw_/article/details/49001413 代码中使用滤镜参见上一篇博客:http://blog.csdn.net/dang ...
- SimpleAdapter真不简单!
作为一名编程初学者,我总是认为自己什么都不会,什么都不行,就算实现了文档指定的功能,我永远都是觉得自己写过的代码实在是太烂了,它只是恰巧能够运行而已!它只是在运行的时候恰巧没有发现错误而已!!一直都是 ...