广播变量的使用-----通过ip查询属于哪个省份
1,为什么要使用广播变量?
举一个简单的例子,我们要处理一份log文件,里面有ip地址。
20090121000132095572000|125.213.100.123|show.51.com|/shoplist.php?phpfile=shoplist2.php&style=1&s
通过切分我们可以拿到ip。现在要求我们通过这个ip得到这个ip属于哪个省份。ip规则如下(简单的一小部分):
1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.0.8.0|1.0.15.255|16779264|16781311|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.0.32.0|1.0.63.255|16785408|16793599|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.1.0.0|1.1.0.255|16842752|16843007|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.1.2.0|1.1.7.255|16843264|16844799|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.1.8.0|1.1.63.255|16844800|16859135|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
ip规则处理
//将ip转换成十进制
def ip2Long(ip: String): Long = {
val fragments = ip.split("[.]")
var ipNum = 0L
for (i <- 0 until fragments.length) {
ipNum = fragments(i).toLong | ipNum << 8L
}
ipNum
}
//二分法快速匹配ip规则
def binarySearch(lines: Array[(Long, Long, String)], ip: Long): Int = {
var low = 0
var high = lines.length - 1
while (low <= high) {
val middle = (low + high) / 2
if ((ip >= lines(middle)._1) && (ip <= lines(middle)._2))
return middle
if (ip < lines(middle)._1)
high = middle - 1
else {
low = middle + 1
}
}
-1
}
1.问题描述:
将来数据量可能很大,所以ip规则肯定是存储在HDFS中的,这样在读取的时候根据切片数量,会启动相应的Task,但是数据切片中就可能不会包含所有的ip规则,然后你处理的log文件获取的ip就找不到对应的省份了。这样就出现了问题。所以现在需要每个Task都会获取到全部的ip规则。但是ip规则的数据是分片存放的,怎样让Task获取到全部的ip规则尼?这时就需要将每个切片的IP规则拉取到Spark Submit(Driver)端,然后再通过广播变量的形式下发到每个Executor中,每个Executor都会持有一份完整的ip规则,这样Task在处理log文件数据的时候,就可以拉取Executor中的IP规则了。
广播变量的好处
广播变量的好处,不是每个task一份变量副本,而是变成每个节点的executor才一份副本。这样的话,
就可以让变量产生的副本大大减少。
广播变量的用法
广播变量,很简单
其实就是SparkContext的broadcast()方法,传入你要广播的变量,即可
final Broadcast<Map<String, Map<String, IntList>>> dateHourExtractMapBroadcast =
sc.broadcast(fastutilDateHourExtractMap);
使用广播变量的时候
直接调用广播变量(Broadcast类型)的value() / getValue()
可以获取到之前封装的广播变量
广播变量,初始的时候,就在Drvier上有一份副本。
task在运行的时候,想要使用广播变量中的数据,此时首先会在自己本地的Executor对应的BlockManager中,
尝试获取变量副本;如果本地没有,那么就从Driver远程拉取变量副本,并保存在本地的BlockManager中;
此后这个executor上的task,都会直接使用本地的BlockManager中的副本。
executor的BlockManager除了从driver上拉取,也可能从其他节点的BlockManager上拉取变量副本。
HttpBroadcast TorrentBroadcast(默认)
BlockManager
负责管理某个Executor对应的内存和磁盘上的数据,尝试在本地BlockManager中找map
举例来说
50个executor,1000个task。一个map,10M。
默认情况下,1000个task,1000份副本。10G的数据,网络传输,在集群中,耗费10G的内存资源。
如果使用了广播变量。50个execurtor,50个副本。500M的数据,网络传输,
而且不一定都是从Driver传输到每个节点,还可能是就近从最近的节点的executor的bockmanager
上拉取变量副本,网络传输速度大大增加;500M的内存消耗。
10000M,500M,20倍。20倍~以上的网络传输性能消耗的降低;20倍的内存消耗的减少。
对性能的提升和影响,还是很客观的。
虽然说,不一定会对性能产生决定性的作用。比如运行30分钟的spark作业,可能做了广播变量以后,
速度快了2分钟,或者5分钟。但是一点一滴的调优,积少成多。最后还是会有效果的。
没有经过任何调优手段的spark作业,16个小时;三板斧下来,就可以到5个小时;
然后非常重要的一个调优,影响特别大,shuffle调优,2~3个小时;应用了10个以上的性能调优的技术点
,JVM+广播,30分钟。16小时~30分钟。
那最后我们做一下,怎么做?就是把dateHourExtractMap做成广播变量Broadcast
广播变量的使用-----通过ip查询属于哪个省份的更多相关文章
- 大数据学习day21-----spark04------1. 广播变量 2. RDD中的cache 3.RDD的checkpoint方法 4. 计算学科最受欢迎老师TopN
1. 广播变量 1.1 补充知识(来源:https://blog.csdn.net/huashetianzu/article/details/7821674) 之所以存在reduce side jo ...
- Spark(三)RDD与广播变量、累加器
一.RDD的概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可 ...
- IP查询系统的异步回调案例
package com.lxj.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...
- spark累加器、广播变量
一言以蔽之: 累加器就是只写变量 通常就是做事件统计用的 因为rdd是在不同的excutor去执行的 你在不同excutor中累加的结果 没办法汇总到一起 这个时候就需要累加器来帮忙完成 广播变量是只 ...
- Spark——DataFrames,RDD,DataSets、广播变量与累加器
Spark--DataFrames,RDD,DataSets 一.弹性数据集(RDD) 创建RDD 1.1RDD的宽依赖和窄依赖 二.DataFrames 三.DataSets 四.什么时候使用Dat ...
- 广播变量、累加器、collect
广播变量.累加器.collect spark集群由两类集群构成:一个驱动程序,多个执行程序. 1.广播变量 broadcast 广播变量为只读变量,它由运行sparkContext的驱动程序创建后发送 ...
- js的定位实现和ip查询
sina的api var GetLocationFromSina = function (successFunc, errorFunc) { $.getScript('http://int.dpool ...
- Spark大师之路:广播变量(Broadcast)源代码分析
概述 近期工作上忙死了--广播变量这一块事实上早就看过了,一直没有贴出来. 本文基于Spark 1.0源代码分析,主要探讨广播变量的初始化.创建.读取以及清除. 类关系 BroadcastManage ...
- IP查询接口1
新浪的:http://counter.sina.com.cn/ip?ip=IP地址返回Js数据,感觉不是很精确,可以把问号后面的去掉,直接返回本机对应的IP所在地http://www.yodao.co ...
- IP查询接口
腾讯的: http://fw.qq.com/ipaddress直接返回本机的IP地址对应的地区新浪的:http://counter.sina.com.cn/ip?ip=IP地址返回Js数据,感觉不是很 ...
随机推荐
- RAC关闭【Oracle 10g】
顺序:关闭监听->关闭实例->关闭服务->关闭软件 1.关闭监听 进入节点1,[oracle@arprac01 ~]$lsnrctl stop 进入节点2,[oracle@arpra ...
- 基于三菱Q系列cc-Link的立体仓库控制系统
系统说明: 方案选择: 工艺流程: 触摸屏设计: 程序设计:采用SFC进行编程,结构清晰,逻辑明了 本文章为学习记录,水平有限,望各路大佬们轻喷!!! 转载请注明出处!!!
- Notion API中Internal Notion integrations和Public Notion integrations的区别
Internal Notion integrations Internal Notion integrations与一个单一的.特定的工作区相联系,只有该工作区的成员可以使用这个integration ...
- 05. C语言数组
数组用于将多个数据集中存储,方便管理,此文将任何集中存储一组数据的语句都称为数组,数组根据存储数据的类型和方式分为以下类型:数组.结构体.共用体.枚举. [数组] 数组用于存储多个类型相同的数据,可以 ...
- grads读取nc格式文件
一.通常: 1.grads读取grd和ctl:open ****.ctl 2.执行gs脚本:run ****.gs d命令,display展示数据,常用来显示变量,比如rh,rain等 q命令, ...
- C语言:将txt文件的单词导入链表&&删除链表重复单词
文章目录 前言 主要分为两个实现部分,按个人需求浏览 首先明确几个任务 先过一遍如何操作的流程. ①全局变量和结构体代码部分 ②实现:将文件单词导入链表 a: 寻找txt文件中最长单词的函数 b: 导 ...
- Istio(四):创建部署Gateway并使用网关暴露服务
目录 一.模块概览 二.系统环境 三.Gateway网关 3.1 使用 Gateway 四.实战:使用Gateway发布服务 4.1 创建部署并使用网关暴露 4.2 清理 一.模块概览 在Kubern ...
- Your lock file does not contain a compatible set of packages. Please run composer update.
执行composer install遇到错误:Your requirements could not be resolved to an installable set of packages. 这是 ...
- 【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标
最近YOLO家族又添新成员:YOLOv10,YOLOv10 提出了一种一致的双任务方法,用于无nms训练的YOLOs,它同时带来了具有竞争力的性能和较低的推理延迟.此外,还介绍了整体效率-精度驱动 ...
- C#中接口的显式实现与隐式实现及其相关应用案例
C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行"密封",增加实现接口的类访问方法的"成本& ...