第1章 Spark的设计与运行原理

简介

hadoop中计算框架MapReduce的缺点:

  • 表能能力有限,计算都必须要转化成Map和Reduce两个操作,难以表示复杂场景
  • IO开销大,中间结果写入到磁盘中,每次执行时都需要从磁盘读取数据
  • 延迟高,IO读取耗时,同时任务串行进行,等待时间长

于是,引入了SPARK:

  • 更多操作算子,计算模式虽然也属于MapReduce,但具备更多算子
  • 内存计算,中间结果直接放到内存中,避免了从磁盘中频繁读取数据,带来了更高的迭代运算效率
  • DAG的任务调度执行机制,要优于MapReduce的迭代执行机制
  • 任务是基于线程的,相对MapReduce基于进程的方式更高效

spark生态系统

运行架构

主从模式,硬件上:master-slave ,软件上:driver-executor
基本概念

  • RDD:弹性分布式数据集(Resilient Distributed Dataset)的简称,是不可变的分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。本质上是一个只读的分区记录集合
  • DAG : 有向无环图,描述RDD的血缘关系
  • Executor : 运行在工作节点(Worker Node)上的一个进程,负责运行任务,并为应用程序存储数据

运行架构

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

基本流程

  • 当一个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存储模块,存储中间结果

RDD的设计与运行原理

一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集来创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join和groupBy)而创建得到新的RDD。

算子

  • 转换操作
    指定RDD之间的相互依赖关系,输入RDD,输出RDD,不立即执行。比如map,filter等

  • 行动操作
    用于执行计算并指定输出的形式,输入RDD,返回非RDD。比如count,collect等

  • 惰性调用
    只有第一次在一个行动操作中用到时,才会真正计算

特性

  • 只读——高效的容错性
  • 中间结果持久化到内存,不需要“落地”到磁盘上,避免了不必要的读写磁盘开销
  • RDD可存放对象,避免序列化和反序列化

把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。

依赖

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

Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分阶段,具体划分方法是:在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的阶段中;将窄依赖尽量划分在同一个阶段中,可以实现流水线计算

创建RDD

  • 读取外部数据
    sc.textFile()
  • 在驱动器程序里分发驱动器程序中的对象集合
    sc.parallelize([“hello”,“world”,“we”,“you”])

Demo

import findspark
#可在环境变量中进行设置,即PATH中加入如下地址
findspark.init("D:\spark\spark-2.4.1-bin-hadoop2.7")
from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark import SparkConf# 创建sc
sc=SparkContext("local","Simple")#读取文件
textFile = sc.textFile("test.txt")
def contains(line):return 'hello' in line
filterRDD = textFile.filter(contains)
filterRDD.cache()
filterRDD.count()counts=textFile.flatMap(lambda line: line.split(" ")) \.map(lambda word: (word, 1)) \.reduceByKey(lambda a, b: a + b)

结果:

林子雨-Spark入门教程(Python版)-学习笔记(一)相关推荐

  1. 林子雨-Spark入门教程(Python版)-学习笔记(二)

    第3章 Spark编程基础 从文件加载数据 从文件系统中加载数据创建RDD--textFile()方法,该方法把文件的URI作为参数 注意: (1)本地文件系统的路径,必须要保证在所有的worker节 ...

  2. 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)

    Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...

  3. Spark入门(Python版)

    Hadoop是对大数据集进行分布式计算的标准工具,这也是为什么当你穿过机场时能看到"大数据(Big Data)"广告的原因.它已经成为大数据的操作系统,提供了包括工具和技巧在内的丰 ...

  4. pythonsparkpickle_Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  5. 一个非常棒的Unity入门教程(附上学习笔记)

    非常适合入门的unity教程,知识点全面,声音清晰,基本没有废话,时间控制得当,UP主Michael还在更很多其他的unity相关教程 视频教程地址:https://www.bilibili.com/ ...

  6. 1算法分析——数据结构与算法Python版学习笔记

    什么是算法分析? 计算资源指标:一种是算法解决问题过程中需要的储存空间或内存,另一种是算法的执行时间 运行时间检测 time模块,获取计算机系统当前时间 例如: 方法一:累计求和程序的运行时间检测 i ...

  7. 【台大郭彦甫】Matlab入门教程超详细学习笔记七:数值微积分(附PPT链接)

    数值微积分 前言 一.多项式微积分 1. 多项式计算 2. 多项式微分 3. 多项式积分 二.数值微积分 1. 数值微分法 2. 高阶微分法 3. 数值积分法 三.回顾Function Handles ...

  8. 【台大郭彦甫】Matlab入门教程超详细学习笔记五:初阶绘图(附PPT链接)

    初阶绘图 前言 一.基础绘图 1.plot() 绘制二维线图 2.legend()添加图例 3.title()和*label()添加标题与坐标轴 4.text()和annotation()增加注解 二 ...

  9. 【台大郭彦甫】Matlab入门教程超详细学习笔记六:高阶绘图(附PPT链接)

    高阶绘图 前言 一.进阶二维绘图 1. 对数图 2.一图双y轴 3. 直方图 4. 条形图 5. 饼状图 6. 极坐标图 7. 阶梯图与取样图 8. 箱线图以及误差线图 9. 填充图 二.配色 1.R ...

最新文章

  1. socket编程和并发服务器
  2. CommunityServer数据部分名词解释
  3. centos 6.8安装git_CentOS7安装GitLab、汉化、邮箱配置及使用
  4. Appium环境搭建python篇(mac系统)
  5. javafx 值对_我今天对JavaFX的了解
  6. linux下的c语言控制灯闪烁,C语言实现LED灯闪烁控制
  7. jquery ztree 设置勾选_047 JAVA-jQuery
  8. Mybatis generator(复制粘贴完成)
  9. Python基础——全局变量与局部变量
  10. 使用git来管理微信小程序
  11. 战旗助手服务器代码,炉石传说酒馆战旗助手
  12. QEMU,Dynamips,IOL区别
  13. 年轻人的第一次汉化APK(教程)
  14. 【Lilishop商城】No4-2.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-平台注册会员接口开发
  15. 小米6鲁大师html5评测,鲁大师曝光小米6跑分:这个分数满意吗?
  16. lesson-3 photoshop之套索工具,渐变、移动
  17. Laya中贴图实时合并
  18. cp symbolic links 引发Too many levels of symbolic links
  19. 手机app自动化操作工具airtest之入门篇
  20. 软件测试最全面试题,了解一下

热门文章

  1. 计算机应用基础模拟试卷 一,计算机应用基础模拟试卷一模拟试卷-02answer
  2. js json对象转数组获取key与长度
  3. Solaris系统安装及网络配置
  4. CSS选择器常见用法总结
  5. mc服务器修改地形,把《我的世界》改造的地形放大1万倍,Mojang看了也得竖起大拇指...
  6. 前中后序遍历-java模板代码
  7. 攻防世界nice_bgm
  8. C# Winform Chart控件用法1
  9. 全球与中国电子设计自动化软件市场深度研究分析报告(2021)
  10. 爬虫学习(16):selenium自动化测试:人为模拟滑块移动