Spark 连接kafka的两种(Receiver与Direct)方式的区别

Receiver方式:

在这里插入图片描述

Receiver方式是使用高级API,需要消费者连接zookeeper来读取数据。是由zookeeper来维护偏移量,不用我们手动维护,这样的话就比较简单,减少了代码量。但是特有很多缺点:

1.丢失数据。他是由Executor内的Receiver来拉取数据并存放到内存中,再由Driver端提交的job来处理数据。这样的话,如果底层节点出现错误,就会发生数据丢失。
2.浪费资源。为了防止再次启动时发生数据重复消费的问题,spark采用了WALs方式将数据同步到高可用数据存储平台上(HDFS,S3),如果发生错误再次启动的时候就读取数据存储平台的数据来防止重复消费。所以就导致了一份数据存储两份,浪费了资源。
3.效率低:因为是分批次执行的,他是接受数据,直到达到了设定的时间间隔,才进行计算。而且我们在kafkaUtils.creatStream()中设定的partition数量,只会增加reciver数量,不能提高并行计算的效率,但我们可以设定不同的group和topic创建Dstream,然后再用Union合并Dstream,提高并行度。

Driect方式:

在这里插入图片描述

Driect方式则采用的是最底层的API,直接连接在kafka服务器上读取数据。需要我们自己维护偏移量,代码量稍微大些。不过这种方式的优点:

1.当我们读取topic下的数据的时候,它会自动对应Topic下的partition生成相应数量的RDD Partition,提高了计算时的并行度,提高了效率。
2.他不需要通过WAL来维持数据的完整性。采取Driect直连方式时,当数据发生丢失,只要kafka上的数据进行了复制,就可以根据副本来进行数据的重新拉取。
3.他保证了数据只消费一次,因为我们将偏移量保存在一个地方(mysql,zookeeper,hbase),当我们读取数据时,从这里拿到数据的起始偏移量和读取偏移量确定读取范围,通过这些我们可以读取数据,当读取完成后会更新偏移量,这就保证了数据只消费一次。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值