Flume数据采集

flume自带很长多的source,如:exe、kafka...其中有一个非常简单的source——httpsource,使用httpSource,flume启动后会拉起一个web服务来监听指定的ip和port。常用的使用场景:对于有些应用环境中,不能部署Flume SDK及其依赖项,可以在代码中通过HTTP而不是Flume的PRC发送数据的情况,此时HTTP SOURCE可以用来将数据接收到Flume中。

1、httpsource 参数:

配置参数 默认值 描述
type
http (org.apache.fluem.source.httpSource)
bind
绑定的IP地址或主机名
port
绑定的端口号
enableSSL false
keystore
使用的keystore文件的路径
keystorePassword
能够进入keystore的密码
handler JSONHandler HTTP SOURCE使用的处理程序类
handler.*
传给处理程序类的任何参数 可以 通过使用此参数(*)配置传入

1)handler:

Flume使用一个可插拔的“handler”程序来实现转换,如果不指定默认是:JSONHandler,它能处理JSON格式的事件,格式如下。此外用户可以自定义handler,必须实现HTTPSourceHandler接口。

json数据格式:

[html]  view plain  copy
  1. [ { "headers":{"":"","":""  
  2.                  },  
  3.      "body":"the first event"  
  4.    },  
  5.    { "headers":{"":"","":""  
  6.                  },  
  7.      "body":"the second event"  
  8.    }  
  9.      
  10. ]  

2、简单介绍一下flume的logger sink:

记录INFO级别的日志,一般用于调试。本文将使用这种类型的sink,配置的属性:

  • type  logger
  • maxBytesToLog    16    Maximum number of bytes of the Event body to log
注意:要求必须在 --conf 参数指定的目录下有 log4j的配置文件,可以通过-Dflume.root.logger=INFO,console在命令启动时手动指定log4j参数。

3、应用

3.1 Flume配置如下:

Flume数据采集_第1张图片

3.2 结构说明

在该场景中,使用三个Flume Agent分别部署在三台Web服务器上,用来采集终端的数据,然后其数据的下沉方式都为发送到另外两个Flume Agent上,然后这两个Flume agent 将数据发送到kafka或者hdfs中

3.3 配置

3.3.1 第一层Flume配置

#########################################################
##
##主要作用是监听文件中的新增数据,采集到数据之后,输出到avro
##    注意:Flume agent的运行,主要就是配置source channel sink
##  下面的a1就是agent的代号,source叫r1 channel叫c1 sink叫k1
#########################################################

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

a1.sinkgroups= g1

a1.sources.r1.type     = http
a1.sources.r1.port     = 14703
a1.sources.r1.channels = c1
a1.sources.r1.charset = UTF-8
#对于channel的配置描述 使用内存作为数据的临时缓存
a1.channels.c1.type   = memory
a1.channels.c1.capacity = 1000000000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 10240000000
#对于sink的配置描述 使用avro日志做数据的消费
a1.sinks.k1.type=avro
a1.sinks.k1.channel=c1
a1.sinks.k1.hostname=lzs01

a1.sinks.k1.port=44444

a1.sinks.k2.type=avro
a1.sinks.k2.channel=c1
a1.sinks.k2.hostname=lzs02

a1.sinks.k2.port=44445

a1.sinkgroups.g1.sinks= k1 k2  
a1.sinkgroups.g1.processor.type= load_balance  
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = round_robin 


3.3.2第二层Flume配置

tier1.sources = r1 r2
tier1.sinks = k1 hdfs1
tier1.channels = c_k1 c_hdfs1


#对于source的配置描述 监听avro
tier1.sources.r1.type = avro
tier1.sources.r1.bind = 0.0.0.0
tier1.sources.r1.port = 44444
tier1.sources.r1.charset = UTF-8


#对于source的配置描述 监听avro
tier1.sources.r2.type = avro
tier1.sources.r2.bind = 0.0.0.0
tier1.sources.r2.port = 44445
tier1.sources.r2.charset = UTF-8


#对于sink的配置描述 使用kafka做数据的消费
tier1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
tier1.sinks.k1.topic = f-k-s
tier1.sinks.k1.brokerList = lzs01:9092,lzs02:9092,lzs03:9092
tier1.sinks.k1.requiredAcks = 1
tier1.sinks.k1.batchSize = 20
tier1.sinks.k1.channel = k1


#对于sink的配置描述 使用日志做数据的消费
tier1.sinks.hdfs1.type = hdfs
tier1.sinks.hdfs1.hdfs.path = hdfs://nameservice1/user/flume/cloud/%Y%m%d/
tier1.sinks.hdfs1.hdfs.filePrefix = stb-%Y-%m-%d-%H
tier1.sinks.hdfs1.hdfs.useLocalTimeStamp = true 
tier1.sinks.hdfs1.hdfs.fileSuffix = .log
tier1.sinks.hdfs1.hdfs.inUseSuffix = .tmp
tier1.sinks.hdfs1.hdfs.round = true
tier1.sinks.hdfs1.hdfs.rollInterval = 3600
tier1.sinks.hdfs1.hdfs.rollCount = 0
tier1.sinks.hdfs1.hdfs.rollSize = 134217728
tier1.sinks.hdfs1.hdfs.callTimeout = 60000
tier1.sinks.hdfs1.hdfs.batchSize = 600
tier1.sinks.hdfs1.hdfs.idleTimeout = 0
# 如果希望上面配置的日志文件滚动策略生效,则必须要配置下面这一项
tier1.sinks.hdfs1.hdfs.minBlockReplicas = 1
#配置下面两项后,保存到HDFS中的数据才是文本
#否则通过hdfs dfs -text查看时,显示的是经过压缩的16进制
tier1.sinks.hdfs1.hdfs.serializer = TEXT
tier1.sinks.hdfs1.hdfs.fileType = DataStream


#对于channel的配置描述 使用内存缓冲区域做数据的临时缓存

tier1.channels.c_k1.type   = memory
tier1.channels.c_k1.capacity = 1000000000
tier1.channels.c_k1.byteCapacityBufferPercentage = 20
tier1.channels.c_k1.byteCapacity = 10240000000

#对于channel的配置描述 使用文件作为数据的临时缓存
tier1.channels.c_hdfs1.type= file
tier1.channels.c_hdfs1.checkpointDir = /data/flume/cloud/filechannel/checkpoint
tier1.channels.c_hdfs1.dataDirs = /data/flume/cloud/filechannel/data
tier1.channels.c_hdfs1.useDualCheckpoints = true
tier1.channels.c_hdfs1.backupCheckpointDir = /data/flume/cloud/filechannel/backupCheckpoint
tier1.channels.c_hdfs1.checkpointInterval = 300000
tier1.channels.c_hdfs1.transactionCapacity=600
tier1.channels.c_hdfs1.capacity = 200000000
tier1.channels.c_hdfs1.maxFileSize = 2146435071

#通过channel将source和sink 关联起来
tier1.sources.r1.channels = c_k1 c_hdfs1
tier1.sources.r2.channels=c_k1 c_hdfs1
tier1.sinks.k1.channel = c_k1
tier1.sinks.hdfs1.channel=c_hdfs1

3.4 测试

3.4.1 创建kafka对应的topic

a.查看topic列表

bin/kafka-topics --list --zookeeper lzs01:2181,lzs02:2181,lzs03:2181/kafka

b.创建topic

 bin/kafka-topics --zookeeper lzs01:2181,lzs02:2181,lzs03:2181/kafka --create --topic f-k-s  --partitions 3 --replication-factor 3

c.启动消费

bin/kafka-console-consumer --topic f-k-s  --bootstrap-server lzs01:9092,lzs02:9092,lzs03:9092 

3.4.2 启动第二层的flume

3.4.3 启动第一层的flume

 bin/flume-ng agent -c conf/ -f conf/flume-httparvo.conf -n a1  -Dflume.root.logger=INFO,console

3.4.4 发送数据

curl -X POST -d'[{"headers":{"h1":"v1","h2":"v2"},"body":"hello body"}]'  http://192.168.1.102:14703

3.4.5查看kafka和hdfs对应的目录是否有数据


你可能感兴趣的:(flume)