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数据格式:
记录INFO级别的日志,一般用于调试。本文将使用这种类型的sink,配置的属性:
3、应用
3.1 Flume配置如下:
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#对于channel的配置描述 使用内存作为数据的临时缓存
a1.channels.c1.type = memory
#对于sink的配置描述 使用avro日志做数据的消费
a1.sinks.k1.type=avro
a1.sinks.k1.port=44444
a1.sinks.k2.type=avroa1.sinks.k2.port=44445
a1.sinkgroups.g1.sinks= k1 k23.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对应的目录是否有数据