Spark 分布式计算原理

Spark Shuffle

1)在数据之间重新分配数据
2)(将父RDD重新定义进入子RDD)每一个分区里面的数据要重新进入新的分区
3)每一个shuffle阶段尽量保存在内存里面,如果保存不下到磁盘
4)在每个shuffle阶段不会改变分区的数量

RDD的依赖关系-1(lineage)

1) 宽依赖:一个夫RDD的分区被子RDD的多个分区使用
发生宽依赖一定shuffle()
(相当于超生)
2) 窄依赖:一个父RDD的分区被子RDD的一个分区使用

RDD的依赖关系-2(lineage)?? 宽依赖对比窄依赖

DAG工作原理

  • 根据RDD之间的依赖关系,形成一个DAG(有向无环)
1)从后往前,遇到宽依赖切割为新的Stage
2)每个Stage由分区一组并行的Task组成
每个Task共享归类内存,堆外内存Task数据在进行交换
提前聚合,避免shuffle,将数据先进行去重

RDD持久化-1

cache:

  • 间数据写入缓存
  • cache()不能再有其他的算子
val rdd=sc.makeRDD(1 to 10)
val rdd2=rdd.map(x=>{println(x);x}
rdd2.cache
rdd2.collect

RDD共享变量-1

  • 广播变量(要定义的是Array)
val rdd=sc.makeRDD(1 to 10)
val j=sc.broadcast(Array(0))
rdd.map(x=>{j.value(0)=j.value(0)+1;println(j.value(0));x}).collect

RDD共享变量-2

  • 累加器:只允许added操作,常用于实现计数
val accum = sc.accumulator(0,"My Accumulator")
sc.parallelize(Array(1,2,3,4)).foreach(x=>accum+=x)
accum.value

RDD分区设计

  • 分区大小限制为2GB
分区太小
1)分区承担的责任越大,内存压力越大
分区过多
1)shuffle开销越大
2)创建任务开销越大

装载CSV数据源

方法一:使用SparkContext
System.setProperty("hadoop.home.dir", "D:\\hadoop-2.7.3")//防止hadoop报错val conf=new SparkConf().setMaster("local[2]").setAppName("hello")val sc=SparkContext.getOrCreate(conf)
val lines = sc.textFile("file:///d:/users.csv")
val fields = lines.mapPartitionsWithIndex((idx, iter) => if (idx == 0) iter.drop(1) else iter).map(l => l.split(",")).foreach(x=>println(x.toList))
————————————————————————————————————————————————————————————————————————————————————————————————
方法二:使用SparkSession
val df = spark.read.format("csv").option("header", "true").load("file:///home/kgc/data/users.csv")

装载JSON数据源

方法一:使用SparkContext
val lines = sc.textFile("file:///home/kgc/data/users.json")
//scala内置的JSON库
import scala.util.parsing.json.JSON
val result=lines.map(l=>JSON.parseFull(l))
————————————————————————————————————————————————————————————————————————————————————————————————
还有一种使用SparkSession方法:API
var spark=SparkSession.builder().master("local[2]").appName("hello").getOrCreate();val rdd=spark.read.json("file:///d:/date.json")print(rdd)
————————————————————————————————————————————————————————————————————————————————————————————————
方法二:使用SparkSession
val df = spark.read.format("json").option("header", "true").load("file:///home/kgc/data/users.json")

RDD数据倾斜*

  • 数据分配的不均匀
  • 通常发生在groupBy,join等之后
1)在执行shuffle操作的时候,是按照key,来进行values的输出、拉取和聚合2)同一个key的values,一定是分配到一个reduce task进行处理的
3)如果是很多相同的key对应的values被分配到了一个task上面去执行,而另外的task,可能只分配了一些
4)这样就会出现数据倾斜问题

解决方法:

方案一:聚合源数据
通过一些聚合的操作,比如grouByKey、reduceByKey就是拿到每个key对应的value,对每个key对应的values执行一定的计算
方案二:过滤导致倾斜的key
在sql中用where条件,过滤某几个会导致数据倾斜的key

——————————————————————————————————————————————————

为什么要划分Stage

spark划分stage思路:
1)从后往前推,一个job拆分为多组task,每组的任务被称为一个stage
2)stage里面的Task的数量对应一个partition,而stage又分为两类,一类是shuffleMapTask,一类是resltTask,DAG的最后一个阶段为每个partition生成一个resultask,其余阶段都会生成ShuffleMapTask,他将自己的计算结果通过shuffle传到下一个stage中。

——————————————————————————————————————————————————

转载于:https://www.cnblogs.com/tudousiya/p/11285866.html

Spark 分布式计算原理相关推荐

  1. Spark分布式计算原理

    Spark分布式计算原理 一.RDD特征 1.Lineage:血统.遗传 2.依赖关系 二.DAG(有向无环图)工作原理 三.Spark Shuffle过程 四.RDD持久化 1.RDD缓存机制 2. ...

  2. 2020.11.10课堂笔记(Apache Spark 分布式计算原理)

    Spark WordCount运行原理 一.RDD的依赖关系 为什么需要划分Stage 数据本地化- 移动计算,而不是移动数据 保证一个Stage内不会发生数据移动 Lineage:血统.遗传 RDD ...

  3. spark启动的worker节点是localhost_Spark大数据在线培训:Spark运行原理解析

    在大数据技术框架当中,Spark是继Hadoop之后的又一代表性框架,也是学习大数据当中必学的重点技术框架.在这些年的发展当中,Spark所占据的市场地位,也在不断拓展.今天的Spark大数据在线培训 ...

  4. Spark工作原理入门

    Spark工作原理入门 文章目录 Spark工作原理入门 1.功能概要 基本描述 运用场景 实际使用 2.模块组成 HDFS MLlib Mesos Tachyon GraphX Spark SQL ...

  5. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...

  6. .Spark Streaming(上)--实时流计算Spark Streaming原理介

    Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...

  7. Spark SQL原理及常用方法详解(二)

    Spark SQL 一.Spark SQL基础知识 1.Spark SQL简介 (1)简单介绍 (2)Datasets & DataFrames (3)Spark SQL架构 (4)Spark ...

  8. 深入理解Spark SQL原理

    1.前言   本文是对自己阅读Spark SQL源码过程的一个记录,主线是对尚硅谷Spark SQL最后练习中建立的表的一个简单SQL编写的源码实现流程的跟读.通过自问自答的方式,学习完了整个Spar ...

  9. Spark 核心原理

    文章目录 1. Spark核心原理 2. 消息通信原理 2.1. Spark运行时消息通信 2.2. 作业执行原理 2.2.1. 总述 2.2.2. 提交Job 2.2.3. 划分stage 2.2. ...

最新文章

  1. SXS完全查杀+预防方案2
  2. 阿里云胡晓明:未来5-10年将和中国移动互为生态
  3. NSIS 刷新ICO缓存
  4. CodeForces - 375D Tree and Queries(树上启发式合并)
  5. [工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据
  6. 如何在一个页面添加多个不同的kindeditor编辑器
  7. 2011年想要惊喜的5z20
  8. CCF201803-4 棋局评估(100分)【博弈+DFS】
  9. python可以给你干什么-Python可以用来做什么 为你揭开python神秘面纱
  10. SVN文件夹对号图标(更新、冲突等)不显示
  11. [美国]《冰雪奇缘》[BD-RMVB.720p.中英双字][2013年高分获奖][奥斯卡提名动画片]
  12. Arm linux开发板移植OpenSSH
  13. 火狐Firefox安装屏蔽广告插件ublock origin方法
  14. 淘东电商项目(27) -门户登出功能
  15. CSS字体如何设置字体变小,为什么设置不了字体变小?
  16. 计算机组成原理实验 实验一 存储器实验
  17. zip格式压缩和解压缩(支持中文和文件嵌套解压缩)
  18. 深度拆解高爷家:单品年销过亿的国产猫粮是怎么炼成的?
  19. PyQt5使用记录之三 —— MVD模式中的委托定义与使用
  20. Android UI框架概览

热门文章

  1. mysql并发更新数据,多用户并发修改数据解决方案。
  2. 知识图谱中传统关系抽取方法
  3. python的print格式化输出,以及使用format来控制。
  4. NLP.TM | GloVe模型及其Python实现
  5. 操作系统学习笔记 第一章:操作系统概述(王道考研)
  6. Ascend Pytorch算子适配层开发
  7. 嵌入式传感器是智能移动增长的关键
  8. idea中设置指向源代码Scala
  9. Android 金钱计算BigDecimal 的使用
  10. Android switchCompat. 和 Switch