首页 > 其他分享 >01_spark入门

01_spark入门

时间:2024-07-11 23:32:07浏览次数:14  
标签:01 入门 分区 Driver Yarn RDD Executor spark Spark

Spark

Spark 作为分布式计算框架,基于 MapReduce 框架开发,但是也有以下区别:

  • Spark 基于 Scala 语言开发,MR 基于 Java 语言开发;Scala 是函数式编程语言,对于函数间相互调用效率更高;而 Java 是面向对象语言,函数间调用必须依赖于对象,效率低。
  • MapReduce 核心是一次性计算,不适合迭代计算,因为中间结果必须存盘,后续步骤依赖于当前中间结果,会造成大量的磁盘IO,导致效率低;Spark 优化了执行逻辑,前一步执行的结果保存到内存而不是磁盘,所以可以提取出重复的步骤,封装成函数。
  • Spark 的 RDD(弹性分布式数据集)支持数据的自动缓存,使得重复的数据可以快速访问,无需重新从磁盘读取。
  • Spark 和 MapReduce 各有利弊,MapReduce 因为依赖于磁盘所以能够保证程序一定运行完毕,Spark 因为依赖于内存,可能会出现内存溢出等问题。
  • 如果旧项目是基于 Hadoop 的,现在需要迁移到 Spark,那么就可以使用 On Yarn 模型,基于 Yarn 调度。

img

Spark 内置模块:

img

  • Spark SQL:提供 HQL 与 Spark 进行交互处理的 API,每个数据表当作一个 RDD,Spark SQL 查询被转化为 Spark 操作;
  • Spark Streaming:对实时数据流进行处理和控制;
  • MLib:机器学习算法库;
  • Graphix:控制图、并行图操作和计算的一组算法和工具的集合;
  • Spark Core:底层 RDD API基础库,其他模块都会依赖;

RDD

RDD(Resilient Distributed Datasets,弹性分布式数据集)在 Spark 计算过程中扮演重要的角色。Spark 的计算任务始于 SparkContext 上下文对象,它负责资源的申请、任务的调度以及 RDD 的管理和创建。

RDD 特点

RDD 具有以下特点:

  • 每个 RDD 都是只读的,是分布在集群中的只读对象的集合;
  • 一个 RDD 由多个 Partition 分区组成,每个分区可能分布在不同节点的内存中;
  • RDD 之间可以执行转换操作,转换但是不计算,每次计算后的结果都需要保存为新的 RDD;

RDD 操作

RDD 主要包含了以下两种方法,通过两种方法不断对数据处理保存,最终实现高效、可靠的大数据处理任务:

  • 转换算子:
    • 将 Scala 集合或者 Hadoop 输入数据构造一个新的 RDD;
    • 通过已有的 RDD 产生新的 RDD;
    • 惰性执行,只记录转换关系不执行计算;
    • 常见操作包括 map、filter、flatmap、union、distinct、sortbykey
  • 动作算子:
    • 通过 RDD 计算得到新的一组值;
    • 触发真正的计算;
    • 常见操作包括 first、count、collect、foreach、saveAsTextFile 等;

比如 rdd.map(_+1).saveAsTextFile("hdfs://node01:9000") 操作,map 对应转换,saveAsTextFile 对应计算。

RDD 依赖

RDD 中区分宽窄依赖,因为宽依赖回复起来速度很慢。

img

窄依赖:

  • 父 RDD 中分区最多被一个子 RDD 分区使用;
  • 子 RDD 如果部分分区数据丢失或损坏,只需要从父 RDD 重新计算恢复;
  • 窄依赖可以并行地生成子 RDD 的分区,使得任务可以在多个节点上并行执行;
  • 常见操作如 map、filter、union、sample

img

宽依赖:

  • 主要发生在需要跨分区的数据重组或者聚合操作;
  • 子 RDD 分区依赖 父RDD 的所有分区;
  • 子 RDD 如果部分或者全部分区数据丢失或损坏,必须从所有父 RDD 分区重新计算;
  • 宽依赖会导致数据在不同的分区间进行洗牌,数据需要重新分配到不同的分区,涉及到大量的数据移动和 IO 操作,执行宽依赖时性能可能会受到影响;
  • 例如:groupByKey、reduceByKey、sortByKey、join

举个例子

img

  • 首先通过 SparkContext 上下文对象加载 HDFS 某个目录下的文件;
  • 针对每一行数据按照分表符切分成多个单词,得到新的单词集合;
  • 对每个单词执行 map 处理,具体就是标记次数为 1;
  • 按照 Key 值执行 Reduce 处理,将 Key 相同的所有 Value 累加求和;(代码中的 _ 是 Scala 语法中的占位符)
  • 将最终结果保存到 HDFS 下的文件目录。

由于每个阶段都会保存新的 RDD,所以如果某阶段计算失败,就可以利用上一个步骤的 RDD 结果重新执行计算,而不需要从源头开始计算。

Spark 程序

程序架构

Spark 也是主从架构,包含管理节点 Master、工作节点 Worker。
img

img

  • 构建运行环境,Driver 创建 SparkContext 上下文;
  • SparkContext 向资源管理器(standalone、Mesos、Yarn)申请 Executor 资源,资源管理器启动 StandaloneExecutorBackend
  • Executor 向 SparkContext 申请 Task;
  • RDD 对象构建成 DAG 图,DAG Scheduler 将 DAG图解析为 Stage,每个 Stage 对应一个 TaskSet,然后将其发送给 TaskScheduler,由 TaskScheduler 调度发送给 Executor 运行;
  • Task 在 Executor 运行完毕后释放资源;

Spark 作业运行模式

Local 模式:

Spark 应用以多线程方式运行在本地,方便调试。

  • local:启动一个 Executor;
  • local[k]:启动 k 个 Executor;
  • local[*]:启动 CPU 核数个 Executor;

standalone 模式:

分布式集群运行,不依赖于第三方资源管理系统(Yarn、Mesos等)。

  • 采用 Master-Slave 结构;
  • Driver 运行于 worker,Master 只负责集群管理;
  • Driver 向 Master 申请作业运行所需资源,Master 分配 Executor 给 Driver;
  • Driver 将解析后的 Task 调度到 Executor 上运行,并且不间断监听运行情况,汇报给 Master;
  • 整体架构类似于 Yarn,其中 Master——ResourceManagerDriver——ContainerExecutor——ApplicationMaster
  • 为了避免 Master 单点故障,由 Zookeeper 负责 Master 节点集群高可用。

Spark On Yarn:

分布式部署集群、资源、任务监控由 Yarn 管理,目前仅支持粗粒度资源分配方式。

img

这种模式的工作流程:

  • Driver 解析 Spark 数据生成一定量的 Task,然后需要开始申请 Hadoop 资源;
  • 但是 Dirver 无法申请,需要借助 ApplicationMaster 申请,所以在 Driver 外部套用一个 ApplicationMaster 用作资源申请;
  • ApplicationMaster 通过向 ResourceManager 申请 Container 资源,到手后通知 Driver;
  • Driver 将解析好的作业分发到 Container 节点上运行。

Yarn 包括 Yarn-Client(适用于交互和调试)、Yarn-Cluster(适用于生产环境)两种模式。

程序执行及底层逻辑

生成逻辑执行计划

通过 Scala 语言编写 Spark 逻辑查询计划:

sc.textFile(inputArg)
  .flatMap(_.split("\t"))
  .map((_,1))
  .reduceByKey(_+_)
  .saveAsTextFile(outArg)

上述是一个 WordCount 程序的逻辑执行计划,每个阶段会生成一个单独的 RDD。

img

生成物理执行计划

物理查询计划关注于底层数据状态:

  • 如图一个 RDD 有 4个 Partition,那么前三个 RDD 步骤作用于 RDD 迭代变换;这三个步骤可以划分到一个 Stage,因为可以多个分区并行执行(生成 4 个任务分别调度到不同计算节点);
  • 接着第四个 RDD 步骤需要进行 shuffle,所以需要单独划分 Stage(可以生成 3个任务调度到不同计算节点上运行);

img

任务调度与执行

将各个阶段生成的 Task 调度到 Executor 上运行,执行过程中会不停向 Driver 汇报进度。

img

标签:01,入门,分区,Driver,Yarn,RDD,Executor,spark,Spark
From: https://www.cnblogs.com/istitches/p/18297360

相关文章

  • 快速入门算法竞赛必修课(cpp)--stl库的使用
    stl目录向量vector常用方法构造动态二维数组尾接&尾删获取长度清空改变长度获取下标.erase(pos).begin().end().front().back()适用情形注意事项提前指定长度当心size_t溢出栈stack常用方法适用情形注意事项不可访问内部元素!下面都是错误用......
  • 机械学习—零基础学习日志012(自然对数e)
    学习《机械学习》时,发现基础薄弱的自己,对自然对数e不甚了解,所以,做了一些资料搜索与汇总。自然对数e的由来最开始起源于复利。如果你现在有100元,存在银行,一年以后,返回给你200元,也就是利润翻了一倍。可以记为:如果银行现在的政策是,随时存,随时取,而且利息为,存放时间除以一年。以......
  • Java基础01:注释
    Java注释主要有三种类型:单行注释多行注释文档注释单行注释单行注释以双斜杠//开始://这是一个单行注释intx=10;//初始化一个变量x为10多行注释多行注释以/*开始,以*/结束:/*这是一个多行注释可以用来注释多行代码*/inty=20;//初始化一个变量y为20......
  • ssm校园短期闲置资源置换平台(10141)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 毕业生就业信息统计系统(10166)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 【粉丝福利社】SQL语言从入门到精通(文末送书-进行中)
    ......
  • 【SpringBoot框架】-- 快速入门
    目录1.spring简介1.1springboot快速入门1.1.1开发步骤1.1.2创建项目2.springboot的特点3.配置文件种类4.读取配置文件中的内容4.1 @ConfigurationPropertie4.2  @Value5.profile多环境配置 6.springboot注册web组件7.springboot包扫描的原理8.spr......
  • C++入门——“命名空间”、“缺省参数”、“函数重载”、“引用”
    C++在C语言的基础上增加了许多东西,在我看来,它和它的名字一样,是C语言的Plus的Plus版本,而且支持C语言的大部分语法,让码农写起来很是别有一番韵味。在这里向大家介绍C++的一些语法结构。一、命名空间    在进行C语言的开发当中,随着代码量的增加,或者工程变得复杂,我们进行......
  • 卡尔曼滤波Kalman Filter零基础入门到实践(上部)
    参考视频:入门(秒懂滤波概要)_哔哩哔哩_bilibili一、入门1.引入假设超声波距离传感器每1ms给单片机发数据。理论数据为黑点,测量数据曲线为红线,引入滤波后的数据为紫线引入滤波的作用是过滤数据中的噪声,使信号更趋于真实值。2.卡尔曼滤波适用系统卡尔曼滤波适用于线性高斯......
  • day01-Spring
    学习目标能够说出Spring的体系结构能够编写IOC入门案例能够编写DI入门案例能够配置setter方式注入属性值能够配置构造方式注入属性值能够理解什么是自动装配一、Spring简介1Spring课程介绍问题导入我们为什么要学习Spring框架?1.1为什么要学Spring技术是Java......