什么是退避算法:
In a single channel contention based medium access control (MAC) protocols, whenever more than one station or node tries to access the medium at the same instant of time, it leads to packet collisions. If the collided stations tries to access the channel again, the packets will collide as the nodes are synchrozied in time. So the nodes need to be displaced in time. To displace them temporally, a backoff algorithm is used (example binary exponential backoff (BEB)). For example, in BEB algorithm, whenever a node's transmission is involved in a collision with another node's transmission, both nodes will choose a random waiting time and wait for this amoiunt of time before attempting again. If they are not successful in this attempt, they double their contention window and choose a randoim waiting time before transmitting again. This process will be repeated for certain number of attempts. If the nodes are not successful in their transmission after this limit, the packets will be dropped from their queue.
大致意思是,在一个共享信道的情况下,当网络上的节点在发生冲突时,每个节点节点等待一定的时间后重新发送。在二进制指数退避算法中,等待时间随着以二为底的指数增长。如果重试失败,那么下次的等待时间将会是上次的等待时间二倍。如果重试次数大于最大重试次数,那么包将从包队列中去除。
我们认识了什么是退避算法之后,来看一下flume中对退避算法的应用。从退避算法的概念可知,该算法用在网络错误,重试的情况中,例如打开一个网络链接,向网络中发送数据等。在flume中,insistentAppend和insistentOpen封装器都用到了退避算法来处理网络的发送数据和链接打开过程。我们来通过insistentAppend中的append方法例子,看一下怎么对退避算法进行运用。
public void append(Event evt) throws IOException, InterruptedException {
List<IOException> exns = new ArrayList<IOException>();
int attemptRetries = 0;
appendRequests++;
while (!backoff.isFailed() && isOpen.get()
&& !Thread.currentThread().isInterrupted()) {
try {
appendAttempts++;
super.append(evt);
appendSuccesses++;
backoff.reset(); // reset backoff counter;
return;
} catch (InterruptedException ie) {
throw ie;
} catch (IOException e) {
// this is an unexpected exception
long waitTime = backoff.sleepIncrement();
LOG.info("append attempt " + attemptRetries + " failed, backoff ("
+ waitTime + "ms): " + e.getMessage());
LOG.debug(e.getMessage(), e);
exns.add((e instanceof IOException) ? (IOException) e
: new IOException(e));
backoff.backoff();
try {
backoff.waitUntilRetryOk();
} catch (InterruptedException e1) {
// got an interrupted signal, bail out!
throw e1;
} finally {
attemptRetries++;
appendRetries++;
}
} catch (RuntimeException e) {
// this is an unexpected exception
LOG.info("Failed due to unexpected runtime exception "
+ "during append attempt", e);
appendGiveups++;
throw e;
}
}
appendGiveups++;
// failed to start
IOException ioe = MultipleIOException.createIOException(exns);
if (ioe == null) {
return;
}
throw ioe;
}
通过对以上代码抽象,一般采用以下形式来运用backoff算法。
while (!backoff.isFailed()) {
try {
doSomething(); //do something
backoff.reset(); // reset backoff counter;
return;
} catch (Exception e) {
backoff.backoff();
try {
backoff.waitUntilRetryOk();
} catch (InterruptedException e1) {
}
}
}
目前在flume中主要运用了ExponentialBackoff,CappedExponentialBackoff,CumulativeCappedExponentialBackoff三种退避算法。
ExponentialBackOff是个简单的指数退避算法,仅仅让下次的等待时间是上次等待时间的2倍,当重试次数达到最大重试次数时,该任务将不能重试。
CappedExponentialBackoff对ExponentialBackOff算法作了简单的改造,该算法对每次的等待时间做了个限定,即每次的等待时间不超过某个值sleepCap。但该方法没有限定重试次数。
CumulativeCappedExponentialBackoff算法对CappedExponentialBackoff作了些改造,该算法加入了cumulativeCap变量,用来限制重试次数。在第一次backoff的时候设置failTime值为当前时间+cumulativeCap。是否可以重试由当前时间和failTime决定。当前时间小于failTime则表明还可以重试,否则,不能重试。
通过对以上的分析,可以得到一个Backoff算法必须提供四个接口(isFailed,backOff,waitUntilRetryOk,reset)。其中,isFailed用来判断是否可以重试,backoff用来设置等待时间,waitUntilRetryOk根据backoff设置的等待时间sleep,以便下次重试。reset的接口是在任务成功后,对backoff算法的一些变量重置。详细可以看ExponentialBackoff等源代码。
退避算法为我们在解决重试某项任务的时候,提供了一个比较好的等待思想。
分享到:
相关推荐
尚硅谷大数据技术之Flume Flume 是 Cloudera 提供的一个高可用的、 高可靠的、分布式的海量日志采集、聚合和传输的系统。 Flume 基于流式架构,灵活简单。 1.1 Flume 定义 Flume 是一个高可用的、 高可靠的、...
**大数据Ambari之flume集成编译好的源码包** Apache Ambari 是一个用于管理和监控Hadoop集群的开源工具,它提供了直观的Web界面和RESTful API,使得安装、配置、管理Hadoop生态系统变得更加简单。Flume是Apache的一...
Flume-NG 安装与配置指南 Flume-NG 是一个分布式日志收集系统,能够从各种数据源中实时采集数据,并将其传输到集中式存储系统中。本文将指导您完成 Flume-NG 的安装和基本配置。 安装 Flume-NG 1. 先决条件:...
Apache Flume 是一个分布式、可靠且可用的数据收集系统,用于高效地聚合、移动和加载大量日志数据到集中式存储系统,如Hadoop HDFS。它设计为容错性强,可扩展,允许从多个源收集数据,并将其流向目标,如数据仓库或...
Flume从1.5.0版本开始,重构了其内部架构,核心组件、配置以及代码架构都进行了重大改动,这个新版本被称为Flume NG(Next Generation),即Flume的新一代版本,用以替代了原来的Flume OG(Original Generation)。...
Flume-ng 在 Windows 环境搭建并测试 + Log4j 日志通过 Flume 输出到 HDFS Flume-ng 是一个高可用、可靠、分布式的日志聚合系统,可以实时地从各种数据源(如日志文件、网络 socket、数据库等)中收集数据,并将其...
### Flume+kafka+Storm整合知识点详解 #### 一、Flume、Kafka与Storm概述 在大数据领域,数据采集、传输与实时处理是至关重要的环节。本篇内容重点介绍了如何利用Flume、Kafka与Storm这三个开源工具实现一套完整的...
大数据技术之Flume Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。它基于流式架构,灵活简单。 Flume定义 Flume是一个高可用的,高可靠的,分布式的海量日志采集、...
Apache Flume 是一个分布式、可靠且可用的服务,用于...然而,Flume的强大之处在于其可扩展性和灵活性,可以根据实际需求进行定制和优化。不断学习和探索,你会发现更多Flume在日志收集、处理和传输方面的应用场景。
Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具 Apache Flume是Apache软件基金会(ASF)的顶级项目 Event是Flume定义的一个数据流传输的最小单元。...
Flume 是 Apache 开源项目提供的一款分布式、可靠且可用于有效收集、聚合和移动大量日志数据的工具。它设计用于高可用性和高可靠性,使得在大数据环境中处理流式数据变得简单。在描述中提到的问题是关于 Flume 不...
【尚硅谷大数据技术之Flume笔记1】 Flume是Cloudera开发的一款专门用于大数据收集、聚合和传输的系统,其设计目标是提供高可用、高可靠性和分布式的服务。Flume基于流处理架构,简化了日志数据的管理和传输过程。 ...
flume支持RabbitMQ插件
### Flume 1.6.0 入门详解:安装、部署及案例分析 #### 一、Flume 概述 Flume 是 Cloudera 开发的一款高效、可靠且易于扩展的日志收集系统,适用于大数据环境下的日志采集任务。Flume 的初始版本被称为 FlumeOG...
根据提供的文档信息,本文将详细解析Flume的基本概念、Flume事件的概念与原理,并进一步探讨其在大数据领域的应用价值。 ### 一、Flume基本概念 #### 1.1 Flume简介 Flume是由Cloudera公司开源的一种分布式、可靠...
默认的SinkProcessor实现包括Default、Failover(基于优先级)和Loadbalance(轮循或随机,带有退避算法)。 配置方面,Flume使用单个配置文件(Java property文档格式),基于流(flow)来配置。一个流包含一个...
Flume安装详细步骤 Flume是一款基于Java的分布式日志收集系统,主要用于收集和传输大规模日志数据。下面是Flume安装的详细步骤: Step 1: 安装JDK环境 在安装Flume之前,需要确保JDK环境已经安装。这里我们使用...
Flume 1.8 安装部署 Flume 是一个分布式、可靠、可扩展的日志收集、聚合和移动系统,广泛应用于大数据和实时数据处理领域。以下是 Flume 1.8 安装部署的详细步骤和相关知识点。 一、准备工作 1. 下载 apache ...
【Flume】 Flume是Apache Hadoop项目的一部分,专门设计用于高效地收集、聚合和移动大规模日志数据。它的核心架构基于事件流,具备分布式、高可靠性和高可用性。Flume通过agent来实现数据采集,每个agent包含source...