spark必知必会的基本概念

  首先我们从宏观的视角来窥视下大数据技术框架:

  

  图1 大数据技术框架

  从图1可以看出,数据源-数据收集-数据存储-资源管理,这是我们进行数据分析和处理的基本;图中的计算框架包括批处理、交互式分析和流处理:

  批处理计算:对时间没有严格要求,吞吐率要高

  交互式计算:支持类SQL语言,快速进行数据分析

  流式计算:数据像流水一样进入系统,需实时对其处理和分析

  不同的计算框架的实时性要求是逐渐增强的,spark在整个大数据技术框架中属于第4层计算框架,spark能很好地满足这三种计算要求,这也是spark这么火的原因之一;对数据进行计算后,我们便可以对数据进行分析,训练机器学习模型等;将数据分析或训练得到的结果可视化并展示给用户或者提供一些智能服务,从而获取商业价值。

  spark 生态系统

  

  图2 spark 生态系统

  spark数据一般放在分布式存储系统里,比如HDFS、Hbase

  HDFS的基本原理是将文件切分成等大的数据块(block,默认128MB),存储到多台机器上,这是一个容量巨大、具有高容错性的磁盘。通常的架构是一个NameNode(存放元数据)多个DataNode,为了防止namenode宕机,有一个备用的NameNode:Standby NameNode。

  

  图3 HDFS架构

  spark的资管管理与调度使用YARN,spark可以运行在YARN之上,YARN可以对多种类型的应用程序进行统一管理和调度,spark四个主要模块:spark SQL,Spark Streaming,Graphx Graph-parallel,MLlib。

  spark的出现时为了解决MapReduce框架的局限性,但并不是在任何情况下,spark都比MapReduce高效。

  MapReduce框架局限性

  仅支持Map和Reduce两种操作,而spark支持丰富的Transformation和Action的api

  处理效率低效

  当一个计算逻辑很复杂的时候,会转换成多个MapReduce作业,而每个MapReduce作业都反复对磁盘进行读写,磁盘IO是个非常耗时的操作:Map的中间结果写入磁盘,Reduce写HDFS,多个MR之间通过读取HDFS来交换数据(**为什么要用磁盘呢?**MapReduce提出来大约是04年的时候,那个时候内存还很贵,所以需要大量存储空间的一个较好的解放方案就是使用磁盘,但现在内存的价格和当年磁盘的价格差不多,而磁盘的价格已经和磁带的价格差不多了)

  任务调度和启动开销大

  无法充分利用内存

  Map端和Reduce端均需要排序

  不适合迭代计算(如机器学习、图计算等),交互式处理(数据挖掘) 和流式处理(点击日志分析)

  MapReduce编程不够灵活,是时候尝试scala函数式编程语言

  而且大数据计算框架多样,各自为战:

  批处理:MapReduce、Hive、Pig

  流式计算:Storm

  交互式计算:Impala

  而spark可同时进行批处理、流 式计算、交互式计算,减少了使用者的学习成本。

  spark特点

  高效(比MapReduce快10~100倍)

  内存计算引擎,提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销,值得注意的是,spark并不是将所有的数据都写入内存,相反spark默认是将数据写入磁盘,但spark支持将数据写入内存并计算。

  使用DAG(有向无环图)引擎,可以减少多次计算之间中间结果写到HDFS的开销

  使用多线程池模型来减少task启动开稍,shuffle过程中避免 不必要的sort操作以及减少磁盘IO操作

  易用

  提供了丰富的API,支持Java,Scala,Python和R四种语言

  代码量比MapReduce少2~5倍

  与Hadoop完美集成

  可读写HDFS/Hbase

  可与YARN集成

  Spark核心概念

  RDD:Resilient Distributed Datasets,弹性分布式数据集,与Java里的集合类似,但它多了两个前缀修饰词:分布式、弹性

  分布式:用户看到的是一个RDD集合,但是后台是分布在集群中不同的只读对象集合(由多个Partition构成)

  弹性:数据可以存储在磁盘或内存中(多种存储级别)

  

  图4 RDD

  RDD的两类基本操作:Transformation和Action

  Transformation:通过Scala集合或者Hadoop数据集构造一个新的RDD,通过已有的RDD产生新的RDD,比如:map, filter,groupBy,reduceBy。Transformation是惰性执行的,即只会记录RDD转化关系,并不会触发实际计算,知道遇到一个action才会触发。

  Action:通过RDD计算得到一个或者一组值,比如:count,reduce,saveAsTextFile。Action会触发程序分布式执行

  

  图5 RDD 惰性执?行

  Spark RDD Cache

  通过上面我们可以知道,spark的主要特点:高效是由于使用了Cache机制来进行迭代计算,同时RDD的弹性也是因为数据可选择是存放在内存还是磁盘中,spark RDD cache允许将RDD缓存到内存中或磁盘上,以便于重用:

  val data = sc.textFile(“hdfs://nn:8020/input”)

  data.cache() //实际上是data.persist(StorageLevel.MEMORY_ONLY)

  //data.persist(StorageLevel.DISK_ONLY_2)

  spark 程序架构

  我们来分析下一个spark程序的架构,每一个程序的main函数运行起来都由两类组件构成:Driver和Executor,main函数运行在Driver中,一个Driver可以转化为多个Task,每个Task都可被调度运行在指定的Executor中。

  

  图6 spark 程序架构

  spark的运行模式

  spark的运行模式有三种,可以在$SPARK_HOME/conf/spark-defaults.conf中使用spark.master来指定:

  local(本地模式):将Spark应用以多线程方式,直接运行在本地,便于调试

  local:只启动一个executor

  local[K]:启动K个executor

  local[*]:启动跟cpu数目相同的executor

  standalone(独立模式):独立运行在一个集群中,Master-Slave

  YARN/mesos:运行在资源管理系统上

  yarn-client:Driver运行在本地,而Executor运行在YARN,Driver一旦宕机,需要自己重启,容错差

  yarn-cluster:Driver运行在集群中(NodeManager),Driver一旦宕机,会自动再找一个NodeManager来启动,容错好

  yarn-client内部处理逻辑

  yarn-client模式下,Driver是运行在Client上的,spark程序是在哪台机器上提交的,这个Driver就运行在哪台机器上,也就是main函数运行在哪台机器上,当提交你的程序到yarn上时,背后发生了什么?

  假设现在有四个服务器组成的yarn集群,一个为Resource Manager,其余三个为Node Manager,当Node Manager启动的时候会将Node Manager上的信息注册到Resource Manager中,在本地部署好hadoop环境之后即可提交spark程序(1),Resource Manager会启动一个Node Manager(2);再由Node Manager来启动你的Application Master(3);Application Master需要的资源是由你运行的程序所指定的,Application Master启动后会与Resource Manager通信,为executor申请资源(4),如果一个executor挂了,Application Master会重新向Resource Manager申请一个executor并启动在某个Node Manager上,那么如果是Node Manager挂了,Application Master会向Resource Manager申请相同数量的executor并启动;executor拥有资源后,Application Master会与Node Manager通信来启动executor(5、6),每个executor与在客户端Client上的Driver通信领取task(虚线部分)

  

  图6 程序运行模式:YARN分布式模式(yarn-client)

  Resource Manager:一个中心的管理服务,决定了哪些应用可以启动executor进程,以及何时何地启动

  Node Manager:一个在每个节点运行的从服务,真正执行启动executor进程,同时监控进程是否存活以及资源消耗情况

  Application Master:在 YARN 中,每个应用都有一个 Application master 进程,这是启动应用的第一个容器。这个进程负责向 ResourceManager 请求资源,当资源分配完成之后,向 NodeManager 发送启动容器的指令。

?

原文地址:https://www.cnblogs.com/qfjavabd/p/10138841.html

时间: 2024-11-02 21:10:42

spark必知必会的基本概念的相关文章

移动前端开发人员必知必会:移动设备概述

因为工作岗位的变换带来工作内容的变动,对于移动网站的前端开发已经疏远了好几个月,在这好几个月中有很多新的东西出现,自己所掌握的一些东西也已经陈旧,所以选择了这本书<HTML5触摸界面设计与开发>来系统地学习和整理一下关于移动网站前端开发的知识体系. 之所以选择这本书,一是因为这本书比较新,2014年04月发的第一版.其二是因为作者Stephen Woods,这是Flickr团队的资深前端,Yahoo主页的Javascript技术平台正是出自此人之手. 接下来的时间里会陆续上传关于这本书学习的一

rime 必知必會

https://github.com/rime/home/wiki/CustomizationGuide Rime 定製指南 必知必會 建議您在定製 Rime 輸入法之前瞭解 Rime 輸入方案的概念.Rime 中的數據文件分佈及作用等基礎知識. 必知必會 重新佈署的操作方法 [中州韻]點擊輸入法狀態欄上的 ? (Deploy) 按鈕 或:如果找不到狀態欄,在終端輸入以下命令,可觸發自動部署: rm ~/.config/ibus/rime/default.yaml; ibus-daemon -d

《MySQL必知必会》读书笔记_3

PS:这次的信息量有点大. 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 #相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products

必知必会的冒泡排序和快速排序

前一篇给大家介绍了<优化的直接插入排序(二分查找插入排序,希尔排序)>,现在继续介绍其他排序算法 本博文介绍两个最常被提起的排序算法:冒泡排序和快速排序.冒泡排序是入门排序算法,思路比较常规,但确是最耗时的排序算法,所以听到冒泡排序笑一笑就好了,千万不要拿来装B.另一个是被誉为“20世纪最伟大的十大经典算法”的快速排序,以及针对数组特征进行优化的“随机快排”和“平衡快排”. 冒泡排序 (一)概念及实现 冒泡排序的原理:重复的遍历要排序的数组,每次遍历过程中从头至尾比较两个相邻的元素,若顺序错误

C++必知必会(3)

条款26操作符函数查找 class X { public: Xoperator %( const X& ) const;             //二元取余操作 XmemFunc1( const X&); voidmemFunc2(); }; 可以采用中缀或函数调用语法来调用这个重载的操作符:如下 X a,b,c; a = b%c;        //采用中缀语法调用成员操作符% a = b.operator %(c);   //成员函数调用语法 a = b.memFunc1(c);  

[ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)

http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaign=socialShare 上次我写<前端工程师必知必会>已经是三年前了,那是我写过最火的文章了.三年了,我仍然会在Twitter上收到关于这篇文章的消息. 从2012年到现在,一篇文章都没发过让我觉得有点羞羞哒.三年是一段很长的时间,很多东西都发生了改变.2012年,我鼓励同学们去学习浏览器开发

嵌入式工程师必知必会 —— 读书笔记1、需掌握的知识

<嵌入式工程师必知必会>,Lewin A.R.W.Edwards 著:张乐锋等译. 很多人推荐这本书,最近也一直在看,把觉得有用的东西记录下,以后自己可以看看,也希望能给想学习嵌入式的朋友带来一点帮助. 一.嵌入式工程师应该掌握的知识 这里给出了一些理论知识与实践技能,我个人认为这些理论知识与实践技能是嵌入式工程师必须掌握的. 1.至少要对印制电路板中电源的走线有基本理解,了解糟糕的布局布线对对电源质量造成什么样的严重后果. 2.同样,你还应该对印制电路板的布线如何影响信号传播有基本理解. 3

.NET零基础入门09:SQL必知必会

一:前言 仿佛到了更进一步的时候了,每一个程序员迟早都会遇到数据存储的问题.我们拿什么来存储程序产生的数据?举例来说,用什么来存储我们的打老鼠游戏每次的成绩呢?选择如下: 1:内存中.缺点,退出游戏,数据就没了: 2:文件中.好办法!缺点,自己解析文本,把文本变成我们程序中的数据,这个解析的过程叫做协议.协议这个词听上去够恐怖吧,实际上说白了无非就是数据格式怎么样,API接口怎么样之类的东东. 3:数据库.好办法!好吧,数据库文件其实也就是硬盘上的文件,只不过数据库本身就已经为我们定义好了数据格

移动前端开发者必知必会:移动设备概述

由于工作岗位的变换带来工作内容的变动,对于移动站点的前端开发已经疏远了好几个月,在这好几个月中有非常多新的东西出现,自己所掌握的一些东西也已经陈旧,所以选择了这本书<HTML5触摸界面设计与开发>来系统地学习和整理一下关于移动站点前端开发的知识体系. 之所以选择这本书,一是由于这本书比較新,2014年04月发的第一版.其二是由于作者Stephen Woods,这是Flickr团队的资深前端,Yahoo主页的Javascript技术平台正是出自此人之手. 接下来的时间里会陆续上传关于这本书学习的

2015 前端[JS]工程师必知必会

2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以后参考! MrSunny · 12 天前 上次我写<前端工程师必知必会>已经是三年前了,那是我写过最火的文章了.三年了,我仍然会在Twitter上收到关于这篇文章的消息. 从2012年到现在,一篇文章都没发过让我觉得有点羞羞哒.三年是一段很长的时间,很多东西都发生了改变.2012年,我鼓励同学们去