SparkStreaming
reids是基于内存的数据库,读取速度快
Jedis是Redis官方推荐的面向Java的操作Redis的客户端
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。
支持基本的数据类型如:String、Hash、List、Set、Sorted Set。
优点:比较全面的提供了Redis的操作特性,相比于其他Redis 封装框架更加原生。
编程模型: 使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,
不支持异步操作。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
一。reids->Jedis->JedisPool
# ConsumerStategies 消费策略
//Kafka consumer
//subscribe(group.id)
_COSUMER_OFFSETS
kb16_kafka_01 : GROUP.ID
industry_line_one : TOPIC
0 389
1 3882
2 292
//assign : 客户端记录消费偏移 TopicPartition
TopicPartition(industry_line_one,0) 389
TopicPartition(industry_line_one,1) 3882
TopicPartition(industry_line_one,2) 292
# LocationStrategies 定位策略
//PreferBrokers : kafka和spark在同一集群内,则Executor会被创建在kafka分区所在的节点
//PreferConsistent : 外部执行,均匀消费
//PreferFixed(map:Map[TopicPartition,String]) : 指定分区消费
# 消费模式
//Receiver
//Direct
1、和kafka底层api对接,通过kafka isr机制实现容错
2、rdd_partition : kafka_partition = 1:1 => offsetRange管理
3、事务 Exactly once => 客户端通过事务机制实时存储消费位置
redis => job dead
checkpoint
4、ZeroCopy
# 背压(反压)机制
# 消费端通过开启反压机制
spark.streaming.backpressure.enabled => true
ReceiverRateController -RateEstimator -> update -> Kafka底层的api
spark.streaming.kafka.maxRatePartition =>
(executor_memory_size/single_message_size_in_byte) * 0.8
# checkpoint
val context: StreamingContext
// Subscribe需要设置checkpoint, 而Assign通常通过外部数据源记录元数据
context.checkpoint(hdfsPath: String)
val ids: InputDStream[ConsumerRecord[Long, String]]
// Subscribe 设置元数据检查点生成间隙,定期自动生成检查点
ids.checkpoint(interval: Duration)
# rdd data 检查点
val rdd: RDD[T]
sc.setCheckpointDir(path: String) //设置数据检查点路径,建议hdfs
...
rdd.checkpoint() //生成检查点
boolean yes = rdd.isCheckpointed //当前rdd对象是否生成检查点
# 案例一:
//sc.textFile(path).mapParitions(...).groupByKey().mapValues().sortByKey()
val rdd1 = sc.textFile(path).mapParitions(...)
//rdd1.checkpoint()
val rdd2 = rdd1.groupByKey().mapValues().sortByKey()
// rdd2.checkpoint()
// rdd3
rdd4 = rdd2.join(rdd3)
//rdd4执行中出现错误,容错如下
rdd2根据血统逆序追踪,
if(rdd2.isCheckpointed) 则从检查点路径直接恢复数据
else if(rdd1.isCheckpointed) rdd2 =
rdd2 = rdd1.groupByKey().mapValues().sortByKey()
else
rdd2 = sc.textFile(path)
.mapParitions(...)
.groupByKey()
.mapValues()
.sortByKey()
# 案例二:
def cal(rdd: RDD[(Int, String, Long)]) = {
if(!rdd.isCheckpointed){
rdd.checkpoint()
}
// ...
}