FLUME介绍 基本使用 常见问题

FLUME介绍 基本使用 常见问题

官网FLUME介绍

Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexible architecture based on streaming data flows. It is robust and fault tolerant with tunable reliability mechanisms and many failover and recovery mechanisms. It uses a simple extensible data model that allows for online analytic application

Flume是一种分布式、可靠和可用的服务,可以有效地收集、聚合和移动大量的日志数据。它有一个基于流数据流的简单而灵活的架构。它具有可调可靠性机制和许多故障转移和恢复机制的强装修性和容错能力。它使用一个简单的可扩展数据模型,允许在线分析应用程序

这里写图片描述

日志上传逻辑

这里写图片描述

flume 就是基于这个逻辑完成了这个整个日志上传框架

FLUME 三件套

Agent主要由:source,channel,sink三个组件组成.

我的理解是 agent就是一台抽水机它里面有三个组件source,channel,sink. source 就是我们抽水机的水管指向的取水地, channel 就是抽水机的水管,sink 就是水管指向的出口。

当有两台抽水机合作的时候,我们可以将一台抽水机的 sink 指向 另外一个抽水机的source 这样就完成了数据的 传递。

如图下中

这里写图片描述

Source:

从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift,twitter1%等
这里列举几个项目常用的Source

Exec Source

这里写图片描述

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/secure
a1.sources.r1.channels = c1

这个就是常用的我们Linux 命令监控 它会一直上传监控到的文字。但是但我们发生异常,tail -f 不能用了,或者程序中断期间的那些文件内容就不会上传了,只会上传当前监控到的文件

Taildir Source

这里写图片描述

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /var/log/test1/example.log
a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.filegroups.f2 = /var/log/test2/.*log.*
a1.sources.r1.headers.f2.headerKey1 = value2
a1.sources.r1.headers.f2.headerKey2 = value2-2
a1.sources.r1.fileHeader = true

Taildir Source 可以监控指定文件,也可以用正则匹配方式来选择自己将要上传的文件。 它的好处是,在flume程序停止的时候。读取过的文件位置是保存在某个文件中的。positionFile 这个属性可以指定该json文件位置。重启之后,继续从那个位置点开始上传

Taildir Source有个弊端 就是在其filegroups 文件目录下,对匹配到的文件,文件名称进行修改后,文件内容会重新上传一份。 将使用这个Source 可以查看 解决该问题http://blog.csdn.net/u012373815/article/details/62241528

Kafka Source

这里写图片描述

a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.source1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093
a1.sources.source1.kafka.topics = mytopic
a1.sources.source1.kafka.consumer.group.id = flume-consumer
a1.sources.source1.kafka.consumer.security.protocol = SASL_PLAINTEXT
a1.sources.source1.kafka.consumer.sasl.mechanism = GSSAPI
a1.sources.source1.kafka.consumer.sasl.kerberos.service.name = kafka

这个就不用多说了, 充当kafka 的消费者,我们只需配上topic 订阅 的主题,所有消费者组的id 最好配置一下batch的属性。这样可以批量的上传。

Avro Source

这里写图片描述

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4141

Avro Source 这个是分布式收集日志的关键了。AVRO 底层是RPC方式。
开启这个配置的话,flume程序会监听4141端口。 另外flume程序 配置文件中将sink 指向这个IP 的4141端口,那个FLUME程序的日志就传输到该FLUME通道中来。

还有http Source ,Spooling Directory Source都是可能会用到的。大家自己到官网上看下吧。http://flume.apache.org/FlumeUserGuide.html#spooling-directory-source


Channel:

channal是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着一共桥梁的作用,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性. 并且它可以和任意数量的source和sink链接. 支持的类型有: JDBC channel , File System channel , Memort channel等.

设计Flume数据流程图时,根据自身服务器配置选择合适的Channel,分别是Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比较常见的是前三种channel。具体使用那种channel,需要根据具体的使用场景。这里我们主要用到的是File Channel 和Memory Channel,而JDBC Channel当前支持它本身嵌入的Derby 数据库。

  File Channel是一个持久化的隧道(channel),他持久化所有的事件,并将其存储到磁盘中。因此,即使Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。Memory Channel是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果java进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到RAM大小的限制,而File Channel这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。

这里举例3个常用的通道

Memory Channel

这里写图片描述

a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000

根据自己服务器配置把。 因为放入通道中的数据 实际是放在内存里面的,所以一旦程序挂掉了。内存里面的数据就丢失掉了。
File Channel

这里写图片描述

a1.channels = c1
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint
a1.channels.c1.dataDirs = /mnt/flume/data

1.这个要注意的是在同一个agent 中也就是同一个配置中,如果有多个文件通道同时初始化的话,只有一个能够成功。
2.dataDirs 最好配置不同磁盘上的日志,这样读取速度会快一点

Spillable Memory Channel

这里写图片描述

a1.channels = c1
a1.channels.c1.type = SPILLABLEMEMORY
a1.channels.c1.memoryCapacity = 10000
a1.channels.c1.overflowCapacity = 1000000
a1.channels.c1.byteCapacity = 800000
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint
a1.channels.c1.dataDirs = /mnt/flume/data

这个是文件通道和内存通道的结合通道,可以设置当放入内存通道的数据量太大的话,会将多余的放到磁盘上面,上面就配置超过多少字节,然后放到磁盘上面

sink:

sink将数据存储到集中存储器比如Hbase和HDFS,它从channals消费数据(events)并将其传递给目标地. 目标地可能是另一个sink,也可能HDFS,HBase.

Avro Sink

这里写图片描述

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 10.10.10.10
a1.sinks.k1.port = 4545

1 Avro Sink 基本都是跟 AVRO Source 一起配合使用的。两者开启压缩(配置相同的compression 属性,保证压缩解压缩能正常)
2 大家也可以根据源码对AVRO SINK做自己的扩展

http://blog.csdn.net/zh_yi/article/details/44948103

File Roll Sink

这里写图片描述

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = file_roll
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.directory = /var/log/flume

1.这比较好理解 ,就是将通道中的数据放到指定的文件中,不停的滚动生成,可以指定他的前缀,后缀

Kafka Sink

这里写图片描述

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = mytopic
a1.sinks.k1.kafka.bootstrap.servers = localhost:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
a1.sinks.k1.kafka.producer.compression.type = snappy

1.Kafka Sink使用FlumeEvent header中的主题和关键属性将事件发送给Kafka。如果主题存在于header中,事件将被发送到特定主题,覆盖为该接收器配置的主题。如果标题中存在键,则Kafka将使用键来分区主题分区之间的数据

HTTP Sink

这里写图片描述

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = http
a1.sinks.k1.channel = c1
a1.sinks.k1.endpoint = http://localhost:8080/someuri
a1.sinks.k1.connectTimeout = 2000
a1.sinks.k1.requestTimeout = 2000
a1.sinks.k1.acceptHeader = application/json
a1.sinks.k1.contentTypeHeader = application/json
a1.sinks.k1.defaultBackoff = true
a1.sinks.k1.defaultRollback = true
a1.sinks.k1.defaultIncrementMetrics = false
a1.sinks.k1.backoff.4XX = false
a1.sinks.k1.rollback.4XX = false
a1.sinks.k1.incrementMetrics.4XX = true
a1.sinks.k1.backoff.200 = false
a1.sinks.k1.rollback.200 = false
a1.sinks.k1.incrementMetrics.200 = true

1 这个接收器的行为是它将从通道接收事件,并使用HTTP POST请求将这些事件发送到远程服务。事件内容作为POST主体发送

2.这个接收器的错误处理行为取决于目标服务器返回的HTTP响应。接收器的backoff /就绪状态是可配置的,因为事务提交/回滚的结果以及事件有助于成功的事件消耗计数

它的组合形式举例:

以上介绍的flume的主要组件,下面介绍一下Flume插件:

  1. Interceptors拦截器

    用于source和channel之间,用来更改或者检查Flume的events数据

  2. 管道选择器 channels Selectors

    在多管道是被用来选择使用那一条管道来传递数据(events). 管道选择器又分为如下两种:

    默认管道选择器: 每一个管道传递的都是相同的events

    多路复用通道选择器: 依据每一个event的头部header的地址选择管道.

3.sink线程
用于激活被选择的sinks群中特定的sink,用于负载均衡.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值