Spark + Kafka 集成 指南
来源:互联网 发布:盘古网络唐山icp备 编辑:程序博客网 时间:2024/05/01 16:19
最近在考虑Spark在消费Kafka 分区数据的过程中究竟反生了什么? 因为比较疑惑现有系统架构会不会遭遇这方面的瓶颈,遂决定去搞一把,一探究竟.
参考:Spark API章节 http://spark.apache.org/docs/1.5.0/streaming-kafka-integration.html 及 http://spark.apache.org/docs/1.5.0/configuration.html
关于Kafka做一下简短的总结,Kafka可参考附件1:
- 多个TOPIC分布在多个Broker中
- 每个TOPIC的数据以分区的方式分布在多个Broker中
- 一个分区同时只能被一个Consumer消费
- 同一个TOPIC允许被不同的Group重复消费,Group内不允许重复消费
Spark接入Kafka数据的两种方式Receiver-based && Direct Approach. 各有特点.
Receiver-based,基于接收器的kafka数据消费,
- API示例如下
val kafkaStream = KafkaUtils.createStream(streamingContext, [ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])
- 概述
- KAFKA高阶API实现,因而编程实现简单.
- 接收器接负责收数据存储到Sparnk 执行器,可能是内存或者磁盘
- 默认配置下潜在的数据丢失风险,可以启用客户端日志特性,该操作将对消费的数据进行以日志文件形式进行存储进而避免依赖于ZK的数据消费异常
- 点晴
- 基于接收器的Kafka数据消费Kafka分区与RDD分区之间没有关联,进而参数[per-topic number of Kafka partitions to consume] ,实际上只是增加了接收器接收数据的并行度而并没有提高Saprk 处理数据的并行度.
- 可以使用多个Reciver来并行消费不同Topic 及不同Group下的数据
- 启用日志特性需要指定数据的存储级别,KafkaUtils.createStream(..., StorageLevel.MEMORY_AND_DISK_SER)
Direct Approach,直接获取数据
- 概述
- 一种端对端的数据消费策略,一个Kafka分区对应一个RDD分区.
- 定期的快速扫描Kafka中每个Partion 及Topic 的最新Offsets以确定当前批次的数据偏移范围,该过程使用低阶API来实现
- 优势
- 简化的并行度,基于DirectStream SparkStream将创建多个RDD分区去消费Kafka分区数据
- 效率上的提升,客户端Offsets不再依赖于ZK存储的Offsets而改由Spark checkPoint 进行跟踪,每次取数据直接使用偏移获取
- 一次消费保证, Offsets 不在依赖于ZK ,排除了ZK Offsets可能不同步的情况,消除了 Spark和Kafka之间的不一致性,意味着数据的消费由Spark掌控,只要数据存在于Kafka即可.
- 弊端
- offsets由Spark在checkpoint中维护不自动更新ZK中的Offsets,导致一些依赖于ZKOffsets监控的工具失效.
- 配置项目
- auto.offset.reset 消费者首次连接时offsets的生成策略,largest/smallest,分别代表当前最新消息位置/最早消息位置.
- spark.streaming.kafka.* 其它可配置的参数
- spark.streaming.kafka.maxRetries 最大重试次数
- spark.streaming.kafka.maxRatePerPartition 每秒中消费的最大条数 ,该参数对于从数据积压中进行恢复有显著调节作用.
附件1:kafka 知识图解
2 0
- Spark + Kafka 集成 指南
- Spark Streaming + Kafka集成指南
- Kafka+Spark Streaming集成
- Spark Streaming -2. Kafka集成指南(Kafka版本0.10.0或更高版本)
- Spark Streaming 集成 Kafka 总结
- Spark Streaming集成Kafka总结
- Spark Streaming + Kafka整合指南
- 「官文译」Spark Streaming2.1.1 + Kafka集成指南(Kafka代理版本0.8.2.1或更高版本)
- 「官文译」Spark 结构Streaming-2.1.1 + Kafka 集成指南 (Kafka broker version 0.10.0 or higher)
- Spark Streaming 与 Kafka 集成分析
- Spark Streaming与Kafka集成编程
- Apache Kafka -8 与Spark集成
- spark-streaming集成Kafka工程实例【转】
- Spark Streaming和Kafka整合开发指南
- Spark Streaming和Kafka整合开发指南
- Spark学习八:spark streaming与flume和kafka集成
- Spark 与 Kafka 集成出错: Apache Spark: java.lang.NoSuchMethodError
- Spark(1.2.0) Streaming 集成 Kafka 总结
- 再谈子线程-居然可以在非UI线程中更新UI
- leetcode解题之237# Delete Node in a Linked List Java版 (删除链表中指定的结点)
- java中的字节流总结
- 蓝桥杯 集合运算(set)
- “玲珑杯”ACM比赛 Round #12【dp】
- Spark + Kafka 集成 指南
- Ubuntu vsftp配置
- 快速排序
- Date.parse()与Date.getTime()方法详解
- 最长公共子序列
- PHP版eclipse配置xampp
- Linux中cat、more、less、tail、head命令的区别
- 被讨厌的勇气
- codefroces 791C Bear and Different Names