首先,介绍前辈研究的基于MapReduce框架的outlier产生原因;其次,根据这些方面来分析Spark架构中的straggler;最后,根据阅览的优化办法,谈谈自己的看法。

一、MapReduce产生outlier的原因

  outlier是指MapReduce中延长job执行时间的因素,参考文献为Reining in the Outliers inMap-Reduce Clusters using Mantri

  MapReduce整体系统产生outlier的原因可以分为三类:

  1、硬件特性

  静态:硬件可靠性。

  动态:资源竞争,包括进程、内存及网络等硬件资源。

  2、网络特性

  网络直接影响数据传输率,而数据中心的瓶颈原因就与数据传输率有重要关系。

  3、MapReduce特性

  分布式系统必然存在分布式的数据和分布式的任务,那么就会存在调度规则。MapReduce将job分为task,资源的调度和任务的调度都会导致task工作量的不平衡或者节点负载的不平衡。

  因此,这三个大类整体上即5个问题:资源的竞争、硬件的可靠性(主要指磁盘可靠性)、网络带宽的差异性、网络堵塞、task之间工作量的不平衡或者节点之间任务量的不平衡。这5个问题是产生outlier的根本原因。文章中也详细分析了各类问题的解法,为了深入的学习,先谈谈自己的想法,再对比文献中的解决办法。

二、Spark中的straggler

  Spark中的straggler产生的原因自然也离不开上述5个方面,但是,资源的竞争和硬件的可靠性这类硬件特性所带来的straggler是无法在执行上进行优化的,因为这类因素主要关乎系统的硬件配置;网络堵塞和网络带宽也是几乎属于不可避免的因素,这类因素导致的straggler只能依靠网络负载和网络配置的优化来解决。而且,从另一方面考虑,在系统配置和网络负载都正常的情况下,这类因素都不会产生straggler,所以这两类因素都不是对straggler的执行策略进行优化时需要考虑的。如果考虑到straggler的判定优化,可以根据网络的负载而动态配置判定方式,这不失为一种好的想法。综上所述,在对straggler的执行进行优化时主要考虑的对象是Spark框架特性所产生的straggler。

  为了便于细致的分析Spark流程中产生straggler的原因,本文使用如下的简图(本人学习阶段,可能存在问题):

  当Job被划分为框架的处理单位——task时,会产生第一个不平衡,因为每个task的任务量并不是完全对等的。每个task都会经过slave来执行,如果某个task工作量大于平均值太多,整个job的完成时间就会被延长,这个task就成为了straggler。这类straggler产生的具体原因是,straggler需求的资源比其他task要多,在分成input splits时明显多于其他的task。input splits的增多首先是map耗时变长,更为重要的是在shuffle阶段,Partition操作产生的bucket数量将使得hashmaps不能够完全存放在内存,这样就必须存放到磁盘中,而且还会导致内存使用的尴尬。所以最主要的延长原因是shuffle阶段产生的hashmaps数量过多会溢出到磁盘从而增加IO操作。

  依靠推测执行解决这个问题必然是可以减少task的按时执行对系统带来的负面影响,但是要更进一步的进行优化就必须减少这类straggler的工作量,或者保证shuffle阶段并不会造成溢出。减少straggler的工作量本身是不现实的,因为task的划分工作是保持平衡的,而task在获取资源后进行处理才开始出现不平衡,这时已经不能再进行工作量的调整操作了。保证shuffle阶段不产生溢出可以换一种想法,就是平衡shuffle的输入与输出,因为数据量远大于内存时必然不能保证不溢出。shuffle阶段由Partition产生的bucket是一块一块的分到hashmap中去的,hashmap存储在内存中,一个hashmap由一个Reduce操作来执行。这个过程是从narrow dependences到wide dependences,再到narrow dependences。

  随后,task通过network调度到不同的slave上,并且task在slave上可能还需要利用network将所需的数据传送到本地。如果slave上分配的task任务不止一个,那么slave之间就会出现负载的不平衡。而且,已经探知的straggler或者因为其他原因执行失败的task(这也是属于一种straggler)会在多个slave上执行来提高效率。推测执行解决了slave之间负载的不平衡,因为判定某个task为straggler后在更加适合的slave上执行或者在本地优先执行该straggler可以加快straggler的执行速度。但是多个slave同时执行straggler任务必然会有slave是在做没有意义的工作,造成资源的浪费。coworker提供了一种方法,就是在已经可以并行执行后续操作的地方将后续操作交给coworker来做,这样当straggler自身和coworker同时完成任务时,整个straggler的执行时间就被缩短了。这种方法很依赖于数据的划分策略,如果数据依赖性很高,coworker的执行时间会很长,虽然不会在原来的基础上延长时间,但是性能的提高效率已经不太划算了。数据的依赖性是普遍存在的,既然执行的过程无法避免,那就要看是否能够在Partition阶段分为hashmaps时就将这种依赖性减小到最弱,然后再利用coworker就可以很明显的提高效率。

三、文献中的优化办法及拓展思考

  各类关于straggler的优化办法目前是基于Hadoop的,但是Hadoop与Spark存在很多的相似点,是切入的好方法。

  总的分析,straggler的优化一般是基于以下几点:straggler的判定方法;straggler的执行决策;straggler占用的资源。

  1、LATE(Longest Approximate Time to End)

  LATE是一种新的调度算法,首先是更新了straggler的判定方法,然后是执行决策。LATE的设计目的是推翻Hadoop的前提假设:每个节点都按照近似相同的速度执行;task至始至终都按照相同的速度执行;在其他节点有空闲时间时启动推测执行的任务是没有资源消耗的;task的得分是完全按照规定的;低分的task更有可能是straggler;同种类的task需要的资源是相同的。

  LATE在于解决Hadoop环境的异构性,而Spark处理数据是以RDD为单位,粗粒度的数据处理方式对相同的硬件应该不存在太大的差异性。LATE在进行计分时,依赖的因素还包括copy,sort和Reduce阶段,而Spark是没有sort阶段的。PS:这种计分的方式看了两遍没看懂,还得再专研一下。

  2、Coworker

  Coworker主要在于优化straggler的资源占用问题。Coworker的要点在于可以讲straggler后续的操作无关联性的移植到前面并行操作,如果是单纯的narrow dependences则显得不使用了,这也是Spark与Hadoop的不同。而且sort的存在本身就是一个依赖前一阶段输出的步骤,使用Coworker就不太适合,Spark对map的输出进行partition后放入hashmaps,再统一reduce,因此hashmaps的形成必然是等partition阶段完成后,最好的情况是hashmaps呈顺序形成,但一般不现实,所以Coworker存在一定缺陷。

  新版本的Spark会着重解决内存使用的问题,拭目以待。目前资源利用这块的优化还没有什么想法。

  3、Mantri

  Mantri更偏向于对系统中的outlier进行检测,实时的检测可以及时的对outlier采取适合的决策。Mantri的特点在于能够察觉各种各样的straggler以及资源的有效管理,即将资源单独管理,可以更灵活的解决straggler问题。Mantri针对每种察觉的straggler都采取了不同的措施,这对研究straggler的优化有很大的帮助,具体有:

  task是因为争夺资源而成为straggler,那么可以将其复制到其他的slave上运行;task在低带宽的链路中传递数据而成为straggler时,寻找最近的本地资源来避免低带宽链路,如果必须经过这条链路,应该尽量避免系统布局的热点;对于等待丢失的input来重新计算的task,这类straggler可以保持其output(非常有想法的一个点,如果可以对中间的结果进行操作,很多想法都可能实现),提高执行效率;由于工作量不平衡而造成的straggler,Mantri采取的方法是在某一个阶段对各个task按照input的大小递减的顺序进行调度,利于长task提前完成。

  Mantri中的很多想法都是非常有意义的,至少它所考虑的straggler非常全面。Mantri对Mapreduce的研究对Spark的straggler的研究有很大帮助,这里面的思想需要我去认真的总结和专研。

  4、Mesos层面

  在框架体系中常看到Spark和Hadoop都是位于Mesos之上的,所以我学习了一下Mesos的内容,觉得有一些方面印象比较深刻,所以也写出来分析一下。

  Mesos提供的接口可以让不同的框架工作在同一个系统中,类比于SDN框架可以这样说:北向接口是框架,因而北向接口具有多样性,并且其上的API是可以自由编辑的;南向接口是节点,或者说是slave、执行进程,是可以制定统一执行的标准的;东西向扩展即资源的管理和应用的编排,Mesos将资源统一管理,脱离于框架,增加了灵活性。所以我突然发现Mesos居然和SDN非常相似,这似乎是一件很有意思的事情。

  前文所提到的框架特性所产生的straggler无外乎资源的利用原因,Mesos关乎资源的方面可以从南向节点的调度、东西向资源的管理和调度上入手。如果结合Mesos上的优化和Spark框架的优化,那么整体系统的优化应该更加明显。

四、总结

  很多知识都是通过论文看来的,并不系统,而论文又很多没有看懂,所以文中的错误必然不少啊。但是,Spark的straggler的产生原因必然离不开上述几个方面,其优化的策略也无非判定、调度和资源管理,优化层面则可以向下拓展到Mesos上。

Spark随笔(三):straggler的产生原因的更多相关文章

  1. Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式

    参考自:Spark部署三种方式介绍:YARN模式.Standalone模式.HA模式http://www.aboutyun.com/forum.php?mod=viewthread&tid=7 ...

  2. 基于Spark1.3.0的Spark sql三个核心部分

    基于Spark1.3.0的Spark sql三个核心部分: 1.可以架子啊各种结构化数据源(JSON,Hive,and Parquet) 2.可以让你通过SQL,saprk内部程序或者外部攻击,通过标 ...

  3. Spark(三)角色和搭建

    目录 Spark(三)角色和搭建 一.Spark集群角色介绍 二.集群的搭建 三.history服务 四.使用spark-submit进行计算Pi 五.Spark On Yarn 六.shell脚本 ...

  4. 大话Spark(5)-三图详述Spark Standalone/Client/Cluster运行模式

    之前在 大话Spark(2)里讲过Spark Yarn-Client的运行模式,有同学反馈与Cluster模式没有对比, 这里我重新整理了三张图分别看下Standalone,Yarn-Client 和 ...

  5. Spark随笔(二):深入学习

    一.如何选择粗粒度和细粒度 从底层往上引申来理解粗粒度与细粒度. 一层:一个类,具有三个属性值.为了查询这个类的所有实例,细粒度查询的程度为属性值,即依次查询每个实例化对象的属性值,查询三次:粗粒度按 ...

  6. Spark(三) -- Shark与SparkSQL

    首先介绍一下Shark的概念 Shark简单的说就是Spark上的Hive,其底层依赖于Hive引擎的 但是在Spark平台上,Shark的解析速度是Hive的几多倍 它就是Hive在Spark上的体 ...

  7. Spark随笔(一):Spark的综合认识

    一.Spark与Hadoop的关系 Spark和Hadoop只是共用了底层的MapReduce编程模型,即它们均是基于MapReduce思想所开发的分布式数据处理系统. Hadoop采用MapRedu ...

  8. Alpha冲刺随笔三:第三天

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(十天冲刺) 团队名称:葫芦娃队 作业目标:在十天冲刺里对每天的任务进行总结. 随笔汇总:https://www.cnblogs ...

  9. 大数据入门第二十二天——spark(三)自定义分区、排序与查找

    一.自定义分区 1.概述 默认的是Hash的分区策略,这点和Hadoop是类似的,具体的分区介绍,参见:https://blog.csdn.net/high2011/article/details/6 ...

随机推荐

  1. JAVA下的Thread.sleep方法一定要try

    try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } 不同于C#,JAVA里的Thre ...

  2. free查看可用缓存

    本篇转自:http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html 解释一下Linux上free命令的输出. 下面是fr ...

  3. vs2010下编译osip2和eXosip2的4.0.0版的静态库及搭建开发环境

    转载于:http://blog.csdn.net/lbc2100/article/details/48293911 本文为参考网上的动态库的方式,进行静态库的实现,在此对动态库的作者表示感谢. 第一步 ...

  4. 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  5. 使用git建立远程仓库,让别人git clone下来

    首先, 如果你的ssh没有安装的话,要安装ssh服务端.ubuntu是很简单 sudo apt-get install openssh-server 1,建立你的git 目录. ourunix@ubu ...

  6. JS加密库Crypto-JS SEA加密

    http://www.seacha.com/tools/aes.html 在该网站测试 CryptoJS有很多加密方式网上查阅后有 CryptoJS (crypto.js) 为 JavaScript ...

  7. JAVA线程锁-读写锁

    JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...

  8. JavaScript的引擎机制

    var x=1; var y=0; var z=0; function add(n){n=n+1;return n;} y=add(x); function add(n){n=n+3;return n ...

  9. ExtJs

    ExtJS是一种主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.      概念 1.ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用 ...

  10. My favorite bit torrent client for Ubuntu

    Deluge Bit Torrent ClientDeluge is among my favorite bit torrent clients for Ubuntu. It is fast, sli ...