我是靠谱客的博主 谦让大米,最近开发中收集的这篇文章主要介绍spark-core相关知识点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

摘要

四个部分, 难度递增

  1. Spark基础
  2. RDD基础
  3. job的生成和提交
  4. 常用算子, 重点在于ActionTransformation算子的区分, 以及是否触发shuffle

概述

Spark特点

  1. 速度快. 以Hadoop的MapReduce为基准, Spark比MR快100倍
  2. 易用. 提供了Java, Scala, Python的API, Python和Shell的交互式界面, 80多种算子
  3. 通用. 批处理, 交互式查询, 实时流处理, 机器学习和图计算
  4. 兼容性. 可以在Hadoop上运行Spark, Spark也有自己的集群

Spark核心组件

SparkCore: 数据抽象RDD, 提供了StandAlone模式
SparkStream: 实时流处理
SparkMLlib: 机器学习库
SparkGraphX: 图计算

Spark和MR

  1. MR只有简单的map和reduce逻辑, Spark有80多种算子, 而且Spark支持流式处理, 机器学习和图计算. 功能更为强大
  2. MR处理复杂数据需要设计多个MR, 依次进行; Spark借助多job在内存中依次进行
  3. MR计算结果会持久化到磁盘, Spark在内存中保留缓存. Spark速度更快
  4. Spark借助RDD实现了高容错性, MR遇到错误只能重新计算
  5. MR逻辑简单, 稳定性强, 适合后台长期运行; Spark需要调优

Spark启动

  1. start-all, 先启动Master, Master找到slaves配置文件, 依次启动Worker
  2. Worker到Master进行注册
  3. Master将Worker信息保存到磁盘和内存, 返回注册成功的信息
  4. Worker开始给Master发送心跳包, Master持续更新心跳信息
启动细节
  1. Spark和Hadoop的sbin包中都有start-all.shstop-all.sh, 在添加到环境变量时需要注意
  2. Spark分布式默认需要1G以上的内存, 所以搭建环境时, 对应的yarn节点内存必须2G及以上

RDD

概述: 处理大数据的核心思路就是分割.
spark不仅切分了数据, 而且将数据处理的流程也进行了切分
全部分区数据的每部分计算以及计算结果, 就是一个RDD

特性

  1. 数据抽象. 不实际存储数据
  2. 分布式. 数据存储位置, 以及计算过程都在分布式系统中
  3. 不可变. RDD一旦生成, 数据和依赖关系就不可更改
  4. 容错. 借助依赖关系, RDD出错时只需要重新计算出错的那部分数据
  5. 弹性. 存储位置可内存可硬盘, 高容错等
弹性体现
  1. 自动进行内存和磁盘数据存储的切换
  2. 基于血统的高效容错机制
  3. Task如果失败, 会自动进行特定次数的重试
  4. Stage如果失败会自动进行特定次数的重试
  5. Checkpoint可以主动或被动触发
  6. 数据调度弹性

属性

  1. 分区信息(计算哪部分数据)
  2. 该分区的计算规则(怎么计算)
  3. 对其它RDD的依赖(此次计算在整个流程中处于什么位置)
  4. [可选]分区器, 默认是HashPartitioner, 也可以自定义
  5. [可选]优先位置列表. 决定task在哪个节点上运行

Job生成和提交逻辑

  1. Action算子触发Job的生成; 根据RDD的依赖关系构建DAG(有向无环图)
  2. 以宽依赖作为分割依据, DAG被进一步细分为多个Stage. 每个Stage根据分区数生成对应数量的Task
  3. TaskScheduler(调度器)根据先到先得(FIFO), 或公平调度原则, 根据资源情况将Task调度到Executor
  4. Worker开启Executor进程, Executor进程将Task分配给线程池
Job提交
  1. 客户端作为Driver, 先启动SparkSubmit进程, 开始和Master通信, 此时也生成了SparkContext对象,
  2. Master收到请求, 寻找空闲的Worker, 并分配相应资源
  3. Worker领取任务, 并启动Executor. Exextor启动后反向注册到Dirver
  4. DriverExecxtor提交具体的计算规则, Execxtor进行计算
  5. Executor将计算结果返回Worker

常用算子

算子分为Transformation算子和Action算子
一般而言, 方法返回值为RDD的属于Transformation算子

Action算子会触发Job的生成, Action算子对应的RDD也会被封装为finalStage.
除了Action算子之外, 触发shuffleTransformation算子也会产生Stage划分

Action算子

名称功能
reduce聚合为单元素
aggregate可以转换数据类型, 类似于combineByKey
count计数
first取首位元素
take取指定位元素
collect聚合为集合
foreach遍历
foreachPartition以分区为单位遍历
saveAsTextFile存储为text文件

Transformation算子

Transformation算子大致上可以分为两类,

  1. map相关, 是对数据的重新映射, 底层调用了new MapPartitionsRDD. 不触发shuffle
  2. reduce相关, 是对数据的聚合, 底层调用了combineByKeyWithClassTag. 会触发shuffle
  3. join相关的方法, 一般都是调用了cogroup, 进而调用了mapValues.
    总而言之, 重新映射的方法底层都是map. 但是像join类这样, 可以在参数中直接指定partitioner的, 都视为可以触发shuffle
触发shuffle

values聚合方法

名称功能
distinct
groudByKey唯一一个在分区内部不聚合的, 避免使用
reduceByKey无初始值, 聚合values
flotByKey指定初始值, 初始值必须和values类型保持一致
aggregateByKey可以分别指定分区聚合逻辑和整体聚合逻辑
combineByKey更为底层的聚合算子, 可以变换数据类型

连接查询

名称功能
leftOuterJoin左外连接
rightOuterJoin右外连接
join内连接
cogroup全外连接
intersection求交集, 去重
repartition重新分区, 默认开启shuffle
coalesce分区多变少可以不shuffer
subtract移除一个RDD中的内容

其它

名称功能
sortByKeynew ShuffledRDD
sortBykeyBy + sortByKey + values
不触发shuffle

map相关方法

名称功能
map映射, 转换数据集
mapPartition以分区为单位的map, 速度快但是耗费内存
mapPartitionWhitIndex自带分区信息
flatMap映射(map)并压平flatten
mapValues只映射转换values
keyBy指定键
filter过滤

其它

名称底层
unionnew UnionRDD

最后

以上就是谦让大米为你收集整理的spark-core相关知识点的全部内容,希望文章能够帮你解决spark-core相关知识点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部