本文主要帮助初学者快速了解Spark,不会面面俱到,但核心一定点到。

Spark是继Hadoop之后的下一代分布式内存计算引擎,于2009年诞生于加州大学伯克利分校AMPLab实验室,现在主要由Databricks公司进行维护(公司创始员工均来自AMPLab),根据本人自2014学习Spark的理解,从下面几个方面介绍。

1、为什么出现Spark? 
2、Spark核心是什么? 
3、Spark怎么进行分布式计算? 
4、Spark在互联网公司的实践应用?

1、为什么出现Spark?

肯定是比Hadoop的MR计算要好,好在如下方面:

  • 高效
  • 多框架整合

1)为什么高效? 
- 相对于Hadoop的MR计算,Spark支持DAG,能缓存中间数据,减少数据落盘次数; 
- 使用多线程启动task,更轻量,任务启动快。计算速度理论上有10-100倍提升。(根据个人工作验证,计算效率相对Hadoop至少是3倍以上) 
- 高度抽象API,代码比MR少2-5倍甚至更多,开发效率高

2)为什么多框架整合? 
相对于过去使用Hadoop + Hive + Mahout + Storm 解决批处理、SQL查询和实时处理和机器学习场景的大数据平台架构,其最大的问题在于不同框架语言不同,整合复杂,同时也需要更多维护成本。

而使用Spark在Spark core的批处理基础上,建立了Spark Sql、Spark Streaming,Spark Mllib,Spark GraphX来解决实时计算,机器学习和图计算场景,方便将不同组件功能进行整合,同时维护成本小。

上图就体现了Spark的One Stack Rule All的设计目标。

2、Spark核心是什么?

核心是RDD(Resilient Distributed Datasets),即弹性分布式数据集。

它是对数据的高度抽象概念,弹性可理解为数据存储弹性,可内存,可磁盘; 分布式可理解为数据分布在不同节点。

RDD是分布式数据的逻辑抽象,物理数据存储在不同的节点上,但对用户透明,用户不需要知道数据实际存在哪台机器。RDD包含的内容下图所示:

  • 只读分区集合:这保证了RDD的一致性,在计算过程中更安全可靠,此外RDD可能包含多个分区,数据分布在不同分区中,这些分区可能在不同的机器上。

  • 对数据的计算函数:RDD包含了对所表示数据的计算函数,也就是得到这个RDD所要经过的计算。

  • 计算数据的位置:对用户而言不需要知道数据在哪里,这些信息隐含在RDD的结构中。

  • 分区器:对数据分区依赖的分区算法,如hash分区器

  • 依赖的RDD信息:该RDD可能依赖的父RDD信息,用于失败重算或计算的DAG划分。

1 ) RDD的计算分为transformation和action两类。

  • transformation有 flatMap、map、union、reduceByKey等。
  • action有count、collect、saveAsTextFile等表示输出的操作。

RDD的计算是lazy的,transformation算子不会引发计算,只是逻辑操作,action算子才会引发实际的计算。

2)RDD算子的宽窄依赖

下图解释什么是宽依赖,什么是窄依赖 

图中左边是宽依赖,父RDD的4号分区数据划分到子RDD的多个分区(一分区对多分区),这就表明有shuffle过程,父分区数据经过shuffle过程的hash分区器(也可自定义分区器)划分到子RDD。

那图中右边为什么是窄依赖?父RDD的每个分区的数据直接到子RDD的对应一个分区(一分区对一分区),例如1号到5号分区的数据都只进入到子RDD的一个分区,这个过程没有shuffle。Spark中Stage的划分就是通过shuffle来划分。

(shuffle可理解为数据的从原分区打乱重组到新的分区)

当明白了Spark分布式计算核心就是RDD之后,下面看Spark如何实现分布式计算。

3、怎么进行分布式计算?

当初我学习Spark,也是一知半解,当理解RDD的内涵,才理解Spark分布式计算过程。

上图是一个Spark的wordcount例子,根据上述stage划分原则,这个job划分为2个stage,有三行,分别是数据读取、计算和存储过程。

仅看代码,用户根本体会不到数据在背后是并行计算。从图中能看出数据分布在不同分区(也可以理解不同机器上),数据经过flapMap、map和reduceByKey算子在不同RDD的分区中流转。(这些算子就是上面所说对RDD进行计算的函数)

下图从更高角度看: 

Spark的运行架构由Driver(可理解为master)和Executor(可理解为worker或slave)组成,Driver负责把用户代码进行DAG切分,划分为不同的Stage,然后把每个Stage对应的task调度提交到Executor进行计算,这样Executor就并行执行同一个Stage的task。

(这里Driver和Executor进程一般分布在不同机器上)

这里有人可能不理解Stage和task,下图就是Spark的作业划分层次:

Application就是用户submit提交的整体代码,代码中又有很多action操作,action算子把Application划分为多个job,job根据宽依赖划分为不同Stage,Stage内划分为许多(数量由分区决定,一个分区的数据由一个task计算)功能相同的task,然后这些task提交给Executor进行计算执行,把结果返回给Driver汇总或存储。

这体现了 Driver端总规划–Executor端分计算–结果最后汇总回Driver 的思想,也就是分布式计算的思想。

4、Spark在互联网公司的实践应用

根据个人工作经历,BAT大公司都直接或间接使用Spark(说间接是可能自主研发分布式计算引擎,但参考Spark设计思想)。中小公司大多已经采用Spark,并逐渐从MR计算迁移到Spark计算。

  • Spark在生产上可以通过zeppelin提供adhoc(即席查询)服务。
  • Spark Sql可以替代Hive的ETL工作,但需要对generic UDF和UDAF进行重写。
  • 可以基于Spark搭建特征工程平台和机器学习平台
  • Spark Streaming实时计算延迟是秒级,支持exactly-once要求的数据消费,可以做实时ETL,也可以结合Spark MLlib处理来做实时机器学习。Spark的下一代Structured Streaming的使用更简单。

转自:http://blog.csdn.net/xwc35047/article/details/60330528

【分布式计算】30分钟概览Spark分布式计算引擎的更多相关文章

  1. 【Streaming】30分钟概览Spark Streaming 实时计算

    本文主要介绍四个问题: 什么是Spark Streaming实时计算? Spark实时计算原理流程是什么? Spark 2.X下一代实时计算框架Structured Streaming Spark S ...

  2. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  3. 【Spark深入学习 -13】Spark计算引擎剖析

    ----本节内容------- 1.遗留问题解答 2.Spark核心概念 2.1 RDD及RDD操作 2.2 Transformation和Action 2.3 Spark程序架构 2.4 Spark ...

  4. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  5. 正则表达式30分钟入门教程<转载>

    来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了 ...

  6. 30分钟快速掌握AngularJs

    [后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs   一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来 ...

  7. Nodejs新手村指引——30分钟上手

    概要 #准备工作 #开启简单的服务 #路由 #获取参数的三种方式 #静态文件 #数据库集成 #async解决多重嵌套问题 本文适合没有nodejs项目开发经验而又想对nodejs有个大概了解的你阅读, ...

  8. js正则表达式30分钟入门教程

    2011-10-27 13:23:15 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要 ...

  9. PHP正则表达式30分钟入门教程

    正则表达式30分钟入门教程 三个常用的知识点: 1.惰性匹配:正则引擎默认是贪婪的,若要最少重复的话,需要用到惰性匹配符 “?” 懒惰限定符 代码/语法 说明 *? 重复任意次,但尽可能少重复 +? ...

随机推荐

  1. 【python-opencv】16-图像平滑

    [微语]“你以后向成为什么样的人?”    “什么意思,难道我以后就不能成为我自己吗?”    ----<阿甘正传> 补充知识点:如何理解图像的低频是轮廓,高频是噪声和细节 图像的频率:灰 ...

  2. AndroidStudio自定义TODO

    1.增加自定义TODO标记 Preferences -> Editor -> TODO,然后点击左下角的加号,输入想要自定义的TODO的正则 输入\bX\b.*(X为TODO标签的名字), ...

  3. [svc]sublime text3设置py环境最佳姿势

    搞个py虚拟环境 待sublim调用 - for windows pip install virtualenv pip install virtualenvwrapper pip install vi ...

  4. Python随机数生成方法

    假设你对在Python生成随机数与random模块中最经常使用的几个函数的关系与不懂之处.以下的文章就是对Python生成随机数与random模块中最经常使用的几个函数的关系,希望你会有所收获,以下就 ...

  5. jquery closest & parent比较

    .closest() .parents() 从当前元素开始 从父元素开始 沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止. 沿 DOM 树向上遍历,直到文档的根元素为止,将每个祖先元素添加 ...

  6. data.frame和matrix的一些操作

    编写脚本的时候经常会涉及到对data.frame或matrix类型数据的操作,比如取指定列.取指定行.排除指定列或行.根据条件取满足条件的列或行等.在R中,这些操作都是可以通过简单的一条语句就能够实现 ...

  7. boost--序列化库serialization

    序列化可以把对象转化成一个字节流存储或者传输,在需要时再回复成与原始状态一致的等价对象.C++标准没有定义这个功能.boost.serialization以库的形式提供了这个功能,非常强大,可以序列化 ...

  8. mysql普通查询日志

  9. webp格式

    有时候你右键保存了一张图片,然后好气啊,打不开.这要么是webp格式,要么,,,,要么有问题啊. WebP格式,谷歌大法开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3, ...

  10. Intro to Python for Data Science Learning 8 - NumPy: Basic Statistics

    NumPy: Basic Statistics from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/ch ...