• 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的错误,从而触发这个配置
  • 相关阅读:
    闲聊js中的apply、call和arguments
    字符串操作,文件操作,英文词频统计预处理
    了解大数据的特点、来源与数据呈现方式
    带你精读你不知道的Javasript(上)(一)
    益智小游戏看你能否通关?
    网站性能优化——网页的生成过程
    带着封装的思想顺便实现楼层点亮
    CSS3 傻傻分不清楚的transition, transform 和 animation
    图片轮播的思路
    如何处理跨平台的自适应三
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8289926.html
Copyright © 2020-2023  润新知