Loading

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

 

posted @ 2019-08-22 15:16  Robin325  阅读(584)  评论(0编辑  收藏  举报