本文介绍初次使用Flume传输数据到MongoDB的过程,内容涉及环境部署和注意事项。

1 环境搭建

需要jdk、flume-ng、mongodb java driver、flume-ng-mongodb-sink
(1)jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)flune-ng下载地址:http://www.apache.org/dyn/closer.cgi/flume/1.5.2/apache-flume-1.5.2-bin.tar.gz
(3)mongodb java driver jar包下载地址:https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/2.13.0/mongo-java-driver-2.13.0.jar
(4)flume-ng-mongodb-sink 源码下载地址:https://github.com/leonlee/flume-ng-mongodb-sink
flume-ng-mongodb-sink 需要自己编译jar包,从github上下载代码,解压之后执行mvn package,即可生成。需要先安装maven用于编译jar包,且机器需要能联网。

2 简单原理介绍

这是一个关于池子的故事。有一个池子,它一头进水,另一头出水,进水口可以配置各种管子,出水口也可以配置各种管子,可以有多个进水口、多个出水口。水术语称为Event,进水口术语称为Source、出水口术语成为Sink、池子术语成为Channel,Source+Channel+Sink,术语称为Agent。如果有需要,还可以把多个Agent连起来。
更多细节参考官方文档:http://flume.apache.org/FlumeDeveloperGuide.html

3 Flume配置

(1)  env配置

将mongo-java-driver和flume-ng-mongodb-sink两个jar包放到flume\lib目录下,并将路径加入到flume-env.sh文件的FLUME_CLASSPATH变量中;
  JAVA_OPTS变量: 加上-Dflume.monitoring.type=http -Dflume.monitoring.port=xxxx,可以在[hostname:xxxx]/metrics 上看到监控信息;  -Xms指定JVM初始内存,-Xmx指定JVM最大内存
  FLUME_HOME变量: 设定FLUME根目录
  JAVA_HOME变量:  设定JAVA根目录

(2) log配置

在调试时,将日志设置为debug并打到文件:flume.root.logger=DEBUG,LOGFILE

(3) 传输配置
        采用 Exec Source、file-channel、flume-ng-mongodb-sink。
    Source配置举例:

my_agent.sources.my_source_1.channels = my_channel_1
my_agent.sources.my_source_1.type = exec
my_agent.sources.my_source_1.command = python xxx.py
my_agent.sources.my_source_1.shell = /bin/bash -c
my_agent.sources.my_source_1.restartThrottle = 10000
my_agent.sources.my_source_1.restart = true
my_agent.sources.my_source_1.logStdErr = true
my_agent.sources.my_source_1.batchSize = 1000
my_agent.sources.my_source_1.interceptors = i1 i2 i3
my_agent.sources.my_source_1.interceptors.i1.type = static
my_agent.sources.my_source_1.interceptors.i1.key = db
my_agent.sources.my_source_1.interceptors.i1.value = cswuyg_test
my_agent.sources.my_source_1.interceptors.i2.type = static
my_agent.sources.my_source_1.interceptors.i2.key = collection
my_agent.sources.my_source_1.interceptors.i2.value = cswuyg_test
my_agent.sources.my_source_1.interceptors.i3.type = static
my_agent.sources.my_source_1.interceptors.i3.key = op
my_agent.sources.my_source_1.interceptors.i3.value = upsert

字段说明:
    采用exec source,指定执行命令行为python  xxx.py,我在xxx.py代码中处理日志,并按照跟flume-ng-mongodb-sink的约定,print出json格式的数据,如果update类操作必须带着_id字段,print出来的日志被当作Event的Body,我再通过interceptors给它加上自定义Event Header;
static interceptors用于为Event Header添加信息,这里我为它加上了db=cswuyg_test、collection=cswuyg_test、op=upsert,这三个key是跟flume-ng-mongodb-sink 约定的,用于指定mongodb中的db、collection名以及操作类型为update。

    Channel配置举例:

my_agent.channels.my_channel_1.type = file
my_agent.channels.my_channel_1.checkpointDir = /home/work/flume/file-channel/my_channel_1/checkPoint
my_agent.channels.my_channel_1.useDualCheckpoints = true
my_agent.channels.my_channel_1.backupCheckpointDir = /home/work/flume/file-channel/my_channel_1/checkPoint2
my_agent.channels.my_channel_1.dataDirs = /home/work/flume/file-channel/my_channel_1/data
my_agent.channels.my_channel_1.transactionCapacity = 10000
my_agent.channels.my_channel_1.checkpointInterval = 30000
my_agent.channels.my_channel_1.maxFileSize = 4292870142
my_agent.channels.my_channel_1.minimumRequiredSpace = 524288000
my_agent.channels.my_channel_1.capacity = 100000

字段说明:

要注意的参数是capacity,它指定了池子里可以存放的Event数量,需要根据日志量设置一个合适的值,如果你也采用file-channel,而且磁盘充足,那可以尽可能的设置得大些。
    dataDirs指定池子存放的位置,如果可以,选择IO不是那么高的磁盘,可以使用逗号分隔使用多个磁盘目录。

    sink配置举例:

my_agent.sinks.my_mongo_1.type = org.riderzen.flume.sink.MongoSink
my_agent.sinks.my_mongo_1.host = xxxhost
my_agent.sinks.my_mongo_1.port = yyyport
my_agent.sinks.my_mongo_1.model = dynamic
my_agent.sinks.my_mongo_1.batch = 10
my_agent.sinks.my_mongo_1.channel = my_channel_1
my_agent.sinks.my_mongo_1.timestampField = _S

字段说明:

 model选择dynamic,表示mongodb的db、collection名字采用Event Header中指定的名字。timestampField 字段用于将json串中指定键的值转换为datetime格式存进mongodb,flume-ng-mongodb-sink不支持嵌套key指定(如:_S.y),但可以自己通过修改sink的代码来实现。

    agent配置举例:

my_agent.channels = my_channel_1
my_agent.sources = my_source_1
my_agent.sinks = my_mongo_1

(4) 启动

可以写一个control.sh 脚本来控制flume的启动、关闭、重启。
    启动demo:
./bin/flume-ng agent --conf ./conf/ --conf-file ./conf/flume.conf -n agent1 > ./start.log 2>&1 &

从此以后,日志数据就从日志文件,通过xxx.py读取,进入到flie-channel,再被flume-ng-mongodb-sink读走,进入到目的地MongoDB Cluster。
搭好基本功能之后,以后需要做的就是调整xxx.py、增强flume-ng-mongodb-sink。

4 其它

1、监控:官方推荐的监控是ganglia:http://sourceforge.net/projects/ganglia/,有图像界面。

2、版本变更:flume 从1.X开始已经不再使用ZooKeeper,在数据可靠性上,提供了E2E(end-to-end)的支持,去掉了重构之前的DFO(store on failure)、BE(best effort)。E2E指的是:在删除channel中的event时,保证event已经传递到了下一个agent或者终点,不过,这里没有提到数据在进入到channel之前如何保证不丢失,像Exec Source这种数据导入channel的方式,需要使用者自己保证。

3、关闭插件:使用Exec Source时,flume重启不会关闭掉旧插件进程,需要自己关闭。

4、Exec Source不能保证数据不丢失,因为这种方式只是把水灌到池子里,不管池子是什么状况, 参见https://flume.apache.org/FlumeUserGuide.html#exec-source 的 Warning 部分。但是,Spooling directory source 也不一定是个好方法,监控目录,但是注意不能修改文件的名字,不能出现同名覆盖文件,不要出现只有一半内容的文件。传输完成之后,文件会被重命名为xx.COMPLETED,需要有定时清理脚本把这些文件清理掉。重启会导致出现重复event,因为那些被传输到一半的文件没有被设置为完成状态。

5、传输瓶颈:使用flume+mongodb来安全传输大量数据(每秒万条级别的日志不算大数据量,每天几百G的也不算),瓶颈会出现在MongoDB上,特别是Update类型的数据传输。

6、需要修改当前的flume-ng-mongodb-sink 插件:(1)让update支持 $setOnInsert;(2)解决update的 $set、$inc为空时,引发exception的bug;(3)解决批量插入时,因其中一条日志有duplicate exception而导致同批插入的后续日志全部被丢弃的bug。

7、flume跟fluentd很类似,但来自hadoop生态的flume更热门,所以我选择flume。

8、批量部署:先把jdk、flume打包成tar,然后借助python 的 paramiko库,将tar包发到各台机器上,解压、运行。

本文所在:http://www.cnblogs.com/cswuyg/p/4498804.html 
参考:

1、http://flume.apache.org/FlumeDeveloperGuide.html

2、《Apache Flume: Distributed Log Collection for Hadoop》

Flume使用小结的更多相关文章

  1. Flume参数小结

    名词解释: 1.netcat:通过网络端口获取数据,source的实现类 2.logger:将数据显示到控制台,sink的实现类 3.memory: ,channel的实现类 4.capacity:是 ...

  2. Flume NG 配置详解(转)

    原文链接:[转]Flume NG 配置详解 (说明,名词对应解释 源-Source,接收器-Sink,通道-Channel) 配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式 ...

  3. Flume学习应用:Java写日志数据到MongoDB

    概述 Windows平台:Java写日志到Flume,Flume最终把日志写到MongoDB. 系统环境 操作系统:win7 64 JDK:1.6.0_43 资源下载 Maven:3.3.3下载.安装 ...

  4. flume 架构设计优化

    对于企业中常用的flume type 概括如下:ource(获取数据源): exec (文件) spoolingdir (文件夹) taildir(文件夹及文件的变动) kafka syslog ht ...

  5. 大数据【八】Flume部署

    如果说大数据中分布式收集日志用的是什么,你完全可以回答Flume!(面试小心问到哦) 首先说一个复制本服务器文件到目标服务器上,需要目标服务器的ip和密码: 命令: scp  filename   i ...

  6. 第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏

    1.7.flume案例二 案例需求: 在数据采集之后,通过flume的拦截器,实现不需要的数据过滤掉,并将指定的第一个字段进行加密,加密之后再往hdfs上面保存 原始数据与处理之后的数据对比 图一  ...

  7. 事件序列化器 Flume 的无数据丢失保证,Channel 和事务

    小结: 1.Flume 的持久性保证依赖于使用的持久性Channel 的保证 通过事件序列化器将Flume事件转化为外部存储格式 主要的事件序列化器: 1.文本 2.带有头信息的文本 3.Avro序列 ...

  8. 外观模式(Facade) Adapter及Proxy 设计模式之间的关系 flume 云服务商多个sdk的操作 face

    小结: 1. 外观模式/门面模式 Facade  往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面. Proxy(代理)注重在为Client-Subject提供一个访问的 ...

  9. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

随机推荐

  1. Linux for QQ 安装

    1.sudo apt-get install wine 2.打开网址http://www.ubuntukylin.com/application/show.php?lang=cn&id=279 ...

  2. Scrum 项目1.0

     1.内容: NABCD模型  1.需求   在当今的时代,把钱存进银行确实是比较稳妥的方式,但收益实在少得可怜.因此投资便是一个比较好的方式,当然,在投资前你需要一个软件去帮你直观地显现出各种投资的 ...

  3. 介绍kali下的一些小工具

    1.macchanger 可以用来修改你的mac地址

  4. android stutio 快捷键

    [F] [F] F2 在错误代码之间切换 F3 往前定位(Shift + F3:往后定位 )有问题 F4\Ctrl+鼠标点击\Ctrl+B 转到定义,查看类继承关系 F5 但不调试进入函数内部. F6 ...

  5. WORD基础快捷键

    选择 Alt+Shift+上下     移动整行 Ctrl+上             移动到行首 Ctrl+Shift+上下     选择到行首尾 shift+del         删除整段   ...

  6. 将java项目转换成Web项目

    http://www.cnblogs.com/kaige123/p/5866446.html 在项目上点击右键,进入Properties配置,点击Project Facets,再点击Convert t ...

  7. 腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)

    导读:在互联网企业,任何一个APP都要事先规划好数据体系,才允许上线运营,有了数据才可以更好的科学运营.因此本文将为大家介绍APP的基础数据指标体系.主要分为五个维度,包括用户规模与质量.参与度分析. ...

  8. Python之通过IP地址库获取IP地理信息

    利用第三方的IP地址库,各个公司可以根据自己的业务情况打造自己的IP地址采集分析系统.例如游戏公司可以采集玩家地区信息,进行有针对性的运营策略,还可能帮助分析玩家网络故障分布等等. #!/usr/bi ...

  9. ASP.net解析JSON例子

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  10. 修改mysql表结构,添加一个主键索引自增字段,修改原来的主字段为普通字段

    原来有一个字段id,为自增,主键,索引.现在要新增一个字段s_id为自增,主键,索引.同时把原来的主字段改成普通字段,默认值为0. Alter table e_diamond_jhds change ...