Spark Streaming是基于微批处理的流式计算引擎,通常是利用Spark Core或者Spark Core与Spark Sql一起来处理数据。在企业实时处理架构中,通常将Spark Streaming和Kafka集成作为整个大数据处理架构的核心环节之一。

作者:开源大数据EMR;来源:阿里云栖社区

针对不同的Spark、Kafka版本,集成处理数据的方式分为两种:Receiver based Approach和Direct Approach,不同集成版本处理方式的支持,可参考下图:

Receiver based Approach

基于receiver的方式是使用kafka消费者高阶API实现的。

对于所有的receiver,它通过kafka接收的数据会被存储于spark的executors上,底层是写入BlockManager中,默认200ms生成一个block(通过配置参数spark.streaming.blockInterval决定)。然后由spark streaming提交的job构建BlockRdd,最终以spark core任务的形式运行。

关于receiver方式,有以下几点需要注意:

  • receiver作为一个常驻线程调度到executor上运行,占用一个cpu
  • receiver个数由KafkaUtils.createStream调用次数决定,一次一个receiver
  • kafka中的topic分区并不能关联产生在spark streaming中的rdd分区
  • 增加在KafkaUtils.createStream()中的指定的topic分区数,仅仅增加了单个receiver消费的topic的线程数,它不会增加处理数据中的并行的spark的数量【topicMap[topic,num_threads]map的value对应的数值是每个topic对应的消费线程数】
  • receiver默认200ms生成一个block,建议根据数据量大小调整block生成周期。
  • receiver接收的数据会放入到BlockManager,每个executor都会有一个BlockManager实例,由于数据本地性,那些存在receiver的executor会被调度执行更多的task,就会导致某些executor比较空闲

建议通过参数spark.locality.wait调整数据本地性。该参数设置的不合理,比如设置为10而任务2s就处理结束,就会导致越来越多的任务调度到数据存在的executor上执行,导致任务执行缓慢甚至失败(要和数据倾斜区分开)

多个kafka输入的DStreams可以使用不同的groups、topics创建,使用多个receivers接收处理数据

两种receiver可靠的receiver:

  • 可靠的receiver在接收到数据并通过复制机制存储在spark中时准确的向可靠的数据源发送ack确认不可靠的receiver:
  • 不可靠的receiver不会向数据源发送数据已接收确认。 这适用于用于不支持ack的数据源当然,我们也可以自定义receiver。
  • receiver处理数据可靠性默认情况下,receiver是可能丢失数据的。
  • 可以通过设置spark.streaming.receiver.writeAheadLog.enable为true开启预写日志机制,将数据先写入一个可靠地分布式文件系统如hdfs,确保数据不丢失,但会失去一定性能

限制消费者消费的最大速率涉及三个参数:

  • spark.streaming.backpressure.enabled:默认是false,设置为true,就开启了背压机制;
  • spark.streaming.backpressure.initialRate:默认没设置初始消费速率,第一次启动时每个receiver接收数据的最大值;
  • spark.streaming.receiver.maxRate:默认值没设置,每个receiver接收数据的最大速率(每秒记录数)。每个流每秒最多将消费此数量的记录,将此配置设置为0或负数将不会对最大速率进行限制

在产生job时,会将当前job有效范围内的所有block组成一个BlockRDD,一个block对应一个分区

kafka082版本消费者高阶API中,有分组的概念,建议使消费者组内的线程数(消费者个数)和kafka分区数保持一致。如果多于分区数,会有部分消费者处于空闲状态

Direct Approach

direct approach是spark streaming不使用receiver集成kafka的方式,一般在企业生产环境中使用较多。相较于receiver,有以下特点:

1.不使用receiver

不需要创建多个kafka streams并聚合它们

减少不必要的CPU占用

减少了receiver接收数据写入BlockManager,然后运行时再通过blockId、网络传输、磁盘读取等来获取数据的整个过程,提升了效率

无需wal,进一步减少磁盘IO操作

2.direct方式生的rdd是KafkaRDD,它的分区数与kafka分区数保持一致一样多的rdd分区来消费,更方便我们对并行度进行控制

注意:在shuffle或者repartition操作后生成的rdd,这种对应关系会失效

3.可以手动维护offset,实现exactly once语义

4.数据本地性问题。在KafkaRDD在compute函数中,使用SimpleConsumer根据指定的topic、分区、offset去读取kafka数据。

但在010版本后,又存在假如kafka和spark处于同一集群存在数据本地性的问题

5.限制消费者消费的最大速率

spark.streaming.kafka.maxRatePerPartition:从每个kafka分区读取数据的最大速率(每秒记录数)。这是针对每个分区进行限速,需要事先知道kafka分区数,来评估系统的吞吐量。

kafka修改分区数_大数据技术:解析SparkStreaming和Kafka集成的两种方式相关推荐

  1. python消费kafka逻辑处理导致cpu升高_大数据技术之一次KAFKA消费者异常引起的思考...

    本篇教程探讨了大数据技术之一次KAFKA消费者异常引起的思考,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. 问题描述: 线上出现一台服务器特别慢,于是关闭了服务器上的kafka ...

  2. kafka分区与分组原理_大数据技术-Kafka入门

    在大数据学习当中,主要的学习重点就是大数据技术框架,针对于大数据处理的不同环节,需要不同的技术框架来解决问题.以Kafka来说,主要就是针对于实时消息处理,在大数据平台当中的应用也很广泛.大数据学习一 ...

  3. mongodb 导出指定数据库文件大小_大数据技术之将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...

    本篇文章探讨了大数据技术之将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. 需求:将mongo ...

  4. 大数据产品开发流程规范_大数据技术思想入门(三):分布式文件存储的流程

    如果你不喜欢阅读文字的话,可以选择滑到最后看 视频讲解 哟~~~ 进程和 RPC 在上一篇文章中,我们讲解了要解决好大数据集的存储问题,需要引入一个主从结构的集群,其中,主服务器用于存储元数据,从服务 ...

  5. 大数据算法_大数据算法解析,如何创建用户画像实现千人千面?

    " 一面科技,一面生活 技术与社交电商的完美融合 打开了全新的幸福视界 " 幸福蜜糖  2020·11·5 大数据算法无处不在 "处在如今的时代中,数据越来越值钱,如何 ...

  6. 大数据开发和python的区别_大数据技术和python开发工程师

    容易来说,从大数据的生命周期来看,无外乎四个方面:大数据采集.大数据预处理.大数据存储.大数据分析,共同组成了大数据生命周期里最核心的技术,下面分开来说: 一.大数据采集 大数据采集,即对各种来源的结 ...

  7. python2 json大数据_大数据技术之python 操作json

    本篇文章探讨了大数据技术之python 操作json,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. #!/usr/bin/env python import json s = ...

  8. 大数据 智能交通调度_大数据技术在智能交通中的应用

    龙源期刊网 http://www.qikan.com.cn 大数据技术在智能交通中的应用 作者:庄斌 来源:<名城绘> 2018 年第 04 期 摘要:随着时代的发展和社会需求变化,现代智 ...

  9. 大数据:技术与应用实践指南_大数据技术与应用社团 社会实践总结篇

    不知不觉,我们已经在家里呆了七个月了 也不知道宿舍还好吗 小伙伴们有没有在家好好学习 在这个漫长的假期里,我们热爱学习的大数据技术与应用社团举办了为期七天的社会实践活动. 本次实践活动主要内容为网页设 ...

最新文章

  1. 自定义listview
  2. matlab strfind用法,findstr和strfind区别
  3. linux文件句柄,【LINUX】使用lsof处理文件恢复、句柄以及空间释放问题
  4. 2013递归求解单链表中的结点个数(C++,附递归函数思路讲解与手绘图)
  5. 前端:JS/16/JavaScript简介,lt;script标记,常用的两个客户端输出方法,JS注释,JS变量(声明,命名规则,赋值),变量的数据类型(数值型,字符型)
  6. [转帖]jQuery框架学习第四天:使用jQuery操作元素的属性与样式
  7. Python中的第三方模块(微信为例)
  8. apropos linux
  9. 「数据新星」Databricks 崛起启示录
  10. [NOI2010] 航空管制
  11. oracle rac定时清理归档日志,Rman 定时删除归档日志
  12. 黑群晖vmm专业版_群晖的ABB应用不错,但必须吐槽群晖 VMM功能,让你看看就是不让你好好用!!!...
  13. Mininet系列实验(五):Mininet设置带宽之简单性能测试
  14. Realtek 2.5G PCIE网卡 RTL8125B-CG支持PXE免驱简介
  15. 阿里云短信服务的使用方法
  16. seekbar自定义android,Android自定义SeekBar实现视频播放进度条
  17. 解决服务器上MSDTC不可用的办法
  18. 2.4.XXX 内核配置 介绍
  19. 操作Excel之“=VLOOKUP(V2,Sheet2!J:K,2)”公式解读
  20. vsftp实用教程(四种配置需求)

热门文章

  1. python编写一个压测重启的测试程序
  2. [crypto]-51.1-python的aes加解密/rsa生成密钥对/rsa加解密/hmac加密
  3. [CISCN2018]crackme-java
  4. MySQL 开发日志 -- 性能调优
  5. linux配置静态ip
  6. [WUSTCTF2020]level3
  7. GetLogicalDrives GetDriveType GetVolumeInformation和FindVolumeClose
  8. HttpClient发送Get请求(java)【从新浪云搬运】
  9. laravel + Vue 前后端分离 之 项目配置- 生产环境部署
  10. Mysql之增加数据_INSERT INTO