本文主要对springboot构建的javaweb项目,利用flume进行日志收集,并且持久化到hdfs上,用来后期的数据分析用,这里的javaweb项目你可以换成你的项目,然后简单体验一下分布式日志收集的一个最简单的demo
本项目利用两个节点作为日志收集,一个节点作为总收集节点持久化到hdfs中,整体流程图如下(有点丑):
试验环境:apache-flume-1.7.0、Hadoop 2.7.3 、 zookeeper-3.4.14、jdk1.8
代码已放到csdn下载区,链接附上:https://download.csdn.net/download/mojir/11323017 (想着不设积分,但是csdn最新版没有找到修改的地方。。。)
1 springboot 实现日志产出作为整个系统的source:
这里主要贴出三部分主要代码:
1.1、产出部分
主要利用logger进行日志的产出,前端简单界面接受用户输入的用户名和密码,后端判断正误,并打印log成功登陆和失败的信息,以此作为数据源
@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
@WebLog(description = "请求了用户登录接口")
public String login(HttpServletRequest request,HttpServletResponse response,String id,String passw){
if(id.equals("1") && passw.equals("1")){
logger.info("---user_id---" +id+"---ip---"+ IpUtil.getIpAddr(request)+"---login sucess---");
return "success";
}
else {
logger.error("---user_id---" +id+"---ip---"+ IpUtil.getIpAddr(request)+"---login failed---");
return "failed";
}
}
1.2 、日志配置文件部分
主要对logback文件配置flume,将其日志作为flume的source
10.1.18.202:44444,10.1.18.204:44444
connect-timeout=4000;
request-timeout=8000
100
1000
myHeader = myValue
JustryDeng's Application
%d{HH:mm:ss.SSS} %-5level %logger{36} - \(%file:%line\) - %message%n%ex
想要对日志配置多了解一点点的话,这篇博客不错,https://blog.csdn.net/qq_2300688967/article/details/82430292 ,当然也是普及型的文章噢
1.3、pom.xml配置文件
主要加入的flume,其他的与平常无异
org.springframework.boot
spring-boot-starter-aop
com.google.code.gson
gson
org.springframework.boot
spring-boot-devtools
true
com.teambytes.logback
logback-flume-appender_2.11
0.0.9
完成上面的工作后,你可以本地跑一下,没错的话用 maven install 导出jar包,导出的jar包在你项目目录的target的文件夹下,长这个样子:
这样第一步工作就完成了
2、服务器Flume的配置
首先,你得保证你hadoop集群,zk flume能正常运行,并能够根据我上篇博客中的flume简单例子跑通,要不然报错就不好了。
这里,flume简单介绍一下吧,在上篇flume安装那篇也没好好介绍。apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。
他的应用场景有很多,比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图. 这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析.而Flume正是帮我们做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于次,不过不一定是使用FLume,毕竟优秀的产品很多,比如facebook的Scribe,还有Apache新出的另一个明星项目chukwa,还有淘宝Time Tunnel。
偷偷放上一个flume介绍的很好的一个博客,也是我这些简介的出处吧,帮助大家更好理解:https://blog.csdn.net/gyshun/article/details/79710534
2.1 闲话不多说,flume配置开始
2.1.1 在master节点的 /apache-flume-1.7.0-bin/conf 下新建一个 spring_flume.conf,作为本项目的配置文件
再说一遍,这是master中的配置文件啊,别搞错了,配置代码如下
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = 10.1.18.201
a1.sources.r1.port = 44444
#定义拦截器,为消息添加时间戳 (暂时不用,因为日志有时间戳了)
#a1.sources.r1.interceptors = i1
#a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
#对于sink的配置描述 传递到hdfs上面
a1.sinks.k1.type = hdfs
#集群的nameservers名字
#单节点的直接写:hdfs://10.1.18.201:9000/data_in
#ns是hadoop集群名称
a1.sinks.k1.hdfs.path = hdfs://10.1.18.201:9000/data_in
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.fileType = DataStream
#不按照条数生成文件
a1.sinks.k1.hdfs.rollCount = 0
#HDFS上的文件达到128M时生成一个文件
a1.sinks.k1.hdfs.rollSize = 134217728
#HDFS上的文件达到60秒生成一个文件
a1.sinks.k1.hdfs.rollInterval = 60
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
代码中分别是对source sink channel进行配置,因为flume主要就是这三部分组成,所以抓大头,想详细配置的可以参考flume官网
2.1.2 slave 配置文件:
在slave1 节点的 /apache-flume-1.7.0-bin/conf 下新建一个 spring_flume.conf,作为本项目的配置文件
这里是slave1的配置文件哦
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = 10.1.18.204
a1.sources.r1.port = 44444
#这个配置是可以直接进行打印的logger日志文件
#a1.sinks.k1.type = logger
#对于sink的配置描述 使用avro日志做数据的消费
a1.sinks.k1.type = avro
# hostname是最终传给的主机名称或者ip地址
a1.sinks.k1.hostname = 10.1.18.201
a1.sinks.k1.port = 44444
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
在slave2 节点的 /apache-flume-1.7.0-bin/conf 下新建一个 spring_flume.conf,作为本项目的配置文件
这里是slave2的配置文件哦
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = 10.1.18.202
a1.sources.r1.port = 44444
#这个配置是可以直接进行打印的logger日志文件
#a1.sinks.k1.type = logger
#对于sink的配置描述 使用avro日志做数据的消费
a1.sinks.k1.type = avro
# hostname是最终传给的主机名称或者ip地址
a1.sinks.k1.hostname = 10.1.18.201
a1.sinks.k1.port = 44444
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3、下面就是最激动人心的时刻,启动整个系统,收网
(1)启动hadoop (我这里因为hadoop和spark集成到了一块,所以启动时就一块启动了)
root@master:/opt/spark-2.1.0-bin-hadoop2.7# sbin/start-all.sh
(2)启动 zookeeper (这里需要三个节点都启动)
root@master:/opt/zookeeper-3.4.14# bin/zkServer.sh start
这里启动后可以简单看下zookeeper的leader 和follower分别是哪个,并且随机down掉一个节点,看看下一次是怎么选举的,结合网上资料,可以对zk的选举加深一点印象
root@master:/opt/zookeeper-3.4.14# bin/zkServer.sh status
(3)启动flume (三个节点都需要启动)
root@master:/opt/apache-flume-1.7.0-bin# bin/flume-ng agent --conf conf/ --conf-file conf/spring_flume.conf --name a1 -Dflume.root.logger=INFO,console
(4)启动java项目(可以随便一个slave节点上,我在202节点启动的)
root@master:/opt/software# nohup java -jar logs_flume-0.0.1-SNAPSHOT.jar
然后在你本地访问你的项目就可以了
http://10.1.18.202:8080/index
随便输入点击,搞完看看master节点的hdfs中是否有新生成的文件,这里默认60秒生成一个文件。
4、结果
hdfs dfs -ls /data_in
hdfs dfs -cat /data_in/events-.1562762029062
发现文件里真是我自己定义的那些日志哎
这就算一个小成功了,下面会尝试加上kafka进行,并且利用sparkStream进行实时统计,实时网站显示统计结果等
下篇见