拓扑设计注意事项

Flume非常灵活,可以支持大量的部署方案。如果你打算在大型生产部署中使用Flume,建议你花些时间来思考如何拓扑Flume来解决你的问题。本小节会介绍一些注意事项。

Flume真的适合你吗?

如果你需要将文本日志数据提取到Hadoop / HDFS中,那么Flume最合适不过了。但是,对于其他情况,你最好看看以下建议:

Flume旨在通过相对稳定,可能复杂的拓扑部署来传输和收集定期生成的Event数据。“Event数据”定义非常广泛,对于Flume来说一个Event就是一个普通的字节数组而已。Event大小有一些限制,它不能比你的内存或者服务器硬盘还大,实际使用中Flume Event可以是文本或图片的任何文件。关键的是这些Event应该是以连续的流的方式不断生成的。如果你的数据不是定期生成的(比如你将大量的数据批量加载到Hadoop集群中),虽然Flume可以做这个事情,但是有点“杀鸡用牛刀”的感觉,这并不是Flume所擅长和喜欢的工作方式。Flume喜欢相对稳定的拓扑结构,但也不是说永远一成不变,Flume可以处理拓扑中的更改而又不丢失数据,还可以处理由于故障转移或者配置的定期重新加载。如果你的拓扑结构每天都会变动,那么Flume可能就无法正常的工作了,毕竟重新配置也是需要一定思考和开销的。

提示

可以这样理解,Flume就像一个高速公路收费站,适合干那种例行性、重复的工作,别今天还全是人工收费出口,明天加一个ETC出口,后天就全改成ETC出口,大后天又改回大部分人口收费出口,计费又不准导致大家有ETC也不敢用,整个系统的吞吐能力不升反降,这样的情况就别用Flume了[doge],不要总是变来变去,虽然Flume具备一些“随机应变”能力,但是也别太频繁了。

Flume中数据流的可靠性

Flume 流的可靠性取决于几个因素,通过调整这几个因素,你可以自定这些Flume的可靠性选项。

  • 使用什么类型的channel。 Flume有持久型的channel(将数据保存在磁盘上的channel)和非持久化的channel(如果机器故障就会丢失数据的channel)。持久化的channel使用基于磁盘的存储,存储在这类channel中的数据不受机器重启或其他非磁盘故障影响。

  • channel是否能充分满足工作负载。 channel在Flume中扮演了数据流传输的缓冲区,这些缓冲区都有固定容量,一旦channel被占满后,就会将压力传播到数据流的前面节点上。如果压力传播到了source节点上,此时Flume将变得不可用并且可能丢失数据。

  • 是否使用冗余拓扑。 冗余的拓扑可以复制数据流做备份。这样就提供了一个容错机制,并且可以克服磁盘或者机器故障。

在设计一个可靠的Flume拓扑时最好的办法就是把各种故障和故障导致的结果都提前想到。如果磁盘发生故障会怎么样?如果机器出现故障会怎么样?如果你的末端sink(比如HDFS sink)挂掉一段时间遭到背压怎么办?拓扑的设计方案多种多样,但是能想到的常见问题也就这么多。

Flume拓扑设计

拓扑设计第一步就是要确定要使用的 source 和 sink(在数据流中最末端的sink节点)。这些确定了你Flume拓扑集群的边缘。下一个要考虑的因素是是否引入中间的聚合层和Event路由节点。如果要从大量的source中收集数据,则聚合数据以简化末端Sink的收集挺有帮助的。聚合层还可以充当缓冲区来缓解突发的 source 流量 和 sink 的不可用情况。如果你想路由不同位置间的数据,你可能还希望在一些点来分割流:这样就会创建本身包含聚合点的子拓扑。

计算Flume部署所需要的节点

一旦你对自己如何拓扑部署Flume集群节点有了大致的方案,下一个问题就是需要多少硬件和网络流量。首先量化你会产生多少要收集的数据,这个不太好计算,因为大多数情况下数据都是突发性的(比如由于昼夜交换)并且可能还不太好预测。我们可以先确定每个拓扑层的最大吞吐量,包括每秒Event数、每秒字节数,一旦确定了某一层的所需吞吐量,就可以计算这一层所需的最小节点数。要确定可达到的吞吐量,最好使用合成或采样Event数据在你的硬件上测试Flume。通常情况下,文件channel能达到10MB/s的速率,内存channel应该能达到100MB/s或更高的速率,不过硬件和操作系统不同,性能指标也会有一些差异。

计算聚合吞吐量可以确定每层所需最小节点数,需要几个额外的节点,比如增加冗余和处理突发的流量。