Flume概述
flume 简介
1.flume是cloudera开发的后来贡献给了Apache的一套用分布式,高可靠的,高可用的海量分布式日志采集、聚合和传输的系统。
2.flume 的版本更新缓慢但是稳定。
3.flume的版本
a:flume 0.9 :flume-og。对线程的并发和安全性支持不好。
b:flume 1.0 :flume-ng。对并发性和安全性支持较好,并且提供了更好的分布式的扩展性。flume-og和flume-ng不兼容。基本概念
1.Event: a.flume会将收集到每一条日志封装成一个Event对象,所以一个Event就是一条日志。 b.Event本质上是json串,即flume将收集到到每一条日志封装了一个个的json,一个json就是一个Event。 c.Event 固定的包含2部分,headers和bady2.Agent(是flume的基本组成结构) a.source:用于从数据源来采集数据 b.channel:用于临时存储数据 c.sink : 用于将数据发往目的。Flume逻辑上分三层架构:agent,collector,storage
agent用于采集数据,agent是flume中产生数据流的地方,同时,agent会将产生的数据流传输到collector。
collector的作用是将多个agent的数据汇总后,加载到storage中。
storage是存储系统,可以是一个普通file,也可以是HDFS,HIVE,HBase等。
Flume的架构主要有一下几个核心概念:
Event:一个数据单元,带有一个可选的消息头
Flow:Event从源点到达目的点的迁移的抽象
Client:操作位于源点处的Event,将其发送到Flume Agent
Agent:一个独立的Flume进程,包含组件Source、Channel、Sink
Source:用来消费传递到该组件的Event
Channel:中转Event的一个临时存储,保存有Source组件传递过来的Event
Sink:从Channel中读取并移除Event,将Event传递到Flow Pipeline中的下一个Agent(如果有的话)
安装flume
flume下载地址 解压安装包并重命名
$ | tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /usr/local # 将apache-flume-1.7.0-bin.tar.gz #解压到指定文件夹下
$ | cd /usr/local/src/ # 移动到指定文件夹下
$ | mv apache-flume-1.7.0-bin flume # 重命名
配置环境变量
$ | vim /etc/profile
然后在你的末尾行加入如下代码:
$ | export FLUME_HOME=/usr/local/src/flume
$ | export FLUME_CONF_DIR=$FLUME_HOME/conf
$ | export PATH=$PATH:$FLUME_HOME/bin
设置source
环境生效
$ | source /etc/profile
修改flume配置文件(flume-env.sh)
$ | cd /usr/local/src/flume/conf # 移动到配置文件下
$ | cp flume-env.sh.template flume-env.sh # 复制新的文件数据
$ | vim flume-env.sh #进入文件
打开flume-env.sh 文件以后,在文件的最开始位置增加一行内容,用于设置java_home变量:
$ | export JAVA_HOME=/usr/local/src/java
然后,保存并退出文件
查看flume版本信息
$ | flume-ng version # 查看flume版本信息
安装成功,会出现如下图片
测试flume
创建agent配置文件
$ | cd /usr/local/src/flume
$ | vim ./conf/avro.conf # 在conf目录下编辑一个avro.conf空文件
然后,我们在avro.conf 写入以下内容
$ | a1.sources = r1
$ | a1.sinks = k1
$ | a1.channels = c1
$ |
$ | # Decsribe/configure the source
$ | a1.sources.r1.type = avro
$ | a1.sources.r1.channels = c1
$ | a1.sources.ri.bind = hadoop # 这是你的用户名或者是你的ip 0.0.0.0
$ | a1.sources.r1.port = 4141 # 注意这个端口号.在启动时会用到
$ | # Decsribe the sink
$ | a1.sinks.k1.type = logger
$ |
$ | # Use a channel which buffers 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
$ | a1.sources.r1.channels = c1
$ | a1.sinks.k1.channel = c1
上面的Avro Source 参数说明如下:
Avro Source的别名是avro,也可以使用完整类别名称org.apache.flume.source.AvroSource,因此,上面有一行设置是a1.sources.r1.type = avro,表示数据源的类 型是avro。
bind绑定的ip地址或主机名,使用0.0.0.0表示绑定机器所有的接口。a1.sources.r1.bind = 0.0.0.0,就表示绑定机器所有的接口。
port表示绑定的端口。a1.sources.r1.port = 4141,表示绑定的端口是4141。
a1.sinks.k1.type = logger,表示sinks的类型是logger。
启动 flume agent a1
$ | /usr/local/src//flume/bin/flume-ng agent -c . -f /usr/local/src/flume/conf/avro.conf -n a1 -Dflume.root.logger=INFO,console # 启动日志控制器
创建指定文件
先打开另外一个终端,在/usr/local/flume下写入一个文件log.00,内容为hello,world:
$ | cd /usr/local/src/flume
$ | bin /flume-ng avro-client --conf conf -H localhost -p 4141 -F /usr/local/src/flume/log.00
此时我们可以看到第一个终端(agent窗口)下的显示,也就是在日志控制台,就会把log.00文件的内容打印出来:
avro source执行成功!案例over!