提起Flume, 就先讲一下它的基本作用, 它可以从不同的数据源导入到一个集中的地方存放起来,基本架构如下图所示
*上图为Flume Data Flow Model, Ref: Flume 1.9.0 User Guide
本篇文章会做一个小demo, 数据从spooling directory来(而不是官网图中画的Web Server), 先经过channel, 再写入HDFS
*Note: Flume的source, channel和sink的类型非常多,所以本次用的source是Spooling Directory Source, Sink是 HDFS Sink, Channel是Memory Channel
前提准备
搭建HDFS环境, 可以参考以下文章
Richie:Hadoop -- 1. 从零搭建HDFSzhuanlan.zhihu.com配置Flume
从下面的官网直接下载Flume编译好的包(Apache Flume binary)
Download - Apache Flumeflume.apache.org解压放在某个路径下, 然后把flume加入环境变量, 如下
export FLUME_HOME=/Path_To_Your_Flume_Dir/flume-1.8.0
export PATH=$PATH:$FLUME_HOME/bin
之后记得source以下, 例如
source ~/.zshrc
创建spool dir
spool dir其实就是一个目录, 所以和创建目录的指令都一致
mkdir /path_to_your_spooldir
为source和sink配置config文件
这里先命名为hdfs.conf吧
agent1.sources = source1
agent1.sinks = sink1
agent1.channels = channel1agent1.sources.source1.channels = channel1
agent1.sinks.sink1.channel = channel1agent1.sources.source1.type = spooldir
agent1.sources.source1.spoolDir = /path_to_your_spooldiragent1.sinks.sink1.type = hdfs
agent1.sinks.sink1.hdfs.path = /tmp/flume
agent1.sinks.sink1.hdfs.filePrefix = events
agent1.sinks.sink1.hdfs.fileSuffix = .log
agent1.sinks.sink1.hdfs.inUsePrefix = _
agent1.sinks.sink1.hdfs.fileType = DataStreamagent1.channels.channel1.type = memory
启动Flume
cd /to_your_flume_home_dir
flume-ng agent --conf-file /path_to_your_hdfs.conf --name agent1 --conf conf -Dflume.root.logger=INFO,console
写入Spool Dir
cd /to_your_spool_dir
echo "Hello Flume" > .file1.txt
mv .file1.txt file1.txt
*Note: 这里解释一下为什么先写入隐藏文件, 然后再重命名了一下. 这是为了避免写了部分文件的时候, 就被flume source读取了, 所以我们先写入隐藏文件, 然后做个原子操作-重命名,之后flume就可以读到完整的文件了
在HDFS中查看写入内容
hdfs dfs -ls /tmp/flume
然后看一下.log文件中的内容
hdfs dfs -cat /tmp/flume/events.1547361342874.log