1.DStream无状态转换和有状态转换。
无状态转化:每个批次处理都不依赖于先前批次的数据,如map() filter() reduceByKey()等均属于无状态的
有状态转化:依赖之前的批次数据或者中间结果来计算当前批次的数据,包括updateStatebyKey()和window()
2.spark的createDstream和createDirectStream区别
追求效率、数据准确可以使用Direct方式,但需要自己对Offset进行处理。
createDstream是高层次API,数据接收存储在Spark executors中,默认会丢失,可启用WAL日志,该日志存储在HDFS上。
如果启用了WAL,需要设置存储级别,即KafkaUtils.createStream(….,StorageLevel.MEMORY_AND_DISK_SER)。
createDirectStream:定期地从kafka的topic+partition中查询最新的偏移量,再根据偏移量范围在每个batch里面处理数据,使用的是kafka的简单消费者api 。
正好一次语义(Exactly-once-semantics),传统的读取kafka数据是通过kafka高层次api把偏移量写入zookeeper中,存在数据丢失的可能性是zookeeper中和ssc的偏移量不一致。EOS通过实现kafka低层次api,偏移量仅仅被ssc保存在checkpoint中,消除了zk和ssc偏移量不一致的问题。缺点是无法使用基于zookeeper的kafka监控工具。
3.spark.streaming.stopGracefullyOnShutdown,true 优雅的停止SparkStreaming而不丢失数据。