flume日志收集系统

flume日志收集系统


概述

Flume是一个分布式的、可靠的、高可用的海量日志采集系统。它能够将不同数据源的海量日志数据进行高效收集、聚合、移动,最后存储到一个中心化数据存储系统中。能够做到实时推送事件,并且可以满足数据量是持续且量级很大的情况。

基本组件

Flume传输的数据的基本单位是event,如果是文本文件,通常是一行记录,这也是事务的基本单位,代表着一个数据流的最小完整单元。flume运行的核心是agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。Event从Source,流向Channel,再到Sink,本身为一个byte数组,并可携带headers信息。基本流程如下: 

  • 1.Source 
    Source主要负责接收数据到Flume Agent组件,可以从其他系统或者应用程序中接收数据,比如web server、log4j等。也可以是从其他Agent的Sink通过RPC发送的数据

  • 2.Channel 
    Channel充当了Source与Sink之间的缓冲区,使得source与sink之间的藕合度降低,source只管向Channel发数据,sink只需从Channel取数据,有点类似于队列的功能。Agent缓冲已经接收,但尚未写出到另一个Agent或者存储系统的数据。多个Source可以同时写入到一个Channel,多个Sink也可以从相同的Channel读取,但是一个Sink只能从一个Channel中读取。它允许Source和Sink可以工作在不同的速率,使得flume可以处理Source 高峰时的负载,即使此时Sink无法读取Channel。

Channel有多种方式:有MemoryChannel、KafkaChannel、JDBCChannel、FileChannel等。 
Memory Channel 实现是一个内存缓冲区,性能比较好,若JVM或者机器重启,Channel冲的任何数据都将丢失。如果允许数据小量丢失,推荐使用; 
KafkaChannel 是用Kafka作为Channel,即就是将数据保存在kafka中。 
File Channel,event 保存在本地磁盘中,可靠性高,只要磁盘上存储的数据仍然是起作用的和可访问的,就不会丢失数据,但吞吐量低于Memory Channel; 
JDBC Channel,event保存在关系数据中,一般不推荐使用;

  • 3.Sink 
    Sink主要是移除Channel中的数据并写入到另一个Agent或者数据存储或者一些其他系统的组件中。Sink会连续的轮询Channel中的事件,将事件传送到下一个目的地,一旦成功传递后,Sink就会通知Channel将该事件删除,这些都是依据于flume中的事务机制实现的。

flume event

flume中event是数据传输的基本单元,由消息头header和消息体body组成,其定义接口如下:

 
 
 
  1. //所在文件:flume-ng-sdk\src\main\java\org\apache\flume\Event.java
  2. public interface Event {
  3. /**
  4. * Returns a map of name-value pairs describing the data stored in the body.
  5. */
  6. public Map<String, String> getHeaders();
  7. /**
  8. * Set the event headers
  9. * @param headers Map of headers to replace the current headers.
  10. */
  11. public void setHeaders(Map<String, String> headers);
  12. /**
  13. * Returns the raw byte array of the data contained in this event.
  14. */
  15. public byte[] getBody();
  16. /**
  17. * Sets the raw byte array of the data contained in this event.
  18. * @param body The data.
  19. */
  20. public void setBody(byte[] body);
  21. }

可以看出header类型为key-value的Map集合,body为byte字节数组类型。消息头header并不是用来传输数据的,只是为了路由和跟踪发送事件的优先级和严重性,还可以给事件添加事件ID等,接下来看下event的基本实现,主要就是实现了header、body两部分的设置,以及toString方法的重写:

 
 
 
  1. public class SimpleEvent implements Event {
  2. private Map<String, String> headers;
  3. private byte[] body;
  4. public SimpleEvent() {
  5. headers = new HashMap<String, String>();
  6. body = new byte[0];
  7. }
  8. @Override
  9. public Map<String, String> getHeaders() {
  10. return headers;
  11. }
  12. @Override</
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值