Spark基础入门篇 | MapReduce原理 + Spark原理 + PySpark环境搭建 + 简单实战

news2024/9/21 16:24:24

😄 之前简单了解过Spark,并简单用别人的代码跑过pyspark的数据处理和模型的分布式推理,但没做系统的总结,那这篇博客就对Spark做个基础入门讲解,看完基本就算基础入门了,后面再实操就会轻松一些。

文章目录

  • 1、Spark简单介绍
  • 2、搭建 PySpark
    • 2.1、java8安装:
    • 2.2、pyspark安装
  • 3、MapReduce 原理
    • 3.1、Map阶段:
    • 3.2、Reduce阶段:
    • 3.3、⭐细节+重点:
  • 4、Spark 原理
    • 4.1、Spark 优势
    • 4.2、Spark 基本概念
    • 4.3、RDD(Spark的基本数据结构)
    • 4.4、Spark 架构
    • 4.5、Spark 执行流程
  • 5、Spark 部署
  • 6、PySpark简单实战(词频统计)

1、Spark简单介绍

  • Spark是一个快速、通用的大数据处理引擎,可以进行分布式数据处理和分析。与Hadoop的MapReduce相比,Spark具有更高的性能和更丰富的功能。Spark支持多种编程语言(如Scala、Java和Python(pyspark)),并提供了一组丰富的API,包括用于数据处理、机器学习和图计算的库。
  • 据我了解,大部分公司,都会对于数据的预处理+模型的推理,都会用pyspark来做分布式处理,如模型的分布式推理(tensorflow和torch只支持分布式训练,不支持分布式预测)。
  • 一般用的最多的是spark-scala(追求高性能,强于工程)和pyspark(AI算法场景,方便和其他python库配合,强于分析)。此外spark-scala支持spark graphx图计算模块,而pyspark是不支持的。

大佬说了spark-scala比较难(要学scala语言,配环境听说也很痛苦😂),但能解锁spark的所有技能;pyspark较简单,方便新手入门。所以我打算先学pyspark,再学spark-scala。当然了,学习pyspark的前提是:会python,会一丢丢SQL。

2、搭建 PySpark

单纯为了学习,配个单机版环境玩玩(无需安装hadoop, scala)

2.1、java8安装:

  • jdk-1.8下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • 安装教程:https://www.runoob.com/java/java-environment-setup.html

2.2、pyspark安装

pip install pyspark -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install findspark

安装完,测试一波,输出成功即为安装成功。

import findspark
# 作用就是初始化自动找到本机安装的spark和当前运行的python环境(也可以传参指定)
findspark.init()
#%%
import pyspark
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("test").setMaster("local[4]")
sc = SparkContext(conf=conf)
#%%
print("spark version:",pyspark.__version__)
rdd = sc.parallelize(["I love you, ","spark"])
print(rdd.reduce(lambda x,y:x+' '+y))

# spark version: 3.4.0
# I love you,  spark

以上为在python中通过调用pyspark库的方式和spark交互。工业界通常通过spark-submit提交spark作业的方式到集群上运行,如提交py脚本或是jar包到集群让成百上千台机器分布式跑。

3、MapReduce 原理

在学习spark之前,我简单学习了下MapReduce,因为spark作为大数据计算框架MapReduce的继任者,我觉得有必要了解下MapReduce。

  • Hadoop是一个开源的分布式计算框架,用于存储和处理大规模数据集。它提供了一个可扩展的分布式文件系统(HDFS)和一个分布式计算框架(MapReduce),可以在大量廉价硬件上进行并行计算。

MapReduce也是分布式运行的,由两个阶段组成: Map和Reduce。map阶段是一个独立的程序,相当于将任务分给多个节点同时运行,每个节点做局部汇总。而reduce阶段也是一个独立的程序,也可在多个节点运行,负责对map阶段处理的局部结果进行最终的汇总。【😄类似分治的思想】
在这里插入图片描述
MapReduce其实就是分治(map)+规约(reduce)。下面以词频统计为例,阐述map和reduce阶段究竟在干嘛:
在这里插入图片描述
假设我们有一个大文件,这个文件以刚好以n个block的形式存储在hadoop集群的n个节点上。block块是文件的物理切分,在磁盘上是真实存在的。split是逻辑划分,不是对文件真正的切分,默认情况下我们可以认为一个split的大小和一个block的大 小是一样的。

3.1、Map阶段:

  • 1、map阶段会把会把输入文件划分为很多InputSplit。计算程序会被分发到每一个InputSplit所在节点上进行计算(一个InputSplit对应一个map任务),各自有一个map任务。默认情况下,每个hdfs的block对应一个InputSplit。然后通过RecordReader 类,把每个InputSplit解析成一个一个的<k,v>,k代表着该数据在文件中的位置信息,v代表着数据的内容。
  • 2、调用Mapper类中的map(k,v)函数,这个map函数根据自己要实现的功能来写,输出是新的<k,v>(对应上图中map的输出就是<单词,1次>)。
  • 3、shuffle过程:按照新的key进行排序,然后分组,相同key的分到一组即<k, {v1, v2…}>。中间结果写入磁盘中。至此,map阶段结束。

3.2、Reduce阶段:

  • 1、数据copy到多个reduce节点,调用Reducer类中的reduce(k, {v1, v2…})函数,该函数根据要实现的功能来写,输出为新的<k,v>(对应上图中<单词,频次>)。
  • 2、把reduce阶段的计算结果输出存储到HDFS中。至此,reduce阶段结束。

3.3、⭐细节+重点:

  • 1、map阶段可以单独使用,当不需要一些聚合操作(reduce)时,便可map阶段结束后直接输出。

  • 2、reduce阶段不能脱离map阶段,必须要通过map阶段来定义哪个是key和哪个是value,以此作为reduce的输入。reduce本质上指的是reduce by key,它是将有着相同的key的数据进行合并,在map到reduce的中间过程中,会将map的结果根据这个key进行排序(sort)和分组(combine)【专业点:也就是shuffle过程】。当然了,这个过程计算框架会自动完成。

  • 🔥 但是!!!重点来了!spark的MapReduce是可以不要map只要reduce的。因为spark并不需要定义数据的key是啥value是啥。所以spark还是非常灵活的。

4、Spark 原理

与Hadoop的MapReduce相比,Spark具有更高的性能和更丰富的功能。

4.1、Spark 优势

1、高效。

  • Hadoop的MapReduce将中间计算结果放入磁盘中,适合处理离线的静态的大数据。
  • Spark中间结果存放优先存放在内存中,内存不够再存放在磁盘中,不放入HDFS,避免了大量的IO和刷写读取操作。并通过并行计算DAG图的优化,减少了不同任务之间的依赖,降低了延迟等待时间。内存计算下,Spark 比 MapReduce 快100倍。

2、简单易用。

  • MapReduce仅支持Map和Reduce两种编程算子。task以进程的方式维护,启动慢。
  • Spark提供了超过80种不同的Transformation算子+Action算子,如map,reduce,filter,groupByKey,sortByKey,foreach等,并且采用函数式编程风格,实现相同的功能需要的代码量极大缩小。task以线程的方式维护,启动快。

3、通用。
Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。
在这里插入图片描述

4、兼容。
Spark能够跟很多开源工程兼容使用。如Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且Spark可以读取多种数据源,如HDFS、HBase、MySQL等。

4.2、Spark 基本概念

Spark应用程序即Application由多个Job组成,Job由多个Stage组成,Stage由多个Task组成。Stage是作业调度的基本单位。
在这里插入图片描述

  • RDD:是弹性分布式数据集(Resilient Distributed Dataset)的简称(Spark的基本数据结构),是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用。它是被分区的,一个RDD可存在多个分区中,每个分区分布在集群中的不同Worker Node上,从而让RDD中的数据可以被并行操作。

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

  • Cluster Manager:集群资源管理中心,负责分配计算资源。

  • Worker Node:工作节点,负责完成具体计算。

  • Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行Task,并为应用程序存储数据。

  • Application:用户编写的Spark应用程序,一个Application包含多个Job。

  • Driver Program:控制程序,负责为Application构建DAG图。

  • Stage:阶段,是作业的基本调度单位,一个job会分多个stage。

  • Task:任务,运行在Executor上的工作单元,是Executor中的一个线程

4.3、RDD(Spark的基本数据结构)

上面介绍了RDD的概念,总结:弹性分布式数据集。不可变、可分区、里面的元素可并行计算的集合
有2钟方式创建RDD

import pyspark
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("test").setMaster("local[4]")
sc = SparkContext(conf=conf)

# 法1:通过读取文件中的数据生成RDD
rdd = sc.textFile("hdfs://hans/data_warehouse/test/data")


# 法2:通过将内存中的对象并行化得到RDD
arr = [1,2,3,4,5]
rdd = sc.parallelize(arr)

创建了RDD后,便可对RDD做各种操作(2种):

  • 1、transformation:从已经存在的RDD创建一个新的RDD。transformation具有 Lazy 特性,即 Spark 不会立刻进行实际的计算,只会记录执行的轨迹,只有触发Action操作的时候,它才会根据 DAG 图真正执行。
  • 2、action:在RDD上进行计算后返回结果到 Driver。

这样一来,各种操作就确定了RDD之间的依赖关系了(窄依赖和宽依赖)。而依赖关系也就确定了DAG图,而DAG图也就指定了切割stage的方式。

  • 窄依赖:父RDD的一个分区只会被子RDD的一个分区依赖。如map操作。
  • 宽依赖:父RDD的一个分区会被子RDD的多个分区依赖,涉及Shuffle。如reducebykey操作。
    在这里插入图片描述

DAG会提交给DAGScheduler,DAGScheduler会把DAG划分成相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就切割stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。
在这里插入图片描述

4.4、Spark 架构

  • Spark集群由Driver, Cluster Manager(Standalone,Yarn 或 Mesos),以及Worker Node组成。
  • SparkContext是spark功能的主要入口。其代表与spark集群的连接,能够用来在集群上创建RDD、累加器、广播变量。每个JVM里只能存在一个处于激活状态的SparkContext,在创建新的SparkContext之前必须调用stop()来关闭之前的SparkContext。
  • 每一个Spark应用都是一个SparkContext实例,可以理解为一个SparkContext就是一个spark application的生命周期,一旦SparkContext创建之后,就可以用这个SparkContext来创建RDD、累加器、广播变量,并且可以通过SparkContext访问Spark的服务,运行任务。SparkContext设置内部服务,并建立与spark执行环境的连接。

在这里插入图片描述

  • pyspark只是在spark的外围包装了一个python api方便调用。在Driver端,借助Py4j实现Python和Java的交互,也就可以用python写spark应用程序了。在Executor端,则不需要借助Py4j,因为Executor端运行的Task逻辑是由Driver发过来的,那是序列化后的字节码。
    在这里插入图片描述

4.5、Spark 执行流程

  • 1、Application首先被Driver构建DAG图并分解成Stage。

  • 2、然后Driver向Cluster Manager申请资源。

  • 3、Cluster Manager向某些Work Node发送征召信号。

  • 4、被征召的Work Node启动Executor进程响应征召,并向Driver申请任务。

  • 5、Driver分配Task给Work Node。

  • 6、Executor以Stage为单位执行Task,期间Driver进行监控。

  • 7、Driver收到Executor任务完成的信号后向Cluster Manager发送注销信号。

  • 8、Cluster Manager向Work Node发送释放资源信号。

  • 9、Work Node对应Executor停止运行。

在这里插入图片描述

5、Spark 部署

在这里插入图片描述

6、PySpark简单实战(词频统计)

读取本地文件(当然也可hdfs)转成RDD,然后就可以进行各种操作了。

words.txt内容:
hello world
hello spark
spark love jupyter
spark love pandas
spark love sql

import findspark
# 作用就是初始化自动找到本机安装的spark和当前运行的python环境(也可以传参指定)
findspark.init()
import pyspark
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("test").setMaster("local[4]")
sc = SparkContext(conf=conf)
#%%
rdd_line = sc.textFile("./words.txt")
rdd_word = rdd_line.flatMap(lambda x:x.split(" "))
rdd_one = rdd_word.map(lambda t:(t,1))
rdd_count = rdd_one.reduceByKey(lambda x,y:x+y) # 分到同个组的词频相加。
rdd_count.collect()

输出:
[('world', 1),
 ('love', 3),
 ('jupyter', 1),
 ('pandas', 1),
 ('hello', 2),
 ('spark', 4),
 ('sql', 1)]






Reference

  • [1] 梁云大佬的: https://github.com/lyhue1991/eat_pyspark_in_10_days。也欢迎大家给梁云大佬点点关注,他的微信公众号叫:“算法美食屋”

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows本地提权 · 下篇

Windows本地提权&#xff0c;这种提权适用于有一本地个用户的基础上&#xff0c;有一定的权限&#xff0c;无法从webshell上进行提权 目录 BypassUAC提权 原理 关于UAC MFS绕过提权 UAC等级为低绕过测试 UAC等级为中绕过测试 UAC等级为高绕过测试 注意&#xff1a;bypa…

【综述】视频无监督域自适应(VUDA)的小综述

【综述】视频无监督域自适应&#xff08;VUDA&#xff09;的小综述 一篇小综述&#xff0c;大家看个乐子就好&#xff0c;参考文献来自于一篇综述性论文 链接&#xff1a;https://arxiv.org/abs/2211.10412 这次基于三篇有代表性的文章来讲解 X. Song, S. Zhao, J. Yang, H.…

第十篇、基于Arduino uno,用LCD1602(不带IIC的)显示屏显示字符——结果导向

0、结果 说明&#xff1a;可以在LCD1602屏幕上面显示字符&#xff0c;实时的变量&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;注意是不带IIC通讯的LCD屏幕&#xff0c;外形如下。 2、连线 说明&#xff1a;需要连接十几根线。 uno——…

#机器学习--深度学习中的优化

#机器学习--深度学习中的优化 引言1、神经网络优化中的挑战1.1、病态1.2、局部极小值1.3、高原、鞍点和其它平坦区域1.4、悬崖1.5、长期依赖、梯度消失与梯度爆炸1.6、非精确梯度1.7、局部和全局结构间的弱对应1.8、优化的理论限制 2、优化算法2.1、随机梯度下降&#xff08;SG…

macos wireshark 抓取https包

1、启动浏览器 1.1 创建空文件 $ touch /Users/zhujl/Downloads/https/mysslkey.log 2、设置wireshark tls属性&#xff0c;指定tls密钥存储文件 2.1 进入Wireshark Preferfences > Protocols > TLS 属性配置 2.2 勾选上Reassemable TLS records spanning multiple …

【网络编程】https协议——加密与窃密的攻防战

目录 一、https协议的介绍 二、加密和解密 1、加密和解密的过程 2、为什么需要加密和解密 3、常见的加密方式 3.1对称加密 3.2非对称加密 3.3数据摘要&#xff08;数据指纹&#xff09; 3.4数字签名 三、https加密解密的方式选择和中间人攻击的方式 1、只使用对称加…

JUC 高并发编程基础篇

JUC 高并发编程基础篇 • 1、什么是 JUC • 2、Lock 接口 • 3、线程间通信 • 4、集合的线程安全 • 5、多线程锁 • 6、Callable 接口 • 7、JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore • 8、读写锁: ReentrantReadWriteLock • 9、阻塞队列 • 10、ThreadPo…

Android12之MediaMetricsService服务(一百五十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

谷歌云 | 你需要知道的关于软件开发中的人工智能

【本文由 Cloud Ace 整理&#xff0c;Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌…

底层课程导学

目录 一、底层导学 1.课程回顾 2.嵌入式系统分层 3.Linux层次结构 二、ARM课该怎么学 1.课程内容 2.学习方法 三、计算机基础知识 1.计算机的进制 2.总线 四、ARM存储模型 1.三级存储结 五、CPU工作原理 1.CPU工作原理 2.指令的执行过程 3.地址空间 六、ARM体系结构 1.ARM处理器…

自动化测试实战项目(二)连连看外挂

自动化测试和做外挂的原理很相似&#xff0c;都是模拟用户的鼠标和键盘操作, 给自己的程序写自动化就是做测试&#xff0c;给别人的程序写自动化就是外挂了。 本文使用的技术也同样适用制作“对对碰”&#xff0c;"找茬" 之类游戏的外挂。 阅读目录 QQ连连看外挂实…

《面试1v1》垃圾回收机制

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 小伙子,跟我聊聊垃圾回收机制吧。什么是垃圾?怎么回收? 候选人&#xff1a; 好的面试官,来吧!垃圾就是那些不再被程序使用的对象。Java 通过…

Spring Boot定时任务

目录 1.概述 2.Spring Boot定时任务 2.1.快速使用 2.2.cron表达式 3.业务示例 3.1.业务描述 3.2.业务实现 4.实现原理 5.自定义线程池 1.概述 在某些业务场景中&#xff0c;需要定时执行一些任务&#xff0c;有可能是定时统计然后生成报表&#xff0c;有可能是定时发…

Python自定义函数

目录 1. 语法 2. 常见用法 2.1. 函数的返回值 2.2. 函数互相调用 3. 实战练习 3.1. 定义执行Linux命令的函数 1. 语法 #定义函数 def 函数名(参数1, 参数2):函数体(代码块)......#调用函数(定义函数时使用了参数&#xff0c;调用也必须使用参数) 函数名(参数1, 参数2) 定…

React学习6 路由

SPA的理解 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 什么是路由? 一个路由就是一个…

网络连接管理除了TCP三次握手,还有TCP四次挥手

网络连接管理除了TCP三次握手&#xff0c;还有TCP四次挥手 TCP三次握手&#xff0c;TCP四次挥手 网络连接管理除了TCP三次握手&#xff0c;还有TCP四次挥手TCP三次握手TCP四次挥手总结 TCP三次握手 网络通信建立连接&#xff0c;TCP会进行三次握手&#xff0c;三次握手主要是两…

【叠高高】叠蛋糕游戏的微信小程序开发流程详解

记得小时候玩过的搭积木游戏吗&#xff0c;和叠高高游戏原理差不多的&#xff0c;与之类似的还有盖高楼游戏&#xff0c;就是看谁盖的&#xff08;叠的&#xff09;最高&#xff0c;这里讲一下比较基础的叠高高游戏小程序实现过程&#xff0c;对编程感兴趣的同学可以参考学习一…

Linux Shell 实现一键部署Rust1.69

rust 前言 一门赋予每个人&#xff0c;构建可靠且高效软件能力的语言。 全世界已有数百家公司在生产环境中使用 Rust&#xff0c;以达到快速、跨平台、低资源占用的目的。很多著名且受欢迎的软件&#xff0c;例如 Firefox、 Dropbox 和 Cloudflare 都在使用 Rust。从初创公司…

网络安全工程师的入门学习路径,年薪30W不是梦!

最近看到网上有很多人在问诸如&#xff1a;“怎样成为网络信息安全工程师”等相关问题&#xff0c;这可能与近几年网络安全事件频发&#xff0c;国家对于互联网信息安全和互联网舆情的重视程度不断提升有关&#xff0c;网络信息安全工程师随之成为炙手可热的职业。 首先&#…

Web的基本漏洞--文件包含漏洞

目录 一、文件包含漏洞的介绍 1.文件包含漏洞的原理 2.常见的文件包含函数 3.文件包含漏洞的分类 本地文件包含漏洞 远程文件包含漏洞 3.文件包含漏洞的危害 4.文件包含漏洞的防范措施 5.文件包含漏洞的绕过手法 空字符绕过 超长字符绕过 一、文件包含漏洞的介绍 1…