日志收集框架Flume的基础使用

Flume是一个用于高效、可靠、分布式的海量日志聚合的系统。本文介绍了Flume的基本概念、架构,详细讲解了环境部署步骤,并提供从网络端口采集数据到控制台、监控文件实时采集数据到控制台以及跨服务器日志采集的实例操作。

1、Flume架构及核心组件

1.1 什么是 Flume?

当用户浏览 web 或 app,比如点击某个网页或浏览某些购物网站的商品,都会产生一条用户行为日志,这些日志大部分都存储在 WebServer(比如 Nginx 或 Tomcat 集群等)中的 log 文件中(比如access.log)。

这些日志在实时流处理中起着十分重要的作用。典型的,例如,天猫双十一的订单销量统计展示。当用户每完成一笔订单,就会在 access.log 中产生一条完成订单记录,然后通过实时计算框架 Storm 或 Sparking Streaming 等完成业务逻辑,将完成后的结果写入到 RDBMS 或 NoSQL 中,最后由前端完成可视化展示。

由于日志一般存储在 WebServer 上,而 WebServer 和 分布式集群(Hadoop、Storm、Spark、Sparking Streaming等)显然是两两独立的,因此如果想使用大数据平台上的一些技术对日志进行处理的话,必然要有某种技术能将日志从 WebServer 上收集到分布式集群中去,然后再进行相应的业务逻辑。

Flume 就是做这种事情的一个很适用的框架。它负责收集 WebServer 上的日志,然后发送到 分布式集群中。

1.2 为什么要使用 Flume?

在这里插入图片描述

1.3 Flume 的架构及核心组件

一个 Agent:
在这里插入图片描述

  • WebServer:应用服务器 → 数据源端
  • Source: 指定数据从哪里来 → 收集
  • Channel:数据批量化,临时存储的地方(将source过来的数据指定一个数量大小,先存在Channel里面,然后按批输出) → 聚集
  • Sink: 将数据写到某个地方去(可以写到HDFS、Hive、HBase、控制台……) → 输出
  • HDFS:数据存储在这儿 → 数据最终到达的目的地

多个 Agent —— 串行:
在这里插入图片描述
第一个 Agent 的输出 是 第二个 Agent 的输入源。Agent 之间是相互串联的关系。

多个 Agent —— 并行:
在这里插入图片描述
每一个 WebServer 布一个 Agent, 通过 avro 类型的 source 收集过来到 channel,再到 sink,再通过 avro sink 的方式 写到最后一个非并行的 source 中去。
这样的好处是,可以将多个 Agent 收集过来的数据统一 sink 到某个地方去。

与此对应的还有,将 多个 sink 出来的数据写到多个地方去。
在这里插入图片描述

2、Flume 环境部署

2.1 系统要求

依照官网:

  • Java Runtime Environment - Java 1.8 or later ---- jdk1.8或以上
  • Memory - Sufficient memory for configurations used by sources, channels or sinks ---- 足够的内存
  • Disk Space - Sufficient disk space for configurations used by channels or sinks ---- 足够的磁盘空间
  • Directory Permissions - Read/Write permissions for directories used by agent ---- 用户具有文件的读写权限

2.2 安装版本

  • centos 7
  • jdk:1.8
  • hadoop 生态系统:cdh 5.7.0
  • flume:flume-ng-1.6.0-cdh5.7.0

2.2 安装jdk

  • 下载
    在这里插入图片描述
  • 解压
    在这里插入图片描述
  • 配置环境变量:
    export JAVA_HOME=/home/zcx/app/jdk1.8.0_191
    export JRE_HOME=/home/zcx/app/jdk1.8.0_191/jre
    
  • 添加到 path 中:
    在这里插入图片描述
  • 使环境变量生效:
     source /etc/profile
    

2.3 安装Flume

  • 下载:http://archive.cloudera.com/cdh5/cdh/5/
    在这里插入图片描述
  • 解压
    在这里插入图片描述
  • 配置环境变量
    export FLUME_HOME=/home/zcx/app/apache-flume-1.6.0-cdh5.7.0-bin
    
  • 添加到 path 中:
    在这里插入图片描述
  • 使环境变量生效:
     source /etc/profile
    
  • 配置flume-env.sh文件
    我下载的 flume 解压后 conf 文件夹下面有一个是 flume-env.sh.template 文件,因此拷贝一份并修改其名称为 flume-env.sh
    修改 flume-env.sh 文件中的 JAVA_HOME 路径
    cd /home/zcx/app/apache-flume-1.6.0-cdh5.7.0-bin/conf
    cp flume-env.sh.template flume-env.sh
    vim flume-env.sh
    # 配置jdk路径并添加到环境变量中
    export JAVA_HOME=/home/zcx/app/jdk1.8.0_191
    检测安装成功:flume-ng version
    
    在这里插入图片描述

3、Flume的使用案例

Flume 的使用流程大概分为以下几步:

  1. 配置 Source
  2. 配置 Channel
  3. 配置 Sink
  4. 把以上三个组件串起来
  5. 启动 Agent

3.1 从指定的网络端口采集数据输出到控制台

选择一个单节点的 Agent 配置即可,例如:netcat source + memory channel + logger sink
参考官方文档说明:https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#flume-sources

  1. 在 conf 目录下 新建一个 名称为 example.conf 的配置文件:
    # example.conf: A single-node Flume configuration
    
    # Name the components on this agent
    # a1 表示 agent 的名称
    # r1 表示 source 的名称
    # k1 表示 sink 的名称
    # c1 表示 channel 的名称
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # 配置 source
    a1.sources.r1.type = netcat
    a1.sources.r1.bind = zoucaoxin
    a1.sources.r1.port = 44444
    
    # 配置 sink
    a1.sinks.k1.type = logger
    
    # 配置 channel
    a1.channels.c1.type = memory
    
    # 将 source、channel 和 sink 这三个组件串起来
    # 一个source可以输出到多个channel
    # 一个channel只能输出到一个sink
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
  2. 启动 Agent:
    flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/example.conf -Dflume.root.logger=INFO,console
    # 命令的参数说明
    # --name [agent的名称]
    # --conf [配置文件所在的目录]
    # --conf-file [配置文件的全路径]
    # -Dflume.root.logger=INFO,console : 设置输出到控制台
    
  3. 使用 telnet 进行测试:
    telnet zoucaoxin 44444
    

3.2 监控一个文件实时采集新增的数据到控制台

Agent 选择:exec source + memory channel + logger sink
参考官方文档说明:https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#exec-source

  1. 在 conf 目录下 新建一个 名称为 exec-memory-logger.conf 的配置文件
    # exec-memory-logger.conf
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # 配置 source
    a1.sources.r1.type = exec
    a1.sources.r1.command=tail -F /home/zcx/data/data.log
    a1.sources.r1.shell = /bin/sh -c
    
    # 配置 sink
    a1.sinks.k1.type = logger
    
    # 配置 channel
    a1.channels.c1.type = memory
    
    # 将 source、channel 和 sink 这三个组件串起来
    # 一个source可以输出到多个channel
    # 一个channel只能输出到一个sink
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
    
  2. 启动 agent:
    flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/exec-memory-logger.conf -Dflume.root.logger=INFO,console
    
  3. 验证:新建一个 data.log 文件,不断用脚本方式写入,观察控制台的输出情况
    在这里插入图片描述

3.2 将A服务器(WebServer服务器)上的日志实时采集到B服务器(HDFS等)

Agent 选择:

  • 服务器A:exec source + memory channel + avro sink
  • 服务器B:avro source + memory channel + logger sink

日志收集过程:

  • 机器A上监控一个文件,当访问主站时,会有用户行为日志记录到 XX.log 中
  • avro sink 把新产生的日志输出到对应的 avro source 指定的 hostname 和 port 上
  • 通过 avro source 对应的 agent 将日志输出到控制台或 kafka
# 服务器A
# 配置文件名称:exec-memory-avro.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# 配置 source
a1.sources.r1.type = exec
a1.sources.r1.command=tail -F /home/zcx/data/data.log
a1.sources.r1.shell = /bin/sh -c

# 配置 sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname=zoucaoxin
a1.sinks.k1.port=44444

# 配置 channel
a1.channels.c1.type = memory

# 将 source、channel 和 sink 这三个组件串起来
# 一个source可以输出到多个channel
# 一个channel只能输出到一个sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
# 服务器B
# 配置文件名称:avro-memory-logger.conf
# 注意,A 和 B 的 agent 名称不能一样,否则启动失败
a2.sources = r2
a2.sinks = k2
a2.channels = c2

# 配置 source
a2.sources.r2.type = avro
a2.sources.r2.bind = zoucaoxin
a2.sources.r2.port = 44444

# 配置 sink
a2.sinks.k2.type = logger

# 配置 channel
a2.channels.c2.type = memory

# 将 source、channel 和 sink 这三个组件串起来
# 一个source可以输出到多个channel
# 一个channel只能输出到一个sink
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

先启动 B:

flume-ng agent --name a2 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/avro-memory-logger.conf -Dflume.root.logger=INFO,console

再启动A:

flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/exec-memory-avro.conf -Dflume.root.logger=INFO,console

验证:
在这里插入图片描述
在这里插入图片描述

4、更新记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值