大数据——Flink Broadcast State 广播状态

代码 代码 1425 人阅读 | 0 人回复

<
1、BroadcastState 的介绍 

播送形态(Broadcast State)是 Operator State 的一种特别范例。假如我们需求将设置 、划定规矩等低吞吐变乱流播送到下流一切 Task 时,就能够利用 BroadcastState。下流的 Task 吸取那些设置、划定规矩并保留为 BroadcastState,一切Task 中的形态连结分歧,感化于另外一个数据流的策画中。
简朴了解:一个低吞吐量流包含一组划定规矩,我们念对去自另外一个流的一切元素基于此划定规矩停止评价。
场景:静态更新策画划定规矩。
播送形态取其他操纵符形态的区分正在于:


  • 它有一个 map 格局,用于界说存储构造
  • 它仅对具有播送流战非播送流输进的特定操纵符可用
  • 如许的操纵符能够具有不同称号的多个播送形态
155337tafglt5kjvcalcdd.jpg

 
2、BroadcastState 操纵流程

155337pysfcdwczpf7uzc7.jpg

3、案例完成



  • 从端心读与Json数据做为变乱流
  • 从Mysql读与数据做为播送流
  • 联系关系播送流战变乱流
  • 婚配对应的用户疑息
  1. package cn.kgc.broadcast
  2. import java.sql.{Connection, DriverManager, PreparedStatement}
  3. import com.alibaba.fastjson.JSON
  4. import org.apache.flink.api.common.state.{BroadcastState, MapStateDescriptor}
  5. import org.apache.flink.configuration.Configuration
  6. import org.apache.flink.streaming.api.datastream.BroadcastStream
  7. import org.apache.flink.streaming.api.functions.co.BroadcastProcessFunction
  8. import org.apache.flink.streaming.api.functions.source.{RichParallelSourceFunction, SourceFunction}
  9. import org.apache.flink.streaming.api.scala._
  10. import org.apache.flink.util.Collector
  11. // (001,&#39;tom&#39;,18,&#39;北京&#39;,15830010002)
  12. // 界说样例类 承受 MySQL的用户数据
  13. case class BaseUserInfo(id:Long,name:String,age:Int,city:String,phone:Long)
  14. // user_id、user_name、user_addrss、behaviour、url
  15. // 输出数据范例
  16. case class UserVisitInfo(id:Long,name:String,city:String,behaviour:String,url:String)
  17. // 完成播送ProcessFunction
  18. class MyBroadcastFunc extends BroadcastProcessFunction[String,(Long, BaseUserInfo),UserVisitInfo]{
  19.   lazy val mapStateDes = new MapStateDescriptor[Long, BaseUserInfo]("mapState",classOf[Long],classOf[BaseUserInfo])
  20.   // 处置的是日记流中的每条数据
  21.   override def processElement(value: String, ctx: BroadcastProcessFunction[String, (Long, BaseUserInfo), UserVisitInfo]#ReadOnlyContext, out: Collector[UserVisitInfo]): Unit = {
  22.     // {"user_id":"001","ts":"2021-07-10 11:10:05","behaviour":"browse","url":"https://www.tb1.com/1.html"}
  23.     val user_id = JSON.parseObject(value).getLong("user_id")
  24.     val behaviour = JSON.parseObject(value).getString("behaviour")
  25.     val url = JSON.parseObject(value).getString("url")
  26.     val mapState = ctx.getBroadcastState(mapStateDes)
  27.     val userInfo = mapState.get(user_id)
  28.     out.collect(UserVisitInfo(user_id,userInfo.name,userInfo.city,behaviour,url))
  29.   }
  30.   // 处置的是播送流的每一个值
  31.   override def processBroadcastElement(value: (Long, BaseUserInfo), ctx: BroadcastProcessFunction[String, (Long, BaseUserInfo), UserVisitInfo]#Context, out: Collector[UserVisitInfo]): Unit = {
  32.     val mapState: BroadcastState[Long, BaseUserInfo] = ctx.getBroadcastState(mapStateDes)
  33.     mapState.put(value._1,value._2)
  34.   }
  35. }
  36. class UserSourceFunc extends RichParallelSourceFunction[BaseUserInfo]{
  37.   var conn:Connection = _
  38.   var statement: PreparedStatement = _
  39.   var flag:Boolean = true
  40.   override def open(parameters: Configuration): Unit = {
  41.     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC","root","liu911223")
  42.     statement = conn.prepareStatement("select * from base_user")
  43.   }
  44.   override def run(ctx: SourceFunction.SourceContext[BaseUserInfo]): Unit = {
  45.     while (flag){
  46.       Thread.sleep(5000)
  47.       val resultSet = statement.executeQuery()
  48.       while (resultSet.next()){
  49.         val id = resultSet.getLong(1)
  50.         val name = resultSet.getString(2)
  51.         val age = resultSet.getInt(3)
  52.         val city = resultSet.getString(4)
  53.         val phone = resultSet.getLong(5)
  54.         ctx.collect(BaseUserInfo(id,name,age,city,phone))
  55.       }
  56.     }
  57.   }
  58.   override def cancel(): Unit = {
  59.     flag = false
  60.   }
  61.   override def close(): Unit = {
  62.     if (statement != null) statement.close()
  63.     if (conn != null) conn.close()
  64.   }
  65. }
  66. object BroadcastDemo01 {
  67.   def main(args: Array[String]): Unit = {
  68.     val env = StreamExecutionEnvironment.getExecutionEnvironment
  69.     env.setParallelism(1)
  70.     // 界说为KV,一圆里是为了播送的时分界说为map,另外一圆里是为了做联系关系操纵
  71.     val userBaseDS: DataStream[(Long, BaseUserInfo)] = env.addSource(new UserSourceFunc)
  72.       .map(user => (user.id, user))
  73.     val mapStateDes = new MapStateDescriptor[Long, BaseUserInfo]("mapState",classOf[Long],classOf[BaseUserInfo])
  74.     val broadCastStream: BroadcastStream[(Long, BaseUserInfo)] = userBaseDS.broadcast(mapStateDes)
  75.     // 日记JSON数据
  76.     val dataInfoDS: DataStream[String] = env.socketTextStream("master",1314)
  77.     dataInfoDS.connect(broadCastStream)
  78.       .process(new MyBroadcastFunc)
  79.       .print()
  80.     env.execute()
  81.   }
  82. }
复造代码


免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则