1.什么是Flume
- FLUME 是HADOOP生态圈中的一个组件。主要应用于实时数据的流处理,比如一旦有某事件触发(如本地交易引起的数据改动)可以将实时的日志数据发向HADOOP文件系统HDFS中
- FLUME 可以将数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。所以它还有较强的缓存作用.
- Flume具有较高的容错性。例如当收集数据的速度超过将写入数据的时候,即超过了系统的写入数据能力的时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供可推送的平稳数据
- FLUME支持多路径流量,多管道接入流量,多管道接出流量。例如FLUME的数据发出源及目的地可以是不同类别的比如社交媒体, 关系型数据库HBASE HDFS 前端控制台也可以是其他流工具如SPARK STREAM,Kafka,甚至其它的FLUME
- 用一个故事理解: 有一个池子,它一头进水,另一头出水,进水口可以配置各种管子,出水口也可以配置各种管子,可以有多个进水口、多个出水口。水术语称为Event,进水口术语称为Source、出水口术语成为Sink、池子术语成为Channel,Source+Channel+Sink,术语称为Agent。如果有需要,还可以把多个Agent连起来。
- FLUME AGENT的内部架构
2.环境搭建
- 官网下载地址(apache-flume-1.8.0-bin.tar.gz):http://flume.apache.org/download.html
- 解压:
tar zxf apache-flume-1.8.0-bin.tar.gz
- 修改配置文件:
vim apache-flume-1.8.0-bin/conf/myagent.conf #文件名随意
- 文件里添加一下配置(HDFS):
myagent.sources= eventDir
myagent.channels= memoryChannel
myagent.sinks= eventHDFS
myagent.sources.eventDir.type= spooldir
myagent.sources.eventDir.spoolDir= /home/cloudera/events
myagent.sources.eventDir.fileHeader= true
myagent.channels.memoryChannel.type= memory
myagent.channels.memoryChannel.capacity= 10000
myagent.channels.memoryChannel.transactioncapacity= 1000000
myagent.sinks.eventHDFS.type= hdfs
myagent.sinks.eventHDFS.hdfs.fileType= DataStream
myagent.sinks.eventHDFS.hdfs.path= /temp/events
myagent.sinks.eventHDFS.hdfs.writeFormat= Text
myagent.sinks.eventHDFS.hdfs.batchSize=10000
myagent.sources.eventDir.channels= memoryChannel
myagent.sinks.eventHDFS.channel= memoryChannel
- 运行(HDFS)
./bin/flume-ng agent -n spooldir -c conf -f conf/spooldir.conf
参数说明: -n 指定agent名称(与配置文件中代理的名字相同)
-c 指定flume中配置文件的目录
-f 指定配置文件
-Dflume.root.logger=DEBUG,console 设置日志等级
把数据放在/home/cloudera/events里面 source组件就可以获取到数据。
- 下面为详细配置文件说明:
myagent.sources= eventDir
myagent.channels= memoryChannel
myagent.sinks= eventHDFS
#这里给agent (名字是myagent, 可以是任起的) 中sources、sinks、channels分别起名--eventDir,memoryChannel以及eventHDFS。这样以后就可以引用这些名字在配置文件或命令行中描述各种操作或关系
myagent.sources.eventDir.type= spooldir #指定source的类型
myagent.sources.eventDir.spoolDir= /home/cloudera/events #Source用来监听一个指定的目录/user/me/events
myagent.sources.eventDir.fileHeader= true
myagent.channels.memoryChannel.type= memory #设置channel为内存型
myagent.channels.memoryChannel.capacity= 10000 #设置内存管道中存储事件数目上限
myagent.channels.memoryChannel.transactioncapacity= 1000000 #设置内存管道中传送事件数目上限
myagent.sinks.eventHDFS.type= hdfs #设置sink的传输类型
myagent.sinks.eventHDFS.hdfs.fileType= DataStream #设置sink接收的文件类型
myagent.sinks.eventHDFS.hdfs.path= /temp/events #设置sink接收的文件目的地即HDFS下的路径
myagent.sinks.eventHDFS.hdfs.writeFormat= Text #设置sink文件写入格式Text
myagent.sinks.eventHDFS.hdfs.batchSize=10000 #设置一次性写入事件数10000
#设置channel = memoryChannel 桥接source和sink
myagent.sources.eventDir.channels= memoryChannel
myagent.sinks.eventHDFS.channel= memoryChannel
2 . Source监听可以指定一个网络端口,即只要应用程序向这个端口里面写数据,这个source组件就可以获取到信息然后写入到channle。
则sink配置如下:
myagent.sources.eventNet.type = netcat
myagent.sources.eventNet.bind= 192.168.60.61 #虚拟机ip
myagent.sources.eventNet.port = 84447 #端口
完整配置如下:
spooldir.sources= eventDir
spooldir.channels= memoryChannel
spooldir.sinks= eventHDFS
spooldir.sources.eventDir.type= spooldir
spooldir.sources.eventDir.spoolDir=/home/hadoop/spooldir
spooldir.sources.eventDir.fileHeader= true
spooldir.channels.memoryChannel.type= memory
spooldir.channels.memoryChannel.capacity= 10000
spooldir.channels.memoryChannel.transactioncapacity= 1000000
spooldir.sources.eventDir.type=netcat
spooldir.sources.eventDir.bind=192.168.110.131
spooldir.sources.eventDir.port=44444
spooldir.sinks.eventHDFS.type= logger
spooldir.sources.eventDir.channels= memoryChannel
spooldir.sinks.eventHDFS.channel= memoryChannel
- 运行(端口)
./bin/flume-ng agent -n spooldir -c conf -f conf/spooldir.conf -Dflume.root.logger=INFO,console
- 使用telnet发送数据
telnet 192.168.110.131 44444 hello world!(windows中运行的)
结果:
Spooling Directory Source的两个注意事项:
①即:拷贝到spool目录下的文件不可以再打开编辑
②即:不能将具有相同文件名字的文件拷贝到这个目录下