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);
    }

}

参考:阿里云

发布了230 篇原创文章 · 获赞 537 · 访问量 71万+

猜你喜欢

转载自blog.csdn.net/qq_32447301/article/details/105018017