﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-SPARK</title><link>http://www.blogjava.net/paulwong/category/54858.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 18 Jun 2015 05:28:33 GMT</lastBuildDate><pubDate>Thu, 18 Jun 2015 05:28:33 GMT</pubDate><ttl>60</ttl><item><title>Spark与Shark的原理</title><link>http://www.blogjava.net/paulwong/archive/2015/06/18/425773.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 18 Jun 2015 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/06/18/425773.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/425773.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/06/18/425773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/425773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/425773.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><strong>1.Spark生态圈</strong></p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">如下图所示为Spark的整个生态圈，最底层为资源管理器，采用Mesos、Yarn等资源管理集群或者Spark 自带的Standalone模式，底层存储为文件系统或者其他格式的存储系统如HBase。Spark作为计算框架，为上层多种应用提供服务。 Graphx和MLBase提供数据挖掘服务，如图计算和挖掘迭代计算等。Shark提供SQL查询服务，兼容Hive语法，性能比Hive快3-50 倍，BlinkDB是一个通过权衡数据精确度来提升查询晌应时间的交互SQL查询引擎，二者都可作为交互式查询使用。Spark Streaming将流式计算分解成一系列短小的批处理计算，并且提供高可靠和吞吐量服务。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><br /><img src="http://dl2.iteye.com/upload/attachment/0109/5585/a0237912-0cd8-3032-a9fe-cff365afb9e1.png" alt="" style="border: 0px;" /><br />&nbsp;<strong>2.Spark基本原理</strong></p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><strong>Spark运行框架如下图所示，首先有集群资源管理服务（Cluster Manager）和运行作业任务的结点（Worker Node），然后就是每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程（Executor）。</strong></p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><strong><br /><img src="http://dl2.iteye.com/upload/attachment/0109/5587/99853dc0-1bb5-323a-9f99-dea35197b965.png" alt="" style="border: 0px;" /><br />&nbsp;</strong>与MR计算框架相比，Executor有二个优点：一个是多线程来执行具体的任务，而不是像MR那样采用进程模型， 减少了任务的启动开稍。二个是Executor上会有一个BlockManager存储模块，类似于KV系统（内存和磁盘共同作为存储设备），当需要迭代 多轮时，可以将中间过程的数据先放到这个存储系统上，下次需要时直接读该存储上数据，而不需要读写到hdfs等相关的文件系统里，或者在交互式查询场景 下，事先将表Cache到该存储系统上，提高读写IO性能。另外Spark在做Shuffle时，在Groupby，Join等场景下去掉了不必要的 Sort操作，相比于MapReduce只有Map和Reduce二种模式，Spark还提供了更加丰富全面的运算操作如 filter,groupby,join等。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">Notes: 在集群(cluster)方式下, Cluster Manager运行在一个jvm进程之中，而worker运行在另一个jvm进程中。在local cluster中，这些jvm进程都在同一台机器中，如果是真正的standalone或Mesos及Yarn集群，worker与master或分布于不同的主机之上。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">JOB的生成和运行</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">job生成的简单流程如下</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">1.首先应用程序创建SparkContext的实例，如实例为sc</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">2.利用SparkContext的实例来创建生成RDD</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">3.经过一连串的transformation操作，原始的RDD转换成为其它类型的RDD</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">4.当action作用于转换之后RDD时，会调用SparkContext的runJob方法</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">5.sc.runJob的调用是后面一连串反应的起点，关键性的跃变就发生在此处</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">调用路径大致如下</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">1.sc.runJob-&gt;dagScheduler.runJob-&gt;submitJob</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">2.DAGScheduler::submitJob会创建JobSummitted的event发送给内嵌类eventProcessActor</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">3.eventProcessActor在接收到JobSubmmitted之后调用processEvent处理函数</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">4.job到stage的转换，生成finalStage并提交运行，关键是调用submitStage</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">5.在submitStage中会计算stage之间的依赖关系，依赖关系分为宽依赖和窄依赖两种</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">6.如果计算中发现当前的stage没有任何依赖或者所有的依赖都已经准备完毕，则提交task</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">7.提交task是调用函数submitMissingTasks来完成</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">8.task真正运行在哪个worker上面是由TaskScheduler来管理，也就是上面的submitMissingTasks会调用TaskScheduler::submitTasks</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">9.TaskSchedulerImpl中会根据Spark的当前运行模式来创建相应的backend,如果是在单机运行则创建LocalBackend</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">10.LocalBackend收到TaskSchedulerImpl传递进来的ReceiveOffers事件</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">11.receiveOffers-&gt;executor.launchTask-&gt;TaskRunner.run</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">Spark采用了Scala来编写，在函数表达上Scala有天然的优势，因此在表达复杂的机器学习算法能力比其他 语言更强且简单易懂。提供各种操作函数来建立起RDD的DAG计算模型。把每一个操作都看成构建一个RDD来对待，而RDD则表示的是分布在多台机器上的 数据集合，并且可以带上各种操作函数。如下图所示：</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><br /><img src="http://dl2.iteye.com/upload/attachment/0109/5589/76cf1a9e-5b47-33e8-b265-a5ca97b743d7.png" alt="" style="border: 0px;" /><br />&nbsp;首先从hdfs文件里读取文本内容构建成一个RDD，然后使用filter（）操作来对上次的RDD进行过滤，再使 用map（）操作取得记录的第一个字段，最后将其cache在内存上，后面就可以对之前cache过的数据做其他的操作。整个过程都将形成一个DAG计算 图，每个操作步骤都有容错机制，同时还可以将需要多次使用的数据cache起来，供后续迭代使用.</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><strong>3.Shark的工作原理</strong></p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">Shark是基于Spark计算框架之上且兼容Hive语法的SQL执行引擎，由于底层的计算采用了Spark，性 能比MapReduce的Hive普遍快2倍以上，如果是纯内存计算的SQL，要快5倍以上，当数据全部load在内存的话，将快10倍以上，因此 Shark可以作为交互式查询应用服务来使用。<br /><img src="http://dl2.iteye.com/upload/attachment/0109/5591/3c1dd765-73b0-3c56-8abb-38a0d3ddb915.png" alt="" style="border: 0px;" /><br />&nbsp;上图就是整个Shark的框架图，与其他的SQL引擎相比，除了基于Spark的特性外，Shark是完全兼容Hive的语法，表结构以及UDF函数等，已有的HiveSql可以直接进行迁移至Shark上。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;"><br /><strong>与Hive相比，Shark的特性如下：</strong></p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">1.以在线服务的方式执行任务，避免任务进程的启动和销毁开稍，通常MapReduce里的每个任务都是启动和关闭进程的方式来运行的，而在Shark中，Server运行后，所有的工作节点也随之启动，随后以常驻服务的形式不断的接受Server发来的任务。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">2.Groupby和Join操作不需要Sort工作，当数据量内存能装下时，一边接收数据一边执行计算操作。在Hive中，不管任何操作在Map到Reduce的过程都需要对Key进行Sort操作。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">3.对于性能要求更高的表，提供分布式Cache系统将表数据事先Cache至内存中，后续的查询将直接访问内存数据，不再需要磁盘开稍。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #616161; font-family: 'microsoft yahei'; line-height: 20px; background-color: #efefef;">4.还有很多Spark的特性，如可以采用Torrent来广播变量和小数据，将执行计划直接传送给Task，DAG过程中的中间数据不需要落地到Hdfs文件系统。</p><img src ="http://www.blogjava.net/paulwong/aggbug/425773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-06-18 13:20 <a href="http://www.blogjava.net/paulwong/archive/2015/06/18/425773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPARK架构与流程</title><link>http://www.blogjava.net/paulwong/archive/2015/06/18/425772.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 18 Jun 2015 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/06/18/425772.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/425772.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/06/18/425772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/425772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/425772.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">Spark的整体流程为：Client 提交应用，Master找到一个Worker启动Driver，Driver向Master或者资源管理器申请资源，之后将应用转化为RDD Graph，再由DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler，由TaskScheduler提交任务给Executor执行。在任务执行的过程中，其他组件协同工作，确保整个应用顺利执行。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点（ClusterManager），Slave是集群中含有Worker进程的节点。Master作为整个集群的控制器，负责整个集群的正常运行；Worker相当于是计算节点，接收主节点命令与进行状态汇报；Executor负责任务的执行；Client作为用户的客户端负责提交应用，Driver负责控制一个应用的执行，如图下图：</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><br /><img alt="" src="http://dl2.iteye.com/upload/attachment/0109/5772/08f9d15b-10ea-3486-b6c9-a65809e27b0b.png" title="点击查看原始大小图片" width="760" height="401" style="border: 0px; cursor: url(http://www.iteye.com/images/magplus.gif), pointer;" /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Spark 框架图</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">Spark集群部署后，需要在主节点和从节点分别启动Master进程和Worker进程，对整个集群进行控制。在一个Spark应用的执行过程中，Driver和Worker是两个重要角色。Driver 程序是应用逻辑执行的起点，负责作业的调度，即Task任务的分发，而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段，Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器，同时Executor对相应数据分区的任务进行处理。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Spark的架构中的基本组件介绍：</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>ClusterManager</strong>：在Standalone模式中即为Master（主节点），控制整个集群，监控Worker。在YARN模式中为资源管理器。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Worker</strong>：从节点，负责控制计算节点，启动Executor或Driver。在YARN模式中为NodeManager，负责计算节点的控制。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Driver</strong>：运行Application的main()函数并创建SparkContext。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Executor</strong>：执行器，在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>SparkContext</strong>：整个应用的上下文，控制应用的生命周期。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>RDD</strong>：Spark的基本计算单元，一组RDD可形成执行的有向无环图RDD Graph。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>DAG Scheduler</strong>：实现将Spark作业分解成一到多个Stage，每个Stage根据RDD的Partition个数决定Task的个数，然后生成相应的Task set放到TaskScheduler中。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>TaskScheduler</strong>：将任务（Task）分发给Executor执行。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Stage</strong>：一个Spark作业一般包含一到多个Stage。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Task</strong>：一个Stage包含一到多个Task，通过多个Task实现并行运行的功能。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Transformations</strong>：转换(Transformations) (如：map, filter, groupBy, join等)，Transformations操作是Lazy的，也就是说从一个RDD转换生成另一个RDD的操作不是马上执行，Spark在遇到Transformations操作时只会记录需要这样的操作，并不会去执行，需要等到有Actions操作的时候才会真正启动计算过程进行计算。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>Actions</strong>：操作(Actions) (如：count, collect, save等)，Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><strong>SparkEnv</strong>：线程级别的上下文，存储运行时的重要组件的引用。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><em>SparkEnv内创建并包含如下一些重要组件的引用。</em></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><em>MapOutPutTracker：负责Shuffle元信息的存储。</em></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><em>BroadcastManager：负责广播变量的控制与元信息的存储。</em></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><em>BlockManager：负责存储管理、创建和查找块。</em></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><em>MetricsSystem：监控运行时性能指标信息。</em></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><em>SparkConf：负责存储配置信息。</em></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;"><br /><img alt="" src="http://dl2.iteye.com/upload/attachment/0109/5774/5fce0961-1030-3805-b649-acafae85170b.png" style="border: 0px;" /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Spark运行逻辑图</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #efefef;">在Spark应用中，整个执行流程在逻辑上会形成有向无环图（DAG）。Action算子触发之后，将所有累积的算子形成一个有向无环图，然后由调度器调度该图上的任务进行运算。Spark的调度方式与MapReduce有所不同。Spark根据RDD之间不同的依赖关系切分形成不同的阶段（Stage），一个阶段包含一系列函数执行流水线。图中的A、B、C、D、E、F分别代表不同的RDD，RDD内的方框代表分区。数据从HDFS输入Spark，形成RDD A和RDD C，RDD C上执行map操作，转换为RDD D， RDD B和 RDD E执行join操作，转换为F，而在B和E连接转化为F的过程中又会执行Shuffle，最后RDD F 通过函数saveAsSequenceFile输出并保存到HDFS或 Hbase中</p><img src ="http://www.blogjava.net/paulwong/aggbug/425772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-06-18 13:17 <a href="http://www.blogjava.net/paulwong/archive/2015/06/18/425772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>