flume集群+springboot日志收集简单实现

本文主要对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

<appender name="flumeTest" class="com.teambytes.logback.flume.FlumeLogstashV1Appender">
        <flumeAgents>  10.1.18.202:44444,10.1.18.204:44444 </flumeAgents>
        <flumeProperties>
            connect-timeout=4000;
            request-timeout=8000
        </flumeProperties>
        <batchSize>100</batchSize>
        <reportingWindow>1000</reportingWindow>
        <additionalAvroHeaders> myHeader = myValue </additionalAvroHeaders>
        <application>JustryDeng's Application</application>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - \(%file:%line\) - %message%n%ex</pattern>
        </layout>
    </appender>

想要对日志配置多了解一点点的话,这篇博客不错,https://blog.csdn.net/qq_2300688967/article/details/82430292 ,当然也是普及型的文章噢 

1.3、pom.xml配置文件

主要加入的flume,其他的与平常无异

<!-- aop 依赖 -->
		<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<!-- 用于日志切面中,以 json 格式打印出入参 -->
		<dependency>
		    <groupId>com.google.code.gson</groupId>
		    <artifactId>gson</artifactId>
		     </dependency>
		
			<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/com.teambytes.logback/logback-flume-appender -->
		<dependency>
		    <groupId>com.teambytes.logback</groupId>
		    <artifactId>logback-flume-appender_2.11</artifactId>
		    <version>0.0.9</version>
		</dependency>

完成上面的工作后,你可以本地跑一下,没错的话用 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进行实时统计,实时网站显示统计结果等

下篇见

 

 

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
flume是一个分布式、可靠、高可用的数据采集、聚合和传输系统。在数据采集方面,flume可以很好地与nginx、kafka、mongodb等常见的数据处理工具和数据库进行集成。下面介绍一下基于nginx+flume+kafka+mongodb实现埋点数据采集的步骤: 1. 配置nginx服务器,将所有的http请求都转发到flume服务器上。可以使用nginx的proxy_pass指令来实现。 2. 在flume服务器上,配置flume agent来接收nginx服务器转发过来的http请求,并将请求数据转发给kafka服务器。flume的配置文件中需要设置source、channel和sink三个部分,具体配置可以参考flume官方文档。 3. 在kafka服务器上,创建一个topic来存储flume发送过来的http请求数据。可以使用kafka的命令行工具kafka-topics来创建topic。 4. 在flume服务器上,配置一个kafka sink来将http请求数据发送到kafka服务器上的指定topic中。 5. 在mongodb数据库中创建一个collection来存储http请求数据。可以使用mongodb的命令行工具mongo来创建collection。 6. 在flume服务器上,配置一个mongodb sink来将http请求数据从kafka服务器中消费,并将其存储到mongodb数据库中的指定collection中。 7. 启动nginx、flume、kafka和mongodb服务,并进行测试。可以使用curl等工具模拟http请求,并查看数据是否能够被成功采集、存储到mongodb中。 以上就是基于nginx+flume+kafka+mongodb实现埋点数据采集的基本步骤。需要注意的是,具体的配置和实现过程可能会因为不同的业务需求而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yann.bai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值