Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。 举个例子,当有一个应用,需要在很大的图(graph)上进行Machine Learning的算法时,Spark会把整个图的数据存储在它的弹性分布式数据集(Resilient Distributed Dataset,RDD),如下图。Spark Client会存储需要运行的程序的各种数据, 并且把它map到对于集群(Cluster)的Spark-specific的指令上,而这个集群包括了许多的Workers。之后,Cluster Manager会把这些指令转变为任务,并在各个worker节点(node)上执行。每个集群需要让应用程序调度使其达到最大的利用率和性能的提升。

图 1

对于Spark来说,它最为重要的一部分就是它的弹性分布式数据集(RDD)。RDD是一个在大数据集上支持在内存间低容错运算的分布式存储抽象。程序员通过把能够在workers上复制并运行的闭包(函数)传递给workers,在RDD上调用各种指令。这部分会在博主之后的文章里作详细介绍。

程序员通过编写驱动(driver)程序来连接workers的集群,driver定义了一个或多个RDD,并且在RDD上调用各种actions。与此同时,driver会追踪每个RDD的“血统”(lineage),该“血统”以有向无环图(Directed Acyclic Graph,DAG)的形式,记录了整个RDD形成的过程。而之所以能够追踪到每一个RDD的“血统”,是因为workers的进程在整个应用程序运行的过程中一直保持存在,并且通过指令能够在RAM内存里存储所有的RDD分区(partition)。

图2是Spark的结构体系,SparkContext对象能够连接到不同类型的Cluster Manager,Cluster Manager负责对所有的应用和任务进行调配。Cluster Manager能够让各个Spark程序相互隔离,每个程序拥有自己的driver,并且运行在由Cluster Manager调配的相互隔离的executor上。目前,Spark能够支持由Java, Scala或Python所编写的应用程序。

图 2

对于每一个在Spark上运行的程序,可以把它们看成是在相互隔离的集群上独立运行的进程集。Driver作为其中一个进程在应用程序中运行main()函数并且建造SparkContext。SparkContext协调Spark上的各个应用程序并且反过来连接负责在集群(cluster)上给所有应用程序分配资源的Cluster Manager。与此同时,SparkContext还包含了一些隐式转换(implicit conversions)和用于不同Spark特性的参数。

目前整个Spark系统支持三种Cluster Manager:

  1. Standalone
  2. Apache Mesos
  3. Hadoop YARN

一旦SparkContext连接上Cluster Manager,Spark便会在Worker Node上获取Executor, 并通过Executor进行计算和数据的存储。接着,Java/Scala/Python代码会被发送到Executor上运行并成为各种各样的tasks。因为每一个应用程序都拥有各自的Executor进程,这些进程能够在各个线程上执行各种tasks,所以Executor在应用程序的整个生命周期里都一直保持存在。

Spark采取上述方式的好处在于,应用程序之间能做到相互隔离,每个应用程序的driver在调度的决策上能够保持独立,不受其他应用程序的影响。不同应用程序里Executor的相互隔离,就像是每一个程序都运行在一个分离的JVM上。当然,这样做的话,如果要对应用程序之间进行数据分享,那就会变得十分困难。

正如上述所提到,Driver作为进程在应用程序中运行main()函数,它主要充当两个角色:

  1. 把user program转化为task:从宏观上看,Spark程序隐式地建造了一个指令的有向无环图(DAG),而Driver把这个转化为实际的物理层面上的运行计划。在这期间,各种各样的优化一直发生,把命令执行图转变成一些列状态,每个状态都包含了各种各样的任务。
  2. 在Executor上调配task:一旦这个物理层面上的执行计划建立起来后,driver能够调配Executor上的每一个task,从而在所有的Executor上起到了一个宏观调控的作用。

Executors作为worker进程一旦被建立起来,直到整个应用程序结束它们才会停止运行。总的来说就是Driver调配Executors,Executor运行各个task并返回结果。每个Executor还包含一个BlockManager,它以内存存储的形式来给RDD提供缓存。

当然,Spark的核心依然是RDD的执行和存储。本人将在下一篇文章作更为详细的讲解。

浅谈Spark(1) - Overview的更多相关文章

  1. 浅谈Spark应用程序的性能调优

    浅谈Spark应用程序的性能调优 :http://geek.csdn.net/news/detail/51819 下面列出的这些API会导致Shuffle操作,是数据倾斜可能发生的关键点所在 1. g ...

  2. 浅谈Spark Kryo serialization

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3833985.html 最近在使用spark开发过程中发现当数据量很大时,如果cache数据将消耗很多的内 ...

  3. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  4. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  5. 浅谈压缩感知(二十):OMP与压缩感知

    主要内容: OMP在稀疏分解与压缩感知中的异同 压缩感知通过OMP重构信号的唯一性 一.OMP在稀疏分解与压缩感知中的异同 .稀疏分解要解决的问题是在冗余字典(超完备字典)A中选出k列,用这k列的线性 ...

  6. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  7. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  8. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  9. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

随机推荐

  1. poj 1182 食物链 (并查集)

    http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...

  2. Android Touch(3)View的touchDelegate

    作用: 基类View有个函数 public void setTouchDelegate(TouchDelegate delegate),给view内部的另一个view设置一个touch代理. 图中vi ...

  3. Top 10 steps to optimize data access in SQL Server

    2009年04月28日 Top 10 steps to optimize data access in SQL Server: Part I (use indexing) 2009年06月01日 To ...

  4. [转载] 推荐的C++书籍以及阅读顺序

    2014-06-17 转载自 oiramario 的文章 推荐的C++书籍以及阅读顺序 当读者有一定c/c++基础 推荐的阅读顺序: level 1 从<<essential c++> ...

  5. 【转】Android横竖屏切换问题

    Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 ...

  6. 3D场景优化

    一) 有效的性能评测 对于任何一个3D应用程序来说,追求场景画面真实感是一个无止尽的目标,其结果就是让我们的场景越来越复杂,模型更加精细,这必然给图形硬件带来极大的负荷以致于无法达到实时绘制帧率.因此 ...

  7. 在DirectX 中进行2D渲染

    http://flcstudio.blog.163.com/blog/static/756035392008115111123672/ 最近,我看到很多关于DirectX8在最新的API中摒弃Dire ...

  8. ArcGis Javascript API (V3.6)加载天地图

    Arcgis的Javascript api开发很活跃,不知不觉都发布了3.6的版本了.该版本基于dojo 1.8.3开发的. 从dojo 1.8开始,AMD机制用得越来越多了,而且require([& ...

  9. Vim实现批量注释的方法

    调试代码的时候,免不了要批量注释/取消代码注释,很多IDE都有快捷键将你选中的代码块批量注释/取消注释的功能,那么在Vim里面如何完成这个功能呢? 方法一 块选择模式 批量注释: Ctrl + v 进 ...

  10. activiti 引擎 数据库设计说明书

    1.结构设计 1.1.    逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...