Flume學習應用:Java寫日志數據到MongoDB


概述


Windows平台:Java寫日志到Flume,Flume最終把日志寫到MongoDB。

系統環境


  • 操作系統:win7 64
  • JDK:1.6.0_43

資源下載

輔助資源下載

  • 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下。

初始化


數據初始化

為MongoDB指定dbpath。
  1. 新建一個目錄,作為dbpath
    e.g. D:\develop\MongoDB\mydata
  2. 啟動監聽服務 - CMD運行
    D:\develop\MongoDB\bin\mongod --dbpath=D:\develop\MongoDB\mydata

配置Flume

  1. 生成flume-env.ps1
    在安裝目錄的conf/下,復制flume-env.ps1.template,重命名為flume-env.ps1
  2. 修改log4j.properties
    在安裝目錄的conf/下,修改文件log4j.properties;修改flume.root.logger=INFO,console

實現


Flume到MongoDB

在Flume安裝目錄的conf下,添加mongo-agent.properties:
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

簡單說明:

  1. 根據agent.sources.so1的相關配置,在44444端口開啟監聽 - log4j可以往這個端口寫日志
  2. 根據agent.sinks.s1的相關配置,so1接收到的數據,將寫到localhost:27017的test數據庫的log-collection中
    27017是MongoDB的默認監聽端口

Java到Flume

這是一個基於Maven的一個simple project,你可以從 flume-ng-java2mongodb拿到源代碼。

文件結構

src/main/java
    |---- cn.sinobest.flume.client.demo
              |---- LogDemo.java
src/main/resources
    |---- log4j.properties
pom.xml

文件內容

  1. 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>
  2. 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的監聽端口
  3. 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格式的字符串。

測試

  1. 啟動MongoDB
    D:\develop\MongoDB\bin\mongod --dbpath=D:\develop\MongoDB\mydata
  2. 啟動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行命令是提醒確認當前所在路徑。
  3. 運行LogDemo
  4. 查看結果
    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中的數據,可以看到數據已經寫入成功。

附錄


參考資料

  1. Flume使用小結
    主要參考了環境搭建部分,其他部分不適合。
  2. flume學習01-flume介紹
    博主寫了一系列,共3篇文章來介紹Flume,這里只貼出第一篇,算是入門文章。后面有些內容沒有研究。
  3. Flume 1.5日志采集並存入mongodb的安裝搭建
    主要參考了Flume配置文件中,MongoSink的配置 - 后來發現博主沒有指定db,數據是寫到events數據庫的events-collection中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM