Flume採集數據利器

一、什麼是Flume
Apache Flume 是一個分佈式、高可靠、高可用的用來收集、聚合、轉移不同來源的大量日誌數據到中央數據倉庫的工具。Flume 可以做離線也可以做實時分析。

二、Flume架構
在這裏插入圖片描述
如圖所示:

Agent就是Flume的一個部署實例,一個完整的Agent中包含了三個組件Source(數據的來源與方式)、Channel(數據的緩存池或者管道)、Sink(定義了數據輸出的方式與目的地)。一個source,可以綁定多個channel。
一個sink,只能綁定一個channel。Events是Flume數據傳輸的基本單元。

在這裏插入圖片描述

Flume 的 Source 負責消費外部傳遞給它的數據(比如 web 服務器的日誌)。外部的數據生產方以 Flume Source 識別的格式向 Flume 發送 Event。

Flume 可以設置多級 Agent 連接的方式傳輸 Event 數據。也支持扇入和扇出的部署方式,類似於負載均衡方式或多點同時備份的方式。

Flume 可以根據自己的業務需求來任意組合傳輸日誌的 Agent 實例,上面這張圖就是一個扇入方式的 Flume 部署方式,前三個 Agent 的數據都彙總到一個 Agent4 上,最後由 Agent4 統一存儲到 HDFS。

Source 的種類非常多,可以適應各種日誌數據源需求。

在這裏插入圖片描述

三、Flume+SpringBoot日誌收集實現

在這裏插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.citydo</groupId>
    <artifactId>flumespringboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>flumespringboot</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <!-- 過濾logback日誌框架 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <!-- flume -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-flume-ng</artifactId>
            <version>2.8.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flume.flume-ng-clients</groupId>
            <artifactId>flume-ng-log4jappender</artifactId>
            <version>1.7.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

springbot 配置

logging.config=classpath:logback.xml

logback.xml

<configuration status="WARN" monitorInterval="30">
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制檯的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level [%logger{16}]  %msg%n"/>
        </console>
        <!--輸出到flume-->
      <!--  <Flume name="Flume" compress="false" type="avro" ignoreExceptions="false">
            <Agent host="127.0.0.1" port="44444"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level [%logger{16}]  %msg%n"/>
        </Flume>-->
    </appenders>
    <!--然後定義logger,只有定義了logger並引入的appender,appender纔會生效-->
    <loggers>
        <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="Flume"/>
        </root>
    </loggers>
</configuration>
package com.citydo.flumespringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FlumespringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(FlumespringbootApplication.class, args);
    }

}

參考:阿里雲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章