flume获取rabbitMQ数据,由kafka接收
最近新项目做的是聊天客户系统,都是单聊的业务。当前的业务需求是将每一个会话中的访客和客服聊天数据持久化,方便后期分析用户行为数据。
使用netty做的长连接,可以使用业务代码回调功能,用kafka消费落入hbase;但是离线数据,使用的是rabbitMQ;
分几步走:
第一步,首先我们需要了解flume是干什么的。
flume可用于海量日志采集、聚合和传输的系统,同时可以对数据做简单处理,并写入到数据接收方(flume中的属于叫sink“槽”,比如hbase,hadoop的hdfs);
source > flume > sink 数据来源由flume获取并处理,由flume落入各个sink中。
在这项目中,flume的source类型是rabbitMQ,当前flume版本还不支持rabbitMQ,这里外国有大神做了这个插件,地址是:https://github.com/jcustenborder/flume-ng-rabbitmq
第二步,安装flume,并对source和sink进行配置
linux服务器下载flume 安装包,解压在opt文件夹下;将第一步github的项目部署,打成jar包,复制到flume的lib文件夹下面
接下来配置 rabbit-flume-kafka.properties (创建一个新文件)
具体如下:
#q_app2web a1.channels = ch-1 a1.sources = src-1 a1.channels.ch-1.type=memory a1.sources.src-1.channels = ch-1 a1.sources.src-1.type = com.aweber.flume.source.rabbitmq.RabbitMQSource #标注rabbitMQ作为source a1.sources.src-1.host = 192.168.0.50 a1.sources.src-1.port = 5672 #rabbitMQ的端口 a1.sources.src-1.virtual-host = / a1.sources.src-1.username = rabbitadmin #用户名 a1.sources.src-1.password = qwe8poi #密码 a1.sources.src-1.queue = q_chat #设置的队列名称 a1.sources.src-1.prefetchCount = 10 a1.sinks = k1 a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink #标注kafka作为sink a1.sinks.k1.channel = ch-1 a1.sinks.k1.topic=q_chat #kafka生产者话题 a1.sinks.k1.brokerList=192.168.0.9:9092,192.168.0.10:9092,192.168.0.11:9092 #Kafka集群节点之间通信的RPC端口 a1.sinks.k1.requiredAcks=1 a1.sinks.k1.batchSize=20
第三步:
启动flume,一般情况下使用命令 ./bin/flume-ng agent --conf conf --conf-file conf/rabbit-flume-kafka.properties --name a1 -Dflume.root.logger=INFO,console
这里有flume启动的shell脚本,方便操作./flume.sh start ./flume.sh stop
#!/bin/bash #echo "begin start flume..." #flume的安装根目录(根据自己情况,修改为自己的安装目录) path=/opt/flume-a1 echo "flume home is :$path" #flume的进程名称,固定值(不用修改) JAR="flume-a1" #flume的配置文件名称(根据自己的情况,修改为自己的flume配置文件名称) Flumeconf="rabbit-flume-kafka.properties" #定义的soure名称 agentname="a1" function start(){ echo "begin start flume process ...." #查找flume运行的进程数 num=`ps -ef|grep java|grep $JAR|wc -l` #判断是否有flume进程运行,如果有则运行执行nohup命令 if [ "$num" = "0" ] ;then nohup $path/bin/flume-ng agent --conf conf -f $path/conf/$Flumeconf --name $agentname -Dflume.root.logger=INFO,console & echo "start success...." echo "日志路径: $path/logs/flume.log" else echo "进程已经存在,启动失败,请检查....." exit 0 fi } function stop(){ echo "begin stop flume process.." num=`ps -ef|grep java|grep $JAR|wc -l` #echo "$num...." if [ "$num" != "0" ];then #正常停止flume ps -ef|grep java|grep $JAR|awk '{print $2;}'|xargs kill echo "进程已经关闭..." else echo "服务未启动,无须停止..." fi } function restart(){ #echo "begin stop flume process .." #执行stop函数 stop #判断程序是否彻底停止 num='ps -ef|grep java|grep $JAR|wc -l' #stop完成之后,查找flume的进程数,判断进程数是否为0,如果不为0,则休眠5秒,再次查看,直到进程数为0 while [ $num -gt 0 ];do sleep 5 num='ps -ef|grep java|grep $JAR|wc -l' done echo "flume process stoped,and starting..." #执行start start echo "started...." } #case 命令获取输入的参数,如果参数为start,执行start函数,如果参数为stop执行stop函数,如果参数为restart,执行restart函数 case "$1" in "start") start ;; "stop") stop ;; "restart") restart ;; *) ;; esac