Flume-原理详解+参数详解+案例演示

What Flume?

Flume 简介:

  • Flume用于将多种来源的日志以流的方式传输至Hadoop或者其它目的地(一种可靠、可用的高效分布式数据收集服务)
  • Flume拥有基于数据流上的简单灵活架构,支持容错、故障转移与恢复

批处理:处理离线数据,冷数据。单个处理数据量大,处理速度比流慢。

流处理:在线,实时产生的数据。单次处理的数据量小,但处理速度更快。

Flume 架构:

Flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink),为了保证传输过程一定成功,在送到目的地(sink)之前,会先缓存(channel),待数据真正到达目的地(sink)之后,Flume再删除自己缓存的数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3E3Ul3wP-1597663263354)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200804162246064.png)]

  • Client:客户端,数据产生的地方,如Web服务器
  • Event:事件,指通过Agent传输的单个数据包,如日志数据通常对应一行数据
  • Agent:代理,一个独立的JVM进程,相当于一个数据传输员
    • Flume以一个或多个Agent(分布式)部署运行
    • Agent包含三个组件
      • Source:采集源,用于和数据源对接,以获取数据,Source是数据的收集端,负责将数据捕获后进行特殊的格式化,将数据封装到事件(event) 里,然后将事件推入Channel中。 Flume提供了很多内置的Source, 支持 Avro, log4j, syslog 和 http post(body为json格式)。可以让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。 如果内置的Source无法满足需要, Flume还支持自定义Source。
      • Channel:Channel是连接Source和Sink的组件,大家可以将它看做一个数据的缓冲区(数据队列),它可以将事件暂存到内存中也可以持久化到本地磁盘上, 直到Sink处理完该事件。介绍两个较为常用的Channel, MemoryChannel和FileChannel。
      • Sink:Sink从Channel中取出事件,然后将数据发到别处,可以向文件系统、数据库、 hadoop存数据, 也可以是其他agent的Source。在日志数据较少时,可以将数据存储在文件系统中,并且设定一定的时间间隔保存数据。

Flume组件:

Source

  • SourceRunner
  • Interceptor
  • Channel
  • ChannelSelector
  • ChannelProcessor
  • Sink
  • SinkRunner
  • SinkProcessor
  • SinkSelector

flume执行流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ML661Ci6-1597663263356)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817094410075.png)]

How Flume?

Flume安装流程 + Flume采集nc数据:

flume–安装流程:https://blog.csdn.net/weixin_42151880/article/details/108048279

注意:flume安装在被监控的节点上(有几个节点就需要安装几个flume),实时采集该节点的数据并传送至主机,交由主机处理。

Flume如何采集数据:

  • 配置文件

    //在指定目录下写一个配置文件
    cd /opt/flumeconf/
    vi conf_0805_readline.properties	//文件名自定义
    ==>(添加信息)
    #在此代理上命名组件
    a2.channels=c2
    a2.sources=s2
    a2.sinks=k2
    
    #描述配置源,监控test1下的所有文件
    a2.sources.s2.type=spooldir
    a2.sources.s2.spoolDir=/opt/test1
    
    #描述通道中事件信息
    a2.channels.c2.type=memory
    a2.channels.c2.capacity=10000
    a2.channels.c2.transactionCapacity=1000
    
    #描述接收器
    a2.sinks.k2.type=logger
    
    #将源与接收器绑定到通道(sinks对应的channel只有一个,即不加 s )
    a2.sinks.k2.channel=c2
    a2.sources.s2.channels=c2
    
  • flume启动命令

参数描述
-n,–nameagent的名称
-c,–conf在目录使用配置文件。指定配置文件放在什么目录(可以省略)
-Dflume.root.logger日志级别和输出源
-f,–conf-file指定配置文件,这个配置文件必须在–conf参数定义的目录下
agent运行一个Flume Agent
flume-ng agent -n a2 -c conf -f /opt/flumeconf/conf_0805_readline.properties -Dflume.root.logger=INFO,console
  • ·flume数据采集成功,监控文件夹下的源文件后缀都会变成.COMPLTETED,并且文件追加,flume会立即采集。

Flume常用配置:

1.可监控的多种数据源:

  • exec source
  • spooling directory source
  • http source
  • avro source
  • kafka source
  • netcat source
  • Taildir Source

1.exec source

执行Linux指令,并消费指令返回的结果,如“tail -f”

属性缺省值描述
type-exec
command-如“tail -f xxx.log”
shell-选择系统Shell程序,如“/bin/sh”
batchSize20发送给channel的最大行数

2.spooling directory source

从磁盘文件夹中获取文件数据,可避免重启或者发送失败后数据丢失,还可用于监控文件夹新文件

属性缺省值描述
type-spooldir
spoolDir-需读取的文件夹
fileSuffix.COMPLETED文件读取完成后添加的后缀
deletePolicynever文件完成后删除策略:never和immediate

3.http source

用于接收HTTP的Get和Post请求

属性缺省值描述
type-http
port-监听端口
bind0.0.0.0绑定IP
handlerorg.apache.flume.source.http.JSONHandler数据处理程序类全名

发送http数据:

curl -XPOST localhost:5140 -d'[{"headers":{"h1":"v1","h2":"v2"},"body":"hello body"}]'

4.avro source

监听Avro端口,并从外部Avro客户端接收events

属性缺省值描述
type-avro
bind-绑定IP地址
port-端口
threads-最大工作线程数量

2.常用的多种channel

  • Memory Channel

    ​ event保存在Java Heap中。如果允许数据小量丢失,但是效率较高,推荐使用

  • File Channel

    ​ event保存在本地文件中,可靠性高,但吞吐量低于Memory Channel

  • JDBC Channel

    ​ event保存在关系数据中,一般不推荐使用

  • Kafka Channel

    ​ 数据直接写入kadka,适用于流处理

3.可以选的各种sink

  • avro sink
  • HDFS sink
  • Hive sink
  • HBase sink
  • Kafka sink

1.avro sink

作为avro客户端向avro服务端发送avro事件

属性缺省值描述
type-avro
hostname-服务端IP地址
post-端口
batch-size100批量发送事件数量

2.HDFS sink

将事件写入Hadoop分布式文件系统(HDFS)

属性缺省值描述
type-hdfs
hdfs.path-hdfs目录
hfds.filePrefixFlumeData文件前缀
hdfs.fileSuffix-文件后缀

3.Hive sink

包含分隔文本或JSON数据流事件直接进入Hive表或分区,传入的事件数据字段映射到Hive表中相应的列

属性缺省值描述
type-hive
hive.metastore-Hive metastore URI
hive.database-Hive数据库名称
hive.table-Hive表
serializer-序列化器负责从事件中分析出字段并将它们映射为Hive表中的列。序列化器的选择取决于数据的格式。支持序列化器:DELIMITED和JSON

4.HBase sink

属性缺省值描述
type-hbase
table-要写入的 Hbase 表名
columnFamily-要写入的 Hbase 列族
zookeeperQuorum-对应hbase.zookeeper.quorum
znodeParent/hbasezookeeper.znode.parent
serializerorg.apache.flume.sink.hbase.SimpleHbaseEventSerializer一次事件插入一列
serializer.payloadColumn-列名col1

4.拦截器(可用,可以简单优化数据)

  • 拦截器可修改或丢弃事件
    • 设置在source和channel之间
  • 内置拦截器
    • HostInterceptor:在event header中插入“hostname”
    • TimestampInterceptor:插入时间戳
    • StaticInceptor:插入key-value
    • UUIDInceptor:插入UUID
    • ……

多层代理(拓扑结构)

  • 多跳(multi-agent flow)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAnmosCB-1597663263357)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817121259626.png)]

  • 多路数据流(Multiplexing the flow)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2U0AG5Co-1597663263359)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817121333384.png)]

  • 合并(Consolidation),将多个源合并到一个目的地

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uL6dzeVN-1597663263363)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817122705527.png)]

  • Flume Sink组处理故障转移、负载均衡

    • sink组是用来创建逻辑上的一组sink
    • sink组的行为是由sink处理器(processor)决定的,它决定了event的路由策略
    • processor包括故障转移和负载均衡两类
    #故障转移
    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
    
    #负载均衡
    a1.sinkgroups = g1
    a1.sinkgroups.g1.sinks = k1 k2
    a1.sinkgroups.g1.processor.type = load_balance
    a1.sinkgroups.g1.processor.backoff = true
    a1.sinkgroups.g1.processor.selector = random
    

Flume 实际案例:

1.Flume自定义拦截器(interceptor):

  • 配置文件

    #组件命名
    a3.channels=c3
    a3.sources=s3
    a3.sinks=k3
    
    #配置源文件信息
    a3.sources.s3.type=spooldir
    a3.sources.s3.spoolDir=/opt/datas
    #过滤器相关配置(过滤第一行头字段)
    a3.sources.s3.interceptors=userid_filter
    a3.sources.s3.interceptors.userid_filter.type=regex_filter
    a3.sources.s3.interceptors.userid_filter.regex=userid.*
    a3.sources.s3.interceptors.userid_filter.excludeEvents=true
    
    #通道信息
    a3.channels.c3.type=memory
    
    #接收器信息
    a3.sinks.k3.type=logger
    
    #连接信息(sinks对应的channel只有一个,即不加 s )
    a3.sources.s3.channels=c3
    a3.sinks.k3.channel=c3 
    

2.监控exec型source

  • 配置文件

    #组件命名
    a1.sources = s1
    a1.channels = c1
    a1.sinks = k1
    
    #配置exec型source
    a1.sources.s1.type = exec
    a1.sources.s1.command = tail -f /opt/datas/exectest.txt
    
    #配置channel
    a1.channels.c1.type = memory
    
    #配置sink
    a1.sinks.k1.type = logger
    
    #sink与channel连接(sinks对应的channel只有一个,即不加 s )
    a1.sinks.k1.channel = c1
    #source与channel连接
    a1.sources.s1.channels = c1
    
  • 启动flume后,可以实时地向exectest.txt文件中添加信息,flume会实时监控

    echo " hello world " >> exectest.txt 
    echo " hello wufan01 " >> exectest.txt 
    

3.flume监控tail source,并实现断点续传

Taildir Source:可实时监控一批文件,并记录每个文件最新消费位置,agent进程重启后不会有重复消费的问题。
使用时建议用1.8.0版本的flume,1.8.0版本中解决了Taildir Source一个可能会丢数据的bug。

  • 配置文件信息

    #组件命名
    a1.sources = s1
    a1.channels = c1
    a1.sinks = k1
    
    #source配置,添加文件组
    a1.sources.s1.type = TAILDIR
    a1.sources.s1.filegroups = f1 f2
    #配置filegroups的f1
    a1.sources.s1.filegroups.f1 = /opt/datas/tail_1/test1.log
    #配置filegroups的f2
    a1.sources.s1.filegroups.f2 = /opt/datas/tail_2/.*log.*
    #指定position的位置
    a1.sources.s1.positionFile =
    /opt/datas/tail_position/taildir_position.json
    #指定headers,记录每次数据采集后的指针位置
    a1.sources.s1.headers.f1.headerKey1 = value1
    a1.sources.s1.headers.f2.headerKey1 = value2
    a1.sources.s1.headers.f2.headerKey2 = value3
    #开启header监控
    a1.sources.s1.fileHeader = true
    
    #channel配置
    a1.channels.c1.type=memory
    
    #sink配置
    a1.sinks.k1.type=logger
    
    #channel连接配置
    a1.sinks.k1.channel=c1
    a1.sources.s1.channels=c1
    
  • 新建文件并添加数据

    touch test1.log
    echo " wufan " >> test1.log 
    
  • 开启flume,监控数据,每次监控指针的信息都会存入position.json文件中。

  • 关闭flume,再次添加数据,当flume开启,都会回到上次关闭时的指针位置,开始数据的采集。

4.flume数据导入HDFS

  • 配置文件信息

    #组件命名
    a2.channels=c2
    a2.sources=s2
    a2.sinks=k2
    
    #source配置
    a2.sources.s2.type=spooldir
    a2.sources.s2.spoolDir=/opt/datas
    
    #channel配置
    a2.channels.c2.type=memory
    a2.channels.c2.capacity=10000
    a2.channels.c2.transactionCapacity=1000
    
    #sink配置
    a2.sinks.k2.type=hdfs
    #指定文件位置
    a2.sinks.k2.hdfs.path=hdfs://192.168.56.104:9000/tmp/customs
    #传输参数(具体值如何设置可以参考官方文件)
    a2.sinks.k2.hdfs.rollCount=5000
    a2.sinks.k2.hdfs.rollSize=600000
    a2.sinks.k2.hdfs.batchSize=500
    
    #channel连接
    a2.sinks.k2.channel=c2
    a2.sources.s2.channels=c2
    

5.双层flume:avro->avro 多跳实现

  • sink->avro 配置文件信息

    #组件命名
    a1.sources = s1
    a1.channels = c1
    a1.sinks = sk1
    
    #设置source类型为exec
    a1.sources.s1.type = exec
    #采集目标文件地址
    a1.sources.s1.command = tail -f /opt/datas/exectest.txt
    
    #指定sink
    a1.sinks.sk1.type = avro
    a1.sinks.sk1.hostname = localhost
    a1.sinks.sk1.port = 44444
    
    #channel配置
    a1.channels.c1.type = memory
    
    #source和channel连接
    a1.sources.s1.channels = c1
    #sink和channel连接
    a1.sinks.sk1.channel = c1
    
  • source->avro 配置文件信息

    #组件命名
    a3.channels=c3
    a3.sources=s3
    a3.sinks=k3
    
    #source配置
    a3.sources.s3.type=avro
    a3.sources.s3.bind= 0.0.0.0[/localhost]
    a3.sources.s3.port=44444
     
    #channel配置
    a3.channels.c3.type=memory
    
    #sink配置
    a3.sinks.k3.type=logger
    
    #channel连接
    a3.sources.s3.channels=c3
    a3.sinks.k3.channel=c3 
    
  • 注意1:启动需要先启动 source->avro flume,再启动 sink->avro flume.

  • 注意2:avro接收器(sink)的hostname需和avro的数据源(source)的bind相同(我测试了就一下几种配置可行)

    • hostname0.0.0.0/hostname
      192.168.56.104(IP地址)192.168.56.104(与前者相同)
      0.0.0.00.0.0.0
      sink->hostnamesource->bind
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值