Flume介绍、架构、安装以及使用

一、Flume简介

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

二、Flume架构

架构图

在这里插入图片描述

组件

Client:客户端,数据产生的地方,如Web服务器
Event:事件,指通过Agent传输的单个数据包,如日志数据通常对应一行数据
Agent:代理,一个独立的JVM进程

Agent包含三个组件
Source:数据输入源
Channel:中间管道
Sink:数据输出口

工作流程

在这里插入图片描述

常用Source

exec source

  • 执行Linux指令,并消费指令返回的结果
    在这里插入图片描述

spooling directory source

  • 从磁盘文件夹中获取文件数据,可避免重启或者发送失败后数据丢失,还可用于监控文件夹新文件
    在这里插入图片描述

http source

  • 用于接收HTTP的Get和Post请求
    在这里插入图片描述

avro source

  • 监听Avro端口,并从外部Avro客户端接收events
    在这里插入图片描述

kafka source

  • 指定kafka Topic中的数据做为数据源

netcat source

  • 同样也可以监控端口

常用Channel

Memory Channel

  • event保存在Java Heap中。如果允许数据小量丢失,推荐使用

File Channel

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

JDBC Channel

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

Kafka Channel

常用Sink

avro sink

  • 作为avro客户端向avro服务端发送avro事件
    在这里插入图片描述

HDFS sink

  • 将事件写入Hadoop分布式文件系统
    在这里插入图片描述

Hive sink

  • 包含分隔文本或JSON数据流事件直接进入Hive表或分区

  • 传入的事件数据字段映射到Hive表中相应的列
    在这里插入图片描述

HBase sink:数据输出至HBase
在这里插入图片描述

Kafka sink:数据输出至Kafka Topic

多级代理

多跳(multi-agent flow
在这里插入图片描述

多路数据流(Multiplexing the flow)

在这里插入图片描述

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

在这里插入图片描述

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

拦截器

拦截器可修改或丢弃事件

  • 设置在source和channel之间

内置拦截器

  • HostInterceptor:在event header中插入“hostname”
  • TimestampInterceptor:插入时间戳
  • StaticInceptor:插入key-value
  • UUIDInceptor:插入UUID

三、Flume安装

  • 第一步:解压Flume包:tar -zxvf /opt/flume-ng-1.6.0-cdh5.14.0.tar.gz -C /opt
  • 第二步:修改包名mv /opt/apache-flume-1.6.0-cdh5.14.0-bin /opt/Flume160
  • 第三步:拷贝一份Flume160/conf下的flume-env.sh.template:cp /opt/Flume160/conf/flume-env.sh.template /opt/Flume160/conf/flume-env.sh
  • 第四步:修改配置flume-env.sh
#配置JDK(根据自己的版本与安装路径进行修改)
export JAVA_HOME=/opt/jdk1.8.0_221
#修改JAVA_OPTS中的Xms为2000(这个值仅作为学习阶段建议设置的大小)
export JAVA_OPTS="-Xms2000m -Xmx2000m -Dcom.sun.management.jmxremote"
  • 第五步(建议):在Flume160/conf目录下新建文件夹方便后面使用:mkdir /opt/Flume160/conf/jobTest

四、Flume使用示例

示例一 :监控端口(netcat)

  • 安装netcat:yum install -y nc

  • 安装telnet.*:yum install -y telnet.*

  • 安装telnet-server.*:yum install -y telnet-server.*

  • 在Flume160/conf/jobTest目录下创建.conf文件:vi /opt/Flume160/conf/jobTest/netcat-flume-logger.conf

#配置以下内容
a1.sources=r1
a1.channels=c1
a1.sinks=k1

#配置sources
a1.sources.r1.type=netcat #类型
a1.sources.r1.bind=localhost #IP地址
a1.sources.r1.port=7777 #端口

#配置channels
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=1000

#配置sinks
a1.sinks.k1.type=logger

#将channel与sources、sinks连接
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
  • 到Flume目录下:cd /opt/Flume160

  • 启动监控:./bin/flume-ng agent --name a1 --conf ./conf/ --conf-file ./conf/jobTest/netcat-flume-logger.conf -Dflume.root.logger=INFO,console

  • 新开一个窗口执行:telnet localhost 7777

  • 测试:在执行telnet localhost 7777命令的新窗口下输入任意字符回车即可在原窗口下看到输出变化

示例二:监控文件(exec)

  • 在Flume160/conf/jobTest目录下创建.conf文件:vi /opt/Flume160/conf/jobTest/file-flume-logger.conf
a2.sources=r1
a2.channels=c1
a2.sinks=k1

a2.sources.r1.type=exec #类型
a2.sources.r1.command=tail -f /opt/Flume160/conf/jobTest/tmp.txt #文件地址

a2.channels.c1.type=memory
a2.channels.c1.capacity=1000
a2.channels.c1.transactionCapacity=1000

a2.sinks.k1.type=logger

a2.sources.r1.channels=c1
a2.sinks.k1.channel=c1
  • 在/opt/Flume160/conf/jobTest/目录下创建测试文件:vi /opt/Flume160/conf/jobTest/tmp.txt
#测试数据
hello Flume
#保存退出
  • 启动监控(在Flume160目录下执行):./bin/flume-ng agent --name a2 --conf ./conf/ --conf-file ./conf/jobTest/file-flume-logger.conf -Dflume.root.logger=INFO,console

示例三:监控文件夹(spooldir )

  • 在Flume160/conf/jobTest目录下创建.conf文件:vi /opt/Flume160/conf/jobTest/events-flume-logger.conf
#events与上面的a1、都只是名称,作用相同
events.sources=eventsSource
events.channels=eventsChannel
events.sinks=eventsSink

#配置sources
events.sources.eventsSource.type=spooldir #类型
events.sources.eventsSource.spoolDir=/opt/Flume160/conf/jobTest/dataSourceFile/events #文件夹路径
events.sources.eventsSource.deserializer=LINE
events.sources.eventsSource.deserializer.maxLineLength=10000
events.sources.eventsSource.includePattern=events_[0-9]{
    
    4}-[0-9]{
    
    2}-[0-9]{
    
    2}.txt #正则匹配,一旦目录下存在events_xxxx-xx-xx.csv的文件就会读取

#配置channels
events.channels.eventsChannel.type=file
events.channels.eventsChannel.checkpoinDir=/opt/Flume160/conf/jobTest/checkPointFile/events 
events.channels.eventsChannel.dataDirs=/opt/Flume160/conf/jobTest/dataChannelFile/events

#配置sinks
events.sinks.eventsSink.type=logger

#将channel与sources、sinks连接
events.sources.eventsSource.channels=eventsChannel
events.sinks.eventsSink.channel=eventsChannel

  • 在Flume160/conf/jobTest目录下创建dataSourceFile/events目录:mkdir /opt/Flume160/conf/jobTest/dataSourceFile/events
  • 在Flume160/conf/jobTest目录下创建checkPointFile/events目录:mkdir /opt/Flume160/conf/jobTest/checkPointFile/events
  • 在Flume160/conf/jobTest目录下创建dataChannelFile/events目录:mkdir /opt/Flume160/conf/jobTest/dataChannelFile/events
  • 启动监控:./bin/flume-ng agent --name events --conf ./conf/ --conf-file ./conf/jobTest/events-flume-logger.conf -Dflume.root.logger=INFO,console
  • (新开一个窗口测试)/opt/Flume160/conf/jobTest/dataSourceFile/events目录下创建测试文件:vi /opt/Flume160/conf/jobTest/dataSourceFile/events/events_2020-11-30.txt
#测试数据
hello Flume
#保存退出
  • 在原窗口查看是否有内容输出

示例四:监控文件夹(输出至HDFS)

注意:提前启动好Hadoop并且能正常读写数据

  • 在Flume160/conf/jobTest目录下创建.conf文件:vi /opt/Flume160/conf/jobTest/userfriend-flume-logger.conf
user_friend.sources=userFriendSource
user_friend.channels=userFriendChannel
user_friend.sinks=userFriendSink

#配置Sources
user_friend.sources.userFriendSource.type=spooldir
user_friend.sources.userFriendSource.spoolDir=/opt/flume/conf/jobkb09/dataSourceFile/userfriend
user_friend.sources.userFriendSource.deserializer=LINE
user_friend.sources.userFriendSource.deserializer.maxLineLength=320000
user_friend.sources.userFriendSource.includePattern=userFriend_[0-9]{
    
    4}-[0-9]{
    
    2}-[0-9]{
    
    2}.csv

#配置channels
user_friend.channels.userFriendChannel.type=file
user_friend.channels.userFriendChannel.checkpointDir=/opt/flume/conf/jobkb09/checkPointFile/userfriend
user_friend.channels.userFriendChannel.dataDirs=/opt/flume/conf/jobkb09/dataChannelFile/userfriend

#配置sinks
user_friend.sinks.userFriendSink.type=hdfs
user_friend.sinks.userFriendSink.hdfs.fileType=DataStream
user_friend.sinks.userFriendSink.hdfs.filePrefix=userFriend
user_friend.sinks.userFriendSink.hdfs.fileSuffix=.csv
user_friend.sinks.userFriendSink.hdfs.path=hdfs://192.168.95.99:9000/kb09file/user/userFriend/%Y-%m-%d
user_friend.sinks.userFriendSink.hdfs.useLocalTimeStamp=true
user_friend.sinks.userFriendSink.hdfs.batchSize=640
user_friend.sinks.userFriendSink.hdfs.rollInterval=20
user_friend.sinks.userFriendSink.hdfs.rollCount=0
user_friend.sinks.userFriendSink.hdfs.rollSize=120000000

#将channel与sources、sinks连接
user_friend.sources.userFriendSource.channels=userFriendChannel
user_friend.sinks.userFriendSink.channel=userFriendChannel
  • 在Flume160/conf/jobTest目录下创建dataSourceFile/userfriend目录:mkdir /opt/Flume160/conf/jobTest/dataSourceFile/userfriend
  • 在Flume160/conf/jobTest目录下创建checkPointFile/userfriend目录:mkdir /opt/Flume160/conf/jobTest/checkPointFile/userfriend
  • 在Flume160/conf/jobTest目录下创建dataChannelFile/userfriend目录:mkdir /opt/Flume160/conf/jobTest/dataChannelFile/userfriend
  • 启动监控:./bin/flume-ng agent --name user_friend --conf ./conf/ --conf-file ./conf/jobTest/userfriend-flume-hdfs.conf -Dflume.root.logger=INFO,console
  • (新开一个窗口测试)/opt/Flume160/conf/jobTest/dataSourceFile/userfriend目录下创建测试文件:vi /opt/Flume160/conf/jobTest/dataSourceFile/userfriend/userFriend_2020-11-30.txt
#测试数据
hello Flume
#保存退出
  • 此时可以查看Hadoop上预先设定好的路径下是否存在数据

示例五:设置拦截器interceptors(输出至HDFS)

  • 在Flume160/conf/jobTest目录下创建.conf文件:vi /opt/Flume160/conf/jobTest/users-flume-logger.conf
users.sources=userSource
users.channels=userChannel
users.sinks=userSink

users.sources.userSource.type=spooldir
users.sources.userSource.spoolDir=/opt/flume/conf/jobkb09/dataSourceFile/user
users.sources.userSource.deserializer=LINE
users.sources.userSource.deserializer.maxLineLength=320000
users.sources.userSource.includePattern=users_[0-9]{
    
    4}-[0-9]{
    
    2}-[0-9]{
    
    2}.csv
users.sources.userSource.interceptors=head_filter
users.sources.userSource.interceptors.head_filter.type=regex_filter
users.sources.userSource.interceptors.head_filter.regex=^user_id* #匹配数据开头
users.sources.userSource.interceptors.excludeEvents=true  #设置true为舍弃开头

users.channels.userChannel.type=file
users.channels.userChannel.checkpointDir=/opt/flume/conf/jobkb09/checkPointFile/user
users.channels.userChannel.dataDirs=/opt/flume/conf/jobkb09/dataChannelFile/user

users.sinks.userSink.type=hdfs
users.sinks.userSink.hdfs.fileType=DataStream
users.sinks.userSink.hdfs.filePrefix=users
users.sinks.userSink.hdfs.fileSuffix=.csv
users.sinks.userSink.hdfs.path=hdfs://192.168.95.99:9000/kb09file/user/users/%Y-%m-%d
users.sinks.userSink.hdfs.useLocalTimeStamp=true
users.sinks.userSink.hdfs.batchSize=640
users.sinks.userSink.hdfs.rollInterval=20
users.sinks.userSink.hdfs.rollCount=0
users.sinks.userSink.hdfs.rollSize=120000000
users.sinks.userSink.hdfs.callTimeout=40000

users.sources.userSource.channels=userChannel
users.sinks.userSink.channel=userChannel
  • 在Flume160/conf/jobTest目录下创建dataSourceFile/users目录:mkdir /opt/Flume160/conf/jobTest/dataSourceFile/users
  • 在Flume160/conf/jobTest目录下创建checkPointFile/users目录:mkdir /opt/Flume160/conf/jobTest/checkPointFile/users
  • 在Flume160/conf/jobTest目录下创建dataChannelFile/users目录:mkdir /opt/Flume160/conf/jobTest/dataChannelFile/users
  • 启动监控:./bin/flume-ng agent --name users --conf ./conf/ --conf-file ./conf/jobTest/users-flume-hdfs.conf -Dflume.root.logger=INFO,console
  • (新开一个窗口测试)/opt/Flume160/conf/jobTest/dataSourceFile/users目录下创建测试文件:vi /opt/Flume160/conf/jobTest/dataSourceFile/users/users_2020-11-30.txt
#测试数据
user_id:hello Flume
#保存退出

猜你喜欢

转载自blog.csdn.net/weixin_38468167/article/details/110409013
今日推荐