Spark streaming中的容错

如果executor故障,所有未被处理的数据都会丢失,解决办法可以通过wal(hbase,hdfs/WALs)方式
    将数据预先写入到hdfs或者s3.

    如果Driver故障,driver程序就会停止,所有executor都是丢失连接,停止计算过程。解决办法需要配置和编程。

    1.配置Driver程序自动重启,使用特定的clustermanager实现。
    2.重启时,从宕机的地方进行重启,通过检查点机制可以实现该功能。
        //目录可以是本地,可以是hdfs.
        jsc.checkpoint("d://....");
        不再使用new方式创建SparkStreamContext对象,而是通过工厂方式JavaStreamingContext.getOrCreate()方法创建
        上下文对象,首先会检查检查点目录,看是否有job运行,没有就new新的。

       

 JavaStreamingContext jsc = JavaStreamingContext.getOrCreate("file:///d:/scala/check", new Function0<JavaStreamingContext>() {
            public JavaStreamingContext call() throws Exception {
                JavaStreamingContext jsc = new JavaStreamingContext(conf, Seconds.apply(2));
                jsc.checkpoint("file:///d:/scala/check");
                return jsc;
            }
        });

3.编写容错测试代码,计算过程编写到Function0的call方法中。

package com.mao.spark.java;

		import org.apache.spark.SparkConf;
		import org.apache.spark.api.java.Optional;
		import org.apache.spark.api.java.function.FlatMapFunction;
		import org.apache.spark.api.java.function.Function0;
		import org.apache.spark.api.java.function.Function2;
		import org.apache.spark.api.java.function.PairFunction;
		import org.apache.spark.streaming.Duration;
		import org.apache.spark.streaming.Seconds;
		import org.apache.spark.streaming.api.java.JavaDStream;
		import org.apache.spark.streaming.api.java.JavaPairDStream;
		import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
		import org.apache.spark.streaming.api.java.JavaStreamingContext;
		import scala.Tuple2;

		import java.util.ArrayList;
		import java.util.Iterator;
		import java.util.List;

		/**
		 * Spark Streaming 容错测试
		 */
		public class JavaSparkStreamingWordCountWindowsApp {
			static JavaReceiverInputDStream sock;
			public static void main(String[] args) throws Exception {
				Function0<JavaStreamingContext> contextFactory = new Function0<JavaStreamingContext>() {
					//首次创建context时调用该方法。
					public JavaStreamingContext call() {
						SparkConf conf = new SparkConf();
						conf.setMaster("local[4]");
						conf.setAppName("wc");
						JavaStreamingContext jssc = new JavaStreamingContext(conf,new Duration(2000));
						JavaDStream<String> lines = jssc.socketTextStream("localhost",9999);

						/*******  变换代码放到此处 ***********/
						JavaDStream<Long> dsCount = lines.countByWindow(new Duration(24 * 60 * 60 * 1000),new Duration(2000));
						dsCount.print();
						//设置检察点目录
						jssc.checkpoint("file:///d:/scala/check");
						return jssc;
					}
				};
				//失败重建时会经过检查点。
				JavaStreamingContext context = JavaStreamingContext.getOrCreate("file:///d:/scala/check", contextFactory);

				context.start();
				context.awaitTermination();
			}
		}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值