SparkStreaming介绍

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()
   }
            // ...
        }   
            

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值