flume介绍与原理
一、flume介绍
flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。
flume的优势:
1、 Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase。
2、当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一共平稳的数据.
3、提供上下文特征
4、flume的管道是基于事务,保证了数据在传送和接收时的一致性
5、flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
Flume具有的特征:
1、 Flume可以高效率的将多个网站服务器中收集的日志信息存入HDFS/HBase中
2、. 使用Flume,我们可以将从多个服务器中获取的数据迅速的移交给Hadoop中
3、除了日志信息,Flume同时也可以用来接入收集规模宏大的社交网络节点事件数据,比如facebook,twitter,电商网站如亚马逊,flipkart等
4、支持各种接入资源数据的类型以及接出数据类型
5、支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等
6、可以被水平扩展
flume架构:
source:数据源
产生数据流,同时source将产生的数据流传输到channel
channel:传输通道
用于桥接Source和sinks
sinks:下沉
从channel收集数据
event:传输单元
Flume数据传传输的基本单元,以事件的形式将数据送往目的地。
具体过程为:按照需求配置一个agent,选取适当的source和sink,然后启动该agent,开始采集日志。
source
flume提供多种source供用户进行选择,尽可能多的满足大部分日志采集的需求,常用的source的类型包括avro、exec、netcat、spooling-directory和syslog等。
avro source:avro可以监听和收集指定端口的日志,使用avro的source需要说明被监听的主机ip和端口号
agent1.sources.r1.type = avro (类型为avro source)
agent1.sources.r1.bind = 0.0.0.0 (指定监听的主机ip.本机是0.0.0.0.)
agent1.sources.r1.port = 16667 (指定监听的端口号)
exec source:可以通过指定的操作对日志进行读取,使用exec时需要指定shell命令,对日志进行读取
agent1.sources.r2.type = exec
agent1.sources.r2.command =tail -F /root/flume/log/event.txt (监听的文件的路径)
agent1.sources.r3.type = spooldir
agent1.sources.r3.spoolDir = /root/flume/log (监听的文件目录)
agent1.sources.r3.fileHeader = true
1、spoolDirectory是监控目录,不能为空,没有默认值。这个source不具有监控子目录的功能,也就是不能递归监控。
2、completedSuffix是文件读取完毕后给完成文件添加的标记后缀,默认是".COMPLETED";
3、deletePolicy这是是否删除读取完毕的文件,默认是"never",就是不删除,目前只支持"never"和“IMMEDIATE”;
4、fileHeader是否在event的Header中添加文件名,boolean类型, 默认false
5、fileHeaderKey这是event的Header中的key,value是文件名
6、batchSize这个是一次处理的记录数,默认是100;
7、inputCharset编码方式,默认是"UTF-8";
8、ignorePattern忽略符合条件的文件名
9、trackerDirPath被处理文件元数据的存储目录,默认".flumespool"
10、deserializerType将文件中的数据序列化成event的方式,默认是“LINE”---org.apache.flume.serialization.LineDeserializer
11、deserializerContext这个主要用在Deserializer中设置编码方式outputCharset和文件每行最大长度maxLineLength。
NetCat source:用来监听一个指定端口,并将接收到的数据的每一行转换为一个事件。
agent1.sources.r4.type = netcat (source类型)
agent1.sources.r4.bind = 0.0.0.0 (指定绑定的ip或主机名)
agent1.sources.r4.port = 16668 (指定绑定的端口号)
HTTP source:接受HTTP的GET和POST请求作为Flume的事件,其中GET方式应该只用于试验。
!type 类型,必须为"HTTP"
!port– 监听的端口
bind 0.0.0.0 监听的主机名或ip
handler org.apache.flume.source.http.JSONHandler处理器类,需要实现HTTPSourceHandler接口
handler.* – 处理器的配置参数
Selector.type
selector.*
interceptors –
interceptors.*
enableSSL false 是否开启SSL,如果需要设置为true。注意,HTTP不支持SSLv3。
excludeProtocols SSLv3 空格分隔的要排除的SSL/TLS协议。SSLv3总是被排除的。
keystore 密钥库文件所在位置
keystorePassword Keystore 密钥库密码
例子:
agent1.sources.r1.type = http
agent1.sources.r1.port = 66666
channel
flume中的channel不如source和sink那么重要,但却是不可忽视的组成部分。常用的channel为memory-channel,同时也有其他类型的channel,如JDBC、file-channel、custom-channel等
常见的channel
memory channel:内存
例子:
agent1.channels = c1
agent1.channels.c1.type = memory
agent1.channels.c1.capacity = 100000
agent1.channels.c1.transactionCapacity = 100000
配置参数说明:
channel
Type:hdfs
path:写入hdfs的路径,需要包含文件系统标识,比如:hdfs://namenode/flume/webdata/
可以使用flume提供的日期及%{host}表达式。
filePrefix: 默认值:FlumeData 写入hdfs的文件名前缀,可以使用flume提供的日期及%{host}表达式。
fileSuffix:写入hdfs的文件名后缀,比如:.lzo .log等。
inUsePrefix:临时文件的文件名前缀,hdfs sink会先往目标目录中写临时文件,再根据相关规则重命名成最终目标文件;
inUseSuffi: 默认值:.tmp 临时文件的文件名后缀。
rollInterval: 默认值:30 hdfs sink间隔多长将临时文件滚动成最终目标文件,单位:秒;
如果设置成0,则表示不根据时间来滚动文件;
注:滚动(roll)指的是,hdfs sink将临时文件重命名成最终目标文件,并新打开一个临时文件来写入数据;
rollSize 默认值:1024 当临时文件达到该大小(单位:bytes)时,滚动成目标文件;
如果设置成0,则表示不根据临时文件大小来滚动文件;
rollCount 默认值:10 当events数据达到该数量时候,将临时文件滚动成目标文件;
如果设置成0,则表示不根据events数据来滚动文件;
idleTimeout 默认值:0
当目前被打开的临时文件在该参数指定的时间(秒)内,没有任何数据写入,则将该临时文件关闭并重命名成目标文件;
batchSize 默认值:100 每个批次刷新到HDFS上的events数量;
codeC 文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy
fileType 默认值:SequenceFile
文件格式,包括:SequenceFile, DataStream,CompressedStream 当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC;当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值;
maxOpenFiles 默认值:5000 最大允许打开的HDFS文件数,当打开的文件数达到该值,最早打开的文件将会被关闭;
minBlockReplicas 默认值:HDFS副本数 写入HDFS文件块的最小副本数。该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件。
writeFormat 写sequence文件的格式。包含:Text, Writable(默认)
callTimeout 默认值:10000 执行HDFS操作的超时时间(单位:毫秒);
threadsPoolSize 默认值:10 hdfs sink启动的操作HDFS的线程数。
rollTimerPoolSize 默认值:1 hdfs sink启动的根据时间滚动文件的线程数。
kerberosPrincipal: HDFS安全认证kerberos配置;
kerberosKeytab
HDFS安全认证kerberos配置;
proxyUser 代理用户
round 默认值:false 是否启用时间上的”舍弃”,这里的”舍弃”,类似于”四舍五入”,后面再介绍。如果启用,则会影响除了%t的其他所有时间表达式;
roundValue 默认值:1 时间上进行“舍弃”的值;
roundUnit 默认值:seconds 时间上进行”舍弃”的单位,包含:second,minute,hour
sink
flume的sink也有很多种,常用的包括avro、logger、HDFS、hbase以及file-roll等,除此之外还有其他类型的sink,如thrift、IRC、custom等。
常见的sink
logger sink:将收集到的日志写到flume的log中
例子:
agent1.sinks = k1
agent2.sinks.k1.type = logger
avro sink:可以将接受到的日志发送到指定端口,供级联agent的下一跳收集和接受日志,使用时需要指定目的ip和端口
例子:
agent1.sinks=k1
agent1.sinks.k2.type = avro
agent1.sinks.k2.channel = c2
agent1.sinks.k2.hostname = hadoop03 (指定的主机名或ip)
agent1.sinks.k2.port = 16666 (指定的端口号)
file_roll sink:可以将一定时间内收集到的日志写到一个指定的文件中,具体过程为用户指定一个文件夹和一个周期,然后启动agent,这时该文件夹会产生一个文件将该周期内收集到的日志全部写进该文件内,直到下一个周期再次产生一个新文件继续写入,以此类推,周而复始。
例子:
agent1.sinks=k1
agent1.sinks.k1.type = file_roll
agent1.sinks.k1.channel = c1
agent1.sinks.k1.sink.directory=/root/flumelog (指定文件所在目录的路径)
hdfs sink:将收集到的日志写入到新创建的文件中保存起来,存储路径为分布式的文件系统hdfs的路径,同时hdfs创建新文件的周期可以是时间,也可以是文件的大小,还可以是采集日志的条数
示例:
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
当时间为2015-10-16 17:38:59时候,hdfs.path依然会被解析为:
/flume/events/20151016/17:30/00
因为设置的是舍弃10分钟内的时间,因此,该目录每10分钟新生成一个。
timeZone
默认值:Local Time 时区。
useLocalTimeStamp 默认值:flase 是否使用当地时间。
closeTries:默认值:0
hdfs sink关闭文件的尝试次数;
如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件,这个未关闭的文件将会一直留在那,并且是打开状态。
设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功。
retryInterval
默认值:180(秒)
hdfs sink尝试关闭文件的时间间隔,如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1.
Serializer 默认值:TEXT
序列化类型。其他还有:avro_event或者是实现了EventSerializer.Builder的类名。
Hbase sink:hbase是一种数据库,可以储存日志,使用时需要指定存储日志的表名和列族名,然后agent就可以将收集到的日志逐条插入到数据库中。
tableName:要写入的HBase数据表名,不能为空;
columnFamily:数据表对应的列簇名,这个sink目前只支持一个列簇,不能为空;
batchSize:每次事务可以处理的最大Event数量,默认是100;
eventSerializerType:用来将event写入HBase,即将event转化为put。默认是org.apache.flume.sink.hbase.SimpleHbaseEventSerializer,还有一个是RegexHbaseEventSerializer,即适合HBaseSink的Serializer只有这俩,否则自己定制;
serializerContext:是eventSerializerType的配置信息,就是配置文件中包含“serializer.”的项;
例子:
agent1.sinks = k1
agent1.sinks.k1.type = hbase
agent1.sinks.k1.table = flume
agent1.sinks.k1.columnFamily=fl_conf
agent1.sinks.k1.serializer=org.apache.flume.sink.hbase.RegexHbaseEventSerializer
flume配置介绍
agent.sources = kafkaSource # source的名字
agent.channels = memoryChannel # channels的名字
agent.sinks = hdfsSink #sink的名字
# 指定source使用的channel
agent.sources.kafkaSource.channels = memoryChannel
//source类型
agent.sources.kafkaSource.type=org.apache.flume.source.kafka.KafkaSource
//连接zookeeper
agent.sources.kafkaSource.zookeeperConnect=master:2181,slave:2181
agent.sources.kafkaSource.topic=flume-data //topic
//默认-1,consumer在没有新消息时无限期的block。如果设置一个正值, 一个超时异常会抛出
agent.sources.kafkaSource.kafka.consumer.timeout.ms=100
agent.channels.memoryChannel.type=memory //放在内存中
agent.channels.memoryChannel.capacity=1000 //channel中最多缓存多少
//channel一次最多吐给sink多少
agent.channels.memoryChannel.transactionCapacity=1000
agent.sinks.hdfsSink.type=hdfs //sink类型
agent.sinks.hdfsSink.channel = memoryChannel //# 指定sink使用的channel
//flume sink 目录
agent.sinks.hdfsSink.hdfs.path=hdfs://master:9000/user/flume/flume-data
//writeFormat 写sequence文件的格式。包含:Text, Writable(默认)
agent.sinks.hdfsSink.hdfs.writeFormat=Text
// # 配置输出文件类型,默认SequenceFile
# DataStream文本格式,不能设置压缩编解码器
# CompressedStream压缩文本格式,需要设置编解码器
agent.sinks.hdfsSink.hdfs.fileType=DataStream
agent.sinks.hdfsSink.hdfs.filePrefix = events- //# 配置文件前缀
flume启动命令
flume-ng agent --conf conf/ --conf-file conf/flume.conf --name agent -Dflume.root.logger=INFO,console
table(默认)
agent.sinks.hdfsSink.hdfs.writeFormat=Text
// # 配置输出文件类型,默认SequenceFile
DataStream文本格式,不能设置压缩编解码器
CompressedStream压缩文本格式,需要设置编解码器
agent.sinks.hdfsSink.hdfs.fileType=DataStream
agent.sinks.hdfsSink.hdfs.filePrefix = events- //# 配置文件前缀
#### flume启动命令
flume-ng agent --conf conf/ --conf-file conf/flume.conf --name agent -Dflume.root.logger=INFO,console