引言

根据IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一 次重大变革 。当前我们正处于第三次信息浪潮(2010年前后),物联网、云计算和大数据技术突飞猛进。 信息爆炸是我们当前所需要解决的主要问题。

大数据时代的到来,完全颠覆了传统的思维方式

  • 分析使用全量样本,而非抽样后进行分析 ;
  • 更注重处理效率,而非精确度 ;
  • 丰富的数据源与分析目标相关,而不具有直接的因果关系。

本文从大数据背景出发,结合林子雨老师的课程,尝试系统地归纳、总结出Spark编程所需了解的架构基础以及程序运行原理。更有利于理解后续编程内容。后续文章会依次按照以下顺序展开:

  • Spark架构基础与运行原理
  • RDD编程
  • Spark SQL
  • Spark Streaming
  • Spark MLlib

⭐️言归正传,本节主要聚焦于大数据技术的基础架构与运行原理。内容概览如下。

引言
1.关键技术
2.核心功能
3.计算模式
4.使用Spark的原因
7.Spark运行流程
8.弹性分布数据集(RDD)
9.Shuffle与依赖
10.Spark的部署方式
总结

1.关键技术

⭐️当前大数据技术所涉及的技术层面有4个,其功能如下:

1)数据采集

利用ETL工具将分布的、异构数据源中的数据如关系数据、平 面数据文件等,抽取到临时中间层后进行清洗、转换、集成, 最后加载到数据仓库或数据集市中,成为联机分析处理、数据 挖掘的基础;或者也可以把实时采集的数据作为流计算系统的 输入,进行实时处理分析。

2)数据存储和管理

利用分布式文件系统、数据仓库、关系数据库、NoSQL数据库 、云数据库等,实现对结构化、半结构化和非结构化海量数据 的存储和管理。

3)数据处理与分析

利用分布式并行编程模型和计算框架,结合机器学习和数据挖 掘算法,实现对海量数据的处理和分析;对分析结果进行可视 化呈现,帮助人们更好地理解数据、分析数据。

4)数据隐私和安全

在从大数据中挖掘潜在的巨大商业价值和学术价值的同时,构 建隐私数据保护体系和数据安全体系,有效保护个人隐私和数据安全。

2.核心功能

⭐️为实现以上层面的功能,大数据架构中需包含以下两个核心功能:

1)分布式存储

分布式存储方式包括:

GFSHDFS

BigTableHBase

NoSQL(键值、列族、图形、文档数据库)

NewSQL(如:SQL Azure)

等等。

2)分布式处理

Hadoop生态通过MapReduce实现数据的分布式处理,而Spark即是用来代替MapReduce的一种更高效的组件。Spark与Hadoop并不是对等关系。所以传言说,Spark会取代Hadoop是一种错误的说法 。Spark只是代替了MapReduce的分布式处理,而另一个非常重要的部分——分布式存储,目前主流框架仍是基于Hadoop生态中的HDFS组件的。

3.计算模式

⭐️现阶段大数据计算模式以及其代表产品:

1)批处理计算

批处理计算可以实现对大规模数据的批量处理。MapReduce、Spark等就是为了该任务而设计的。

2)流计算

流计算需要较高的响应速度。因此对计算的效率要求更高于其精确度。Storm、S4、Flume、Streams 、Puma、DStream、Super Mario、银河流数据处理平台等,都可以针对流数据的实时计算。

3)图计算

Pregel、GraphX、Giraph、 PowerGraph、Hama、 GoldenOrb等,可针对大规模图结构数据进行处理。

4)查询分析计算

对于企业中的业务分析人员,通常只需要针对大规模数据的实现存储管理,或者进行查询分析。常用的产品如Hive、Dremel、Cassandra、 Impala等。

Hadoop生态系统的架构图如下所示。

以HDFS为基础,通过YARN来管理和调度集群资源,最终通过MapReduce实现分布式计算。而上层的Hive、Pig、Mahout等通过更简单的语言编译为MapReduce语句,给用户以更好的交互体验以及更低的使用门槛。

为了更好的理解Spark运行机制,首先要理解分布式计算的两个核心:

1)MapReduce

  • MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数: Map和Reduce 。
  • 编程非常容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式 系统上,完成海量数据的计算 。
  • MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会 被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理。

2)YARN

  • YARN的目标就是实现“一个集群多个框架”,即在一个集群上部署一个统 一的资源调度管理框架YARN,在YARN之上可以部署其他各种计算框架 ;
  • 由YARN为这些计算框架提供统一的资源调度管理服务,并且能够根据各种 计算框架的负载需求,调整各自占用的资源,实现集群资源共享和资源弹性 收缩;
  • 可以实现一个集群上的不同应用负载混搭,有效提高了集群的利用率 ;
  • 不同计算框架可以共享底层存储,避免了数据集跨集群移动 。

下图展示了在YARN上部署各种计算框架:

对于YARN暂时不需要过多关注,只需要记住,在分布式计算前,会先经过YARN调配当前平台的各种计算资源,以防止某个任务占用过多资源或资源浪费。

4.使用Spark的原因

⭐️那么为什么使用Spark呢?

Hadoop存在如下一些缺点:

  • 表达能力有限
  • 磁盘IO开销大
  • 延迟高

Hadoop中任务之间的衔接涉及IO开销。在前一个任务执行完成之前,其他任务就无法 开始,难以胜任复杂、多阶段的计算任务。尤其是机器学习所涉及的迭代计算。在MapReduce框架下效率极低。

Spark在借鉴Hadoop MapReduce优点的同时,很好地解决了 MapReduce所面临的问题 相比于Hadoop MapReduce,Spark主要具有如下优点 :

  • Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作 ,还提供了多种数据集操作类型,编程模型比Hadoop MapReduce更 灵活
  • Spark提供了内存计算,可将中间结果放到内存中,对于迭代运算 效率更高
  • Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的 迭代执行机制

Spark将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间结果作运算,避免了从磁盘中频繁读取数据。Hadoop与Spark执行逻辑回归的时间对比如下图所示:

Spark有选择的将数据放入内存中或磁盘中,自动地寻找最佳计算方法。至于其计算方法,在后续文章中进行介绍。

5.基本概念

⭐️RDD:是Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布 式内存的一个抽象概念,提供了一种高度受限的共享内存模型

DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依 赖关系

Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task

应用(Application):用户编写的Spark应用程序

任务( Task ):运行在Executor上的工作单元

作业( Job ):一个作业包含多个RDD及作用于相应RDD上的各种操作

阶段( Stage ):是作业的基本调度单位,一个作业会分为多组任务,每 组任务被称为阶段,或者也被称为任务集合,代表了一组关联的、相互之间 没有Shuffle依赖关系的任务组成的任务集

6.架构设计

⭐️Spark运行架构包括集群资源管理器(Cluster Manager)、运行作 业任务的工作节点(Worker Node)、每个应用的任务控制节点 (Driver)和每个工作节点上负责具体任务的执行进程(Executor)。资源管理器可以自带或Mesos或YARN 。

在Spark中,一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成,一个作业由多个阶段(Stage)构成,一个阶段由多个任务(Task)组成。当执行一个应用时,任务控制节点会向集群管理器(Cluster Manager)申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行任务,运行结束后,执行结果会返回给任务控制节点,或者写到HDFS或者其他数据库中。

7.Spark运行流程

⭐️接下来看一下Spark运行的4个步骤:

  • 当一个Spark应用被提交时,Driver创建一个SparkContext,由SparkContext负责和资源管理器(Cluster Manager)的通信以及进行资源的申请、任务的分配和监控等。SparkContext会向资源管理器注册并申请运行Executor的资源 ;
  • 资源管理器为Executor分配资源,并启动Executor进程,Executor发送心跳到资源管理器上;
  • SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解成多个“阶段”,并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler)进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor;
  • 任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源 。

该过程的特点:

  • 数据本地化,计算向数据靠拢;
  • 多线程方式,executor执行task的时候采用多线程方式,减少了多进程任务频繁的启动开销;
  • BlockManager存储模块,存储中间结果。

8.弹性分布数据集(RDD)

⭐️一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。

RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集来创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join和groupBy)而创建得到新的RDD。

RDD提供了一组丰富的操作以支持常见的数据运算 ,分为 “动作”(Action)和“转换”(Transformation)两种类型。其中Transformation有两种:

  • 转换操作:指定RDD之间的相互依赖关系,输入RDD,输出RDD,不立即执行。比如map,filter等;
  • 行动操作:用于执行计算并指定输出的形式,输入RDD,返回非RDD。比如count,collect等。

RDD的算子是惰性调用。只有第一次在一个行动操作中用到时,才会真正计算 。RDD具有如下特性:

  • 只读——只能新生成RDD,而不能修改原始RDD,因此具有高效的容错性;
  • 中间结果持久化内存,不需要“落地”到磁盘上,避免了不必要的读写磁盘开销;
  • 存放的数据可以是Java对象,避免了不必要的对 象序列化和反序列化。

通常把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。对象的序列化主要有两种用途:

  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  • 在网络上传送对象的字节序列。

9.Shuffle与依赖

⭐️Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分阶段。

在Spark中,有两种依赖关系:

  • 宽依赖:一个父RDD的一个分区对应一个子RDD的多个分区;
  • 窄依赖:一个父RDD的分区对应于一个子RDD的分区,或多个父RDD的分区对应于一个子RDD的分区。

窄依赖和宽依赖,主要取决于是否包含Shuffle操作。

Spark 根据DAG 图中的RDD 依赖关系,把一个作业分成多个 阶段。阶段划分的依据是窄依赖和宽依赖。对于宽依赖和窄依 赖而言,窄依赖对于作业的优化很有利,宽依赖无法优化。逻辑上,每个RDD 操作都是一个fork/join(一种用于并行执行 任务的框架),把计算fork 到每个RDD 分区,完成计算后对 各个分区得到的结果进行join 操作,然后fork/join下一个RDD 操作。

窄依赖可以实现“流水线”优化。宽依赖无法实现“流水线”优化。

上图中,A->B存在一个父RDD的一个分区对应一个子RDD的多个分区,因此是一个宽依赖,不能优化。

C->D->F显然是一个窄依赖,可以进行优化。

B->G是一个窄依赖,可以进行优化。

F->G是一个宽依赖,不能进行优化。

⭐️前文提到,Spark通过分析各个RDD的依赖关系生成了DAG,再通过分 析各个RDD中的分区之间的依赖关系来决定如何划分 Stage,具体划分方法是:

  • 在DAG中进行反向解析,遇到宽依赖就断开 ;
  • 遇到窄依赖就把当前的RDD加入到Stage中 ;
  • 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算。

比如下图中,流水线操作实例分区7通过map操作生成的分区9,可以不用等待 区8到分区10这个map操作的计算结束,而是继续进行union操作,得到分区13,这样流水线执行大大提高了计算的效率。

⭐️通过上述对RDD概念、依赖关系和Stage划分的介绍,结合之前介绍的Spark运行基 本流程,再总结一下RDD在Spark架构中的运行过程:

  • 创建RDD对象;
  • SparkContext负责计算RDD之间的依赖关系,构建DAG;
  • DAGScheduler负责把DAG图分解成多个Stage,每个Stage中包含了多个 Task,每个Task会被TaskScheduler分发给各个WorkerNode上的Executor去执行。

10.Spark的部署方式

⭐️Spark支持三种不同类型的部署方式,包括:

  • Standalone(类似于MapReduce1.0,slot为资源分配单 位)
  • Spark on Mesos(和Spark有血缘关系,更好支持Mesos)
  • Spark on YARN
Spark on YARN架构

Hadoop现在分三块HDFS/MR/YARN,Spark比Hadoop性能好,只是Spark作为一个计算引擎,比MR的性能要好。但它的存储和调度框 架还是依赖于HDFS/YARN,Spark也有自己的调度框架,但仍然非常 不成熟,基本不可商用。

总结

⭐️本文总结了Spark编程的相关理论基础,了解系统架构和运行机制有助于后续编程方法的理解。预计从下一篇文章开始逐步介绍基于Python的Spark编程方法。内容主要是对于大数据技术的复盘和林子雨老师课程学习笔记,感谢阅读 。

推荐厦门大学林子雨老师的课程:

Spark编程基础(Python版) - 网易云课堂​study.163.com

spark on yarn 完全分布式_Spark编程笔记(1)-架构基础与运行原理相关推荐

  1. spark on yarn 完全分布式_「大数据」(七十一)Spark之架构介绍

    [导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[71]篇文章,欢迎阅读和收藏] 1 基本概念 Spark 架构采用了分布式计算中的 Master-Slave 模型. Ma ...

  2. spark on yarn 完全分布式_Apache Spark探秘:三种分布式部署方式比较

    [本文详细介绍了Spark的三种部署方式及其比较,欢迎读者朋友们阅读.转发和收藏!] 目前Apache Spark支持三种分布式部署方式,分别是 standalone . spark on mesos ...

  3. “Spark三剑客”之SparkCore和SparkSql学习笔记(零基础入门)(一)

    目录 1 Spark的介绍 1.1 Spark的定义 1.2 Spark为什么比MapReduce快? 1.3 RDD 弹性式分布式数据集 1.4 MasterURL 1.5 Spark为什么很占内存 ...

  4. spark on yarn 完全分部署_大数据Spark面试题(一)

    1.spark的有几种部署模式,每种模式特点?(☆☆☆☆☆) 1)本地模式 Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定.将Spark应用以多线程的方式直接运行在本地, ...

  5. 分布式队列编程:模型、实战

    介绍 作为一种基础的抽象数据结构,队列被广泛应用在各类编程中.大数据时代对跨进程.跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在.但是,这种常见的基础性的事物往往容易被忽 ...

  6. Spark on YARN :yarn-cluster模式如何查看日志

    Spark on YARN 两种模式yarn-cluster yarn-client 一:yarn-client 在运行时是可以看到日志的 而yarn-cluster是看不懂的,那么问题来了,如何查看 ...

  7. Java编程笔记2:初始化和清理

    Java编程笔记2:初始化和清理 图源:Java Switch语句(用法详解)-java教程-PHP中文网 构造器 构造器,在编程领域也会被称作构造函数.事实上我觉得这个名称并不是很恰当,可能相当一部 ...

  8. spark 查看yarn日志_spark周边项目之Livy

    无Spark Client环境的部署实现 首先,熟悉spark开发的人都知道spark的部署模式分为三种,分别为Local.Standalone.YARN,通过YARN又分为YARN-Client和Y ...

  9. spark编程基础python版实验报告_Spark编程基础(Python版)

    章 大数据技术概述 1.1 大数据概念与关键技术 1.1.1 大数据的概念 1.1.2 大数据关键技术 1.2 代表性大数据技术 1.2.1 Hadoop 1.2.2 Spark 1.2.3 Flin ...

最新文章

  1. Android10.0 startActivity启动过程
  2. Access数据库审计工具mdbtools
  3. 修改及查看mysql数据库的字符集
  4. 最新版ffmpeg 提取视频关键帧
  5. @autowired注解原理_相见恨晚,一个架构师也不会用的Lombok注解
  6. 选择云备份:应当怎样和云供应商签合同
  7. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
  8. 【英语学习】【WOTD】peer-to-peer 释义/词源/示例
  9. Matploblib work5
  10. 全新 Veeam Availability Suite 9.5 成为率先全面集成 Windows Server 2016和Hyper-V技术的 可用性解决方案之一...
  11. POS Tagging 标签类型查询表(Penn Treebank Project)
  12. 嵌入在网页上Flash媒体播放器(1)
  13. 火山安卓全屏侧滑布局器使用教程
  14. 办公室文秘试题 计算机,办公室文秘实用计算机操作技巧
  15. Excel获取Sheet名称公式
  16. Vue app.js文件过大,带宽占用过大,优化方案(持续优化)
  17. 情侣的网站代码java_java版给爱人表白祝福的小项目
  18. mesh 协调器 路由器_为什么WiFi6和MESH是绝配
  19. R语言在图上标出点坐标_R语言绘制平行坐标图(PCP)示例
  20. OpenGL中常用的 GLUT 函数

热门文章

  1. Cell:人体细菌到究竟有多少,再作报告必引此文
  2. R语言使用pie函数可视化饼图(pie chart)、为饼图添加百分比信息、使用plotrix包可视化3D饼图、使用plotrix包可视化扇形饼图
  3. R语言ggplot2可视化:组合箱图(boxplot)和直方图(histogram)输出组合可视化结果
  4. pandas使用cut函数基于分位数进行连续值分箱(手动计算分位数)处理后出现NaN值原因及解决
  5. 机器学习类别/标称(categorical)数据处理:目标编码(target encoding)
  6. R语言在可视化图像中添加文本(Adding Text to plot)
  7. TED+如何让压力成为朋友+如何面对压力决定你的未来
  8. java触发器如何创建表_在java 中执行触发器代码、创表语句
  9. Java面向对象知识概括归纳与总结
  10. Comparison of long-read sequencing technologies in the hybrid assembly of complex bacterial genomes