Cris 玩转大数据系列之日志收集神器 Flume

Cris 玩转大数据系列之日志收集神器 Flume

Author:Cris

文章目录

1. Flume 概述

1.1 什么是 Flume?

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单

1.2 Flume 的优点

  1. 可以和任意集中式存储进程集成(例如 HDFS 或者 HBase)。

  2. 输入的的数据速率大于写入目的存储的速率,Flume 会进行缓冲,减小 HDFS 的压力。

  3. flume中的事务基于 channel,使用了两个事务模型(sender + receiver),确保消息被可靠发送。

Flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。一旦事务中所有的数据全部成功提交到channel,那么source才认为该数据读取完成。同理,只有成功被sink写出去的数据,才会从channel中移除

1.3 Flume 组成架构

① Agent

Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的,是 Flume 数据传输的基本单元

Agent 主要有3个部分组成,Source、Channel、Sink

② Source

Source 是负责接收数据,并将数据封装成 event,并将 events 批量的放到一个或多个ChannelSource 组件可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy

③ Channel

Channel 是位于 SourceSink 之间的缓冲区。因此,Channel 允许 SourceSink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。

Flume 自带两种 ChannelMemory ChannelFile Channel

Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么 Memory Channel 就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。

File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

④ Sink

Sink不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent

Sink 是完全事务性的。在从 Channel 批量删除数据之前,每个 SinkChannel 启动一个事务。批量事件一旦成功写出到存储系统或下一个 Flume AgentSink 就利用 Channel 提交事务。事务一旦被提交,该 Channel 从自己的内部缓冲区删除事件。

Sink 组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。

⑤ Event

​ 传输单元,Flume 数据传输的基本单元,以事件的形式将数据从源头送至目的地。 Event 由可选的 header 和载有数据的一个 byte array 构成。Header 是容纳了 key-value 字符串对的 HashMap

1.4 Flume 常见四种拓扑结构

第一种结构

​ 这种模式是将多个 Flume 给顺序连接起来了,从最初的 source 开始到最终 sink 传送的目的存储系统。此模式不建议桥接过多的 Flume 数量, Flume 数量过多不仅会影响传输速率,而且一旦传输过程中某个节点 Flume 宕机,会影响整个传输系统

第二种结构

Flume 支持将事件流向一个或者多个目的地。这种模式将数据源复制到多个 channel 中,每个 channel 都有相同的数据,sink 可以选择传送的不同的目的地

第三种结构

Flume 支持使用将多个 sink 逻辑上分到一个 sink 组,Flume 将数据发送到不同的 sink,主要解决负载均衡和故障转移问题

第四种结构

​ 这种模式是我们最常见的,也非常实用,日常 web 应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用 flume 的这种组合方式能很好的解决这一问题,每台服务器部署一个 flume 采集日志,传送到一个集中收集日志的 flume,再由此 Flume 上传到 HDFSHiveHBasejms 等,进行日志分析

1.5 Flume Agent 内部原理解析

2. Flume 快速上手

2.1 Flume 官方文档

  1. Flume官网地址

    http://flume.apache.org/

  2. 文档查看地址

    http://flume.apache.org/FlumeUserGuide.html

  3. 下载地址

    http://archive.apache.org/dist/flume/

2.2 安装部署

  1. apache-flume-1.7.0-bin.tar.gz 上传到 linux的/opt/software 目录下

  2. 解压 apache-flume-1.7.0-bin.tar.gz/opt/module/ 目录下

  3. 修改 apache-flume-1.7.0-bin 的名称为 flume

  4. flume/conf 下的 flume-env.sh.template 文件备份后改名为 flume-env.sh,并配置 flume-env.sh 文件

     vim flume-env.sh
     # 添加一句代码即可
    export JAVA_HOME=/opt/module/jdk1.8.0_172
    
  5. 验证安装

2.3 配置 Flume 的环境变量(推荐)

直接在 /etc/profile 目录下配置 FLUME_HOME 即可,这里不再赘述~

3. Flume 实战(重点)

3.1 监控端口数据官方案例

① 案例需求

​ 首先,Flume 监控本机 44444 端口,然后通过 telnet 工具向本机 44444 端口发送消息,最后 Flume 将监听的数据实时显示在控制台

② 需求分析

③ 实现步骤
  1. 安装 telnet 工具

  2. 执行安装命令

    $ sudo rpm -ivh xinetd-2.3.14-40.el6.x86_64.rpm
    $ sudo rpm -ivh telnet-0.17-48.el6.x86_64.rpm
    $ sudo rpm -ivh telnet-server-0.17-48.el6.x86_64.rpm
    
  3. 判断 44444 端口是否被占用

    $ sudo netstat -tunlp | grep 44444
    

    功能描述:netstat 命令是一个监控 TCP/IP 网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息

    基本语法:netstat [选项]

    选项参数:

    ​ -t或–tcp:显示TCP传输协议的连线状况;

    ​ -u或–udp:显示UDP传输协议的连线状况;

    ​ -n或–numeric:直接使用ip地址,而不通过域名服务器;

    ​ -l或–listening:显示监控中的服务器的Socket;

    ​ -p或–programs:显示正在使用Socket的程序识别码和程序名称;

  4. 创建 Flume Agent 配置文件 flume-telnet-logger.conf

    Flume 目录下创建 job 文件夹并进入 job 文件夹

    job 文件夹下创建 Flume Agent 配置文件 flume-telnet-logger.conf

    flume-telnet-logger.conf 文件中添加如下内容

    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    #使用nc打开并监听本机的44444的端口号,并将数据传给channel
    a1.sources.r1.type = netcat
    #bing本机及端口号
    a1.sources.r1.bind = localhost
    a1.sources.r1.port = 44444
    
    # Describe the sink
    # 将channel传来的数据通过日志打印到控制台
    a1.sinks.k1.type = logger
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    #	将设置的sink和source与channel进行绑定
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    

    注:配置文件来源于官方手册http://flume.apache.org/FlumeUserGuide.html

    配置文件详解

  5. 首先开启 Flume 监听端口

    flume-ng agent -c /opt/module/flume/conf/ -n a1 -f /opt/module/flume/job/flume-telnet-logger.conf -Dflume.root.logger=INFO,console
    

    参数说明:

    ​ --conf :表示配置文件存储在conf/目录

    ​ --name :表示给agent起名为a1

    ​ --conf-file :flume本次启动读取的配置文件是在job文件夹下的flume-telnet.conf文件。

    ​ -Dflume.root.logger==INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值(默认flume.root.logger=INFO,LOGFILE,打印到日志文件,可查看flume配置文件log4j.properties),并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error

  6. 使用 telnet 工具向本机的 44444 端口发送内容

    telnet localhost 44444
    

    注意:如果此时使用 telent hadoop101 44444 的命令 Flume 是无法接受到消息的,因为之前的 Flume 配置文件配置的是 localhost,就只能以 localhost 开启端口

3.2 实时读取本地文件到HDFS案例

① 案例需求

实时监控Hive日志,并上传到HDFS中

② 案例分析图

③ 实现步骤
  1. Flume 要想将数据输出到 HDFS,必须持有 Hadoop 相关 jar 包;或者当前节点已经安装了 Hadoop 并在 /etc/profile 配置了 Hadoop 环境变量(这里 Cris 小哥哥的虚拟机集群已经配置好了)

  2. 创建 Flume Agent 配置文件 flume-file-hdfs.conf

    注:要想读取Linux系统中的文件,就得按照Linux命令的规则执行命令。由于hive日志在Linux系统中所以读取文件的类型选择:exec即execute执行的意思。表示执行Linux命令来读取文件

    # 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 /opt/module/hive-1.2.1/logs/hive.log
    
    #指定shell解释器,-c即为"command string"
    a2.sources.r2.shell = /bin/bash -c
    
    # Describe the sink
    a2.sinks.k2.type = hdfs
    a2.sinks.k2.hdfs.path = hdfs://hadoop101:9000/flume/%Y%m%d/%H
    
    #上传文件的前缀
    a2.sinks.k2.hdfs.filePrefix = logs-
    
    #是否按照时间滚动文件夹
    a2.sinks.k2.hdfs.round = true
    
    #多少时间单位创建一个新的文件夹
    a2.sinks.k2.hdfs.roundValue = 1
    
    #重新定义时间单位
    a2.sinks.k2.hdfs.roundUnit = hour
    
    #是否使用本地时间戳
    a2.sinks.k2.hdfs.useLocalTimeStamp = true
    
    #积攒多少个Event才flush到HDFS一次
    a2.sinks.k2.hdfs.batchSize = 1000
    
    #设置文件类型,可支持压缩
    a2.sinks.k2.hdfs.fileType = DataStream
    
    #多久生成一个新的文件
    a2.sinks.k2.hdfs.rollInterval = 600
    
    #设置每个文件的滚动大小
    a2.sinks.k2.hdfs.rollSize = 134217700
    
    #文件的滚动与Event数量无关
    a2.sinks.k2.hdfs.rollCount = 0
    
    #最小冗余数
    a2.sinks.k2.hdfs.minBlockReplicas = 1
    
    # Use a channel which buffers events in memory
    a2.channels.c2.type = memory
    a2.channels.c2.capacity = 1000
    a2.channels.c2.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a2.sources.r2.channels = c2
    a2.sinks.k2.channel = c2
    

​ 对于所有与时间相关的转义序列,Event Header中必须存在以 “timestamp”的key(除非hdfs.useLocalTimeStamp设置为true,此方法会使用TimestampInterceptor自动添加timestamp)

​ 配置详解:

​ 更加详细的配置介绍,请参考这篇文章

​ 如果还不满足,就请参考官网文档

④ 执行监控
flume-ng agent -c conf/ -n a2 -f job/flume-file-hdfs.conf

如下图:

⑤ 开启hadoop和hive并操作hive产生日志
startall

这里使用 Cris 写的群起脚本,启动 101,102,103 节点的所有 Hadoop 集群和 YARN 集群

然后直接输入 hive 命令,此时 hive 会往 /opt/module/hive-1.2.1/logs/hive.log 写日志,由于 Flume 的监控,可以发现 HDFS 上已经生成了对应的文件

然后静静的等待十分钟,发现临时文件已经生产永久文件了

3.3 实时读取目录文件到HDFS案例(重点)

① 案例需求

使用flume监听整个目录的文件

② 需求分析

③ 实现步骤
  1. 创建配置文件 flume-dir-hdfs.conf

  2. 具体添加内容如下:

    a3.sources = r3
    a3.sinks = k3
    a3.channels = c3
    
    # Describe/configure the source
    a3.sources.r3.type = spooldir
    a3.sources.r3.spoolDir = /opt/module/flume/upload
    #将文件传给channel后,将文件名修改为.COMPLETED结尾
    a3.sources.r3.fileSuffix = .COMPLETED
    #是否在event的Header中添加文件的绝对路径
    a3.sources.r3.fileHeader = true
    #忽略所有以.tmp结尾的文件,不上传
    a3.sources.r3.ignorePattern = ([^ ]*\.tmp)
    
    # Describe the sink
    a3.sinks.k3.type = hdfs
    a3.sinks.k3.hdfs.path = hdfs://hadoop101:9000/flume/upload/%Y%m%d/%H
    #上传文件的前缀
    a3.sinks.k3.hdfs.filePrefix = upload-
    #是否按照时间滚动文件夹
    a3.sinks.k3.hdfs.round = true
    #多少时间单位创建一个新的文件夹
    a3.sinks.k3.hdfs.roundValue = 1
    #重新定义时间单位
    a3.sinks.k3.hdfs.roundUnit = hour
    #是否使用本地时间戳
    a3.sinks.k3.hdfs.useLocalTimeStamp = true
    #积攒多少个Event才flush到HDFS一次
    a3.sinks.k3.hdfs.batchSize = 100
    #设置文件类型,可支持压缩
    a3.sinks.k3.hdfs.fileType = DataStream
    #多久生成一个新的文件(秒)
    a3.sinks.k3.hdfs.rollInterval = 600
    #设置每个文件的滚动大小大概是128M
    a3.sinks.k3.hdfs.rollSize = 134217700
    #文件的滚动与Event数量无关
    a3.sinks.k3.hdfs.rollCount = 0
    #最小冗余数
    a3.sinks.k3.hdfs.minBlockReplicas = 1
    
    # Use a channel which buffers events in memory
    a3.channels.c3.type = memory
    a3.channels.c3.capacity = 1000
    a3.channels.c3.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a3.sources.r3.channels = c3
    a3.sinks.k3.channel = c3
    

    说明: 在使用Spooling Directory Source时

    1. 不要在监控目录中创建并持续修改文件

    2. 上传完成的文件会以.COMPLETED结尾

    3. 被监控文件夹每500毫秒扫描一次文件变动

④ 开启监控测试
[cris@hadoop101 flume]$ flume-ng agent -c conf/ -n a3 -f job/flume-dir-hdfs.conf

3.4 单数据源多出口案例(一)

① 架构图示

② 案例需求

使用flume-1监控文件变动,flume-1将变动内容传递给flume-2,flume-2负责存储到HDFS。同时flume-1将变动内容传递给flume-3,flume-3负责输出到local filesystem

③ 需求分析

④ 实现步骤
  1. 在/opt/module/flume/job目录下创建group1文件夹

  2. 在/opt/module/datas/目录下创建flume3文件夹

  3. 创建flume-file-flume.conf

    配置1个接收日志文件的source和两个channel、两个sink,分别输送给flume-flume-hdfs和flume-flume-dir

    在配置文件中输入以下内容:

    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1 k2
    a1.channels = c1 c2
    # 将数据流复制给多个channel
    a1.sources.r1.selector.type = replicating
    
    # Describe/configure the source
    a1.sources.r1.type = exec
    a1.sources.r1.command = tail -F /opt/module/hive-1.2.1/logs/hive.log
    a1.sources.r1.shell = /bin/bash -c
    
    # Describe the sink
    #sink端的avro是一个数据发送者
    a1.sinks.k1.type = avro
    a1.sinks.k1.hostname = hadoop101
    a1.sinks.k1.port = 4141
    
    a1.sinks.k2.type = avro
    a1.sinks.k2.hostname = hadoop101
    a1.sinks.k2.port = 4142
    
    # Describe the channel
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    a1.channels.c2.type = memory
    a1.channels.c2.capacity = 1000
    a1.channels.c2.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1 c2
    a1.sinks.k1.channel = c1
    a1.sinks.k2.channel = c2
    

    注:Avro是由Hadoop创始人Doug Cutting创建的一种语言无关的数据序列化和RPC框架

  4. 创建flume-flume-hdfs.conf

    配置上级flume输出的source,输出是到hdfs的sink

    在配置文件输入:

    # Name the components on this agent
    a2.sources = r1
    a2.sinks = k1
    a2.channels = c1
    
    # Describe/configure the source
    ##source端的avro是一个数据接收服务
    a2.sources.r1.type = avro
    a2.sources.r1.bind = hadoop101
    a2.sources.r1.port = 4141
    
    # Describe the sink
    a2.sinks.k1.type = hdfs
    a2.sinks.k1.hdfs.path = hdfs://hadoop101:9000/flume2/%Y%m%d/%H
    #上传文件的前缀
    a2.sinks.k1.hdfs.filePrefix = flume2-
    #是否按照时间滚动文件夹
    a2.sinks.k1.hdfs.round = true
    #多少时间单位创建一个新的文件夹
    a2.sinks.k1.hdfs.roundValue = 1
    #重新定义时间单位
    a2.sinks.k1.hdfs.roundUnit = hour
    #是否使用本地时间戳
    a2.sinks.k1.hdfs.useLocalTimeStamp = true
    #积攒多少个Event才flush到HDFS一次
    a2.sinks.k1.hdfs.batchSize = 100
    #设置文件类型,可支持压缩
    a2.sinks.k1.hdfs.fileType = DataStream
    #多久生成一个新的文件
    a2.sinks.k1.hdfs.rollInterval = 600
    #设置每个文件的滚动大小大概是128M
    a2.sinks.k1.hdfs.rollSize = 134217700
    #文件的滚动与Event数量无关
    a2.sinks.k1.hdfs.rollCount = 0
    #最小冗余数
    a2.sinks.k1.hdfs.minBlockReplicas = 1
    
    # Describe the channel
    a2.channels.c1.type = memory
    a2.channels.c1.capacity = 1000
    a2.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a2.sources.r1.channels = c1
    a2.sinks.k1.channel = c1
    
  5. 创建flume-flume-dir.conf

    配置上级flume输出的sou

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值