Spark streaming实时计算程序的HA高可用

一、设置checkpoint目录

在程序中,如果用到了updateStateByKey、window等有状态的操作,自动进行checkpoint,必须设置checkpoint目录。

checkpoint目录:容错的文件系统的目录,比如说,HDFS

jssc.checkpoint("xxxxxxx");

设置完这个目录之后,有些会自动进行checkpoint操作的DStream,就实现了HA高可用性;相当于吧数据保留一份在容错文件系统中,一旦内存中的数据丢失,可以直接从文件系统中读取数据,不需要重新计算。

 

二、Driver的高可用性

第一次在创建和启动StreamingContext的时候,将持续不断地将实时计算程序的元数据(比如,有些dstream或job执行到了哪个步骤),如果后面因为某些原因导致driver节点挂掉,那么可以让spark集群帮着我们自动重启driver,然后继续运行计算程序的时候,会接着之前的作业继续执行,不会中断,不会丢失数据。

第一次在创建和启动StreamingContext的时候,将元数据写入容错的文件系统中(比如HDFS);spark-submit脚本中加一些参数;保证在driver挂掉之后,spark集群可以自己将driver重新启动起来;而且driver在启动的时候,不会重新创建一个streaming context,而是从容错文件系统中读取之前的元数据信息,包括job的执行进度,接着之前的进度,继续执行。

使用这种机制,必须使用cluster模式提交,确保driver运行在某个worker上面;

部分代码参考如下:

JavaStreamingContextFactory contextFactory = new JavaStreamingContextFactory() {

  @Override

  public JavaStreamingContext create() {

    JavaStreamingContext jssc = new JavaStreamingContext(...); 

    JavaDStream lines = jssc.socketTextStream(...);    

    jssc.checkpoint(checkpointDirectory);                      

    return jssc;

  }

};

 

JavaStreamingContext context = JavaStreamingContext.getOrCreate(checkpointDirectory, contextFactory);

context.start();

context.awaitTermination();

脚本部分参考代码:

spark-submit

--deploy-mode cluster

--supervise

 

三、实现RDD高可用性:启动WAL预写日志机制

spark streaming,从原理上来说,是通过receiver来进行数据接收的,接收到的数据会被划分成一个一个的block;block会被组合成一个batch;针对一个batch,会创建一个rdd,启动一个job来执行我们定义的算子操作;

receiver只要接收到数据,会立即将数据写入一份到容错文件系统上的checkpoint目录中,一份到磁盘文件中,作为数据的冗余副本。所以,无论程序怎么挂掉,或者数据丢失,数据都不可能会永久性地丢失。

WAL(Write-Ahead Log)预写日志机制

设置方法:

SparkConf.set("spark.streaming.receiver.writeAheadLog.enable ","true");

 

 

 

 

 

 

你可能感兴趣的:(Spark,Streaming)