Flink 支持广播变量,就是将数据广播到具体的 taskmanager 上,数据存储在内存中,这样可以减缓大量的 shuffle 操作;

比如在数据 join 阶段,不可避免的就是大量的 shuffle 操作,我们可以把其中一个 dataSet 广播出去,一直加载到 taskManager 的内存中,可以直接在内存中拿数据,避免了大量的 shuffle,导致集群性能下降;

广播变量创建后,它可以运行在集群中的任何 function 上,而不需要多次传递给集群节点。另外需要记住,不应该修改广播变量,这样才能确保每个节

点获取到的值都是一致的。

一句话解释,可以理解为是一个公共的共享变量,我们可以把一个 dataset数据集广播出去,然后不同的 task 在节点上都能够获取到,这个数据在每个节

点上只会存在一份。如果不使用 broadcast,则在每个节点中的每个 task 中都需要拷贝一份 dataset 数据集,比较浪费内存(也就是一个节点中可能会存在多份dataset 数据)。

注意:因为广播变量是要把 dataset 广播到内存中,所以广播的数据量不能太大,否则会出现 OOM 这样的问题

  • Broadcast:Broadcast 是通过 withBroadcastSet(dataset,string)来注册的
  • Access:通过 getRuntimeContext().getBroadcastVariable(String)访问广播变量

 
 

操作步骤

:初始化数据

DataSet<Integer> toBroadcast = env.fromElements(1, 2, 3)

:广播数据

.withBroadcastSet(toBroadcast, "broadcastSetName");

:获取数据

Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("broadcastSetName");

 
 

  

package com.starzy

 
 

import org.apache.flink.api.common.functions.RichMapFunction

import org.apache.flink.api.scala.ExecutionEnvironment

import org.apache.flink.configuration.Configuration

import org.apache.flink.api.scala._

import scala.collection.mutable

import scala.collection.mutable.ArrayBuffer

import scala.util.Random

 
 

object BrodCast {

def main(args: Array[String]): Unit = {

val env: ExecutionEnvironment = ExecutionEnvironment. getExecutionEnvironment

 
 

//TODO data2 join data3 的数据,使用广播变量完成
的数据,使用广播变量完成

val data2 = new mutable.MutableList[(Int, Long, String)]

data2.+=((1, 1L, "Hi"))

data2.+=((2, 2L, "Hello"))

data2.+=((3, 2L, "Hello world"))

val ds1 = env.fromCollection(Random.shuffle(data2))

val data3 = new mutable.MutableList[(Int, Long, Int, String, Long)]

data3.+=((1, 1L, 0, "Hallo", 1L))

data3.+=((2, 2L, 1, "Hallo Welt", 2L))

data3.+=((2, 3L, 2, "Hallo Welt wie", 1L))

val ds2 = env.fromCollection(Random.shuffle(data3))

 
 

 
 

//todo 使用内部类 RichMapFunction ,提供 open 和 map ,可以完成 join 的操作
的操作

val result = ds1.map(new RichMapFunction[(Int , Long , String) , ArrayBuffer[(Int , Long , String , String)]] {

 
 

var brodCast :mutable.Buffer[(Int, Long, Int, String, Long)] = null

override def open(parameters: Configuration): Unit = {

import scala.collection.JavaConverters._

//asScala 需要使用隐式转换

brodCast = this.getRuntimeContext.getBroadcastVariable[(Int, Long, Int, String, Long)]("ds2").asScala

}

override def map(value: (Int, Long, String)):ArrayBuffer[(Int , Long , String , String)] = {

val toArray: Array[(Int, Long, Int, String, Long)] = brodCast .toArray

val array = new mutable.ArrayBuffer[(Int , Long , String , String)]

var index = 0

var a:(Int, Long, String, String) = null

while(index < toArray.size){

if(value._2 == toArray(index)._5){

a = (value._1 , value._2 , value._3 , toArray(index)._4)

array += a

}

index = index + 1

}

array

}

}).withBroadcastSet(ds2 , "ds2")

println (result.collect())

}

}

 
 

 
 

 
 

 
 

 
 

Flink 的广播变量的更多相关文章

  1. Flink的广播变量

    Flink支持广播变量,就是将数据广播到具体的taskmanager上,数据存储在内存中,这样可以减缓大量的shuffle操作: 比如在数据join阶段,不可避免的就是大量的shuffle操作,我们可 ...

  2. [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast

    [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...

  3. 初识Flink广播变量broadcast

    Broadcast 广播变量:可以理解为是一个公共的共享变量,我们可以把一个dataset 或者不变的缓存对象(例如map list集合对象等)数据集广播出去,然后不同的任务在节点上都能够获取到,并在 ...

  4. 广播变量、累加器、collect

    广播变量.累加器.collect spark集群由两类集群构成:一个驱动程序,多个执行程序. 1.广播变量 broadcast 广播变量为只读变量,它由运行sparkContext的驱动程序创建后发送 ...

  5. Spark大师之路:广播变量(Broadcast)源代码分析

    概述 近期工作上忙死了--广播变量这一块事实上早就看过了,一直没有贴出来. 本文基于Spark 1.0源代码分析,主要探讨广播变量的初始化.创建.读取以及清除. 类关系 BroadcastManage ...

  6. 【Spark篇】---Spark中广播变量和累加器

    一.前述 Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量. 累机器相当于统筹大变量,常用于计数,统计. 二.具体原理 ...

  7. Spark RDD持久化、广播变量和累加器

    Spark RDD持久化 RDD持久化工作原理 Spark非常重要的一个功能特性就是可以将RDD持久化在内存中.当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内 ...

  8. SparkCore | Rdd| 广播变量和累加器

    Spark中三大数据结构:RDD:  广播变量: 分布式只读共享变量: 累加器:分布式只写共享变量: 线程和进程之间 1.RDD中的函数传递 自己定义一些RDD的操作,那么此时需要主要的是,初始化工作 ...

  9. Spark 广播变量BroadCast

    一. 广播变量 广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量.广播变量可被用于有效地给每个节点一个大输入数据集的副本.Spark还尝试使用高效地广播算法来分发变量,进而 ...

随机推荐

  1. UVA 11054 Wine trading in Gergovia(思维)

    题目链接: https://vjudge.net/problem/UVA-11054 /* 问题 输入村庄的个数n(2=<n<=100000)和n个村庄的数值,正代表买酒,负代表卖酒,k个 ...

  2. [转]Build beautiful, responsive sites with Bootstrap and ASP.NET Core

    本文转自:https://docs.microsoft.com/en-us/aspnet/core/client-side/bootstrap?view=aspnetcore-2.1 Bootstra ...

  3. ASP.NET MVC标记最新的发布新闻或文章

    开发的网站中,一些文章列表或新闻列表,需要在标题前放置一个小new.gif小图,标记为是最新的新闻或是文章.今天Insus.NET的练习,就是在asp.net mvc的应用程序中实现这样功能.计划使用 ...

  4. 使用WPF教你一步一步实现连连看(三)

    这次首先对以前的结构进行了调整: 第一步:把MyButton按钮的属性独立成一个类,放在一个单独的MyButton.cs中,把图片的初始化也放到里面. 调整代码如下: public class MyB ...

  5. 解决代码报红:Cannot resolve symbol 'xxx'

    直接复制别人的代码,maven依赖到自己的IDEA中,个别代码报红,说是不能加载这个东西,检查代码没错,依赖没错,引入jar包也没错 最后网上找到了解决方法,参考文章 如上图所示,一般建议点击Inva ...

  6. VirtualBox配置centos7静态ip(详解)

    VirtualBox安装centos7配置静态ip地址可以本机访问,可以联网. 在开始之前先说一下,不知道为什么,我在网上百度的大多数是不能用的,或者只能主机访问,或者只能联网. 我的配置文件为ifc ...

  7. 华中农业大学第五届程序设计大赛网络同步赛-K

    K.Deadline There are N bugs to be repaired and some engineers whose abilities are roughly equal. And ...

  8. Echarts之悬浮框中的数据排序

    Echarts非常强大,配置也非常的多,有很多细节需要深入研究.详解一下关于悬浮框中的数据排序问题 悬浮框的数据排序默认是根据series中的数据位置排序的,在我们想自定义排序时,在echarts的配 ...

  9. SD从零开始01-02

    SD从零开始1 SD中的组织结构 销售相关的组织结构: 销售组织Sales organization 分销渠道Distribution channel 产品组Division 销售区域Sales ar ...

  10. IT的2017,面临数字生态系统新挑战,该怎么办?

    所谓数字生态系统,就是包含一系列基于标准,规模可变的硬件.软件.数字设备和服务,可系统地实现企业信息数字化,数据流通,以帮助企业提高运营效率. 随着越来越多的中国企业加入数字生态系统,中国CIO在技术 ...