flume==官网学习地址
http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
验证flume 是否安装成功
/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/bin/flume-ng version
实例1(小例) : 配置netcat 接口方式 的==》监控端口
#Name the components on this agent
命名 每个sink \source\channel 对应的名字
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
## 定义source 的相关配置
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
## 定义sink 配置
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
## 定义 channels 的配置
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
## 将各个配置相关联
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
前往 启动配置–启动一个agent
### INFO,console 打印在控制台
./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/flume_1114_netcat.conf --name a1 -Dflume.root.logger=INFO,console
实例2(exec) 监控某个文件 exec ===》控制台
#定义各个组件
agent1.sources = src01
agent1.channels = ch01
agent1.sinks = sink01
#配置source
agent1.sources.src01.type = exec
agent1.sources.src01.command = tail -n 10 /data/flume/items
#配置channel
agent1.channels.ch01.type = memory
#配置sink
agent1.sinks.sink01.type = logger
##下面是把上面设置的组件关联起来(把点用线连起来)
agent1.sources.src01.channels = ch01
agent1.sinks.sink01.channel = ch01
启动 flume
./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/flume_1114_exec.conf --name agent1 -Dflume.root.logger=INFO,console
实例4 监控某个文件夹 --spooling-dir
# 定义别名
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = spooldir
# 监控的文件夹
a1.sources.r1.spoolDir = /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data
# 上传成功后显示后缀名
a1.sources.r1.fileSuffix = .COMPLETED
# 如论如何 加绝对路径的文件名 默认false
a1.sources.r1.fileHeader = true
#忽略所有以.tmp 结尾的文件(正在被写入),不上传
# ^以任何开头 出现无限次 以.tmp结尾的
a1.sources.r1.ignorePattern = ([^ ]*\.tmp)
# Describe the sink 下沉到hdfs
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop000:8020/flume/testdir/%Y%m%d/%H
#上传文件的前缀
a1.sinks.k1.hdfs.filePrefix = testdir-
#是否按照时间滚动文件夹
a1.sinks.k1.hdfs.round = true
#多少时间单位创建一个新的文件夹
a1.sinks.k1.hdfs.roundValue = 1
#重新定义时间单位
a1.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a1.sinks.k1.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a1.sinks.k1.hdfs.fileType = DataStream
#多久生成一个新的文件 ---秒为单位--以下为间隔30秒生成一个新的文件
a1.sinks.k1.hdfs.rollInterval = 30
#设置每个文件的滚动大小大概是 128M
a1.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a1.sinks.k1.hdfs.rollCount = 10
#最小副本数
a1.sinks.k1.hdfs.minBlockReplicas = 1
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动flume
./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/flume_2021_1114_spoolingdir.conf --name a1 -Dflume.root.logger=INFO,console
实例5 监控某个文件夹【超级重要】 --tail-dir 断点续传
#*********** set agent *************
a1.sources=r1
a1.channels=c1
a1.sinks=k1
#********* set sources **********
a1.sources.r1.type=taildir
a1.sources.r1.positionFile=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/taildir_position.json
a1.sources.r1.filegroups=f1 f2 f3
a1.sources.r1.filegroups.f1=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/access.log
a1.sources.r1.filegroups.f2=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/nginx.log
a1.sources.r1.filegroups.f3=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/web.log
a1.sources.r1.headers.f1.headerKey=access
a1.sources.r1.headers.f2.headerKey=nginx
a1.sources.r1.headers.f3.headerKey=web
a1.sources.r1.fileHeader=true
a1.sources.r1.channels=c1
#************ set channels **************
a1.channels.c1.type=memory
a1.channels.c1.capacity=10000
a1.channels.c1.transactionCapacity=100
#************* set sinks【先用logger测试下,在用hdfs】 *************
#配置sink
# a1.sinks.k1.type = logger
## 以上logger 测试没问题,再来调hdfs
###
a1.sinks.k1.type=hdfs
a1.sinks.k1.channel=c1
a1.sinks.k1.hdfs.path=hdfs://hadoop000:8020/flume/tail_dir/%{headerKey}/%Y-%m-%d
a1.sinks.k1.hdfs.filePrefix=event_data
a1.sinks.k1.hdfs.fileSuffix=.log
a1.sinks.k1.hdfs.round=true
## 多长时间,建一个文件夹
a1.sinks.k1.hdfs.roundValue=1
a1.sinks.k1.hdfs.roundUnit=minute
## 间隔多少秒建一个文件
a1.sinks.k1.hdfs.rollInterval=20
# 设置每个文件的滚动大小大概是 50M
a1.sinks.k1.hdfs.rollSize=50
a1.sinks.k1.hdfs.rollCount=10
a1.sinks.k1.hdfs.batchSize=100
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.threadsPoolSize=10
a1.sinks.k1.hdfs.callTimeout=10000
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.useLocalTimeStamp=true
##下面是把上面设置的组件关联起来(把点用线连起来)
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动flume
./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/test1114.conf --name a1 -Dflume.root.logger=INFO,console
flume 参数小结
Name Default Description
channel@ –
type@ – 指定类型:hdfs
hdfs.path@ – HDFS的路径,eg hdfs://namenode/flume/webdata/
hdfs.filePrefix FlumeData 保存数据文件的前缀名
hdfs.fileSuffix – 保存数据文件的后缀名
hdfs.inUsePrefix – 临时写入的文件前缀名
hdfs.inUseSuffix .tmp 临时写入的文件后缀名
hdfs.rollInterval 30 间隔多长将临时文件滚动成最终目标文件,单位:秒,
如果设置成0,则表示不根据时间来滚动文件
hdfs.rollSize 1024 当临时文件达到多少(单位:bytes)时,滚动成目标文件,
如果设置成0,则表示不根据临时文件大小来滚动文件
hdfs.rollCount 10 当 events 数据达到该数量时候,将临时文件滚动成目标文件,
如果设置成0,则表示不根据events数据来滚动文件
hdfs.idleTimeout 0 当目前被打开的临时文件在该参数指定的时间(秒)内,
没有任何数据写入,则将该临时文件关闭并重命名成目标文件
hdfs.batchSize 100 每个批次刷新到 HDFS 上的 events 数量
hdfs.codeC – 文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy
hdfs.fileType SequenceFile 文件格式,包括:SequenceFile, DataStream,CompressedStre,
当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC;
当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值;
hdfs.maxOpenFiles 5000 最大允许打开的HDFS文件数,当打开的文件数达到该值,
最早打开的文件将会被关闭
hdfs.minBlockReplicas – HDFS副本数,写入 HDFS 文件块的最小副本数。
该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件
hdfs.writeFormat Writable 写 sequence 文件的格式。包含:Text, Writable(默认)
hdfs.callTimeout 10000 执行HDFS操作的超时时间(单位:毫秒)
hdfs.threadsPoolSize 10 hdfs sink 启动的操作HDFS的线程数
hdfs.rollTimerPoolSize 1 hdfs sink 启动的根据时间滚动文件的线程数
hdfs.kerberosPrincipal – HDFS安全认证kerberos配置
hdfs.kerberosKeytab – HDFS安全认证kerberos配置
hdfs.proxyUser 代理用户
hdfs.round false 是否启用时间上的”舍弃”
hdfs.roundValue 1 时间上进行“舍弃”的值
hdfs.roundUnit second 时间上进行”舍弃”的单位,包含:second,minute,hour
hdfs.timeZone Local Time 时区。
hdfs.useLocalTimeStamp false 是否使用当地时间
hdfs.closeTries 0 Number hdfs sink 关闭文件的尝试次数;
如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件,
这个未关闭的文件将会一直留在那,并且是打开状态;
设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功
hdfs.retryInterval 180 hdfs sink 尝试关闭文件的时间间隔,
如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1
serializer TEXT 序列化类型
serializer.*
======== 添加 flume 拦截器 ====
======== 添加 flume 拦截器 ====
首先在 idea 开发拦截器
添加flume 涉及的版本
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<encoding>UTF-8</encoding>
<hadoop.version>2.6.0-cdh5.16.2</hadoop.version>
<flume.version>1.6.0-cdh5.16.2</flume.version>
<kafka.version>2.5.0</kafka.version>
<spark.version>3.0.0</spark.version>
</properties>
添加对应的依赖
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>${flume.version}</version>
</dependency>
package com.imooc.bigdata.flume;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class domainIntercepter implements Interceptor {
List<Event> events;
// 初始化
@Override
public void initialize() {
events=new ArrayList<>();
}
// 单例的处理
@Override
public Event intercept(Event event) {
Map<String, String> headers = event.getHeaders();
String body = new String(event.getBody());
if(body.contains("imooc")){
headers.put("type","imooc");
}else {
headers.put("type","other");
}
return event;
}
//多例的处理
@Override
public List<Event> intercept(List<Event> list) {
events.clear();
for (Event i :list){
events.add(intercept(i));
}
return events;
}
// 清理
@Override
public void close() {
events=null;
}
public static class Builder implements Interceptor.Builder{
@Override
public Interceptor build() {
return new domainIntercepter();
}
@Override
public void configure(Context context) {
}
}
}