环境准备:
1.安装flume
下载地址
http://archive.apache.org/dist/flume/
上传到linux并解压jar包
tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/
修改apache-flume-1.9.0-bin的名称为flume
mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume
解决jar包冲突:删除flume/lib中的guava-11.0.2.jar
rm -rf /opt/module/flume/lib/guava-11.0.2.jar
2.配置netcat
安装netcat工具
sudo yum install -y nc
判断端口是否被占用
sudo netstat -tunlp | grep 端口号
入门案例1-监听端口数据打印到控制台
在在flume目录下创建job文件夹
mkdir job
配置文件flume-netcat-logger.conf
[XXX@hadoop102 flume]$ vim job/flume-netcat-logger.conf
添加如下内容:
#1、定义agent、source、channel、sink的名称
#a1是agent的名称[由自己定义]
#r1是source的名称
#c1的channel的名称
#k1是sink的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1
#2、描述source
a1.sources.r1.type = netcat
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 9999
#3、描述channel
a1.channels.c1.type = memory
#指定channel的容量[指定channel中最多可以存放多少个Event]
a1.channels.c1.capacity = 100
#transactionCapacity 事务容量[事务容量必须<=capacity]
a1.channels.c1.transactionCapacity = 100
#4、描述sink
a1.sinks.k1.type = logger
#5、关联source->channel->sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
开启flume监听端口
bin/flume-ng agent --conf conf/ --name a1 --conf-file job/flume-netcat-lo
使用netcat工具向本机的9999端口发送内容
需开启另一个命令行窗口
nc localhost 9999
hello
world
入门案例2-实时监听文件保存到HDFS
创建配置文件flume-file-hdfs.conf
[XXX@hadoop102 flume]$ vim job/flume-file-hdfs.conf
添加如下内容
#1、定义agent、source、channel、sink的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1
#2、描述source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/module/a.txt
a1.sources.r1.shell = /bin/bash -c
#batchsize必须<=事务的容量
a1.sources.r1.batchSize = 100
#3、描述channel
a1.channels.c1.type = memory
#channel的容量
a1.channels.c1.capacity = 100
#事务的容量[事务容量必须<=channel的容量]
a1.channels.c1.transactionCapacity = 100
#4、描述sink
a1.sinks.k1.type = hdfs
#设置hdfs存储目录
a1.sinks.k1.hdfs.path = hdfs://hadoop102:9820/flume/%Y%m%d
#设置存储文件的前缀
a1.sinks.k1.hdfs.filePrefix = flume-
#设置滚动的时间间隔
a1.sinks.k1.hdfs.rollInterval = 3
#设置滚动的文件的大小[当文件达到指定的大小之后,会生成新文件,flume向新文件里面写入内存]
a1.sinks.k1.hdfs.rollSize = 13421000
#设置文件写入多少个Event就滚动
a1.sinks.k1.hdfs.rollCount = 0
#设置每次向HDFS写入的时候批次大小
a1.sinks.k1.hdfs.batchSize = 100
#指定写往HDFS的时候的压缩格式
#a1.sinks.k1.hdfs.codeC = 100
#指定写往HDFS的时候的文件格式[SequenceFile-序列化文件,DataStream-文本文件,CompressedStream-压缩文件]
a1.sinks.k1.hdfs.fileType = DataStream
#是否按照指定的时间间隔生成文件夹
a1.sinks.k1.hdfs.round = true
#指定生成文件夹的时间值
a1.sinks.k1.hdfs.roundValue = 24
#指定生成文件夹的时间单位[hour、second、minute]
a1.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#5、关联source->channel->sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
②开启集群
[XXX@hadoop102 flume]$ mycluster start
mycluster脚本如下:
#!/bin/bash
if [ $# -lt 1 ]
then
echo " args number error!!!!"
exit
fi
case $1 in
"start")
ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
hdfs dfsadmin -safemode leave
;;
"stop")
ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
;;
*)
echo "args info error!!!!"
;;
esac
运行Flume
[XXX@hadoop102 flume]$ bin/flume-ng agent -n a1 -c conf -f job/flume-file-hd
对txt文件进行修改/opt/module/a.txt
[XXX@hadoop102 flume]$ echo "aabbcc" >> /opt/module/a.txt
在HDFS上查看文件
agent与agent之间连接的时候需要使用(AVRO端口监听)
1. 简单串联
这种模式是将多个 flume 的agent顺序连接起来了,从最初的 source 开始到最终 sink 传送的目的存储系统。此模式不建议桥接过多的 flume 数量,flume 数量过多不仅会影响传输速率,而且一旦传输过程中某个节点 flume 宕机,会影响整个传输系统。
2. 复制和多路复用
Flume 支持将事件流向一个或者多个目的地。这种模式可以将相同数据复制到多个channel 中,或者将不同数据分发到不同的 channel 中,sink 可以选择传送到不同的目的地。
3. 负载均衡和故障转移
Flume支持使用将多个sink逻辑上分到一个sink组,sink组配合不同的SinkProcessor可以实现负载均衡和错误恢复的功能。
对于负载均衡来说,缓解了单个HDFSsink的压力,也缓解了channel中缓冲的数据量。
对于故障转移来说,只能是对于从第二层开始的agent进行故障转移。Flume本身就存在单点故障问题。
4. 聚合
这种模式是我们最常见的,也非常实用,日常 web 应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用 flume 的这种组合方式能很好的解决这一问题,每台服务器部署一个 flume 采集日志,传送到一个集中收集日志的flume,再由此 flume 上传到 hdfs、hive、hbase 等,进行日志分析。
5. 负载均衡
6. 复制模式
Flume支持将事件流向一个或者多个目的地。这种模式将数据源复制到多个channel中,每个channel都有相同的数据,sink可以选择传送的不同的目的地。