zoukankan      html  css  js  c++  java
  • Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

    Spark Streaming揭秘 Day18

    空RDD判断及程序中止机制

    空RDD的处理

    从API我们可以知道在SparkStreaming中,对于RDD的操作一般都是在foreachRDD和Transform方法里。
    在使用foreachRDD时,有一个风险,就是如果RDD为空可能会导致计算失败,那么应用如何来判断为空呢?

    方法1:使用RDD.count

    count方法会直接触发一个Job,代价有些大
    Snip20160601_4

    方法2:调用RDD.paritions.isEmpty

    我们可以看到partitions是一个方法,返回的是一个数组,那么isEmpty实际上就仅仅是对数组长度的判断,非常的高效。

    Snip20160601_5

    这个判断是否有效?我们进入BlockGenerator,发现如果数据为空时,默认会不生成Block,也就是不会生成partition。所以说,从数据生成机制看,方法2是有效的。
    Snip20160602_1

    方法3:调用RDD.isEmpty
    Snip20160601_1

    方法2比较高效,但是也有一个隐患,就是进行shuffle操作,当并行度不变时,可能出现有partition没数据的情况,会导致方法2判断失效。
    方法3,这个方法是目前来看最完备的方式。首先,对于数组为空的情况,在第一个条件处进行了短路,否则会执行take操作,来实际判断是否有数,但是take()方法内部还是会有Job生成,所以也会产生一定的效率影响。

    Spark Streaming程序的停止

    因为SparkStreaming可能由于各种异常情况等发生终止,所以其在设计时,对停止操作提供了一个通用的解决方法。

    首先是在启动时,就注册了关闭的方法。
    Snip20160601_8

    从注册方法的内部,我们看到,实际上是注册了一个jvm的hook方法,来确保一旦发生异常,关闭方法一定会被调用,从而确保了这个方法的强制执行。
    Snip20160601_9

    下面让我们进入关闭方法内部:
    这里出现了一个非常重要的参数,就是stopGracefullyOnShutdown,一旦使用stopGracefully,会将所有接收的数据处理完再执行关闭,建议打开,从而确保数据安全性。
    Snip20160601_7

    最后,在关闭方法的内部,实际上是调用了jobScheduler来完成。
    Snip20160601_10

    欲知后事如何,且听下回分解

    DT大数据每天晚上20:00YY频道现场授课频道68917580

  • 相关阅读:
    实用机器人设计(六)-建图,导航和路径规划
    实用机器人设计(五)-机器人电机功率选择和减速箱传动比设计
    实用机器人设计(四)-电机和驱动系统基础原理
    实用机器人设计(三)-计算机视觉
    Git 提交文件到Github
    爬虫框架Scrapy
    scrapy终端与核心组件
    图像识别与文字处理
    存储爬虫数据--Mongodb
    并发下载
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5551438.html
Copyright © 2011-2022 走看看