SparkStreaming 对接kafka实时计算程序HA高可用

HA高可用性:High Availability,如果有些数据丢失,或者节点挂掉;那么不能让你的实时计算程序挂了;必须做一些数据上的冗余副本,保证你的实时计算程序可以7 * 24小时的运转

1、updateStateByKey、window等有状态的操作,自动进行checkpoint,必须设置checkpoint目录
checkpoint目录:容错的文件系统的目录,比如说,常用的是HDFS

SparkStreaming.checkpoint("hdfs://192.168.1.105:9090/checkpoint")

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

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

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

private static void testDriverHA() {
		final String checkpointDir = "hdfs://192.168.1.105:9090/streaming_checkpoint";
		
		JavaStreamingContextFactory contextFactory = new JavaStreamingContextFactory() {
			
			@Override 
			public JavaStreamingContext create() {
				SparkConf conf = new SparkConf()
						.setMaster("local[2]")
						.setAppName("AdClickRealTimeStatSpark");
				
				JavaStreamingContext jssc = new JavaStreamingContext(
						conf, Durations.seconds(5));  
				jssc.checkpoint(checkpointDir);
				
				Map kafkaParams = new HashMap();
				kafkaParams.put(Constants.KAFKA_METADATA_BROKER_LIST, 
						ConfigurationManager.getProperty(Constants.KAFKA_METADATA_BROKER_LIST));
				String kafkaTopics = ConfigurationManager.getProperty(Constants.KAFKA_TOPICS);
				String[] kafkaTopicsSplited = kafkaTopics.split(",");  
				Set topics = new HashSet();
				for(String kafkaTopic : kafkaTopicsSplited) {
					topics.add(kafkaTopic);
				}
				
				JavaPairInputDStream adRealTimeLogDStream = KafkaUtils.createDirectStream(
						jssc, 
						String.class, 
						String.class, 
						StringDecoder.class, 
						StringDecoder.class, 
						kafkaParams, 
						topics);
				
				JavaPairDStream filteredAdRealTimeLogDStream = 
						filterByBlacklist(adRealTimeLogDStream);
				generateDynamicBlacklist(filteredAdRealTimeLogDStream);
				JavaPairDStream adRealTimeStatDStream = calculateRealTimeStat(
						filteredAdRealTimeLogDStream);
				calculateProvinceTop3Ad(adRealTimeStatDStream);  
				calculateAdClickCountByWindow(adRealTimeLogDStream);  
			  
				return jssc;
			}
		  
		};
		
		JavaStreamingContext context = JavaStreamingContext.getOrCreate(
				checkpointDir, contextFactory);
		context.start();
		context.awaitTermination();
	}

注意使用这种方式 必须基于cluster并且 提交时指定两个参数

spark-submit
--deploy-mode cluster
--supervise

3、实现RDD高可用性:启动WAL预写日志机制
spark streaming,从原理上来说,是通过receiver来进行数据接收的;接收到的数据,会被划分成一个一个的block;block会被组合成一个batch;针对一个batch,会创建一个rdd;启动一个job来执行我们定义的算子操作。 女

receiver主要接收到数据,那么就会立即将数据写入一份到容错文件系统(比如hdfs)上的checkpoint目录中的,一份磁盘文件中去;作为数据的冗余副本。

无论你的程序怎么挂掉,或者是数据丢失,那么数据都不肯能会永久性的丢失;因为肯定有副本。

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

spark.streaming.receiver.writeAheadLog.enable true

你可能感兴趣的:(实战,spark)