分析比较KafkaWordCount及DierctKafkaWordCount
Guide,其中提到Spark Streaming如何从Kafka中接收数据.主要有两种方法,一种是使用Receivers的旧方法,另一种是不使用Receivers的新方法(从Spark 1.3才开始引入)
val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).
需要注意的地方:
(1) Kafka中的Topic分区和Spark Streaming中RDDs的分区没有关系.因此,增加KafkaUtils.creatStream()中topic的分区仅仅只能增加使用这个从单一receiver进行consume的thread数量(only increases the number of threads using which topics that are consumed within a single receiver.),它并不能提高Spark在处理数据过程中的并行处理能力.
(2)能够为不同groups和topics创建多个Kafka输入DStream,这些DStream能够被多个receivers接收并行处理.
(3)如果使用Write Ahead Logs来备份数据,input stream的storage level应该被设置为StorageLevel.MEMORY_AND_DISK_SER
2,Approach 2:Direct Approache(No Receiers),没有Receiver直接接收数据
从Spark 1.3开始,引入了无receiver的direct方式,保证了强端对端关系.不同于使用receivers去接收数据,这种方法每隔一段时间就去查询Kafka最近生成的每一个主题+分区(topic+partition),并根据该查询结果,来处理每一个batch的数据处理范围.
当处理数据的Job运行起来,Kafka简单的consumer API被用来从Kafka的defined ranges中读取数据(类似于从文件系统读取数据).
相比于基于receiver的方式,无receiver方式具有如下优点:
(1)更容易实现并行处理.不需要创建更多的Kafka input streamings并union它们.使用directStream,Spark Streaming会创建与Kafka分区一样多的RDD分区进行consume,这些会并行从Kafka读取数据.因此Kafka分区与RDD分区之间有了一对一的关系.
(2)高效.在Approach1中,需要使用Write Ahead Log机制来保证数据0丢失,但是这样会导致数据重复保存.(分别在Kafka和Write Ahead Log中).Approach2不使用receiver,所以不需要Write Ahead Logs.丢失的数据可以在Kafka中进行恢复.
(3)Exactly-once.Approach1中采用典型的方法去consume Kafka数据,同时使用Write Ahead Logs去保证数据的0丢失,这样实现了at-least once.只有很少的可能会出现数据在failure后被consume两次.在Approach2中,使用简单Kafka API不使用Zookeeper,在Spark Streaming的checkpoints位置会跟踪记录数据的offsets
这种方法的一个不足之处是,不会更新Zookeeper中的offsets,因此基于Zookeeper的Kafka监控工具不会显示这个过程.然而你可以在每个batch中手动更新Zookeeper.
在编程中使用Approach2:
import org.apache.spark.streaming.kafka._
val directKafkaStream = KafkaUtils.createDirectStream[[key class],[value class],[key decoder class],[value decoder class]](streamingContext,[map of kafka parameters],[set of topics to consume])
在DirectKafkaWordCount中:
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicsSet)
在Kafka的参数中,必须指定metadata.broker.list或者bootstrap.servers.默认清空下,会从Kafka分区最新的offset开始consuming.如果将Kafka的auto.offset.reset参数设置为smallest,会从最小的offset开始consuming
还可以通过使用KafkaUtils.createDirectStream的其他配置参数从任意的offset开始consuming.更进一步,如果想从Kafka的每一个batch接收Kafka offsets,按如下方式进行:
// Hold a reference to the current offset ranges, so it can be used downstream
var offsetRanges = Array[OffsetRange]()
directKafkaStream.transform { rdd =>
offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
rdd
}.map {
...
}.foreachRDD { rdd =>
for (o <- offsetRanges) {
println(s"${o.topic} ${o.partition} ${o.fromOffset} ${o.untilOffset}")
}
...
}
使用这种方法可以更新Zookeeper,从而可以是基于Zookeeper的Kafka监控工具显示streaming程序运行过程中的监控清空.
Note that the typecast to HasOffsetRanges will only succeed if it is done in the first method called on the directKafkaStream, not later down a chain of methods. You can use transform() instead of foreachRDD() as your first method call in order to access offsets,
then call further Spark methods. However, be aware that the one-to-one mapping between RDD partition and Kafka partition does not remain after any methods that shuffle or repartition, e.g. reduceByKey() or window().
Another thing to note is that since this approach does not use Receivers, the standard receiver-related (that is, configurations of
the formspark.streaming.receiver.* ) will not apply to the input DStreams created by this approach (will apply to other input DStreams though).
Instead, use the configurations spark.streaming.kafka.*.
An important one is spark.streaming.kafka.maxRatePerPartition which is the maximum rate (in messages per second) at which each Kafka partition
will be read by this direct API.
分析比较KafkaWordCount及DierctKafkaWordCount的更多相关文章
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 一起来玩echarts系列(一)------箱线图的分析与绘制
一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...
- UWP中新加的数据绑定方式x:Bind分析总结
UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
随机推荐
- 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...
- 网络安全之在Kali Linux上安装Openvas
本文目录: 一.解决和配置更新源问题 二.安装Openvas 三.自定义登陆密码 四.升级Openvas 五.查看Openvas运行情况 六.修改OpenVAS远程链接 =============== ...
- 原生Js写轮播图代码
html css js 在知道jQuery如何实现轮播效果的基础上,用js写代码 如图:标记这里的地方 理解一下 用到的知识: 1.HTML DOM 的appendChild() 和 removeCh ...
- CSS布局套路
这篇笔记的目的是记录分别应用float和flex布局的方法.主要是对遇到的问题进行总结. 1.float布局 总结: 1.1 使用float布局要清除浮动,清除的方法是,在父元素添加如下样式 .cle ...
- ng-book札记——内置指令
Angular提供了一些内置指令(directive),这些添加在HTML元素(element)上的特性(attribute)可以赋予更多的动态行为. NgIf ngIf指令用于在某个条件下显示或者隐 ...
- Dynamics 365 你所期待的子网格编辑终于来了
Dynamics 365的online版本已经在11月1号发布了,on-premises版也在没几天后发布,今天略看了一眼 what's new 一眼就看到了 editable grids,这个不用我 ...
- 粗浅看Struts2和Hibernate框架
----------------------------------------------------------------------------------------------[版权申明: ...
- 让你的代码量减少3倍!使用kotlin开发Android(一)
让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...
- android 自定义view之侧滑效果
效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.Vi ...
- Android简易实战教程--第三十九话《简单的模糊查询》
今天这一篇小案例模拟模糊查询,即输入一个字符,显示手机对应的所有存在该字符的路径. 布局: <?xml version="1.0" encoding="utf-8& ...