Storm-kafka源码分析之Config相关类
要创建一个KafkaSpout对象,必须要传入一个SpoutConfig对象,KafkaSpout的构造函数定义如下:
public KafkaSpout(SpoutConfig spoutConf) {
_spoutConfig = spoutConf;
}
SpoutConfig继承KafkaConfig,并实现Serializable,由于在KafkaConfig中所有的属性字段都是public的因此在SpoutConfig中可以直接引用,SpoutConfig类的定义如下其中核心字段添加了注释。
public class SpoutConfig extends KafkaConfig implements Serializable {
//记录zookeeper的地址列表
public List<String> zkServers = null;
//zookeeper端口号
public Integer zkPort = null;
//该参数是Consumer消费的meta信息,保存在zk的路径,自己指定
public String zkRoot = null;
//唯一id
public String id = null;
//向zookeeper记录offset的间隔时间
public long stateUpdateIntervalMs = 2000;
public SpoutConfig(BrokerHosts hosts, String topic, String zkRoot, String id) {
super(hosts, topic);
this.zkRoot = zkRoot;
this.id = id;
}
}
KafkaConfig的定义如下:
public class KafkaConfig implements Serializable {
//用以获取Kafka broker和partition的信息
public final BrokerHosts hosts;
//读消息的topic
public final String topic;
//消息者所用的client id
public final String clientId;
//每次从kafka读取的byte数
public int fetchSizeBytes = 1024 * 1024;
//Consumer连接kafka server超时时间
public int socketTimeoutMs = 10000;
//当服务器没有新消息时,消费者会等待这些时间
public int fetchMaxWait = 10000;
//consumer段的缓冲区大小
public int bufferSizeBytes = 1024 * 1024;
//数据发送的序列化和反序列化定义的Scheme
public MultiScheme scheme = new RawMultiScheme();
//是否强制从kafka中offset最小开始读数据,和startOffsetTime,一起用,默认情况下,为false,一旦startOffsetTime被设置,就要置为true
public boolean forceFromStart = false;
//从何offset时间开始读,默认为最旧的offset
public long startOffsetTime = kafka.api.OffsetRequest.EarliestTime();
//每次kafka会读取一批offset存放在list中,当zk offset比当前本地保存的commitOffse相减大于这个值时,重新设置commitOffset为当前zk offset
public long maxOffsetBehind = Long.MAX_VALUE;
//如果所请求的offset对应的消息在Kafka中不存在,是否使用startOffsetTime
public boolean useStartOffsetTimeIfOffsetOutOfRange = true;
//多长时间统计一次metrics
public int metricsTimeBucketSizeInSecs = 60;
public KafkaConfig(BrokerHosts hosts, String topic) {
this(hosts, topic, kafka.api.OffsetRequest.DefaultClientId());
}
public KafkaConfig(BrokerHosts hosts, String topic, String clientId) {
this.hosts = hosts;
this.topic = topic;
this.clientId = clientId;
}
}
影响初始读取进度的配置
在一个topology上线后,KafkaSpout从何处开始读消息呢,有几个配置影响读消息的位置,先罗列如下:
- SpoutConfig中的id字段:如果想让一个topology从另一个topology之前的处理进度处读取数据,他们需要有相同的id
- KafkaConfig的forceFromStart字段:如果该字段为true,在topology上线后会忽略之前id相同的topology的进度,重新从最早的消息处读取
- KafkaConfig的startOffsetTime字段:默认为kafka.api.OffsetRequest.EarliestTime()开始读,也就是从Kafka中最早的消息开始处理。也可以设成kafka.api.OffsetRequest.LatestOffset,也就是最晚的消息开始读。也可以自己指定具体的值
- KafkaConfig的maxOffsetBehind字段:这个字段对于KafkaSpout的多个处理流程都有影响。当提交一个新topology时,如果没有forceFromStart, 当KafkaSpout对某个partition的处理进度落后startOffsetTime对应的offset多于此值时,KafkaSpout会丢弃中间的消息,从而强制赶上目标进度.比如,如果startOffsetTime设成了lastestTime,那么如果进度落后超过maxOffsetBehind,KafkaSpout会直接从latestTime对应的offset开始处理。如果设成了froceFromStart,则在提交新任务时,始终会从EarliestTime开始读。
- KafkaSpout的userStartOffsetTimeIfOffsetOutOfRange字段:如果设成true,那么当fetch消息时出错,且FetchResponse显示的出错原因是OFFSET_OUT_OF_RANGE,那么就会尝试从KafkaSpout指定的startOffsetTime对应的消息开始读。例如,如果有一批消息因为超过了保存期限被Kafka删除,并且zk里记录的消息在这批被删除的消息里。如果KafkaSpout试图从zk的记录继续读,那么就会出现OFFSET_OUT_OF_RANGE的错误,从而触发这个配置
Storm-kafka源码分析之Config相关类的更多相关文章
- Apache Kafka源码分析 – Broker Server
1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...
- Kafka源码分析系列-目录(收藏不迷路)
持续更新中,敬请关注! 目录 <Kafka源码分析>系列文章计划按"数据传递"的顺序写作,即:先分析生产者,其次分析Server端的数据处理,然后分析消费者,最后再补充 ...
- Kafka源码分析(一) - 概述
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 实际问题 二. 什么是Kafka, 如何解决这些问题的 三. 基本原理 1. 基本 ...
- Kafka源码分析(三) - Server端 - 消息存储
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 业务模型 1.1 概念梳理 1.2 文件分析 1.2.1 数据目录 1.2.2 . ...
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...
- kafka源码分析之一server启动分析
0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...
- Kafka源码分析(二) - 生产者
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...
- apache kafka源码分析-Producer分析---转载
原文地址:http://www.aboutyun.com/thread-9938-1-1.html 问题导读1.Kafka提供了Producer类作为java producer的api,此类有几种发送 ...
- Kafka源码分析及图解原理之Producer端
一.前言 任何消息队列都是万变不离其宗都是3部分,消息生产者(Producer).消息消费者(Consumer)和服务载体(在Kafka中用Broker指代).那么本篇主要讲解Producer端,会有 ...
随机推荐
- 测试用例Excel模板For Quality Center
Subject Test Name Description Step Name Step Description Expected Result PU Regr\Component\Attribut ...
- Cookis与文件缓存的区别
我是一位顶尖的网络专家.稍后更新...
- 用winsw让任何Windows程序都能运行为服务
用winsw让任何Windows程序都能运行为服务 winsw介绍 有时候我们需要在Windows下开机运行某些程序,这对于有图形界面的程序来说一般不是什么事,在选项中选中开机启动,然后它们就可以自动 ...
- Django入门与实践-第16章:用户登录(完结)
# myproject/settings.py LOGIN_REDIRECT_URL = 'home' EMAIL_BACKEND = 'django.core.mail.backends.conso ...
- memmove、memcpy、strcpy、memset的实现
memmove.memcpy.strcpy.memset 原型为: void *memmove( void* dest, const void* src, size_t count ); char* ...
- deploy myeclipse j2ee project to server 按了没反应 怎么办
解决办法: 1.如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了. 这个文件在Myeclipse工作区(workspace) .metadata\.plugins\org.eclips ...
- 基础的linux学习
学习了这几个命令分享一下: 文本文件内搜索数据 grep -n -e pattern1 -e pattern2 file1 -n 搜索到的数据显示行号展示 -e pattern1 多个匹配模式下可以通 ...
- b2_trsd_EDSD_new
# -*- coding:utf-8 -*- import re ss="./data/" year = '17A' filename = ss+'EDSD%s.txt'%year ...
- python 编码方式大全 fr = open(filename_r,encoding='cp852')
7.8.3. Standard Encodings Python comes with a number of codecs built-in, either implemented as C fun ...
- hdu 1425
题目 这道题用快排做总是会超时,但是别人的快排就不会超时,最后看博客说最保险的方法还是用哈希的思想[哈希思想:散列再循环,对每一个数字进行通过改变哈希表的地址散列放置,将散列地址的哈希表记为1,这样 ...