Flume 数据采集工具安装与使用

Flume 的定义

  • Flume 由 Cloudera 公司开发,是一个分布式、高可靠、高可用的海量日志采集、聚合、传输的系统。
  • Flume 支持在日志系统中定制各类数据发送方,用于采集数据;
  • Flume 提供对数据进行简单处理,并写到各种数据接收方的能力。

简单的说,Flume 是实时采集日志的数据库引擎

image

Flume 组建

Flume 有三个重要组件:Source、Channel、Sink

  • Source:数据接收的组件。处理各种类型、各个格式的日子数据。如:avro、exce、netcat。
  • Channel:位与 Source 与 Sink 之间的缓冲区。允许 Source、Sink 运行在不同的速率上。(线程安全,可以同时处理多个 Source、Sink)
    • 常见的 Channel:Memory Channel、File Channel
    • Memory Channel:内存 速度快、容量有限、容易丢数据
    • File Chenmel:文件 速度慢、容量大、不丢数据
  • Sink:不断的从 Channel 中取数据,发送到目的地。

Flume 的特点

特点:

  • 分布式:flume 分布式集群部署,扩展性好
  • 可靠性好:当节点出现故障时,日志能够被传送到其他节点上而不会丢失
  • 易用性:flume 配置使用较繁琐,对使用人员专业技术要求高
  • 实时采集:flume 采集流模式进行数据实时采集

适用场景 :适用于日志文件实时采集。

Flume 安装

https://flume.apache.org/download.html
本文章使用的是 Flume1.9.0
安装节点是 slave2

  1. 下载安装
1
2
3
4
5
6
7
8
9
# 下载Flume1.9.0
wget https://dlcdn.apache.org/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz -P /opt/software --no-check-certificate

# 解压至 /opt/servers
tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/servers

# 重命名
cd /opt/servers
mv apache-flume-1.9.0-bin flume-1.9.0
  1. 配置环境变量
    vim /etc/profile

    1
    2
    3
    # Flume 
    export FLUME_HOME=/opt/servers/flume-1.9.0
    export PATH=$PATH:$FLUME_HOME/bin

    使其生效

    1
    source /etc/profile
  2. 拷贝配置模版

    1
    2
    cd $FLUME_HOME/conf
    cp flume-env.sh.template flume-env.sh
  3. 修改配置
    vim flume-env.sh

    1
    export JAVA_HOME=/usr/java/jdk1.8.0_202

简单案例

中文 flume 帮助文档
https://flume.liyifeng.org/

业务需求

监听本机 8888 端口,Flume 将监听的数据实时显示在控制台
需求分析:
使用 telnet 工具可以向 8888 端口发送数据

  • 监听端口数据,选择 netcat source
  • channel 选择 memory
  • 数据实时显示,选择 logger sink

实现步骤

  1. 安装 telnet 工具
    1
    yum install telnet
  2. 检查 8888 端口是否被占用。如果该端口被占用,可以选择使用其他端口完成任务
    1
    2
    3
    lsof -i:8888
    # 如果有进程占用
    kill [PID]
  3. 创建 Flume Agent 配置文件。flume-netcat-logger.conf

    https://flume.liyifeng.org/#netcat-tcp-source
    https://flume.liyifeng.org/#memory-channel
    https://flume.liyifeng.org/#logger-sink

1
2
mkdir ~/conf
vim ~/conf/flume-netcat-logger.conf

添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Agent  a1是Agent的名称,r1、c1、k1分别是source、channels、sink的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1

# Source
a1.sources.r1.type = netcat
a1.sources.r1.bind = slave2
a1.sources.r1.port = 8888

# Channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000

# Sink
a1.sinks.k1.type = logger

# Source、Channel、Sink之间的关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

Memory Channel 是使用内存缓冲 Event 的 Channel 实现。速度比较快速,容量会受到 jvm 内存大小的限制,可靠性不够高。适用于允许丢失数据,但对性能要求较高的日志采集业务。

  1. 启动 Flume

    1
    2
    3
    flume-ng agent --name a1 \
    --conf-file ~/conf/flume-netcat-logger.conf \
    -Dflume.root.logger=INFO,console

    image

  2. 发送数据

    1
    telnet slave 8888

    image
    收到数据并打印在终端上
    image

监控日志文件信息到 HDFS

业务需求:监控本地日志文件,收集内容实时上传到 HDFS

需求分析:
使用 tail-F 命令即可找到本地日志文件产生的信息

  • source 选择 exec。exec 监听一个指定的命令,获取命令的结果作为数据源。source 组件从这个命令的结果中取数据。当 agent 进程挂掉重启后,可能存在数据丢失;
  • channel 选择 memory
  • sink 选择 HDFS
    1
    2
    3
    4
    5
    tail -f
    等同于--follow=descripror,根据文件描述符进行追踪,当文件改名或被删除,追踪停止

    tail -F
    等同于--follow=name--retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪选择语言

操作步骤

1、环境准备。Flume 要想将数据输出到 HDFS, 必须持有 Hadoop 相关 jar 包。将
commons-configuration-1.6.jar
hadoop-auth-2.10.1.jar
hadoop-common-2.10.1.jar
hadoop-hdfs-2.10.1.jar
commons-io-2.4.jar
htrace-core4-4.1.0-incubating.jar
拷贝到 $FLUME_HOME/lib 文件夹下

1
2
3
4
5
6
7
cd $HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib
cp commons-configuration-1.6.jar $FLUME_HOME/lib
cp hadoop-auth-2.10.1.jar $FLUME_HOME/lib
cp hadoop-common-2.10.1.jar $FLUME_HOME/lib
cp hadoop-hdfs-2.10.1.jar $FLUME_HOME/lib
cp commons-io-2.4.jar $FLUME_HOME/lib
cp htrace-core4-4.1.0-incubating.jar $FLUME_HOME/lib
  1. 创建配置文件
    vim ~/conf/flume-exec-hdfs.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # Name the components on this agent
    a2.sources = r2
    a2.sinks = k2
    a2.channels = c2

    # Describe/configure the source
    a2.sources.r2.type = exec
    a2.sources.r2.command = tail -F /tmp/root/hive.log

    # Use a channel which buffers events in memory
    a2.channels.c2.type = memory
    a2.channels.c2.capacity = 10000
    a1.channels.c1.transactionCapacity = 10000

    # Describe the sink
    a2.sinks.k2.type = hdfs
    a2.sinks.k2.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H
    #上传文件的前缀
    a2.sinks.k2.hdfs.filePrefix = logs-
    # 是否使用本地时间戳
    a2.sinks.k2.hdfs.useLocalTimeStamp = true
    # 积攒10000个Event才f1ush到HDFS一次
    a2.sinks.k2.hdfs.batchSize = 10000
    # 设置文件类型,支持压缩。Datastream没启用压缩
    a2.sinks.k2.hdfs.fileType = DataStream
    # 1分钟滚动一次
    a2.sinks.k2.hdfs.rollInterval = 60
    # 128M滚动一次
    a2.sinks.k2.hdfs.rollsize = 134217700
    # 文件的滚动与Event数量无关
    a2.sinks.k2.hdfs.rollCount = 0
    # 最小见余数
    a2.sinks.k2.hdfs.minBlockReplicas = 1

    # Bind the source and sink to the channel
    a2.sources.r2.channels = c2
    a2.sinks.k2.channel = c2
  2. 启动 Flume

    1
    2
    3
    flume-ng agent --name a2 \
    --conf-file ~/conf/flume-exec-hdfs.conf \
    Dflume.root.logger=INFO,console

    image

  3. 测试
    使用命令监控,为什么做比对

    1
    2
    cd /tmp/root
    tail -F hive.log

输入错的命令使其产生日志

1
hive -e "show databasessss"
  1. 查看 HDFS 中的文件
    1
    hadoop fs -ls /flume
    image