Flume收集log到HDFS(雏形)

Flume系列文章:
Flume 概述 & 架构 & 组件介绍
Flume 使用入门 & 入门Demo

在本篇文章中,将继续介绍Flume的使用

Flume的使用场景

监控某个文件,并把新增的内容输出到HDFS(这是离线处理的典型的一个场景)
Agent的技术选型,该如何选择?在这里我们的选择如下:

  • exec source
  • memory channel
  • hdfs sink

Flume收集log到HDFS(雏形)

Agent配置内容解读

a1.sources = r1
a1.sinks = k1.....
a1.channels = c1,c2,c3

# 官网:http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#exec-source
# 必填的属性:channels
#            type      必须是exec
#            command   命令,使用 tail -F 监控/home/hadoop/data/data.log  目前data.log是空的
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /home/hadoop/data/data.log
a1.sources.r1.channels = c1

# 使用memory channel
a1.channels.c1.type = memory

# 官网:http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#hdfs-sink
# 如果我们自己进行设置的话,使用HDFS Sink,我们需要进行配置的内容有:路径、batch、压缩、存储格式
# 必填的属性:channel
#            type        必须是hdfs
#            hdfs.path
# 
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop000:8020/data/flume/tail
a1.sinks.k1.hdfs.batchSize = 10             每个批次放10条数据
a1.sinks.k1.hdfs.fileType = DataStream      文件类型;有SequenceFile(默认设置是这种,SequenceFile的内容我们是看不见的,是没有办法直接读取的),
                                                       DataStream(不能使用压缩,因此不能设置codec)
                                                       CompressedStream(需要去设置codec)
                                                      3种
a1.sinks.k1.hdfs.writeFormat = Text         写数据的格式,有Text,Writable 2种类型

conf文件配置

$FLUME_HOME/conf/exec-memory-hdfs.conf文件编写

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /home/hadoop/data/data.log
a1.sources.r1.channels = c1

a1.channels.c1.type = memory

a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://192.168.26.131:8020/data/flume/tail
a1.sinks.k1.hdfs.batchSize = 10
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.channel = c1

运行Flume

启动Flume Agent:

$>flume-ng agent \
  --name a1  \
  --conf $FLUME_HOME/conf \
  --conf-file $FLUME_HOME/conf/exec-memory-hdfs.conf \
  -Dflume.root.logger=INFO,console

$>echo aaa >> data.log
$>echo aaa >> data.log
$>echo aaa >> data.log
$>echo aaa >> data.log
$>echo aaa >> data.log
$>echo aaa >> data.log
$>echo aaa >> data.log
...
不断向/home/hadoop/data/data.log追加内容

启动Agent的那端,所显示的log信息:
Serializer = TEXT, UseRawLocalFileSystem = false
Creating hdfs://192.168.26.131:8020/data/flume/tail/FlumeData.1517894275500.tmp
创建文件,前缀是FlumeData,中间是一个时间戳,后缀是.tmp(因为还在写)
注意:

  • 之所以前缀是FlumeData,是因为hdfs.filePrefix属性的默认值就是FlumeData(参照HDFS Sink的配置文件,官网可以查阅到)
    在生产上,就相当于业务线的名称(结合线下若泽所说的项目来想)

  • 之所后缀是.tmp,是因为hdfs.inUseSuffix属性的默认值是.tmp(参照HDFS Sink的配置文件,官网可以查阅到)

Closing hdfs://192.168.26.131:8020/data/flume/tail/FlumeData.1517894275500.tmp
Renaming hdfs://192.168.26.131:8020/data/flume/tail/FlumeData.1517894275500.tmp to
hdfs://192.168.26.131:8020/data/flume/tail/FlumeData.1517894275500

写完之后,做了一个Rename的操作,将带tmp的文件,给Rename成不带tmp文件了,没有后缀了,标志着真正的写完了

收集到HDFS之后,最终会在HDFS目录/data/flume/tail上所产生了2个文件:

Permission  Owner   Group       Size    Last Modified                   Replication     Block Size  Name
-rw-r--r--  hadoop  supergroup  40 B    Tue Feb 06 13:18:01 +0800 2018  1               128 MB      FlumeData.1517894275500
-rw-r--r--  hadoop  supergroup  16 B    Tue Feb 06 13:18:31 +0800 2018  1               128 MB      FlumeData.1517894275501

潜在的问题:
Block Size都是128MB,而Flume收集过来的文件分别只有40B与16B,这就产生了1个问题:
Flume收集过来的文件过小,这点必然是不行的;同时,这点会造成集群的Block的数量扛不住,对此需要采取相应的措施去规避,这点将在下篇文章中介绍
这里,分享一篇关于Block计算的相关issue:hadoop-1687

猜你喜欢

转载自blog.csdn.net/lemonZhaoTao/article/details/81150902