将Flume部署到应用服务器中
Source、Channel、Sink有哪些类型
Flume Source
Source类型 | 说明
Avro Source | 支持Avro协议(实际上是Avro RPC),内置支持
Thrift Source | 支持Thrift协议,内置支持
Exec Source | 基于Unix的command在标准输出上生产数据
JMS Source | 从JMS系统(消息、主题)中读取数据
Spooling Directory Source | 监控指定目录内数据变更
Twitter 1% firehose Source| 通过API持续下载Twitter数据,试验性质
Netcat Source | 监控某个端口,将流经端口的每一个文本行数据作为Event输入
Sequence Generator Source | 序列生成器数据源,生产序列数据
Syslog Sources | 读取syslog数据,产生Event,支持UDP和TCP两种协议
HTTP Source | 基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式
Legacy Sources | 兼容老的Flume OG中Source(0.9.x版本)
Flume Channel
Channel类型 说明
Memory Channel | Event数据存储在内存中
JDBC Channel | Event数据存储在持久化存储中,当前Flume Channel内置支持Derby
File Channel | Event数据存储在磁盘文件中
Spillable Memory Channel | Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件
Pseudo Transaction Channel | 测试用途
Custom Channel | 自定义Channel实现
Flume Sink
Sink类型 说明
HDFS Sink | 数据写入HDFS
Logger Sink | 数据写入日志文件
Avro Sink | 数据被转换成Avro Event,然后发送到配置的RPC端口上
Thrift Sink | 数据被转换成Thrift Event,然后发送到配置的RPC端口上
IRC Sink | 数据在IRC上进行回放
File Roll Sink | 存储数据到本地文件系统
Null Sink | 丢弃到所有数据
HBase Sink | 数据写入HBase数据库
Morphline Solr Sink | 数据发送到Solr搜索服务器(集群)
ElasticSearch Sink | 数据发送到Elastic Search搜索服务器(集群)
Kite Dataset Sink | 写数据到Kite Dataset,试验性质的
Custom Sink | 自定义Sink实现
Kafka Sink | 数据写到Kafka
一、Flume安装
Flume是Java开发的,所以先得安装JDK。
- 安装包
1)下载
wget http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz
2)解压
tar –zxvf apache-flume-1.8.0-bin.tar.gz
mv apache-flume-1.8.0-bin /usr/local/flume
- 配置环境变量
vim /etc/profile
export FLUME_HOME=/usr/local/flume
export PATH=$PATH:$FLUME_HOME/bin
source /etc/profile
- 配置flume
cd /usr/local/flume
cp flume-env.sh.template flume-env.sh
#修改JAVA_HOME
vim flume-env.sh
export JAVA_HOME=/root/java/jdk1.8
- 验证
flume-ng version
Flume 1.8.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: 99f591994468633fc6f8701c5fc53e0214b6da4f
Compiled by denes on Fri Sep 15 14:58:00 CEST 2017
From source with checksum fbb44c8c8fb63a49be0a59e27316833d
二、Flume配置
根据需求修改/usr/local/flume/conf/flume.conf文件
1.监控指定目录下的指定日志文件(Exec Source)
- Flume配置文件
1.1 未对接Kafka(本地测试)
agent.sources = s1
agent.channels = c1
agent.sinks = k1
#sources设置
agent.sources.s1.type=exec
#这里取了指定任务日志文件作为监控源,指定任何有流式输入的文件均可
agent.sources.s1.command=tail -F /tmp/data/flume/flume.log
#channel设置
agent.channels.c1.type=file
#存放检查点目录,checkpointDir是一个目录
agent.channels.c1.checkpointDir = /tmp/data/flume/checkpoint
#备份目录
agent.channels.c1.backupCheckpointDir = /tmp/data/flume/backupCheckpointDir
#存放数据的目录,dataDirs可以是多个目录,以逗号隔开。用独立的多个磁盘上的多个目录可以提高file channel的性能
agent.channels.c1.dataDirs = /tmp/data/flume/dataDir
#通道中存储的最大事件数
agent.channels.c1.capacity=1000000
#每个事务通道从source或提供给sink的最大事件数,不大于capacity
agent.channels.c1.transactionCapacity=10000
# 使用channel将source和sink连接起来
agent.sources.s1.channels = c1
agent.sinks.k1.channel = c1
1.2 对接Kafka
agent.sources = s1
agent.channels = c1
agent.sinks = k1
#sources设置
agent.sources.s1.type=exec
#这里取了指定任务日志文件作为监控源,指定任何有流式输入的文件均可
agent.sources.s1.command=tail -F /tmp/data/flume/flume.log
agent.sources.s1.channels=c1
#channel设置
agent.channels.c1.type=file
#存放检查点目录,checkpointDir是一个目录
agent.channels.c1.checkpointDir = /tmp/data/flume/checkpoint
#备份目录
agent.channels.c1.backupCheckpointDir = /tmp/data/flume/backupCheckpointDir
#存放数据的目录,dataDirs可以是多个目录,以逗号隔开。用独立的多个磁盘上的多个目录可以提高file channel的性能
agent.channels.c1.dataDirs = /tmp/data/flume/dataDir
#通道中存储的最大事件数
agent.channels.c1.capacity=1000000
#每个事务通道从source或提供给sink的最大事件数,不大于capacity
agent.channels.c1.transactionCapacity=10000
#设置Kafka接收器
agent.sinks.k1.type=org.apache.flume.sink.kafka.KafkaSink
#设置Kafka的broker地址和端口号
agent.sinks.k1.brokerList=zk-master01:9092,zk-slaver01:9092,zk-slaver02:9092
#设置Kafka的指定Topic
agent.sinks.k1.topic=my-topic
#设置序列化方式
agent.sinks.k1.serializer.class=kafka.serializer.StringEncoder
agent.sinks.k1.channel=c1
2.监控指定目录下的新增文件(Spooling Directory Source)
2.1 未对接Kafka(本地测试)
agent.sources = r1
agent.sinks = k1
agent.channels = c1
# Describe/configure the source
agent.sources.r1.type = spooldir
agent.sources.r1.spoolDir = /tmp/data/flume
agent.sources.r1.fileHeader = true
# Describe the sink
agent.sinks.k1.type = logger
# Use a channel which buffers events in memory
agent.channels.c1.type=file
#存放检查点目录,checkpointDir是一个目录
agent.channels.c1.checkpointDir = /tmp/data/flume/checkpoint
#备份目录
agent.channels.c1.backupCheckpointDir = /tmp/data/flume/backupCheckpointDir
#存放数据的目录,dataDirs可以是多个目录,以逗号隔开。用独立的多个磁盘上的多个目录可以提高file channel的性能
agent.channels.c1.dataDirs = /tmp/data/flume/dataDir
#通道中存储的最大事件数
agent.channels.c1.capacity=1000000
#每个事务通道从source或提供给sink的最大事件数,不大于capacity
agent.channels.c1.transactionCapacity=10000
# Bind the source and sink to the channel
agent.sources.r1.channels = c1
agent.sinks.k1.channel = c1
2.2 对接Kafka
agent.sources = s1
agent.sinks = k1
agent.channels = c1
#sources设置
agent.sources.s1.type=spooldir
#这里取了指定目录作为监控源,监控新增文件
agent.sources.s1.spoolDir = /tmp/data/flume
agent.sources.s1.fileHeader = true
agent.sources.s1.channels=c1
#channel设置
agent.channels.c1.type=file
#存放检查点目录,checkpointDir是一个目录
agent.channels.c1.checkpointDir = /tmp/data/flume/checkpoint
#备份目录
agent.channels.c1.backupCheckpointDir = /tmp/data/flume/backupCheckpointDir
#存放数据的目录,dataDirs可以是多个目录,以逗号隔开。用独立的多个磁盘上的多个目录可以提高file channel的性能
agent.channels.c1.dataDirs = /tmp/data/flume/dataDir
#通道中存储的最大事件数
agent.channels.c1.capacity=1000000
#每个事务通道从source或提供给sink的最大事件数,不大于capacity
agent.channels.c1.transactionCapacity=10000
#sink设置
#设置Kafka接收器
agent.sinks.k1.type=org.apache.flume.sink.kafka.KafkaSink
#设置Kafka的broker地址和端口号
agent.sinks.k1.brokerList=zk-master01:9092,zk-slaver01:9092,zk-slaver02:9092
#设置Kafka的指定Topic
agent.sinks.k1.topic=test-1016
#设置序列化方式
agent.sinks.k1.serializer.class=kafka.serializer.StringEncoder
agent.sinks.k1.channel=c1
3.启动
3.1正常启动
flume-ng agent \
--name agent \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/flume.conf \
-Dflume.root.logger=INFO,console
3.2http监控启动方式
flume-ng agent \
--name agent \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/flume.conf \
-Dflume.root.logger=INFO,console \
-Dflume.monitoring.type=http \
-Dflume.monitoring.port=5653
这种启动方式,flume监控链接,http://zk-master01:5653/metrics,获取flume运行参数信息,如下所示:
{
"SOURCE.s1": {
"StopTime": "0", //source组件停止时间
"AppendBatchReceivedCount": "0", //source端刚刚追加的批量的数量,比如一批100,该度量为2,就是source端收到了200个events
"EventReceivedCount": "4913189", //source端累计收到的event数量
"AppendBatchAcceptedCount": "0", //source端追加到channel的数量
"Type": "SOURCE",
"EventAcceptedCount": "4912519", //source端累计成功放入channel的event数量
"AppendReceivedCount": "0", //source端刚刚追加的且目前已收到的event数量
"StartTime": "1496839492821", //source组件启动的时间
"AppendAcceptedCount": "0", //source端刚刚追加放入channel的event数量
"OpenConnectionCount": "0" //当前有效的连接数
},
"CHANNEL.c1": {
"StopTime": "0", //channel组件停止时间
"EventPutSuccessCount": "4912519", //成功放入channel的event数量
"ChannelCapacity": "200000", //channel容量
"ChannelFillPercentage": "5.0E-4", //channel使用比例
"Type": "CHANNEL",
"ChannelSize": "1", //目前在channel中的event数量
"EventTakeSuccessCount": "4912589", //从channel中成功取出event的数量
"EventTakeAttemptCount": "4912661", //正在从channel中取event的数量
"StartTime": "1496839492318", //channel组件启动时间
"EventPutAttemptCount": "4912519" //正在放进channel的event数量
},
"SINK.k1": {
"StopTime": "0", //sink组件停止时间
"KafkaEventSendTimer": "403088", //从channel批量取event,并成功发送到kafka的耗时,单位:毫微秒
"EventDrainSuccessCount": "4912589", //sink成功发送出的event数量
"RollbackCount": "0", //失败回滚的event数量
"Type": "SINK",
"ConnectionCreatedCount": "0", //连接被创建的数量
"BatchCompleteCount": "0", //成功完成输出的批量事件个数
"BatchEmptyCount": "62", //批量取空的数量
"EventDrainAttemptCount": "0", //试图从channel消耗的事件数量
"StartTime": "1496839492829", //sink组件开始时间
"BatchUnderflowCount": "8", //正处于批量处理的batch数
"ConnectionFailedCount": "0", //连接失败数
"ConnectionClosedCount": "0" //连接关闭数
}
}
三、CDH上kafka集群的安装
1.kafka基本概念
1、消费者:(Consumer):从消息队列中请求消息的客户端应用程序
2、生产者:(Producer) :向broker发布消息的应用程序
3、AMQP服务端(broker):用来接收生产者发送的消息并将这些消息路由给服务器中的队列,便于fafka将生产者发送的消息,动态的添加到磁盘并给每一条消息一个偏移量,所以对于kafka一个broker就是一个应用程序的实例
4、主题(Topic):一个主题类似新闻中的体育、娱乐、教育等分类概念,在实际工程中通常一个业务一个主题。
5、分区(Partition):一个Topic中的消息数据按照多个分区组织,分区是kafka消息队列组织的最小单位,一个分区可以看作是一个FIFO( First Input First Output的缩写,先入先出队列)的队列。
kafka分区是提高kafka性能的关键所在,当你发现你的集群性能不高时,常用手段就是增加Topic的分区,分区里面的消息是按照从新到老的顺序进行组织,消费者从队列头订阅消息,生产者从队列尾添加消息。
2.kafka安装包准备
csd包:http://archive.cloudera.com/csds/kafka/
parcel包: http://archive.cloudera.com/kafka/parcels/latest/
3.集成
1、将原来Kafka的在CDH中删除
2、csd包放到CDH安装节点下的 /opt/cloudera/csd目录下
3、将parcel包放到CDH安装节点下的/opt/cloudera/parcel-repo目录下
4.启动CDH,在主机–>parcel,点击检查新parcel,就会发现刚刚新增的kafka parcel,分配激活。
5.现在就可以在CDH主界面的服务列表选项中添加kafka服务。
4.验证
输入命令 jps
5.kafka基本命令
5.1.创建topic
/bin/kafka-topics --create --zookeeper zk-master01:2181 --replication-factor 1 --partitions 1 --topic test-1016
5.2.查看所有topics
/bin/kafka-topics --list --zookeeper zk-master01:2181
5.3.查看指定topic信息
/bin/kafka-topics --zookeeper zk-master01:2181 --topic test-1016 --describe
Topic:test-1016
PartitionCount:1 ReplicationFactor:1
Configs:
Topic: test-1016 Partition: 0
Leader: 199 Replicas: 199
Isr: 199
5.4.创建一个消息生产者
/bin/kafka-console-producer --broker-list zk-master01:9092 --topic test-1016
/bin/kafka-console-producer --broker-list zk-master01:9092,zk-slaver01:9092,zk-slaver02:9092 --topic test-1016
5.5.创建一个消息消费者
/bin/kafka-console-consumer --zookeeper zk-master01:2181 --topic test-1016 --from-beginning