一,必备知识

  1.1 经典14问

  1.2 问题前提

二,序列化问题

  2.1 Spark序列化出现情况

  2.2 Spark序列化问题解决

三,线程安全问题

  3.1 Spark线程安全出现情况

  3.2 Spark线程安全问题解决

正文

一,必备知识

  1.1 经典14问

1.SparkContext哪一端生成的?Driver端2.DAG是在哪一端被构建的?Driver端3.RDD是在哪一端生成的?Driver端4.广播变量是在哪一端调用的方法进行广播的?Driver端5.要广播的数据应该在哪一端先创建好再广播呢? Driver端6.调用RDD的算子(Transformation和Action)是在哪一端调用的Driver端7.RDD在调用Transformation和Action时需要传入一个函数,函数是在哪一端声明和传入的?Driver端8.RDD在调用Transformation和Action时需要传入函数,请问传入的函数是在哪一端执行了函数的业务逻辑?Executor中的Task执行的9.自定义的分区器这个类是在哪一端实例化的?Driver端10.分区器中的getParitition方法在哪一端调用的呢?Executor中的Task中调用的11.Task是在哪一端生成的呢? Driver端12.DAG是在哪一端构建好的并被切分成一到多个State的Driver端13.DAG是哪个类完成的切分Stage的功能?DAGScheduler14.DAGScheduler将切分好的Stage以什么样的形式给TaskSchedulerTaskSet

  1.2 需求前提

  在上面的12问的7-8问中,函数的申明和调用分别在Driver和Execute中进行,这其中就会牵扯到序列化问题和线程安全问题。接下来会对其进行解释。

二,序列化问题

  2.1 Spark序列化出现情况

  工具类:

package cn.edu360.spark05// 随意定义一工具类
class MyUtil {def get(msg: String): String ={msg+"aaa"}
}

  Spark实现类:

package cn.edu360.spark05
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDDobject SequenceTest {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setAppName("ScalaWordCount").setMaster("local[3]")var sc = new SparkContext(conf)val lines: RDD[String] = sc.textFile("hdfs://hd1:9000/wordcount/input/")val words = lines.flatMap(_.split(" "))// 对类进行实例化val util = new MyUtil// 调用实例的方法val value: RDD[String] = words.map(word => util.get(word))value.collect()sc.stop()}
}

  报错信息如下:

  

  

  上述报错信息就说明是MyUtil实例的序列化问题。该实例是在Driver端创建,通过网络发送到Worker的Executer端。但是这个实例并为序列化,所以会报这些错误。

  2.2 Spark序列化问题解决

  解决方案一:实现序列化接口

package cn.edu360.spark05// 继承Serializable
class MyUtil extends Serializable {def get(msg: String): String ={msg+"aaa"}
}

  弊端:需要自己实现序列化接口,相对麻烦

  解决方案二:不实现序列化接口,在Executer进行MyUtil内进行实例化

package cn.edu360.spark05
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDDobject SequenceTest {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setAppName("ScalaWordCount").setMaster("local[3]")var sc = new SparkContext(conf)val lines: RDD[String] = sc.textFile("hdfs://hd1:9000/wordcount/input/")val words = lines.flatMap(_.split(" "))val value: RDD[String] = words.map(word => {// 在这里进行实例化,这里的操作是在Executer中val util = new MyUtilutil.get(word)})val result: Array[String] = value.collect()print(result.toBuffer)sc.stop()}
}

  弊端:每一次调用都需要创建一个新的实例,浪费资源,浪费内存。

  解决方案三:采用单例模式

  MyUtil类:

package cn.edu360.spark05// 将class 改为 object的单例模式
object MyUtil {def get(msg: String): String ={msg+"aaa"}
}

  Spark实现类:

package cn.edu360.spark05
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDDobject SequenceTest {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setAppName("ScalaWordCount").setMaster("local[3]")var sc = new SparkContext(conf)val lines: RDD[String] = sc.textFile("hdfs://hd1:9000/wordcount/input/")val words = lines.flatMap(_.split(" "))val value: RDD[String] = words.map(word => {// 调用方法
            MyUtil.get(word)})val result: Array[String] = value.collect()print(result.toBuffer)sc.stop()}
}

三,线程安全问题

  3.1 Spark线程安全出现情况、

  有共享成员变量:

    1. 工具类使用object,说明工具类是单例的,有线程安全问题。在函数内部使用,是在Executer中被初始化,一个Executer中有一个实例,所以 就出现了线程安全问题。

    2. 工具类使用Class,说明是多例的,没有线程安全问题。每个task都会持有一份工具类的实例。

  没有共享成员变量:

    1. 工具类Object,没有线程安全问题

    2. 工具类使用class,实现序列化即可

  3.2 Spark线程安全问题解决

    工具类优先使用object,但尽可能不使用成员变量,若实在有这方面的需求,可以定义类的类型,或者把成员变量变成线程安全的成员变量,例如加锁等。

转载于:https://www.cnblogs.com/tashanzhishi/p/10994834.html

Spark 学习(六) Spark 的线程安全和序列化问题相关推荐

  1. Spark学习之Spark调优与调试(7)

    Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...

  2. Spark学习之Spark Streaming(9)

    Spark学习之Spark Streaming(9) 1. Spark Streaming允许用户使用一套和批处理非常接近的API来编写流式计算应用,这就可以大量重用批处理应用的技术甚至代码. 2. ...

  3. Spark学习之Spark Streaming

    一.简介 许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用,还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它 ...

  4. Spark学习之Spark初识

    一.什么是Spark Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎.Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Had ...

  5. Spark学习之Spark RDD算子

    个人主页zicesun.com 这里,从源码的角度总结一下Spark RDD算子的用法. 单值型Transformation算子 map /*** Return a new RDD by applyi ...

  6. Spark学习之spark集群搭建

    (推广一下自己的个人主页 zicesun.com) 本文讲介绍如何搭建spark集群. 搭建spark集群需要进行一下几件事情: 集群配置ssh无秘登录 java jdk1.8 scala-2.11. ...

  7. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  8. Spark学习:spark读取HBase数据报异常java.io.NotSerializableException

    1.准备工作,安装好HABSE之后,执行Hbase shell create '表名称', '列名称1','列名称2','列名称N' create '表名称','列族名称' 在hbase中列是可以动态 ...

  9. Spark学习笔记 --- Spark Streaming 与 Stom 比较

    对比点 Storm

  10. sparkcore分区_Spark学习:Spark源码和调优简介 Spark Core (二)

    本文基于 Spark 2.4.4 版本的源码,试图分析其 Core 模块的部分实现原理,其中如有错误,请指正.为了简化论述,将部分细节放到了源码中作为注释,因此正文中是主要内容. 第一部分内容见: S ...

最新文章

  1. 解决达梦数据库新增大字段报错问题
  2. python杨辉三角居中center_python经典---杨辉三角(两种方法)
  3. midi api java_Java声音api – 扫描MIDI设备
  4. Arts 第十八周(7/15 ~ 7/21)
  5. 传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)
  6. mysqldump文件中有SET @@SESSION.SQL_LOG_BIN= 0;解决方法
  7. 计算机视觉基础——本质矩阵与基本矩阵(Essential and Fundamental Matrices)
  8. linux开启IOMMU方法
  9. python 系统策略禁止这个安装_电脑无法安装软件提示设置了系统策略禁止此项安装怎么办?...
  10. C++多继承构造和析构顺序
  11. 从 SGD 到 Adam —— 深度学习优化算法概览(一) 重点
  12. pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型
  13. [APIO2009]抢掠计划 ($Tarjan$,最长路)
  14. OpenCV探索之路(十六):图像矫正技术深入探讨
  15. 建议收藏,10个Windows系统装机必备软件,相见恨晚!
  16. 电路基础-二阶(second -order) 电路
  17. 嵌入式知识图谱WiKi(嵌入式开发/研发入门教程和路线图)
  18. 汉字转语音 android 软件,文字转语音助手
  19. 科学家发明创可贴式MP3靠人体热量工作
  20. 案例分析|人工智能产品带来的用户价值

热门文章

  1. python - 2 8 16进制/颜色/字符编码
  2. 【2017-12-12】Winform----Datagirdview使用
  3. 使用代理进行界面之间的反向传值
  4. C#基础概念之延迟加载
  5. 不能比较或排序text、ntext和image数据类型,除非使用IS NULL 或 LIKE 运算符。
  6. UCSB微软提出VIOLET,用Masked Visual-token Modeling进行端到端的视频语言学习!性能SOTA...
  7. 大道至简,仅需4行代码提升多标签分类性能!ICCV21 南大提出Residual Attention
  8. NAS新突破,仅需半个 GPU day 即可训练出高性能架构!阿里提出 Zen-NAS
  9. 直播 | 智能仓库:端侧 AI 和 OpenVINO 落地实践
  10. 免费数学神器Mathpix发布移动版,一起来写更快的公式