Spark中的事件监听

Posted 雷先燊您好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark中的事件监听相关的知识,希望对你有一定的参考价值。

一、相关概念

  事件是什么?

    事情、事项。这里通常指的是对象在软件系统或软件环境中产生活动或发生的现象。


  事件如何监听?

    古代有“听瓮”,这套系统中存在事件源(地面的声音)、监听者及事件处理模型。所以不同事件采用不同的事件处理模型建立两者关系。


  相关成型理论及方案:

   设计模式中的监听器模式

     作为事件源(生成各种事件)

     事件处理模型(连接监听器和传递事件)

     监听者(接受对应事件并进行处理)

二、Spark中事件的处理


      2.1 ListenerBus[L <: AnyRef, E] 主要用来作为事件总线,各种事件通过总线来传输。   

      ListenerBus 核心属性及方法:

     private[this] val listenersPlusTimers = new CopyOnWriteArrayList[(L, Option[Timer])] 监听及监听处理时间的对象。

      private[spark] def  listeners = 

listenersPlusTimers.asScala.map(_._1).asJava 所有的监听集合。

    postToAll(event: E) 方法主要是接收一个事件并将事件发生到已经注册的监听器中。

      doPostEvent(listener: L, event: E):方法是由子类来进行实现对应的事件处理。


       2.2 SparkListenerBus 作为一个大的分支对象处理对应的信息。

 private[spark] trait SparkListenerBus extends 

 ListenerBus[SparkListenerInterface, SparkListenerEvent] 给出了监听和事件的对应模型。

      2.3 示例:在Spark的DAGScheduler的stage划分提交的时候会调用


   listenerBus.post(SparkListenerStageSubmitted(stage.latestInfo, properties)) 将事件提交给LiveListenerBus的AsyncEventQueue对象中。

  AsyncEventQueue对象后台会启动一个线程来将事件放到ListenerBus队列中并调用父类SparkListenerBus的doPostEvent方法。

   

三、此类设计的优缺点:


    3.1  对象之间耦合度降低,利用抽象模型和对象分开。

    3.2  大量的事件可能会导致OOM产生。

    3.3 此类设计适用的场景是:监听事件众多并且处理逻辑复杂,为了便于管理可以采用这类设计思路。




  

 


以上是关于Spark中的事件监听的主要内容,如果未能解决你的问题,请参考以下文章

StreamingListener记录(spark-2.2.0)

Spring事件监听机制源码解析

Spark监听器源码阅读

话话js中的事件监听

Java中的事件监听机制

Android webview中的js如何监听键盘事件