Spark闭包,序列化,多线程、线程抢占(线程不安全)问题

线上Spark处理Bzip2引出Hadoop Bzip2线程安全问题 我们的Hadoop生产环境有两个版本,其中一个是1.0.3,为了支持日志压缩和split,我们添加了hadoop-1.2中关于Bzip2压缩的feature. 一切运行良好。 为了满足公司对迭代计算的需求(复杂HiveSQL,广告推荐算法,机器学习 etc), 我们构建了自己的Spark集群,最初是Standalone Mode,版本spark-0.9.1,支持Shark。 上线后,问题接踵而 阅读详情
方案一
new Object(); // 需要实现序列化

map(x=>{
	引用外边Object
})

结果
同一个Executor不同线程调用的Object为同一个
但是 多个Executor 之间不是同一个,

Object先在driver创建 然后序列化,然后在Executor里反序列化
--------------------------------

方案二
new Class(); // 需要实现序列化

map(x=>{
	引用外边Class
})
结果
每个线程中的Class都是一个新的。
Object先在driver创建 然后序列化,然后在Executor里反序列化
--------------------------------

方案三
map(x=>{
	内部创建Object(不需要序列化)
})
结果
同一个Executor不同线程调用的Object为同一个
但是 多个Executor 之间不是同一个
Object在Executor里创建,不在Driver端创建
--------------------------------

方案四
map(x=>{
	内部创建Class(不需要序列化)
})
结果
每次map中没循环一次都是一个新的
Object在Executor里创建,不在Driver端创建

 精华:

问题:如果一个公用的类 我们到底是用class还是object,是放到里边还是放到外边???????

解答:
1、如果用object,无论放在内部调用还是外部调用 ,同一Executor中多个并行task(多个线程)是用的同一个对象。会有多线程的问题(线程抢占),访问同一个公共资源容易出问题,所以需要加锁(synchronized)或者使用线程安全的对象(其实现方式也是加锁)。这样会影响效率。但是如果这个公用的类只用来读取他本身的数据,不进行修改操作。那就可以用这两种方式


2、如果用class,无论放在内部调用还是外部调用 ,同一Executor中多个并行task(多个线程)是用的不是同一个对象。不会有多线程的问题(线程抢占)。所以如果这个公用的类需要处理的逻辑很复杂,我们就用这两种。

3、如果用 class放在内部 一定要用mapPartitions()而不要用map(),前者每个分区创建一次,后者每次循环创建一次。

总结:

1、公共的类只是定义了一些成员变量用来读取,或者没有定义任何的成员变量,全是内部方法的局部变量。那么用方案三 内部创建Object(不需要序列化,不会出现线程问题)

2、公共的类逻辑复杂,其中的多个方法调用相同的成员变量,那么需要用方案二,如果又不好放在外部只能放在内部,那么需要用方案四的升级版  map===>mapPartitions,foreach===>foreachPartition

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

相关推荐

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01

算法设计

weixin_49199313的博客 1503

浅谈Spark

本次分享案例参考厦门大学数据库实验室。

欢迎来到我的小家 632

Spark调优多线程并行处理任务实现方式

主要介绍了Spark调优多线程并行处理任务实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Spark程序执行过程中遇到的线程安全问题及解决办法

caiyefly的博客 3467

用gm/Id方法设计简单折叠式共源共栅放大器

gm/Id

qq_45541367的博客 2万+

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

大数据之spark_spark中的线程安全问题

Task多线程问题 问题原因 一个Executor是一个进程,一个进程中可以同时运行多个线程Task,如果多个Task使用了共享的成员变量,就会出现线程不安全的问题 案例 需求 使用spark将日期字符串转换成long类型时间戳 样例数据 2019-11-06 15:59:50 2019-11-06 15:59:51 2019-11-06 15:59:52 2019-11-06 15:59:53 2019-11-06 15:59:54 2019-11-06 15:59:55 2019-11-06 15:59

WuBoooo的博客 1194

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 579

spark遇到的死锁

一.死锁 数据库基础知识: http://blog.youkuaiyun.com/luyaran/article/details/53502917   死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都分配不到必需的资源因而无法继续运行.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.  错误: Caused

keyuquan的博客 2714

老N卡福音:GT1030/GTX1050在MacOS Ventura 13.2上的完整驱动指南(附实测截图)

本文详细介绍了如何在MacOS Ventura 13.2上通过OCLP工具链驱动GT1030和GTX1050等老款NVIDIA显卡,涵盖硬件兼容性验证、BIOS设置、OpenCore配置、驱动安装及性能测试全流程。实测数据显示,这些基于Pascal和Maxwell架构的显卡在当代MacOS系统中仍能发挥实用价值,为老N卡用户提供完整解决方案。

weixin_30832143的博客 633

新系统申请软件著作权详细操作说明

今年八月底版权中心系统升级,新系统相对好用一些,至少不用再拿IE访问了,但是多了一项实名认证。下面介绍新系统的操作流程。 目录注册、登录和实名认证注册登录实名认证软件登记申请申请表填写鉴别材料身份证明文件权利归属证明文件其他材料提交材料变更登记 注册、登录和实名认证 首先访问版权中心系统:https://register.ccopyright.com.cn/login.html,如果老系统有账号直接登录即可,没有的话需要注册。 注册 点击注册按钮进入注册。 根据实际情况选择个人或单位,每个个人或单位只能在

Programming Talk 1万+

余老师带你学习大数据-Spark快速大数据处理第二章第四节zookeeper分布式锁

zookeeper分布式锁是干什么的 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且其他节点就会监听序号比自己小的节点,一旦序号比自己小的节点被删除了,其他节点就会得到相应的事件,然后查看自己是否为序号最小的节点,如果是,则获取锁。 为什么使用zookeeper分布式锁? 使用分布式锁的目的,无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作。 但是Martin指出,根据锁的用途还可以细分为以下两类: (1)允许

weixin_45810046的博客 197

Pytorch图像去噪实战(七):Noise2Noise自监督图像去噪实战,没有干净图也能训练模型

PyTorch图像去噪实战:Noise2Noise自监督去噪方法 本文介绍了在没有干净图像的情况下使用Noise2Noise方法进行图像去噪的实战方案。主要内容包括: 问题场景:真实项目中经常只有带噪图像而没有对应的干净图像,如夜间监控、医学影像等场景。 Noise2Noise核心思想:使用同一场景的两张不同噪声版本的图像进行训练(noisy_image_a → noisy_image_b),让模型学习恢复共同的干净结构而非随机噪声。 技术原理:模型通过最小化两个独立噪声图像之间的差异,最终会收敛到真实干净

ai技术增长的博客 502

Spark之多线程安全问题 ,RDD的错误示范,累加器(分布式计算器) ,shuffle算子特殊情况 ,调用别人的API怎么操作(9)

一 多线程安全问题 二 定期更新规则 三 累加器 用来统计数据处理的条数 ,在Task局部聚合 ,再到Driver端sum 在Driver端定义累加器 ,有以下三种形式 : 1)collectionAccumulator :将异常数据保存到集合里面 2)longAccumulator("累加器的名字") 3) DoubleAccumulator无参 val rdd1 = parallelize(List(1,2,3,4,5,6)) ---在Driver端定义...

桂林算啦粉的博客 1474

ISOLAR Autosar BSW 配置 之 Com

Autosar ISOLAR Bsw Configuration 之 Com

qq_42262743的博客 453

运维系列【仅供参考】:RustDesk部署疑难解答

RustDesk部署疑难解答

weixin_54626591的博客 282

Spark优化,多线程提交任务,提升效率

val listBuffer = new ListBuffer[Future[String]] val service: ExecutorService = Executors.newFixedThreadPool(4) for (i <- 0 to 3) { val task: Future[String] = service.submit(new Callable[String] { override def call(): String = {

epitomizelu的专栏 4604

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spark-Scala多线程

11

weixin_37796929的博客 618

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

记spark过程中Scala多线程小问题

这次更改ThriftServer源码,加了些业务,中间遇到这样一个问题,异步提交任务的时候想做成多线程,刚开始是使用的scala的Actor,传递了SQLContext和sql,发现每次sparkSessionId在一直变化,每次提交和触发Action之后产生的sessionId都不一致,这是怎么回事,后来才发现是多线程异步的问题,传递sqlContext在线程那边执行任务的时候会重新触发一个会话...

格赚 2149

Spark连接池死锁问题解决及处理过程记录

1. 背景 由于业务需求驱动,财务系统需要定时从库存事物数据库,及订单接口,价格接口等数据库实例或接口系统获取数据并按设定的动态逻辑规则生成账单及明细.面对复杂,海量数据来源以及灵活的多数据库分库实例,在众多的数据处理框架中,我们决定使用Spark框架来处理海量账单数据. 库存事物相关数据库表以及账单相关表是按各自分库维度存放在各自上百个 MYSQL 数据分库实例上. 其中读取库存事物分库是通...

一群专业码农的笔记本 2506

spark 多线程删数据库数据_多线程加锁并发任务

# coding=utf-8import threadingimport timeimport stringimport randomclass TestTreading(threading.Thread):def __init__(self,func):threading.Thread.__init__(self)self.func =func#@overridedef run(self):mu...

weixin_39996742的博客 203

hive 表锁、分区锁

场景: 在执行insert into或insert overwrite任务时,觉得hive速度有点慢,中途手动将程序停掉,改成了spark的引擎继续跑数,然后出现卡死情况(无法提交MapReduce),只能执行查询操作,而drop insert操作均执行不成功,无论执行多久,都会保持卡死状态。 原因: hive表被锁或者某个分区被锁,需要解锁。hive存在两种锁,共享锁Shared (S)和互斥锁Exclusive (X)。 其中只触发s锁的操作可以并发的执行,只要有一个操作对表或者分区出发了x锁,则该表或

沐霜枫叶 2148

Spark任务的core,executor,memory资源配置方法

Spark任务的core,executor,memory资源配置方法 1、概述 执行Spark任务,资源分配是很重要的一方面。如果配置不准确,Spark任务将耗费整个集群的机缘导致其他应用程序得不到资源。 怎么去配置Spark任务的executors,cores,memory,有如下几个因素需要考虑: 数据量 任务完成时间点 静态或者动态的资源分配 上下游应用 2、Spark应用当中术语的基本定义: Partitions: 分区是大型分布式数据集的一小部分。 Spark使用分区来管理数据,.

helloxiaozhe的博客 8883

多线程问题(二)(安全问题)

出现上述情况导致的结果就是更新丢失,例如是自增操作: 假设内存中的变量的初始值为0,t1就先把0加载到寄存器,但是t2进行抢占,也从内存中把0加载到寄存器然后自增为1,然后将1加载回内存,然后t1再自增为1,再将1加载回内存,按道理两次自增应该为2,但是由于线程的抢占以及自增操作是非原子的就会出现上述情况。线程的抢占式执行就是在一个线程的执行过程中,另一个更优先的进程会抢占当前线程执行的任务,当前线程就会被迫中断,这是引发线程不安全的根本原因,但是线程的调度是随机的,这是由系统决定的,我们无法改变。

m0_62404808的博客 691

Spark中的多线程并发处理

Spark中的多任务处理 Spark的一个非常常见的用例是并行运行许多作业。 构建作业DAG后,Spark将这些任务分配到多个Executor上并行处理。但这并不能帮助我们在同一个Spark应用程序中同时运行两个完全独立的作业,例如同时从多个数据源读取数据并将它们写到对应的存储,或同时处理多个文件等。 每个spark应用程序都需要一个SparkSession(Context)来配置和执行操作。...

weixin_30732825的博客 6700

spark多线程跑

学习如何在Spark中实现多线程 在大数据处理平台Apache Spark中,合理使用多线程可以显著提高数据处理效率。本文将为刚入行的小白提供一个简单的流程指南,帮助你理解如何在Spark中实现多线程运行,本教程将采用Python的PySpark库为例。 1. 实现Spark多线程的流程 以下是实现Spark多线程的基本步...

weixin_40874325的博客 350
上一篇: spark流程
下一篇: Json 解析日期异常
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值