关于spark streaming重新编译之后部署异常

2022-04-18 14:19:52 浏览数 (1)

使用spark streaming开发的人员都知道,它的容错机制是通过checkpoint来实现的,但是checkpoint有一个问题,就是当线上在运行一个spark streaming那么这时候你在编译一下(平时也难免不了对代码进行修改编译),再次发布的时候就会报checkpoint反序列化异常的errors。

然后,如果将checkpoint目录删除在发布就可以了,但是删除了容错不就实效了么?在这里我以前的做法是将kafka offset值保存到了zookeeper中,但是这样问题是更严峻的,RDD如果异常的话那么DAG的血缘就断了,等于spark的容错就没有充分利用上

在这里,官方上面有一端描述了该问题的处理方式,我将其翻译如下:

如果正在运行的spark streaming 需要升级到新的程序,那么这里有两种机制实现

1、升级spark streaming 启动并于现有程序并行执行,这样一旦新的(接收到与旧的数据相同的数据)已经预热并且准备好了,旧的程序就可以关掉了,注意,这里用于支持将数据发送到两个目的地的数据源(既:早期的程序和新升级的应用程序)

2、将现在的运行的应用程序优雅的关闭 ( 见StreamingContext.stop(...) or JavaStreamingContext.stop(…) 选项) 确保在关闭前已经将接收到的数据处理完成,然后启动升级的应用程序,将会从刚才应用程序中断的同一点开始处理,请注意,这只能通过支持源端缓存(比如:kafka和Flume)输入源来完成,因为数据需要缓冲,而之前的程序宕机了,而新的应用程序还没有启动起来,并且如果从早期的checkpoint信息点重新开始,是无法完成预先升级的程序代码的,checkpoint本质上包含序列化后的Scala/Java/Python对象,并试图将对象进行反序列化为新的对象,修改的类可能会导致错误,在这种情况下,可以让升级的应用程序使用不同的checkpoint目录或者删除以前的检查点目录

总结两点:

1.在编译之后,线上的先不要停,将新的部署之后,在停掉旧的

2.手动的优雅关闭旧的,确保数据处理正常,然后启动新的

0 人点赞