在用sparkstreaming做实时计算时,对两个数据流进行join,会因为网络延迟导致数据流批次不一致(spark中流式处理数据实际上是微批次处理,因此网络延迟会导致数据之间错开join不上)
而由于sprak对流式处理的理解实际还是批处理导致这种问题只能通过缓存到一个地方,后续进行join
一般可以采用redis缓存到内存中,但如果数据量大的话会导致内存溢出,因此我们可以设置一个网络最大延迟时间作为缓存时间,时间到了对缓存的数据进行删除即可。
将orderInfo数据写入Redis
1.存什么? orderInfo的json字符串
2.用什么类型? String 如果使用的是Redis集群,则在存数据的时候是按照RedisKey进行hash存储的,如果是Hash类型的话,不同orderId的RedisKey都一样,这样数据会都存放在相同的节点上,导致数据倾斜,某个节点压力过大
3.redisKey怎么设计? "orderInfo:"+orderId
将orderDetail数据写入Redis
1.存什么? orderDetail的json字符串
2.用什么类型? Set 在不改变结果的前提下,能用幂等的框架就用幂等,为了防止重复消费
3.redisKey怎么设计? "orderDetail:"+orderId
将UserInfo数据写入Redis
1.存什么? userInfo的json字符串
2.用什么类型? String
3.redisKey怎么设计? "userInfo:"+userId
当然sparkstreaming计算实时数据时有弊端,开窗进行数据统计groupby的时候由于开窗滑动步长一般为微批次时间间隔的整数倍,会导致不完全在窗口范围中的数据统计漏掉