空RDD判断及程序中止机制

空RDD的处理

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

方法1:使用RDD.count

count方法会直接触发一个Job,代价有些大
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

方法2:调用RDD.paritions.isEmpty

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

Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

这个判断是否有效?我们进入BlockGenerator,发现如果数据为空时,默认会不生成Block,也就是不会生成partition。所以说,从数据生成机制看,方法2是有效的。
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

方法3:调用RDD.isEmpty
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

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

Spark Streaming程序的停止

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

首先是在启动时,就注册了关闭的方法。
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

从注册方法的内部,我们看到,实际上是注册了一个jvm的hook方法,来确保一旦发生异常,关闭方法一定会被调用,从而确保了这个方法的强制执行。
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

下面让我们进入关闭方法内部:
这里出现了一个非常重要的参数,就是stopGracefullyOnShutdown,一旦使用stopGracefully,会将所有接收的数据处理完再执行关闭,建议打开,从而确保数据安全性。
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

最后,在关闭方法的内部,实际上是调用了jobScheduler来完成。
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制

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

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

相关文章:

  • 2021-11-16
  • 2021-11-25
  • 2021-08-21
  • 2021-08-22
  • 2022-01-23
  • 2022-01-05
  • 2021-09-03
  • 2021-10-17
猜你喜欢
  • 2021-09-17
  • 2021-11-22
  • 2021-06-06
  • 2021-05-29
  • 2021-06-28
  • 2021-07-11
  • 2021-06-16
相关资源
相似解决方案