一种基于内存计算的流式数据处理模型
介绍
这是一种基于Spark内存计算框架的实时流式处理模型,可用于预处理数据、实时数据统计、实时数据分析等方面。
组成
以下,是这个流式数据处理模型的重要组成部分:
- Spark Streaming
- Spark流式计算框架
- 支持多种数据源,如kafka、HDFS、socket等
- kafka
- kafka在大数据下的延时是接近1ms级别,因此,用于传输实时数据非常合适
- 通过调参,能够保证大量数据中的出现数据丢失的机率接近于0
重要概念
Spark Streaming
sparkStreaming是spark中用于实时计算的一个模块,可以实现低延时,零丢失等目标。sparkStreaming是一种流式计算架构,支持多种数据源,如HDFS数据文件、Socket数据、分布式消息系统kafka的数据等。总而言之,支持多种常见的数据源。sparkStreaming有两种计算模型,一种是基于receiver,另一种是direct,以下,讲解一下这两种模型。
1、receiver(AWL)
这是kafka与streaming结合的基本方式,如图spark集群中的 worker节点中 exeutor线程里的 receiver接口会一直消费kafka中的数据,那么问题来了,假如我们定义5秒消费一次,如果spark集群定义了每个worker使用的cpu资源不足以消费完了这5秒的数据,那么就会出现数据的丢失,消费不了的那些数据就没了,并且streaming一经启动会一直循环消费拉取资源,如果出现上述问题,分配的cpu不足以消费5秒拉取的数据,那么丢失的数据便会越积越多,这在程序里是严重的bug。
上面那种图说的就是awl方式,这种方式是以前常用的方式,我们在程序里对streamingContext初始化后,得到他的对象进行checkpoint(“hdfs://xxxx/xx”) 即可,这样程序会默认把日志偏移量存到hdfs上面做备份,防止数据丢失,但是这样会影响性能。
2、direct
direct方式是直接获取流进行消费处理,速度快、延时低下,可靠性强,当然,要实现数据的最为可靠性,最好不要使用自动提交,因为自动提交如果处理出现问题,还是会出现数据丢失。同时,要注意一些幂等操作。
3、demo
- 官方demo
/ The details depend on your data store, but the general idea looks like this
// begin from the the offsets committed to the database
Map<TopicPartition, Long> fromOffsets = new HashMap<>();
for (resultSet : selectOffsetsFromYourDatabase)
fromOffsets.put(new TopicPartition(resultSet.string("topic"), resultSet.int("partition")), resultSet.long("offset"));
}
JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(
streamingContext,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Assign(fromOffsets.keySet(), kafkaParams, fromOffsets)
);
stream.foreachRDD(rdd -> {
//这一步获取必须是rdd的偏移值获取最先操作,否则会出现偏移值等出错的问题
OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd