Flume基础【概述、安装、入门案例】

285 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

文章目录

一 Flume概述

1 Flume定义

Flume 是一种分布式、可靠且可用的服务,用于高效收集、聚合和移动大量日志数据。 它具有基于流数据流的简单灵活的架构。 它具有可调整的可靠性机制以及许多故障转移和恢复机制,具有健壮性和容错性。 它使用允许在线分析应用程序的简单可扩展数据模型。

分布式的日志采集、聚合和传输的系统,基于流式架构。

Flume最主要的作用是实时读取服务器本地磁盘的数据,将数据写入到HDFS。

2 Flume基础架构

在这里插入图片描述

Agent

Agent是一个JVM进程,它以事件的形式将数据从源头送至目的。Agent主要由3个部分组成,Source、Channel、Sink。

Source

Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。

Sink

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

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

Channel

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

Flume自带两种Channel:Memory Channel(快,数据不安全)和File Channel(慢,数据安全)。

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

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

Event

传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header(一般为空)和Body(存放数据)两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。

在这里插入图片描述

二 Flume入门

1 Flume安装

#apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/software目录下
#解压apache-flume-1.9.0-bin.tar.gz到/opt/module/目录下
tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/
#修改apache-flume-1.9.0-bin的名称为flume
mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume
#将lib文件夹下的guava-11.0.2.jar删除以兼容Hadoop 3.1.3
cd flume/lib/
rm /opt/module/flume/lib/guava-11.0.2.jar
#配置环境变量
sudo vim /etc/profile.d/my_env.sh
#添加以下内容
#FLUME_HOME
export FLUME_HOME=/opt/module/flume
export PATH=$PATH:$FLUME_HOME/bin
#使环境变量生效
source /etc/profile.d/my_env.sh
#在其他目录看到flume-ng命令说明配置成功
fl 两次table键
#群发flume目录
xsync flume
#配置日志
#flume文件夹conf目录下
vim log4j.properties
flume.log.dir=/opt/module/flume/logs/
#在flume目录下创建文件夹logs
mkdir logs

日志的作用:当程序崩溃的时候,我们想要看一些变量的值是否正确(system.out.println),一个项目中,进行这种操作的地方十分多,当项目上线的时候,sys这些代码需要删除,只是作为调试的一种手段。日志可以代替原来sys这些语句的作用,且不用删除,用户也不会看到这些信息。

log4j.print(“debug”,info)级别为debug,info在debug时进行输出

log4j.print(“info”,info)级别为info,用于给用户查看的信息,log4j框架负责管理这一类的内容

2 入门案例

2.1 flume命令解析

commands:
  help                      display this help text
  agent                     run a Flume agent
  avro-client               run an avro Flume client
  version                   show Flume version info

--一些参数
global options:
  --conf,-c <conf>          use configs in <conf> directory
  --classpath,-C <cp>       append to the classpath
  --dryrun,-d               do not actually start Flume, just print the command
  --plugins-path <dirs>     colon-separated list of plugins.d directories. See the
                            plugins.d section in the user guide for more details.
                            Default: $FLUME_HOME/plugins.d
  -Dproperty=value          sets a Java system property value
  -Xproperty=value          sets a Java -X option

agent options:
  --name,-n <name>          the name of this agent (required)
  --conf-file,-f <file>     specify a config file (required if -z missing)
  --zkConnString,-z <str>   specify the ZooKeeper connection to use (required if -f missing)
  --zkBasePath,-p <path>    specify the base path in ZooKeeper for agent configs
  --no-reload-conf          do not reload config file if changed
  --help,-h                 display help text

avro-client options:
  --rpcProps,-P <file>   RPC client properties file with server connection params
  --host,-H <host>       hostname to which events will be sent
  --port,-p <port>       port of the avro source
  --dirname <dir>        directory to stream to avro source
  --filename,-F <file>   text file to stream to avro source (default: std input)
  --headerFile,-R <file> File containing event headers as key/value pairs on each new line
  --help,-h              display help text

2.2 入门案例

  • 需求

    使用Flume监听一个端口,收集该端口数据,并打印到控制台。

  • 分析

    通过netcat工具向本机44444端口发送数据,Flume监控本机的44444端口,通过Flume的Source端读取数据,然后通过Sink端将数据写出到控制台

  • netcat监听原理(本机-本机)
    在这里插入图片描述

  • netcat监听原理(本机-他机)
    在这里插入图片描述

  • netcat小demo

    netcat的使用
    	1.安装sudo yum install -y nc
    	2.具体操作命令(基于tcp协议)
    		监听 : nc -l 端口号
    		发送 : nc 主机名(IP地址) 端口号
    		注意 :监听和发送的端口号必须一致
    			  端口号必须在范围之内的  
    			  先启动监听端再启动发送端
    
    #本机和本机
    #安装netcat工具
    sudo yum install -y nc
    #在hadoop101监听并发送,开启两个shell窗口,在其中一台监听
    nc -l 44444
    #在另一个hadoop101窗口发送数据
    nc hadoop101 44444
    #此时两个窗口都卡住,在发送窗口发送数据,另一个窗口可以接收到发送的信息
    
    #本机和他机
    #启动监听方
    nc -l 44444
    #在102启动发送方
    nc hadoop101 44444
    
  • 案例实现原理
    在这里插入图片描述

  • 案例实现步骤

    --在flume目录下创建job文件夹并进入job文件夹
    mkdir job
    cd job/
    --在job文件夹下创建Flume Agent配置文件flume-netcat-logger.conf
    vim flume-netcat-logger.conf
    --在flume-netcat-logger.conf文件中添加如下内容
    # Name the components on this agent,a1为agent的名字
    # sources,sinks,channels可以是多个,中间使用空格隔开,名字随便写
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    a1.sources.r1.type = netcat
    a1.sources.r1.bind = hadoop101
    a1.sources.r1.port = 44444
    
    # Describe the sink
    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,声明source,sink和channel之间的关系
    a1.sources.r1.channels = c1
    # 一个sink对应的channel只能有一个
    a1.sinks.k1.channel = c1
    
    --开启flume监听端口
    flume-ng agent --name a1 --conf conf/ --conf-file job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
    

    参数说明:

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

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

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

    ​ -Dflume.root.logger=INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error。

    --开启发送端口
    nc hadoop101 44444
    --发送一些内容两台机器都可以收到