PySpark(一)Spark原理介绍、PySpark初体验及原理

Spark简介

Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎,其特点就是对任意类型的数据进行自定义计算。

 Spark VS Hadoop

尽管Spark相对于Hadoop而言具有较大优势,但Spark并不能完全替代Hadoop

  • 在计算层面,Spark相比较MR(MapReduce)有巨大的性能优势,但至今仍有许多计算工具基于MR构架,比如非常成熟的Hive
  • Spark仅做计算,而Hadoop生态圈不仅有计算(MR)也有存储(HDFS)和资源管理调度(YARN),HDFS和YARN仍是许多大数据体系的核心架构 

面试题:Hadoop的基于进程的计算和Spark基于线程方式优缺点
答案:Hadoop中的MR中每个map/reduce task都是一个java进程方式运行,好处在于进程之间是互相独立的,每个task独享进程资源,没有互相干扰,监控方便,但是问题在于task之间不方便共享数据,执行效率比较低。比如多个map task读取不同数据源文件需要将数据源加载到每个map task中,造成重复加载和浪费内存。而基于线程的方式计算是为了数据共享和提高执行效率,Spark采用了线程的最小的执行单位,但缺点是线程之间会有资源竞争 


Spark四大优点

  •  速度快

Spark处理数据与MapReduce处理数据相比,有如下两个不同点:

  1. 其一、Spark处理数据时,可以将中间处理结果数据存储到内存中;
  2. 其二、Spark提供了非常丰富的算子(API), 可以做到复杂任务在一个Spark 程序中完成.
  • 易于使用 

Spark 的版本已经更新到 Spark 3.2.0(截止日期2021.10.13),支持了包括 Java、Scala、Python 、R和SQL语言在内的多种语言。为了兼容Spark2.x企业级应用场景,Spark仍然持续更新Spark2版本。

  • 通用性强

在 Spark 的基础上,Spark 还提供了包括Spark SQL、Spark Streaming、MLib 及GraphX在内的多个工具库,我们可以在一个应用中无缝地使用这些工具库。

  • 运行方式 

Spark 支持多种运行方式,包括在 Hadoop 和 Mesos 上,也支持 Standalone的独立运行模式,同时也可以运行在云Kubernetes(Spark 2.3开始支持)上。

 Spark框架模块

整个Spark 框架模块包含:Spark Core、 Spark SQL、 Spark Streaming、 Spark GraphX、 Spark MLlib,而后四项的能力都是建立在核心引擎之上


Spark Core:Spark的核心,Spark核心功能均由Spark Core模块提供,是Spark运行的基础。Spark Core以RDD为数据抽象,提供Python、Java、Scala、R语言的API,可以编程进行海量离线数据批处理计算。


SparkSQL:基于SparkCore之上,提供结构化数据的处理模块。SparkSQL支持以SQL语言对数据进行处理,SparkSQL本身针对离线计算场景。同时基于SparkSQL,Spark提供了StructuredStreaming模块,可以以SparkSQL为基础,进行数据的流式计算。


SparkStreaming:以SparkCore为基础,提供数据的流式计算功能。


MLlib:以SparkCore为基础,进行机器学习计算,内置了大量的机器学习库和API算法等。方便用户以分布式计算的模式进行机器学习计算。


GraphX:以SparkCore为基础,进行图计算,提供了大量的图计算API,方便用于以分布式计算模式进行图计算

Spark的结构角色

Spark运行角色
Spark中由4类角色组成整个Spark的运行时环境
. Master角色,管理整个集群的资源        类比与YARN的ResouceManager
. Worker角色,管理单个服务器的资源        类比于YARN的NodeManager
. Driver角色,管理单个Spark任务在运行的时候的工作        类比于YARN的ApplicationMaster
. Executor角色,单个任务运行的时候的一堆工作者,干活的.类比于YARN的容器内运行的TASK

从2个层面划分:

资源管理层面:

管理者: Spark是Master角色,YARN是ResourceManager。

工作中: Spark是Worker角色,YARN是NodeManager

从任务执行层面:
·某任务管理者: Spark是Driver角色,YARN是ApplicationMaster
·某任务执行者: Spark是Executor角色,YARN是容器中运行的具体工作进程。

Spark的运行模式

  • 本地模式(单机)

        本地模式就是以一个独立的进程,通过其内部的多个线程来模拟整个Spark运行时环境

  • Standalone模式(集群)

        Spark中的各个角色以独立进程的形式存在,并组成Spark集群环境

  • Hadoop YARN模式(集群)

        Spark中的各个角色运行在YARN的容器内部,并组成Spark集群环境

  • - Kubernetes模式(容器集群)

        Spark中的各个角色运行在Kubernetes的容器内部,并组成Spark集群环境

  • -云服务模式(运行在云平台上)

 本地模式

本质:启动一个JVM Process进程(一个进程里面有多个线程),执行任务Task

  •  Local模式可以限制模拟Spark集群环境的线程数量, 即Local[N] 或 Local[*]
  • 其中N代表可以使用N个线程,每个线程拥有一个cpu core。如果不指定N,则默认是1个线程(该线程有1个core)。通常Cpu有几个Core,就指定几个线程,最大化利用计算能力.
  • 如果是local[*],则代表 Run Spark locally with as many worker threads as logical cores on your machine.按照Cpu最多的Cores设置线程数

Local 下的角色分布:
资源管理:
Master:Local进程本身
Worker:Local进程本身
任务执行:
Driver:Local进程本身
Executor:不存在,没有独立的Executor角色, 由Local进程(也就是Driver)内的线程提供计算能力

Standalone模式 

Standalone模式是Spark自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。

StandAlone 是完整的Spark运行环境,其中:
Master角色以Master进程存在, Worker角色以Worker进程存在
Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行

StandAlone集群在进程上主要有3类进程:
主节点Master进程:
 Master角色, 管理整个集群资源,并托管运行各个任务的Driver
从节点Workers
 Worker角色, 管理每个机器的资源,分配对应的资源来运行Executor(Task);
每个从节点分配资源信息给Worker管理,资源信息包含内存Memory和CPU Cores核数
 历史服务器HistoryServer(可选)
 Spark Application运行完成以后,保存事件日志数据至HDFS,启动HistoryServer可以查看应用运行相关信息。

搭配环境

Spark基础入门-第三章-3.5-总结_哔哩哔哩_bilibili

启动历史服务器

sbin/start-history-server.sh

启动Spark的Master和Worker进程

# 启动全部master和worker
sbin/start-all.sh

# 或者可以一个个启动:
# 启动当前机器的master
sbin/start-master.sh
# 启动当前机器的worker
sbin/start-worker.sh

# 停止全部
sbin/stop-all.sh

# 停止当前机器的master
sbin/stop-master.sh

# 停止当前机器的worker
sbin/stop-worker.sh

  Standalone HA 模式

Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master 单点故障(SPOF)的问题。

如何解决这个单点故障的问题,Spark提供了两种方案:
1.基于文件系统的单点恢复(Single-Node Recovery with Local File System)--只能用于开发或测试环境。
2.基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)--可以用于生产环境。

ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master,但是只有一个是Active的,其他的都是Standby。当Active的Master出现故障时,另外的一个Standby Master会被选举出来。由于集群的信息,包括Worker, Driver和Application的信息都已经持久化到文件系统,因此在切换的过程中只会影响新Job的提交,对于正在进行的Job没有任何的影响

 

Spark on Yarn (重点)

Master角色由YARN的ResourceManager担任.

Worker角色由YARN的NodeManager担任. 

Driver角色运行在YARN容器内提交任务的客户端进程

真正干活的Executor运行在YARN提供的容器内

部署模式DeployMode 

Spark On YARN是有两种运行模式的,一种是Cluster模式一种是Client模式. 这两种模式的区别就是Driver运行的位置.

Cluster模式即:Driver运行在YARN容器内部, 和ApplicationMaster在同一个容器内

Client模式即:Driver运行在客户端进程中, 比如Driver运行在spark-submit程序的进程中 

 Cluster模式:

 

Client模式: 

 

二者主要区别: 

Cluster模式Client模式
Driver运行位置YARN容器内客户端进程内
通讯效率低于Cluster模式
日志查看日志输出在容器内,查看不方便日志输出在客户端的标准输出流中,方便查看
生产可用推荐不推荐
稳定性稳定基于客户端进程,受到客户端进程影响

bin/pyspark --master yarn --deploy-mode client|cluster #

--deploy-mode 选项是指定部署模式, 默认是 客户端模式 # client就是客户端模式 # cluster就是集群模式 # --deploy-mode 仅可以用在YARN模式下

也可以直接运行文件:

bin/spark-submit --master yarn --deploy-mode cluster examples/src/main/python/pi.py 100
此处 --depoly-mode client 用于指定模型,可以不写,默认为client

PySpark

PySpark是一个Python的类库, 提供Spark的操作API

而之前使用的 bin/pyspark 是一个交互式的程序,可以提供交互式编程并执行Spark计算,注意区分

环境配置:

Spark基础入门-第七章-7.1-本机配置Python环境_哔哩哔哩_bilibili

初体验

Spark Application程序入口为:SparkContext,任何一个应用首先需要构建SparkContext对象,如下两步构建:

 第一步、创建SparkConf对象

         设置Spark Application基本信息,比如应用的名称AppName和应用运行Master

 第二步、基于SparkConf对象,创建SparkContext对象

下面是一个demo:

#coding:utf8
from pyspark import SparkConf,SparkContext
if __name__ == '__main__':
    conf = SparkConf().setMaster('local[*]').setAppName('LMX')
    sc = SparkContext(conf = conf)

    file_rdd = sc.textFile("data/input/words.txt")
    words_rdd = file_rdd.flatMap(lambda line: line.split(" "))
    words_one_rdd = words_rdd.map(lambda x: (x,1))
    result_rdd = words_one_rdd.reduceByKey(lambda a,b:a+b)
    print(result_rdd.collect())

 下面这两句由  driver 运行,然后将虚拟化发送到Executor 

    conf = SparkConf().setMaster('local[*]').setAppName('LMX')
    sc = SparkContext(conf = conf)

Executor读取文件,完成计算,在这个过程中Executor之间可能还会存在shuffle交互

    file_rdd = sc.textFile("data/input/words.txt")
    words_rdd = file_rdd.flatMap(lambda line: line.split(" "))
    words_one_rdd = words_rdd.map(lambda x: (x,1))
    result_rdd = words_one_rdd.reduceByKey(lambda a,b:a+b)

最后Executor将结果汇总到driver,print输出

print(result_rdd.collect())

Python on Spark原理

PySpark宗旨是在不破坏Spark已有的运行时架构,在Spark架构外层包装一层Python API,借助Py4j实现Python和 Java的交互,进而实现通过Python编写Spark应用程序,其运行时架构如下图所示

        在driver中,会使用 py4j 将python代码转换为java代码,然后由JVM执行Driver程序(因为driver部分的代码很少,是可以做到python和jvm的完全转换的)

        在executor中,无法做到完全转换,于是由driver中的JVM向executor中的JVM传到指令,再通过python守护进程调用python程序完成executor程序 

        所以其实在这个过程中,是由JVM运行Driver程序,而通过python运行executor的。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Three.js 纹理贴图 - 环境贴图 - 纹理贴图 - 透明贴图 - 高光贴图

文章目录 Three.js 纹理贴图纹理贴图 map属性纹理贴图的映射方式 texture.Mapping纹理加载器 THREE.TextureLoader监听单个材质监听多个材质 - LoadingManager类 1. 颜色贴图与材质的颜色2.渲染效果:UV坐标 - 描述纹理贴图的坐标自定义顶点UVgeometry.attributes.uv…

Java 数据抓取

大家好我是苏麟 , 今天聊聊数据抓取 . 大家合理使用 注意,爬虫技术不能滥用,干万不要给别人的系统造成压力、不要侵犯他人权益! 数据抓取 实质上就是java程序模拟浏览器进行目标网站的访问,无论是请求目标服务器的接口还是请求目标网页内容…

python基础——池

池的介绍: 提前创建进程池,防止创建的进程数量过多导致系统性能受到影响,在系统执行任务时,系统会使用池中已经创建进程/线程,从而防止资源的浪费,创建的进程/线程可以让多个进程使用,从而降低…

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说,直接看题: 下面为分析: 很显然,我们在整体上以s[i]为基准,先把士兵按s[i]排好。然后,我们先求s[i]大的开始,即规定选人数…

电源模块欠压保护点测试方法分享 纳米软件

电源欠压保护原理 欠压保护是指当电源电压低于一定值时,电源的保护功能会及时断开电路,避免设备受到损坏。电源欠压保护一般是通过一个或多个传感器来检测电压,当电压低于设定值时就会触发电源的保护功能,断开电路,保护…

Git--07--GitExtension

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、GitExtension下载GitExtension官网下载教程 二、GitExtension安装三、GitExtension配置四、GitExtension使用 一、GitExtension下载 官网下载: http…

Docker中安装MySql的遇到的问题

目录 一、mysql查询中文乱码问题 1. 进入mysql中进行查看数据库字符集 2. 修改 my.cnf 中的配置 3. 重启mysql容器,使得容器重新加载配置文件 4. 测试结果 二、主从同步中遇到的问题 2.1 Slave_IO_Running:Connecting 的解决方案 1. 确定宿主机防火墙开放my…

嵌入式学习第十四天!(结构体、共用体、枚举、位运算)

1. 结构体: 1. 结构体类型定义: 嵌入式学习第十三天!(const指针、函数指针和指针函数、构造数据类型)-CSDN博客 2. 结构体变量的定义: 嵌入式学习第十三天!(const指针、函数指针和…

推荐一个好用的旧版本软件安装包下载地址

最近要下载旧版本的mysql和postman,发现官网和其他博客里边提供的地址,要不都非常难找到相应的下载链接,要不就是提供的从别的地方复制过来的垃圾教程,甚至有的下载还要积分,反正是最后都没下载成功,偶然发…

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时,可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题,专门设计了安全通道堵塞识别摄像机,它具有监测、识别和报警功能,可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…

Mysql-索引创建,索引失效案例

索引创建建议 1 什么情况下需要创建索引? 频繁出现在where 条件字段,order排序,group by分组字段select 频繁查询的列,考虑是否需要创建联合索引(覆盖索引,不回表)多表join关联查询&#xff0…

【PyRestTest】高级使用

本节主要涉及PyRestTest的高级特征的详细使用,主要指:generators(生成器), variable binding(变量绑定), data extraction(数据提取), content validators(文本验证) 它们是如何组合在一起的? 模板和上下文 测试和基准测试可以使用变量来模板化动态配置。使用基础的…

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

区块链游戏解说:什么是 SecondLive

数据源:SecondLive Dashboard 作者:lesleyfootprint.network 什么是 SecondLive SecondLive 是元宇宙居民的中心枢纽,拥有超过100 万用户的蓬勃社区。它的主要使命是促进自我表达,释放创造力,构建梦想中的平行宇宙…

【HTML】自定义属性(data)

自定义属性 data: 的用法(如何设置,如何获取) ,有何优势? data-* 的值的获取和设置,2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

腾讯云SSL证书在阿里云添加域名DNS解析

场景说明 在阿里云申请并备案了域名,这个域名理论上可以在任何服务器上进行绑定。应用服务器部署到腾讯云,并在腾讯云申请了SSL证书,从而完成HTTPS转化。那么问题来了,腾讯提供的免费版SSL证书是一年有效期,到期后就需…

Cadence——布线部分相关教程

(一)PCB布线叠层与阻抗设计 PCB布线要区分有阻抗和无阻抗这个是根据频率和速率来区分,一般达100M以上就是有阻抗,单端信号一般是五十欧姆,差分信号一般一百欧姆 叠成是多层板由不同的介质压合而成,介质是&…

SD-WAN技术:网络升级的智慧选择

在移动办公、云计算技术和多元化的应用交付方式不断普及的今天,企业网络正变得越来越错综复杂,充满了不可预测性。为了跟上这一网络发展的步伐,IT部门需要深刻反思网络建设的方式,而定义软件广域网(SD-WAN)…

Ubuntu系统硬盘分区攻略(磁盘分区、RAID磁盘阵列、RAID阵列、固态硬盘分区、机械硬盘分区、swap分区、swap交换分区)

文章目录 分区需求分区方案分区顺序相关疑问swap分区不是应该放在最后吗?我安装系统分区的时候,上面有available devices,下面有create software raid(md),我该用哪个?我available devices下面有个893G的固态&#xff…