Spark 广播变量BroadCast
一、 广播变量
广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。Spark还尝试使用高效地广播算法来分发变量,进而减少通信的开销。 Spark的动作通过一系列的步骤执行,这些步骤由分布式的洗牌操作分开。Spark自动地广播每个步骤每个任务需要的通用数据。这些广播数据被序列化地缓存,在运行任务之前被反序列化出来。这意味着当我们需要在多个阶段的任务之间使用相同的数据,或者以反序列化形式缓存数据是十分重要的时候,显式地创建广播变量才有用。
二、为什么使用广播变量
在默认的,task执行的算子中,使用了外部的变量,每个task都会获取一份变量的副本,
map副本,传输到了各个task上之后,是要占用内存的。1个map的确不大,1M;1000个map分布在你的集群中,一下子就耗费掉1G的内存。对性能会有什么影响呢?不必要的内存的消耗和占用,就导致了,你在进行RDD持久化到内存,也许就没法完全在内存中放下;就只能写入磁盘,最后导致后续的操作在磁盘IO上消耗性能;
你的task在创建对象的时候,也许会发现堆内存放不下所有对象,也许就会导致频繁的垃圾回收器的回收,GC。GC的时候,一定是会导致工作线程停止,也就是导致Spark暂停工作那么一点时间。频繁GC的话,对Spark作业的运行的速度会有相当可观的影响。
不是每个task一份副本,而是变成每个节点Executor上一个副本。
1.举例来说:
50个Executor 1000个task。
一个map10M
默认情况下,1000个task 1000个副本
1000 * 10M = 10 000M = 10 G
10G的数据,网络传输,在集群中,耗费10G的内存资源。
如果使用 广播变量,
50个Executor ,50个副本,10M*50 = 500M的数据。
网络传输,而且不一定是从Drver传输到各个节点,还可能是从就近的节点
的Executor的BlockManager上获取变量副本,网络传输速度大大增加。
之前 10000M 现在 500M。
20倍网络传输性能的消耗。20倍内存消耗的减少。
三、如何使用
开始使用broadcast变量,使用完后,程序结束记得释放
sc = SparkContext(appName=AppNames.JOURNEY_AGGREGATOR_APP_NAME)
broadCastForLog = None
try:
broadCastForLog = ELogForDistributedApp.setLogConf2BroadCast(sc)
elogging.initLogFromDict(broadCastForLog.value)
except StandardError:
pass .......
#执行完程序逻辑,记得释放该变量 if broadCastForLog is not None:
broadCastForLog.unpersist(False)
#获取要被共享的大变量,这里是log配置
class ELogForDistributedApp(object):
LOGHDFSPATH = "/user/hdfs/test/logging/logging_hdfs.json"
@staticmethod
def setLogConf2BroadCast(sc):
logFilePath = ELogForDistributedApp.LOGHDFSPATH
if sc is not None:
configDict = HDFSOperation.getConfigFromHDFS(logFilePath,sc)
broadCast = sc.broadcast(configDict)
#globals()['broadCast'] = broadCast
#elogging.initLogFromDict(broadCast.value)
return broadCast
#print broadCast.value
else:
return None
def initLogFromDict(self):
elogging.initLogFromDict(self.eloggingConfig)
从hdfs中找到相应配置文件
class HDFSOperation(object):
@staticmethod
def getConfigFromHDFS(hdfsPath,sc):
if sc is not None:
filesystem_class = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
hadoop_configuration = sc._jsc.hadoopConfiguration()
fs =filesystem_class.get(hadoop_configuration)
path_class = sc._gateway.jvm.org.apache.hadoop.fs.Path
pathObj = path_class(hdfsPath)
try:
hdfsInStream = fs.open(pathObj)
bufferedReader_class = sc._gateway.jvm.java.io.BufferedReader
inputStreamReader_class = sc._gateway.jvm.java.io.InputStreamReader
bufferedReader = bufferedReader_class(inputStreamReader_class(hdfsInStream))
except IOError,msg:
print str(msg)
return None
else:
return None
configStr = ''
while True:
tmpStr = bufferedReader.readLine()
if tmpStr == None:
break
configStr += tmpStr
try:
confDict = json.loads(configStr)
except IOError,msg:
print str(msg)
return None
return confDict
参考文档
Spark 广播变量BroadCast的更多相关文章
- spark 广播变量
Spark广播变量 使用广播变量来优化,广播变量的原理是: 在每一个Executor中保存一份全局变量,task在执行的时候需要使用和这一份变量就可以,极大的减少了Executor的内存开销. Exe ...
- spark中的广播变量broadcast
Spark中的Broadcast处理 首先先来看一看broadcast的使用代码: val values = List[Int](1,2,3) val broadcastValues = sparkC ...
- 【Spark-core学习之七】 Spark广播变量、累加器
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Spark2.0基于广播变量broadcast实现实时数据按天统计
package com.gm.hive.SparkHive; import java.text.SimpleDateFormat; import java.util.Arrays; import ja ...
- spark广播变量定时更新
广播变量 先来简单介绍下spark中的广播变量: 广播变量允许程序员缓存一个只读的变量在每台机器上面,而不是每个任务保存一份拷贝.例如,利用广播变量,我们能够以一种更有效率的方式将一个大数据量输入集合 ...
- Spark 广播变量 和 累加器
1. 广播变量 理解图 使用示例 # word.txt hello scala hello python hello java hello go hello julia hello C++ hello ...
- Spark 广播变量和累加器
Spark 的一个核心功能是创建两种特殊类型的变量:广播变量和累加器 广播变量(groadcast varible)为只读变量,它有运行SparkContext的驱动程序创建后发送给参与计算的节点.对 ...
- Spark广播变量和累加器
一.广播变量图解 二.代码 val conf = new SparkConf() conf.setMaster("local").setAppName("brocast& ...
- 初识Flink广播变量broadcast
Broadcast 广播变量:可以理解为是一个公共的共享变量,我们可以把一个dataset 或者不变的缓存对象(例如map list集合对象等)数据集广播出去,然后不同的任务在节点上都能够获取到,并在 ...
随机推荐
- 《C#图解教程》一览
本书针对编程新手和中级水平的程序员.笔者尽力专注 C# 语言本身,详尽深入地描述语言及各部分.少涉及 .NET 和相关编程实践.本书写作过程中,笔者始终坚持确保内容简洁性的同时又能透彻地讲解这门语言. ...
- AGC 014E.Blue and Red Tree(思路 启发式合并)
题目链接 \(Description\) 给定两棵\(n\)个点的树,分别是由\(n-1\)条蓝边和\(n-1\)条红边组成的树.求\(n-1\)次操作后,能否把蓝树变成红树. 每次操作是,选择当前树 ...
- (Android数据传递)Intent消息传递机制 “Intent”“数据传递”
Intent类的继承关系: 需要注意的是,该类实现了Parcelable(用于数据传递)和Cloneable接口. Intent是一种(系统级别的)消息传递机制,可以在应用程序内使用,也可以在应用 ...
- redis(五)
发布订阅 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的 ...
- shell之磁盘容量检查,配合crontab可以定时清理磁盘
我的做法: !/bin/bashAvailable=`df -k | sed -n 2p | awk '{print $4}'`if [ $Available -eq 0 ];then ...
- JavaScript HTML DOM 元素操作(节点)
在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType :节点 ...
- Linux内存管理学习资料
下面是Linux内存管理学习的一些资料. 博客 mlock() and mlockall() system calls. All about Linux swap space 逆向映射的演进 Linu ...
- 小白入门使用Nginx基础的常用操作
nginx启动,重启,关闭命令 停止操作 停止操作前需要ps当前Nginx的所有进程 步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编 ...
- gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)
gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例) 首先祭出官网文档链接:https://docs.gitlab.com/omnibus/settings/smtp.html 其实 ...
- Docker 下载镜像慢的问题解决方法
让你火箭般的速度下载docker镜像! 的冷漠度 百家号17-11-1713:09 因为有墙的原因所以在国内下载docker镜像的速度非常慢,有时候是几kb每秒,那个蛋疼的等待,真是谁等谁知道!下面我 ...