Flume学习应用:Java写日志数据到MongoDB
概述
系统环境
- 操作系统:win7 64
- JDK:1.6.0_43
资源下载
- Maven:3.3.3
下载、安装、入门参考:1. Maven - 开始和2. 创建一个简单的Maven项目 - Flume:1.6.0
下载apache-flume-1.6.0-bin.tar.gz,并解压到合适的目录(e.g. F:\temp\apache-flume-1.6.0-bin) - MongoDB:3.2.3
下载mongodb-win32-x86_64-3.2.3-signed.msi,并安装到合适的目录(e.g. D:\develop\MongoDB)
辅助资源下载
- MongoDB Java Driver:2.13.0
下载地址:mongo-java-driver-2.13.0.jar
下载之后放入Flume安装目录的lib下。 - flume-ng-mongodb-sink
Flume需要这个,才能把数据写到MongoDB中
下载地址:flume-ng-mongodb-sink
这是一个基于Maven的源代码,package之后,将jar包放到Flume安装目录的lib下。
初始化
数据初始化
- 新建一个目录,作为dbpath
e.g. D:\develop\MongoDB\mydata - 启动监听服务 - CMD运行
D:\develop\MongoDB\bin\mongod --dbpath=D:\develop\MongoDB\mydata
配置Flume
- 生成flume-env.ps1
在安装目录的conf/下,复制flume-env.ps1.template,重命名为flume-env.ps1 - 修改log4j.properties
在安装目录的conf/下,修改文件log4j.properties;修改flume.root.logger=INFO,console
实现
Flume到MongoDB
agent.sources = so1
agent.channels = c1
agent.sinks = s1 agent.sources.so1.type = avro
agent.sources.so1.bind = 0.0.0.0
agent.sources.so1.port = 44444
agent.sources.so1.channels = c1 agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000
agent.channels.c1.transactionCapacity = 100 agent.sinks.s1.type = org.riderzen.flume.sink.MongoSink
agent.sinks.s1.host = localhost
agent.sinks.s1.port = 27017
agent.sinks.s1.model = single
agent.sinks.s1.db = test
agent.sinks.s1.collection = log
agent.sinks.s1.batch = 100
agent.sinks.s1.channel = c1
简单说明:
- 根据agent.sources.so1的相关配置,在44444端口开启监听 - log4j可以往这个端口写日志
- 根据agent.sinks.s1的相关配置,so1接收到的数据,将写到localhost:27017的test数据库的log-collection中
27017是MongoDB的默认监听端口
Java到Flume
文件结构
src/main/java
|---- cn.sinobest.flume.client.demo
|---- LogDemo.java
src/main/resources
|---- log4j.properties
pom.xml
文件内容
- pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.sinobest.asj</groupId>
<artifactId>fluent-client-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.flume.flume-ng-clients</groupId>
<artifactId>flume-ng-log4jappender</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
</project> - log4j.properties
# 配置Log4jAppender,能写日志到Flume
log4j.appender.flumeAvro=org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flumeAvro.Hostname=localhost
log4j.appender.flumeAvro.Port=44444
log4j.appender.flumeAvro.UnsafeMode=true
log4j.appender.flumeAvro.layout=org.apache.log4j.PatternLayout
log4j.appender.flumeAvro.layout.ConversionPattern=%m
# 配置根logger 此配置的日志级别和appender会被所有的logger继承
log4j.rootLogger=INFO, flumeAvro注意:
<1> org.apache.flume.clients.log4jappender.Log4jAppender负责将数据写到Flume的具体实现<2> 44444端口为前文Flume配置agent.sources.so1的监听端口 - LogDemo.java
package cn.sinobest.flume.client.demo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class LogDemo {
static final Log log = LogFactory.getLog(LogDemo.class); public static void main(String[] args) {
log.info("{'name':'Adam', 'age':'26', 'skill':'reading'}");
}
}注意:确保日志内容是json格式的字符串。
测试
- 启动MongoDB
D:\develop\MongoDB\bin\mongod --dbpath=D:\develop\MongoDB\mydata
- 启动Flume
# cd F:\temp\apache-flume-1.6.0-bin\bin
flume-ng.cmd agent --conf ..\conf -f ..\conf\mongo-agent.properties -n agent说明:第1行命令是提醒确认当前所在路径。
- 运行LogDemo
- 查看结果
D:\tools\PowerCmd>D:\develop\MongoDB\bin\mongo
2016-03-08T18:05:33.168+0800 I CONTROL [main] Hotfix KB2731284 or later update is not installed, will zero-out data files
MongoDB shell version: 3.2.3
connecting to: test
> db.log.find()
{ "_id" : ObjectId("56dea2b18449e36553652bc3"), "name" : "Adam", "age" : "26", "skill" : "reading" }
>说明:<1> mongo默认连接test数据库,也可以使用mongo test的方式指定连接test数据库。<2> db.log.find()用来查看log-collection中的数据,可以看到数据已经写入成功。
附录
参考资料
- Flume使用小结
主要参考了环境搭建部分,其他部分不适合。 - flume学习01-flume介绍
博主写了一系列,共3篇文章来介绍Flume,这里只贴出第一篇,算是入门文章。后面有些内容没有研究。 - Flume 1.5日志采集并存入mongodb的安装搭建
主要参考了Flume配置文件中,MongoSink的配置 - 后来发现博主没有指定db,数据是写到events数据库的events-collection中
Flume学习应用:Java写日志数据到MongoDB的更多相关文章
- 应用Flume+HBase采集和存储日志数据
1. 在本方案中,我们要将数据存储到HBase中,所以使用flume中提供的hbase sink,同时,为了清洗转换日志数据,我们实现自己的AsyncHbaseEventSerializer. pac ...
- 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考
本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...
- flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去
1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...
- Jmeter 在 beanshell 脚本中写日志
JMETER 在执行时,会写日志数据,我们在编写脚本的时候也可以自己写日志. 日志记录再jmeter 的bin 目录的 jmeter.log 文件中. jmeter 比较人性化,它在这里提供了脚本可以 ...
- flume学习(三):flume将log4j日志数据写入到hdfs(转)
原文链接:flume学习(三):flume将log4j日志数据写入到hdfs 在第一篇文章中我们是将log4j的日志输出到了agent的日志文件当中.配置文件如下: tier1.sources=sou ...
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- 学习笔记:分布式日志收集框架Flume
业务现状分析 WebServer/ApplicationServer分散在各个机器上,想在大数据平台hadoop上进行统计分析,就需要先把日志收集到hadoop平台上. 思考:如何解决我们的数据从其他 ...
- 海量日志数据提取某日访问百度次数最多的那个IP的Java实现
海量日志数据提取某日访问百度次数最多的那个IP的Java实现 前几天在网上看到july的一篇文章<教你如何迅速秒杀掉:99%的海量数据处理面试题>,里面说到百度的一个面试题目,题目如下: ...
- 零基础学习java------29---------网络日志数据session案例,runtime(导出jar程序)
一. 网络日志数据session案例 部分数据 数据中的字段分别为: 访客ip地址,访客访问时间,访客请求的url及协议,网站响应码,网站返回数据量,访客的referral url,访客的客户端操作系 ...
随机推荐
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- OScached缓存整个页面和缓存局部页面
1.缓存整个页面 在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存.主要用于对web应用中的某些动态页面进行缓存,尤其是那些需要生成PDF格式文件/报表.图片文件等的页面,不 ...
- Bzoj1822 [JSOI2010]Frozen Nova 冷冻波
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1933 Solved: 608 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖 ...
- hdu 1217 Arbitrage (spfa算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:通过货币的转换,来判断是否获利,如果获利则输出Yes,否则输出No. 这里介绍一个ST ...
- bzoj 1854 游戏 二分图匹配 || 并查集
题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...
- windows下常用快捷键(转)
原文转自 https://blog.csdn.net/LJFPHP/article/details/78818696 win+E 打开文件管器 win+D ...
- Python3 嵌套函数
嵌套函数: 函数体内用def定义函数 注意:函数体中调用其他函数不算嵌套函数,只能是函数的调用 简单的嵌套函数: 输出结果:
- vue路由-动态路由和嵌套路由
一.动态路由 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那么,我们可以在 vue-route ...
- python基础===进程,线程,协程的区别(转)
本文转自:http://blog.csdn.net/hairetz/article/details/16119911 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自 ...
- 【UOJ#9】vfk的数据
我感觉这题可以出给新高一玩2333 #include<bits/stdc++.h> #define N 10005 using namespace std; string s[N]; in ...