Flume

Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of streaming event data.

Version 1.9.0 is the eleventh Flume release as an Apache top-level project. Flume 1.9.0 is stable, production-ready software, and is backwards-compatible with previous versions of the Flume 1.x codeline.

 

Flume最早是Cloudera开发的一套分布式的日志收集系统,后来贡献给了Apache。

Flume是一套分布式的,可靠的,能够进行日志的收集,汇聚和传输的框架

版本:

a.Flume-og:Flume0.9及以前的版本

b.Flume-ng:Flume1.0及以后的版本

基本概念

1. Event:

Flume会将收集到的每一条日志封装成一个Event对象。

Event对象本质是一个json串

json串固定的包含两个部分:header,body.

2.Agent

在Flume中,Agent是Flume组成的基本单位

每一个Agent固定的包含三个组件:source,channel,sink.

(source==>channel==>sink)单级流动

(source==>channel==>sink==source==>channel==>sink)多级流动

(source,source==>channel,channel==>sink,sink=source==>channel==>sink)扇入流动

(source==>channel==>sink==source,source==>channel,channel==>sink,sink)扇出流动

复杂流动

Source

AVRO:接收序列化数据

SpoolDir:监听给定 的目录只要目录下的文件发生变化,会自动收集文件中的内容。

HTTP:监听HTTP请求,注意只能接收GET和POST,get仅用于测试

自定义Source

AbstractSource抽象类,实现了基本的方法

如果需要自定义Source,那么需要实现POllableSource或者EventDrivenSource.

PollableSource:拉取型Source,会主动访问数据源然后去获取数据,所以在PollableSource中已经定义好获取数据线程。

EventDrivenSource:事件驱动型Source,在数据源发生变化的时候才会获取数据,所以EventDriverSource不会预定义线程

流动模型

单级流动:只有1个Agent

多级流动:有多个Agent

因为数据在节点之间的传输必须经过序列化。所以结点间的source和sink必须是avro类型。

基本配置

a1.sources = s1
a1.channels = c1
a1.sinks = k1

a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 8090

a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000

a1.sinks.k1.type = logger

a1.sources.s1.channels = c1
a1.sinks.k1.channel =c1

启动:../bin/flume-ng agent -n a1 -c ../conf -f basic.conf -Dflume.root.logger=INFO,console(改路径和配置文件名)

Source配置

Avro Source

    1. 监听Avro 端口来接收外部avro客户端的事件流
    2. avro-source接收到的是经过avro序列化后的数据,然后反序列化数据继续传输。
    3. 源数据必须是经过avro序列化后的数据
    4. 利用Avro source可以实现多级流动、扇出流、扇入流等效果
    5. 可以接收通过flume提供的avro客户端发送的日志信息

配置项    说明
channels    绑定通道
type    avro
bind    需要监听的主机名或IP
port    要监听的端口
threads    工作线程最大线程数
selector.*    选择器配置
interceptors.*    拦截器配置
 

    a1.sources.s1.type=avro  
    a1.sources.s1.bind=0.0.0.0
    a1.sources.s1.port=8090

Exec Source

    1. 可以将命令产生的输出作为源来进行传递

配置项    说明
channels    绑定的通道
type        exec
command    要执行的命令
selector.*    选择器配置
interceptors.*    拦截器列表配置

    a1.sources.r1.type=exec  
    a1.sources.r1.command=ping 192.168.234.163
 

Spooling Directory Source

    1. flume会持续监听指定的目录,把放入这个目录中的文件当做source来处理
    2. 注意:一旦文件被放到“自动收集”目录中后,便不能修改,如果修改,flume会报错
    3. 此外,也不能有重名的文件,如果有,flume也会报错
 

配置项    说明
channels    绑定通道
type    spooldir
spoolDir    读取文件的路径,即"搜集目录"
selector.*    选择器配置
interceptors.*         拦截器配置

    #描述/配置a1的source1
    a1.sources.s1.type=spooldir
    a1.sources.s1.spoolDir=/home/work/data

NetCat Source

    1. 一个NetCat Source用来监听一个指定端口,并接收监听到的数据
    2. 接收的数据是字符串形式
配置项    说明
channels    绑定通道
type    netcat
port    指定要绑定到的端口号
selector.*    选择器配置
interceptors.*        拦截器配置

a1.sources.s1.type=netcat

a1.sources.s1.bind=0.0.0.0

a1.sources.s1.port=44444

Squence Generator Source

    1. 一个简单的序列发生器,不断的产生事件,值是从0开始每次递增1
    2. 主要用来测试
配置项    说明
channels    绑定的通道
type    seq
selector.*    选择器配置
interceptors.*    拦截器配置
batchSize    递增步长, 默认是1

    a1.sources.s1.type=seq
 

HTTP Source

    1. 此Source接受HTTP的GET和POST请求作为Flume的事件
    2. GET方式只用于试验,所以实际使用过程中以POST请求居多
    3. 如果想让flume正确解析Http协议信息,比如解析出请求头、请求体等信息,需要提供一个可插拔的"处理器"来将请求转换为事件对象,这个处理器必须实现HTTPSourceHandler接口。
    4. 这个处理器接受一个 HttpServletRequest对象,并返回一个Flume Envent对象集合

 

二、常用Handler
JSONHandler
    1. 可以处理JSON格式的数据,并支持UTF-8 UTF-16 UTF-32字符集
    2. 该handler接受Event数组,并根据请求头中指定的编码将其转换为Flume Event
    3. 如果没有指定编码,默认编码为UTF-8
    4. 格式:
    [
        {
            "headers" : {
                "timestamp" : "434324343",
                "host" : "random_host.example.com"
            }
            "body" : "random_body"
        },
        {
            "headers" : {
                "namenode" : "namenode.example.com",
                "datanode" : "random_datanode.example.com"
            },
            "body" : "really_random_body"
        }
    ]
BlobHandler
    1. BlobHandler是一种将请求中上传文件信息转化为event的处理器
    2. BlobHandler适合大文件的传输

三、可配置选项说明
配置项    说明
channels    绑定的通道
type         http
selector.*    选择器配置
interceptors.*    拦截器配置
port    端口
 

#描述/配置a1的source1

a1.sources.s1.type=http

a1.sources.s1.port=8888

 

Channel

Memory Channel

    1. 事件将被存储在内存中(指定大小的队列里)
    2. 非常适合那些需要高吞吐量且允许数据丢失的场景下
配置项    说明
type    memory
capacity    100    事件存储在信道中的最大数量
    建议实际工作调节:10万首先估算出每个event的大小,然后再服务的内存来调节
transactionCapacity    100    每个事务中的最大事件数
    建议实际工作调节:1000~3000

File Channel

    1. 将数据临时存储到计算机的磁盘的文件中
    2. 性能比较低,但是即使程序出错数据不会丢失

配置项    说明
type    file
dataDirs    指定存放的目录,逗号分隔的目录列表,用以存放日志文件。使用单独的磁盘上的多个目录可以提高文件通道效率。
    a1.channels.c1.type=file
    a1.channels.c1.dataDirs=/home/filechannel

其他Channel

一、JDBC Channel


    1. 事件会被持久化(存储)到可靠的数据库里
    2. 目前只支持嵌入式Derby数据库。但是Derby数据库不太好用,所以JDBC Channel目前仅用于测试,不能用于生产环境。

二、内存溢出通道

    1. 优先把Event存到内存中,如果存不下,在溢出到文件中
    2. 目前处于测试阶段,还未能用于生产环境
 

Sink

Logger Sink


    1. 记录指定级别(比如INFO,DEBUG,ERROR等)的日志,通常用于调试
    2. 要求,在 --conf(-c )参数指定的目录下有log4j的配置文件
    3. 根据设计,logger sink将body内容限制为16字节,从而避免屏幕充斥着过多的内容。如果想要查看调试的完整内容,那么你应该使用其他的sink,也许可以使用file_roll sink,它会将日志写到本地文件系统中

二、可配置项说明
配置项    说明
channel    绑定通道
type    logger
 

#描述a1的s1

a1.sinks.k1.type=logger

File_roll Sink


    1. 在本地系统中存储事件
    2. 每隔指定时长生成文件保存这段时间内收集到的日志信息

二、可配置选项说明
配置项    说明
channel    绑定通道
type    file_roll
sink.directory    文件被存储的目录
sink.rollInterval    30  记录日志到文件里,每隔30秒生成一个新日志文件。如果设置为0,则禁止滚动,从而导致所有数据被写入到一个文件中。

#描述sink

a1.sinks.k1.type=file_roll

a1.sinks.k1.sink.directory=/home/work/rolldata

a1.sinks.k1.sink.rollInterval=60

HDFS Sink

    1. 此Sink将事件写入到Hadoop分布式文件系统HDFS中
    2. 目前它支持创建文本文件和序列化文件,并且对这两种格式都支持压缩
    3. 这些文件可以分卷,按照指定的时间或数据量或事件的数量为基础
    4. 它还通过类似时间戳或机器属性对数据进行 buckets/partitions 操作
    5. HDFS的目录路径可以包含将要由HDFS替换格式的转移序列用以生成存储事件的目录/文件名
    6. 使用这个Sink要求haddop必须已经安装好,以便Flume可以通过hadoop提供的jar包与HDFS进行通信

二、可配置选项说明
配置项    说明
channel    绑定的通道
type    hdfs 
hdfs.path    HDFS 目录路径 (hdfs://namenode/flume/webdata/)
hdfs.inUseSuffix    .tmp    Flume正在处理的文件所加的后缀
hdfs.rollInterval    文件生成的间隔事件,默认是30,单位是秒
hdfs.rollSize    生成的文件大小,默认是1024个字节 ,0表示不开启此项
hdfs.rollCount    每写几条数据就生成一个新文件,默认数量为10
    每写几条数据就生成一个新文件, 
hdfs.fileType    SequenceFile/DataStream/CompressedStream
hdfs.retryInterval    80    Time in seconds between consecutive attempts to close a file. Each close call costs multiple RPC round-trips to the Namenode, so setting this too low can cause a lot of load on the name node. If set to 0 or less, the sink will not attempt to close the file if the first attempt fails, and may leave the file open or with a ”.tmp” extension.
 

#描述sink

a1.sinks.s1.type=hdfs

a1.sinks.s1.hdfs.path=hdfs://192.168.234.21:9000/flume

a1.sinks.s1.hdfs.fileType=DataStream

Avro Sink

一、概述
    1. 将源数据进行利用avro进行序列化之后写到指定的节点上
    2. 是实现多级流动、扇出流(1到多) 扇入流(多到1) 的基础

二、可配置选项说明
配置项    说明
channel    绑定的通道
type     avro
hostname    要发送的主机
port    要发往的端口号
 

#描述sink

a1.sinks.s1.type=avro

a1.sinks.s1.hostname=flume02

a1.sinks.s1.port=9999

 

Selector

复制模式

一、概述
    1. Selector 默认是复制模式(replicating),即把source复制,然后分发给多个sink

二、 可配置选项说明
配置项    说明
selector.type    replicating  表示复制模式,source的selector如果不配置,默认就是这种模式
    在复制模式下,当source接收到数据后,会复制多分,分发给每一个avro sink
selector.optional    标志通道为可选

a1.sources = r1
a1.channels = c1 c2 c3
a1.source.r1.selector.type = replicating(这个是默认的)
a1.source.r1.channels = c1 c2 c3
a1.source.r1.selector.optional = c3

多路复用模式

 

多路复用模式

一、概述
    1. 在这种模式下,用户可以指定转发的规则。selector根据规则进行数据的分发

二、可配置选项说明
配置项    说明
selector.type    multiplexing  表示路由模式
selector.header    指定要监测的头的名称
selector.mapping.*    匹配规则
selector.default        如果未满足匹配规则,则默认发往指定的通道

三、示例
概述
01机利用http source接收数据,根据路由规则,发往02,03机。02,03通过avro source接收数据,通过logger sink 打印数据

#描述/配置a1的source1

a1.sources.r1.type=http

a1.sources.r1.port=8888

a1.sources.r1.selector.type=multiplexing

a1.sources.r1.selector.header=state

a1.sources.r1.selector.mapping.cn=c1

a1.sources.r1.selector.mapping.us=c2

a1.sources.r1.selector.default=c2

Interceptor

    1. Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的
    2. 拦截器需要实现org.apache.flume.interceptor.Interceptor接口
    3. 拦截器可以修改或删除事件基于开发者在选择器中选择的任何条件
    4. 拦截器采用了责任链模式,多个拦截器可以按指定顺序拦截
    5. 一个拦截器返回的事件列表被传递给链中的下一个拦截器
    6. 如果一个拦截器需要删除事件,它只需要在返回的事件集中不包含要删除的事件即可
    7. 如果要删除所有事件,只需返回一个空列表
 

Timestamp Interceptor

一、概述
    1. 这个拦截器在事件头中插入以毫秒为单位的当前处理时间
    2. 头的名字为timestamp,值为当前处理的时间戳
    3. 如果在之前已经有这个时间戳,则保留原有的时间戳

二、可配置项说明
配置项    说明
type    timestamp
preserveExisting    false    如果时间戳已经存在是否保留
 

a1.sources.s1.interceptors = i1
a1.sources.s1.interceptors.i1.type = timestamp

 

Host Interceptor

一、概述
    1. 这个拦截器插入当前处理Agent的主机名或ip
    2. 头的名字为host或配置的名称
    3. 值是主机名或ip地址,基于配置

二、可配置项说明
配置参数    说明
type    host
preserveExisting    false    如果主机名已经存在是否保留
useIP    true    如果配置为true则用IP,配置为false则用主机名
hostHeader    host    加入头时使用的名称

Static Interceptor

一、概述
    1. 此拦截器允许用户增加静态头信息使用静态的值到所有事件
    2. 目前的实现中不允许一次指定多个头
    3. 如果需要增加多个静态头可以指定多个Static interceptors

二、可配置项说明
配置项    说明
type    static
preserveExisting    true
key    key    要增加的头名
value    value    要增加的头值

UUID Interceptor

一、概述
    1. 这个拦截器在所有事件头中增加一个全局一致性标志,其实就是UUID

二、可配置项说明
配置项    说明
type    org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder
headerName    id    头名称
preserveExisting    true    如果头已经存在,是否保留
prefix    “”    在UUID前拼接的字符串前缀

Search And Replace Interceptor

    1. 这个拦截器提供了简单的基于字符串的正则搜索和替换功能

二、可配置项说明
配置项    说明
type    search_replace
searchPattern    要搜索和替换的正则表达式
replaceString    要替换为的字符串
charset        UTF-8    字符集编码,默认utf-8

Regex Filtering Interceptor


    1. 此拦截器通过解析事件体去匹配给定正则表达式来筛选事件
    2. 所提供的正则表达式即可以用来包含或刨除事件

二、可配置项说明
配置项    说明
type    regex_filter
regex    ”.*” 所要匹配的正则表达式
excludeEvents    false    如果是true则刨除匹配的事件,false则包含匹配的事件。

Regex Extractor Interceptor

    1. 使用指定正则表达式匹配事件,并将匹配到的组作为头加入到事件中
    2. 它也支持插件化的序列化器用来格式化匹配到的组在加入他们作为头之前

二、可配置项说明
配置项    说明
type    regex_extractor
regex    要匹配的正则表达式
serializers    匹配对象列表

Processor

  1. Sink Group允许用户将多个Sink组合成一个实体
  2. Flume Sink Processor 可以通过切换组内Sink用来实现负载均衡的效果,或在一个Sink故障时切换到另一个Sink

Default Sink Processor

一、概述
    1. 只接受一个 Sink
    2. 这是默认的策略。即如果不配置Processor,用的是这个策略

二、可配置选项说明
配置项    说明
sinks    用空格分隔的Sink集合
processor.type    default

Failover Sink Processor

一、概述
    1. 维护一个sink们的优先表。确保只要一个是可用的就事件就可以被处理
    2. 失败处理原理是,为失效的sink指定一个冷却时间,在冷却时间到达后再重新使用
    3. sink们可以被配置一个优先级,数字越大优先级越高
    4. 如果sink发送事件失败,则下一个最高优先级的sink将会尝试接着发送事件
    5. 如果没有指定优先级,则优先级顺序取决于sink们的配置顺序,先配置的默认优先级高于后配置的
    6. 在配置的过程中,设置一个group processor ,并且为每个sink都指定一个优先级
    7. 优先级必须是唯一的
    8. 另外可以设置maxpenalty属性指定限定失败时间

二、可配置项说明
配置项    说明
sinks    绑定的sink
processor.type     failover
processor.priority    设置优先级,注意,每个sink的优先级必须是唯一的
processor.maxpenalty    30000    The maximum backoff period for the failed Sink (in millis)

三、示例
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000

Load Balancing Sink Processor

一、概述
    1. 提供了在多个sink之间实现负载均衡的能力
    2. 它维护了一个活动sink的索引列表
    3. 它支持轮询或随机方式的负载均衡,默认值是轮询方式,可以通过配置指定
    4. 也可以通过实现AbstractSinkSelector接口实现自定义的选择机制

二、可配置项说明
配置项    说明
processor.sinks    绑定的sink
processor.type        load_balance
processor.selector    round_robin(轮叫调度)random(随机)

三、示例
01的配置示例:
#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1 s2
a1.channels=c1
a1.sinkgroups=g1

#描述/配置a1的source1
a1.sources.r1.type=http
a1.sources.r1.port=8888
a1.sinkgroups.g1.sinks=s1 s2
a1.sinkgroups.g1.processor.type=load_balance
a1.sinkgroups.g1.processor.selector=round_robin
轮叫调度算法(轮询发送)


#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999

a1.sinks.s2.type=avro
a1.sinks.s2.hostname=192.168.234.213
a1.sinks.s2.port=9999
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

#为channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c1

02,03的配置示例:
#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1

#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999

#描述sink
a1.sinks.s1.type=logger

#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

#为channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
 


 

你可能感兴趣的:(大数据)