林子雨-Spark入门教程(Python版)-学习笔记(一)
第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版)-学习笔记(一)相关推荐
- 林子雨-Spark入门教程(Python版)-学习笔记(二)
第3章 Spark编程基础 从文件加载数据 从文件系统中加载数据创建RDD--textFile()方法,该方法把文件的URI作为参数 注意: (1)本地文件系统的路径,必须要保证在所有的worker节 ...
- 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)
Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...
- Spark入门(Python版)
Hadoop是对大数据集进行分布式计算的标准工具,这也是为什么当你穿过机场时能看到"大数据(Big Data)"广告的原因.它已经成为大数据的操作系统,提供了包括工具和技巧在内的丰 ...
- pythonsparkpickle_Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令
<Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...
- 一个非常棒的Unity入门教程(附上学习笔记)
非常适合入门的unity教程,知识点全面,声音清晰,基本没有废话,时间控制得当,UP主Michael还在更很多其他的unity相关教程 视频教程地址:https://www.bilibili.com/ ...
- 1算法分析——数据结构与算法Python版学习笔记
什么是算法分析? 计算资源指标:一种是算法解决问题过程中需要的储存空间或内存,另一种是算法的执行时间 运行时间检测 time模块,获取计算机系统当前时间 例如: 方法一:累计求和程序的运行时间检测 i ...
- 【台大郭彦甫】Matlab入门教程超详细学习笔记七:数值微积分(附PPT链接)
数值微积分 前言 一.多项式微积分 1. 多项式计算 2. 多项式微分 3. 多项式积分 二.数值微积分 1. 数值微分法 2. 高阶微分法 3. 数值积分法 三.回顾Function Handles ...
- 【台大郭彦甫】Matlab入门教程超详细学习笔记五:初阶绘图(附PPT链接)
初阶绘图 前言 一.基础绘图 1.plot() 绘制二维线图 2.legend()添加图例 3.title()和*label()添加标题与坐标轴 4.text()和annotation()增加注解 二 ...
- 【台大郭彦甫】Matlab入门教程超详细学习笔记六:高阶绘图(附PPT链接)
高阶绘图 前言 一.进阶二维绘图 1. 对数图 2.一图双y轴 3. 直方图 4. 条形图 5. 饼状图 6. 极坐标图 7. 阶梯图与取样图 8. 箱线图以及误差线图 9. 填充图 二.配色 1.R ...
最新文章
- socket编程和并发服务器
- CommunityServer数据部分名词解释
- centos 6.8安装git_CentOS7安装GitLab、汉化、邮箱配置及使用
- Appium环境搭建python篇(mac系统)
- javafx 值对_我今天对JavaFX的了解
- linux下的c语言控制灯闪烁,C语言实现LED灯闪烁控制
- jquery ztree 设置勾选_047 JAVA-jQuery
- Mybatis generator(复制粘贴完成)
- Python基础——全局变量与局部变量
- 使用git来管理微信小程序
- 战旗助手服务器代码,炉石传说酒馆战旗助手
- QEMU,Dynamips,IOL区别
- 年轻人的第一次汉化APK(教程)
- 【Lilishop商城】No4-2.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-平台注册会员接口开发
- 小米6鲁大师html5评测,鲁大师曝光小米6跑分:这个分数满意吗?
- lesson-3 photoshop之套索工具,渐变、移动
- Laya中贴图实时合并
- cp symbolic links 引发Too many levels of symbolic links
- 手机app自动化操作工具airtest之入门篇
- 软件测试最全面试题,了解一下
热门文章
- 计算机应用基础模拟试卷 一,计算机应用基础模拟试卷一模拟试卷-02answer
- js json对象转数组获取key与长度
- Solaris系统安装及网络配置
- CSS选择器常见用法总结
- mc服务器修改地形,把《我的世界》改造的地形放大1万倍,Mojang看了也得竖起大拇指...
- 前中后序遍历-java模板代码
- 攻防世界nice_bgm
- C# Winform Chart控件用法1
- 全球与中国电子设计自动化软件市场深度研究分析报告(2021)
- 爬虫学习(16):selenium自动化测试:人为模拟滑块移动