Flume FailedSinkProcessor源码解析

记flume部署过程中遇到的问题以及解决方法(持续更新) 项目需求是将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collector,collector将数据汇集后,发送给kafka,拓扑结构如下:现将调试过程中遇到的问题以及解决方法记录如下:1、 [ERROR - org.apache.thrift.server.Abstr... 阅读详情

简介

FailoverSinkProcessor是Sink组的处理器,其工作机制是通过优先级的方式选择Sink进行数据发送,最高级的Sink会持续写数据的优先权,直到其执行失败,被加入失败队列待经常最大失败回退时间恢复后重新执行。

配置参数

参数默认值描述
type-failover
priority-sink优先级
maxpenalty30000(ms)失败最大回退时间

配置示例

agent.sinks = s1 s2 s3 s4
agent.sinkgroups.group1.processor.type = failover
agent.sinkgroups.group1.processor.priority.s1 = 90
agent.sinkgroups.group1.processor.priority.s2 = 100
agent.sinkgroups.group1.processor.priority.s4 = 110
agent.sinkgroups.group1.processor.maxpenalty = 10000

以上配置,s1优先级为90,s2优先级为100,s4优先级为110,s3没有配置故默认为0,其后若有其他没配置优先即的则依次-1,如下一个为-1,下下个为-2。

源码分析

configure方法

  public void configure(Context context) {
    //TreeMap实现为红黑数,有序,按优先级大小排序。
    liveSinks = new TreeMap<Integer, Sink>();
    //Queue先入先出,即先失败的Sink先被拿出来尝试恢复
    failedSinks = new PriorityQueue<FailedSink>();
    //初始优先级
    Integer nextPrio = 0;
    //最大失败恢复时间
    String maxPenaltyStr = context.getString(MAX_PENALTY_PREFIX);
    if (maxPenaltyStr == null) {
      //默认30000
      maxPenalty = DEFAULT_MAX_PENALTY;
    } else {
      try {
        maxPenalty = Integer.parseInt(maxPenaltyStr);
      } catch (NumberFormatException e) {
        logger.warn("{} is not a valid value for {}",
                    new Object[] { maxPenaltyStr, MAX_PENALTY_PREFIX });
        maxPenalty = DEFAULT_MAX_PENALTY;
      }
    }
    for (Entry<String, Sink> entry : sinks.entrySet()) {
      String priStr = PRIORITY_PREFIX + entry.getKey();
      Integer priority;
      try {
        priority =  Integer.parseInt(context.getString(priStr));
      } catch (Exception e) {
        //没有配优先级的依次减1
        priority = --nextPrio;
      }
      if (!liveSinks.containsKey(priority)) {
        liveSinks.put(priority, sinks.get(entry.getKey()));
      } else {
        //相同优先级则不能同时加入
        logger.warn("Sink {} not added to FailverSinkProcessor as priority" +
            "duplicates that of sink {}", entry.getKey(),
            liveSinks.get(priority));
      }
    }
    //最获取最后一个key的值,即优先级最大的为活跃Sink
    activeSink = liveSinks.get(liveSinks.lastKey());
  }

总结:
1.sink组按优先级选择,优先级最大的初始化时先被选中作为活跃Sink
2.失败队列先加进去的会先被取出尝试恢复
3.相同优先级的sink,只能添加先配的那个,否则同优先级的每次都会被互相代替,flume1.2版本修成了这个Bug。
[FLUME-1002] - FailoverSinkProcessor replaces sinks with same priority
地址:flume-1.2 Release

process方法

  public Status process() throws EventDeliveryException {
    // Retry any failed sinks that have gone through their "cooldown" period
    Long now = System.currentTimeMillis();
    //去出最先失败的Sink判断恢复时间是否小于当前,小于当前即可尝试恢复
    while (!failedSinks.isEmpty() && failedSinks.peek().getRefresh() < now) {
      //取出头节点
      FailedSink cur = failedSinks.poll();
      Status s;
      try {
        //进行sink发送处理
        s = cur.getSink().process();
        if (s  == Status.READY) {
          //sink可发送数据则将其恢复
          liveSinks.put(cur.getPriority(), cur.getSink());
          //取出恢复sink后的当前Sink列表中优先级最大的
          activeSink = liveSinks.get(liveSinks.lastKey());
          logger.debug("Sink {} was recovered from the fail list",
                  cur.getSink().getName());
        } else {
          // if it's a backoff it needn't be penalized.
          //如果发送失败,则按指数方式增加时间,回到失败队列尾部
          failedSinks.add(cur);
        }
        return s;
      } catch (Exception e) {
        cur.incFails();
        failedSinks.add(cur);
      }
    }
    //若没有失败队列或没有能恢复的sink,则选用当前活跃Sink处理
    Status ret = null;
    while (activeSink != null) {
      try {
        ret = activeSink.process();
        return ret;
      } catch (Exception e) {
        logger.warn("Sink {} failed and has been sent to failover list",
                activeSink.getName(), e);
        //执行失败则加入失败队列
        activeSink = moveActiveToDeadAndGetNext();
      }
    }

    throw new EventDeliveryException("All sinks failed to process, " +
        "nothing left to failover to");
  }
总结:
    1.失败sink的恢复在每次选择sink处理数据时开始,选择失败队列的头部即最先被恢复,  
      根据失败时间决定,跟优先级没有关系。  
    2.对于活跃Sink的选择,始终根据优先级决定。

疑问:奇怪的是在看《Flume 构建高可用、可扩展的海量日志采集系统》这本书中,对于失败恢复说明如下:

疑问:

奇怪的是在看《Flume 构建高可用、可扩展的海量日志采集系统》这本书中,对于失败恢复说明如下:
在这里插入图片描述
但在process方法中,失败恢复后的sink会被加入到liveSinks中,因此如果其优先级若比当前活跃的activeSink高,则活跃Sink会被取代才是。

  //sink可发送数据则将其恢复
          liveSinks.put(cur.getPriority(), cur.getSink());
          //取出恢复sink后的当前Sink列表中优先级最大的
          activeSink = liveSinks.get(liveSinks.lastKey());
          logger.debug("Sink {} was recovered from the fail list",
                  cur.getSink().getName());
Flume容错机制 : Sink Processor Sink Processors是作用在sink组件上的容错机制。通过调度Sink Groups(就是分了组的Sinks),可以做到负载均衡(load_balance Processors)和类似HDFS中Namenode高可用(Failover Processors )那样的目的。 Failover Sink Processor Name Default Description s... 阅读详情

相关推荐

flume AvroSource和AvroSink使用

AvroSource Avro Source是flume主要的RPC Source,能接收其他节点的Avro Sink或者用Flume SDK发来的数据, 常与Avro Sink结合作为缓冲使用。 关于Avro,这篇文章有作介绍,链接:Avro使用详解 AvroSource配置参数 配置参数 默认值 描述 type - source类型 bind - ip地址,0.0.0.0绑...

SW_LCC的博客 1793

解决Flume数据采集中出现的几个问题

22/06/23 12:08:58 ERROR hdfs.HDFSEventSink: process failed sinkjava.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null

ForestCat的专栏 2182

Memory Channel源码阅读笔记

Memory Channel 使用LinkedBlockingDeque实现, 数据基于双向队列存储,可从从两端取出,插入。 主要属性: LinkedBlockingDeque queue: 存放Event Semaphore queueStored : queue中已使用空间 private volatile Integer transCapacity :一个事务中Event的最大数目 Se...

SW_LCC的博客 334

【Flume】【源码分析】flume中FailoverSinkProcessor容错处理机制源码分析

FailoverSinkProcessor顾名思义是flume中sink输出容错的处理器 继承自AbstractSinkProcessor 先看下整体源码 /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the N

三也_攻城狮 3343

Mac电脑用Latex论文排版3天速成5天实战de笔记

我后悔了,这五天竞赛搞得我视力都下降了...一个冲动的决定后成为数模竞赛论文写手,3天速成+5天时间=点亮攻克latex写论文技能💡关于Overleaf我是Mac,曾经按照大部分推荐的方式用TEXshop+vs code,但是把模板导入就开始报错。跟着少之又少的适配mac的教程(此时我已知道大概是走错路了)改了配置也无效。海鲜市场找佬改了半天,佬问我:一定要用VC吗?我说,那倒也不是。于是佬推荐我overleaf,三下五除二帮我挑配了环境,美汁汁收了我30块钱。

luwanjoyce的博客 2247

步进电机驱动算法——梯形加减速算法

目录步进电机梯形加减速梯形加减速算法原理分析算法实现 步进电机梯形加减速 电机的控制方式一般分为开环控制与闭环控制两种控制方式,其中开环控制原理框图如下: 这种种控制方式的特点是:控制简单、实现容易、价格较低,这种开环控制方式,负载位置对控制电路没有反馈。 对于步进电机,控制脉冲的输入并不依赖于转子的位置,而是按一固定的规律发出控制脉冲,如果励磁变化太快,电机不能移动到新的位置,那么实际负载位置与理想位置就会产生一个偏差,就有可能出现失步或者过冲现象,所以需要使用加减速算法。 梯形加减速算法,S加减速算法等

aaa376070331的博客 3万+

【Apache Flume系列】Flume-ng failover 以及Load balance测试及注意事项

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。 这里我主要讲述我测试flume failover(容错)和load balance(负载均衡)的几个场景以及注意的点。

Jonathan.Wei的专栏 9550

TESSY创建单元测试或集成测试工程

我们以tessy5.1为例,给大家展示单元测试和集成测试工程的创建过程。

空气中的告白专栏 1683

Flume使用过程中的异常(OOM)

1、发现启动Flume抛出异常 ERROR hdfs.HDFSEventSink: process failed java.lang.OutOfMemoryError: GC overhead limit exceeded 解决方案: 明显OOM异常,需要调大内存 顾在flume中的flume-env.sh 配置: export JAVA_OPTS="-Xms100m -Xmx2000m -Dcom.sun.management.jmxremote" 参数解释: -Xms表示JVM Heap(堆内存)最小尺

weixin_43468369的博客 985

RFSOC实战解析:MTS多片同步的时序校准与相位相干实现

本文深入解析了在RFSOC平台上实现MTS多片同步的关键技术与实战流程。文章从相位相干的重要性出发,详细阐述了SYSREF与SYNC信号的协同工作机制,并提供了从硬件时钟配置到软件API调用的完整MTS实现步骤。重点探讨了时序校准的核心方法,旨在帮助工程师解决多通道系统相位不一致的难题,确保ADC与DAC达到精确的相位相干,从而构建高性能的MIMO和相控阵系统。

weixin_29206669的博客 192

别再死磕公式了!用Python+NumPy手把手实现机器人逆运动学数值求解(附避坑指南)

本文详细介绍了如何使用Python和NumPy实现机器人逆运动学(Inverse Kinematics, IK)的数值求解方法,包括牛顿-拉弗森法、雅可比矩阵计算及奇异位形处理。通过实战代码和避坑指南,帮助开发者快速掌握现代机器人学中的核心算法,提升工程实践能力。

weixin_30687051的博客 127

flume采集数据的时候报异常

WARN - org.apache.flume.sink.hdfs.BucketWriter.callWithTimeout(BucketWriter.java:735)] Unexpected Exception null java.lang.InterruptedException at java.util.concurrent.FutureTask.awaitDone(FutureTas...

kt906885821的博客 1万+

飞腾D2000开发板实战:手把手教你为UEFI/EDK2驱动SD3077 RTC时钟芯片

本文详细介绍了在飞腾D2000开发板上为UEFI/EDK2环境驱动SD3077 RTC时钟芯片的全流程开发指南。从硬件连接到软件适配,包括引脚复用配置、电源管理优化以及UEFI驱动的深度定制,帮助开发者解决嵌入式系统中的时间同步问题,确保RTC芯片的稳定性和准确性。

weixin_30892037的博客 423

flume 无法写数据到 hdfs

问题呈现: flume启动后一直停在sink已经启动。。。 控制台看不到报错信息。。。 hdfs上查看不到数据。。。 解决方法: 检测是否为kafka问题,因为消费的是Kafka中的数据。 1) 使用 kafka-consumer-groups.sh 检测消费情况 2) 不断生成新的数据,发现数据会被 flume 消费( 但没有写入 hdfs ) 检测是否为 flume 问题 新建一个简单的 flume 配置文件,让采集本地数据到 hdfs ,这么一来,终于发现问题了(有报错信息了) 2021-07-27

weixin_46376562的博客 3572

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

Cesium进阶学习四、shadertoy(着色器)

Cesium进阶学习着色器

程迷学习的博客 4319

flume源码分析-SinkProcessor

flume包括三种sink processor,DefaultSinkProcessor,FailoverSinkProcessor,LoadBalancingSinkProcessor   Default sink processor that only accepts a single sink, passing on process results without any additi...

fannk的博客 521

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Flume的安装和测试故障转移

[b]1.实现功能 [/b] 配置Flume监控本地文件夹变化,将变化的文件上传到hdfs上。 [b]2.集群规划(3台机器都需要安装)[/b] [img]http://dl2.iteye.com/upload/attachment/0118/1297/28d83bb4-6f97-36c7-8f54-8b948969bfe4.jpg[/img] [img]http://dl2.itey...

天高任鸟飞,海阔凭鱼跃 548

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

快学Big Data -- Flume(十五)

Flume 总结 官网:http://flume.apache.org/FlumeUserGuide.html   概述 Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。 Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、hbase、hive、kafka等众多外部存储系统中 一般的采集需求,通过对flume的简单...

知识的力量 808

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Flume 1.7.0安装与实例

Flume 1.7.0安装与实例

strongyoung的专栏 1万+

flume Channel选择器

简介 channel处理器用于决定source接收的时间写入哪个channel,由其通知channel,并将时间写入。 选择器类型 flume自带两种选择器: 1.relicating(复制选择器),默认使用 2.multiplexing(多路复用选择器) 1.复制选择器 复制选择器会复制每个source接收的事件,将事件复制并分发到所有channel,可通过配置参数,控制分发的channel。 ...

SW_LCC的博客 2724

flume常见报错记录

1.java.nio.channels.ClosedChannelException Unexpected exception from downstream 一般来说,这种错误是source往channel写入数据时错误才有的异常,因此只需根据实际情况去处理就行。但有另一种错误,我们配置zabbix监控flume端口时,会每隔固定时间往source端口建立一个tcp连接但并没有发送具体数据。查看...

SW_LCC的博客 2317

flume HttpSource使用

HttpSource httpsource允许是flume提供的能接收get和post的http请求,http请求会被HttpHandler接口实现类处理,从而将http请求转换为event从而提交到channel。 http适用于一些无法通过部署SDK接收日志的场景,例如游戏客户端。 HttpSource配置使用 HttpSource基本配置参数 配置参数 默认值 描述 type...

SW_LCC的博客 1071

Flume源码阅读记录(1)flume介绍

Flume简介 Flume 是 Cloudera 提供的日志收集系统, 使用java语言编写,具有分布式、 高可靠、高可用性等特点, 适用于大数据的数据收集,聚合转换和传输。 Flume 支持在组件式配置,用户可以根据不同的应用场景部署各个组件。组件可以使用官方提供的,也可以使用用户自己二次开发的。 Flume架构 Flume的核心为Agent,每个Agent是一套完成的数据传输工具,完成数据的接...

SW_LCC的博客 612

Flume源码阅读记录(3)flume启动组件Application代码分析

public class Application { private static final Logger logger = LoggerFactory .getLogger(Application.class); public static final String CONF_MONITOR_CLASS = "flume.monitoring.type"; pub...

SW_LCC的博客 384

Flume源码阅读记录(2)flume启动过程

flume-ng 启动 当flume配置好后,使用 bin/flume-ng agent -n agent -c conf -f conf/flume-demo.conf -Dflume.root.logger=INFO,console ,即可利用flume-ng脚本以及传入的各参数启动flume服务。 flume-ng脚本 在这里注意,FLUME_AGENT_CLASS=“org.apache...

SW_LCC的博客 309
上一篇: Hive数据类型
下一篇: Flume LoadBalanceSinkProcessor源码阅读记录
SW_LCC
博客等级 码龄11年 4粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值