PySpark入门
学习目标
1. 分布式计算
- 目标:掌握分布式计算设计
- MapReduce和YARN有什么区别?
- 一个分布式计算程序如何在分布式资源平台中运行的?
2. Spark的介绍
- 目标:掌握Spark功能、场景、特点
- 什么是Spark,有什么功能,能解决什么问题?
- Spark在工作中具体的应用场景是什么?
- Spark部署模式、开发语言支持哪些?
- Spark为什么要比MR快?
【模块一:分布式的设计思想】
1. 大数据开发流程及技术
-
目标:了解大数据开发流程及技术
-
实施
-
数据采集
- 功能:将公司中各种数据源数据采集同步到大数据平台
- 技术:Sqoop、DataX、Flume、Canal等
- 数据存储
- 功能:实现整个公司所有数据的统一化数据存储,提供数据读写
- 技术:HDFS、Hive、Kafka、Redis、Hbase等
- 数据计算
- 功能:实现对数据的处理计算
- 技术:MR + YARN、Presto、Impala、Spark、Flink等
- 第一代:MapReduce,奠定了分布式计算的设计思想
- |
- 第四代:Flink
- 数据应用
- 功能:实现对数据的应用,例如构建报表等
- 技术:FineBI、Tableau、PowerBI、SuperSet等
-
小结
- 了解大数据开发流程及技术
2. 理解分布式设计基础
-
目标:理解分布式的基本设计思想及架构
-
实施
- 传统架构问题
- 单机资源不足
- 存储:3台机器,每台机器都有2T的硬盘空间,但是现在有1个3T的文件要存储
- 计算:3台机器,每台机器都有8核CPU和8GB内存,但是现在有1个程序需要12核CPU和24GB内存
- 单机性能较差
- 存储:10个1GB大小的文件,共10GB,要存储写入一台机器,1台机器的磁盘最多500MB/s,需要20s以上
- 计算:10个程序需要运行,每个程序需要8核8GB资源,1台机器有10核10GB,只能挨个运行
- 根本原因:数据量非常大
- 单机资源不足
- 分布式思想
- 分而治之
- 分:将一个大的任务拆分成多个小的任务,每台机器处理一个小的任务,并行处理
- 合:将多个小任务的结果最终再合并生成最终的结果进行返回
- 问题解决
- 存储:将3T的文件拆分成若干个小文件,例如每500M一个小文件,将这些小文件存储在不同的机器上
- 计算:将这个程序拆分成若干个小程序,每个小程序只需要3核6G,将这些小程序运行在不同的机器上
- 分而治之
- 分布式软件架构
- 集群:一般由多个提供相同服务的机器共同协作,称为集群或者群集,强调个体与群体的关系
- 分布式:一般由多个提供相同或者不同服务的机器共同协作,称为分布式系统或者分布式服务,强调合作关系
- 分布式主从架构
- 主节点:管理节点:管理所有的从节点,管理所有任务的分配,对外接受用户的请求
- 从节点:工作节点:一般一个从节点负责一台机器,利用一台机器的资源来完成主节点分配的小任务
- HDFS:从逻辑上将多台机器的磁盘合并为一个整体
- 主节点:NameNode:负责管理从节点,负责接客,负责存储的任务分配和元数据管理
- 从节点:DataNode:负责管理自己这台机器的硬盘,实现每个块的存储
- YARN:从逻辑上将多台机器的内存和CPU合并为一个整体
- 主节点:ResourceManager:负责管理从节点,负责接客,负责资源管理分配和任务调度
- 从节点:NodeManager:负责管理自己这台机器的内存和CPU,实现每个Task的计算
- 传统架构问题
-
小结
- 理解分布式的基本设计思想及架构
3. 掌握分布式计算设计
-
目标:掌握分布式计算的设计
-
实施
-
本质
- 将一个大的计算任务拆分成多个小的计算任务,由多台机器并行执行所有小任务
- 最终将每个小任务的结果进行合并得到最终结果
-
组成
- 分布式程序:一个多进程的程序,程序运行时可以拆分成多个进程来运行
- 程序可以被拆分为多个小的任务
+ - 分布式资源:一个多机器的集群,可以将多台机器的硬件资源从逻辑上合并为一个整体
- 程序可以被拆分为多个小的任务
- 从逻辑上合并多台机器的资源用于运行分布式程序
|| - 分布式计算:让分布式程序拆分出来的每个小任务运行在分布式资源的每台节点上
- 分布式程序:一个多进程的程序,程序运行时可以拆分成多个进程来运行
-
以Hadoop为例
- 分布式程序:MapReduce:分布式编程模型,理解为是一套API,基于这套API写出的程序,就是分布式程序
+ - 分布式资源:YARN:分布式资源管理和任务调度框架,理解将多台机器的资源从逻辑上合并,利用每台机器的资源完成每个小任务
|| - Hadoop分布式计算
- 分布式程序:MapReduce:分布式编程模型,理解为是一套API,基于这套API写出的程序,就是分布式程序
-
流程:分布式计算目标是处理数据
-
1st:读取数据:Input
- 读取数据,按照一定的规则将数据划分成多份,一般称为数据分片或者数据分区
- MapReduce这个阶段叫做Input
- 功能叫分片:Split:是否大于128M的1.1倍来划分
- 将每个分区的数据读取机器的内存中,不同分区的数据放在不同的机器内存中
- 读取数据,按照一定的规则将数据划分成多份,一般称为数据分片或者数据分区
-
2nd:处理数据:Process
- 根据划分规则,每个分区的数据对应一个Task计算任务来计算
- MapReduce中这个阶段叫做:Map【一对一转换】、Shuffle【分组】、Reduce【聚合】
- 功能:每一个分片都会启动一个MapTask来进行处理
- 每个Task计算任务可以运行在不同的机器上,使用多台机器的资源并行执行
- YARN的不同节点上会运行MapTask进程和ReduceTask进程
- 根据划分规则,每个分区的数据对应一个Task计算任务来计算
-
3rd:保存结果:Output
- 最后使用Task将前面每个Task任务计算的结果进行合并,输出保存
-
举例:现在有一个求和的任务,数据量非常大,以1 ~ 9求和为例
-
step1-Input:将1 ~ 9 的9个数字划分为三份【具体根据划分规则来决定】
- split1:1 2 3:数据在Node1上
- split2:4 5 6:数据在Node2上
- split3:7 8 9:数据在Node3上
-
step2-Process:启动多个Task分别对每个Split进行求和
- Task1:处理Split1:1 + 2 + 3 = 6:Node1
- Task2:处理Split2:4 + 5 + 6 = 15:Node2
- Task3:处理Split3:7 + 8 + 9 = 24:Node3
-
step3:将上面每个Task的结果进行合并
- Task4:将Task1 ~ Task3的结果进行合并:6 + 15 + 24 = 45
- 输出结果
-
以Hadoop为例,概念对比
栗子 Hadoop 1 ~ 9 理解为HDFS中的一个文件 Split1,Split2,Split3 理解为这个文件被分成了三个Block块 Task1,Task2,Task3 理解为三个Map Task进程,分别运行在三台NodeManager上 Task4 理解为一个Reduce Task进程,将三个MapTask的结果做最终聚合 Node1,Node2,Node3 作为DataNode和NodeManager的节点
-
-
-
发展
- 第一代计算引擎:MapReduce,现在很少直接使用,不写MapReduce代码了,性能太差了,只会间接使用Hive、Sqoop、Oozie
- 背景:为了解决大数据计算的问题
- 第二代计算引擎:Tez,基于MapReduce封装了Tez,引入DAG思想,底层还是MR,性能比MR快10倍以上,相对比较少见
- 背景:优化MR速度,优化MR设计的,增加DAG
- 第三代计算引擎:Spark,内存式计算引擎,Presto、Impala、Spark都是类似产品
- 背景:基于DAG的内存式设计
- 第四代计算引擎:Flink,实时计算引擎
- 背景:让数据一产生就立即被处理:实时:让数据价值最大化
- 第一代计算引擎:MapReduce,现在很少直接使用,不写MapReduce代码了,性能太差了,只会间接使用Hive、Sqoop、Oozie
-
-
小结
- 掌握分布式计算的设计
【模块二:Spark的介绍及功能特点】
1. 了解Spark的诞生及发展
-
目标:了解Spark的诞生及发展
-
实施
-
问题:MR的计算速度太慢了,怎么解决大数据计算效率差的问题?
-
诞生
-
DataBricks官网:https://databricks.com/spark/about
-
-
发展
- 2009年Spark诞生于伯克利AMPLab,伯克利大学的研究性项目 - 2010年通过BSD 许可协议正式对外开源发布 - 2012年Spark第一篇论文发布,第一个正式版(Spark 0.6.0)发布 - 2013年Databricks公司成立并将Spark捐献给Apache软件基金会 - 2014年2月成为Apache顶级项目,同年5月发布Spark 1.0正式版本 - 2015年引入DataFrame大数据分析的设计概念 - 2016年引入DataSet更强大的数据分析设计概念并正式发布Spark2.0 - 2017年Structured streaming 发布,统一化实时与离线分布式计算平台 - 2018年Spark2.4.0发布,成为全球最大的开源项目 - 2019年11月Spark官方发布3.0预览版
- 2020年6月Spark发布3.0.0正式版
-
-
小结
- 了解Spark的诞生及发展
2. 理解Spark的功能及特点
-
目标:掌握Spark的功能及特点
-
实施
-
官网:https://spark.apache.org/
Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.
-
定义:基于内存式计算的分布式的统一化的数据分析引擎
-
功能:多语言数据分析引擎工具栈
- 实现离线数据批处理:类似于MapReduce、Pandas,写代码做处理
- 实现交互式即时数据查询:类似于Hive、Presto、Impala,使用SQL做即席查询分析
- 实现实时数据处理:类似于Storm、Flink实现分布式的实时计算
- 实现机器学习的开发:代替传统一些机器学习工具
-
场景:所有需要对数据进行分布式的查询、计算、机器学习都可以使用Spark来完成
-
模块:类似于Hadoop中有HDFS、YARN、MapReduce几个模块
- Spark Core:Spark核心模块,其他模块都是基于这个模块构建的,基于代码编程的模块
- Spark SQL:基于SparkCore之上构建的SQL模块,用于实现结构化数据处理,基于SQL或者DSL进行编程
- Spark Streaming:基于SparkCore之上构建的准实时计算的模块,用离线批处理来模拟实时计算,代码编程
- Struct Streaming:基于SparkSQL之上的真正的实时计算的模块,基于SQL或者DSL进行编程
- MLlib:提供的机器学习的算法库,主要偏向于推荐系统的算法库
- Graphx:图计算的模块
-
-
开发语言:Python、SQL、Scala、Java、R
- Spark是用什么语言开发的:Scala语言开发的
-
特点
- Batch/Streaming data:统一化离线计算和实时计算开发方式,支持多种开发语言
- SQL analytics:通用的SQL分析快速构建分析报表,运行速度快于大多数数仓计算引擎
- Data science at scale:大规模的数据科学引擎,支持PB级别的数据进行探索性数据分析,不需要使用采样
- Machine learning:可以支持在笔记本电脑上训练机器学习算法,并使用相同的代码扩展到数千台机器的集群上
-
整体:功能全面、性能前列、开发接口多样化、学习成本和开发成本比较低
-
小结
- 掌握Spark的功能及特点
3. Spark的应用及使用
-
目标:掌握Spark的应用及使用
-
实施
- 应用场景
- 离线场景:实现离线数据仓库中的数据清洗、数据分析、即席查询等应用
- 比较成熟,工作中主要的应用场景
- 使用Spark对各种数据源数据进行处理:Hive、RDBMS、文件
- Hive数仓常见处理引擎:Spark、Impala、Presto
- Impala:底层是C语言,性能最好,SQL开发,集成Hive或者Hbase,语法兼容性较差
- Presto:底层基于JVM,性能其次,SQL开发,集合各种数据库数据源,纯内存,与Hive兼容性较差
- Spark:底层基于JVM,支持读写各种大数据平台数据源数据,多种开发语言,与Hive语法完美兼容
- 实时场景:实现实时数据流数据处理,相对而言功能和性能不是特别的完善,工作中建议使用Flink替代
- 离线场景:实现离线数据仓库中的数据清洗、数据分析、即席查询等应用
- 开发语言:Python、Scala、SQL、Java、R
- 运行模式
- 本地模式Local:程序运行在本地,不是分布式的,只启动1个进程运行所有Task任务,一般用于测试
- 集群模式Cluster
- Standalone:Spark自带的一个分布式资源管理平台,可以将Spark直接运行在自带的平台中
- YARN:Hadoop中的一个公共的分布式资源管理平台,可以将Spark程序提交到YARN中运行
- Messos:类似于YARN,国外用的比较多
- K8s:分布式资源容器平台
- 应用场景
-
小结
- 掌握Spark的应用及使用
4. Spark的计算流程设计
-
目标:理解Spark的基本思想
-
实施
-
MR的计算流程设计
- step1:读取数据:Input
- 功能一:实现分片,将读取到的数据进行划分,将不同的数据才能分给不同Task
- 功能二:转换KV
- step2:处理数据:Map、Shuffle、Reduce
- Map:负责数据处理:一对一的转换,多对一的过滤
- 功能一:构建分布式并行Task,每个分片对应一个MapTask【进程】
- 功能二:每个MapTask负责自己处理的分片的数据的转换,转换逻辑由map方法来决定
- Shuffle:负责数据处理
- Map输出写入数据:磁盘
- 功能:实现全局的:分区、排序、分组
- Reduce读取Map输出的数据:读取磁盘
- Reduce:负责数据处理:多对一的聚合
- 功能:默认由一个ReduceTask【进程】来实现数据的聚合处理
- Map:负责数据处理:一对一的转换,多对一的过滤
- step3:保存结果:Output
- 功能:将上一步的结果写入外部系统
- step1:读取数据:Input
-
Spark的计算流程设计
-
- **step1:读取数据**
- 根据分片的规则,将数据源进行分片,每个分片作为一个数据分区
- 整个数据的所有分区从逻辑上合并为一个整体,SparkCore中称之为RDD
- 一个RDD就代表读取到的数据,这个数据由多个分区组成,每个分区数据存储在不同的机器的内存中
- RDD可以理解为一个分布式的列表集合
- |
- 读取到的数据会放入一个RDD中,实际读取的数据会划分成多个分区,每个分区的数据在不同节点上
- 操作RDD代表操作这个文件数据,RDD就是文件数据的集合,类似于一个列表
- RDD是一个逻辑上的概念,只是代表一份数据,这份数据在物理上被分成了多个分区,存储在不同的节点上
- **step2:处理数据**
- 对RDD调用函数进行处理,Spark底层就会启动多个Task【线程】对这个RDD的每个分区来进行并行处理
- 处理流程由代码中的函数决定,可以有多个Map和多个Reduce阶段
- 如果不经过Shuffle,上一步处理后的结果可以存储在内存中,直接供下一步进行计算
- **step3:保存结果**
- 将每个Task计算的结果进行输出保存
-
为什么Spark比MR要快?
| 区别 | MapReduce | Spark |
| ------------ | ----------------------------------------- | ------------------------------------------------------------ |
| 计算流程结构 | 1个Map +1个Reduce,每步结果都必须进入磁盘 | 支持DAG,一个程序中可以有多个Map、Reduce过程,多个Map之间的操作可以直接在内存中完成 |
| 中间结果存储 | 磁盘 | 不经过Shuffle的过程直接存储在内存中 |
| Task运行方式 | 进程:MapTask、ReduceTask | 进程只启动一次:所有Task都以线程方式存在,不需要频繁启动、申请资源 | -
小结
- 理解Spark的基本思想