本文已参与「新人创作礼」活动,一起开启掘金创作之路。
文章目录
一 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 --发送一些内容两台机器都可以收到