flume

flume

大数据处理流程

1、数据采集

2、数据存储

3、数据清洗

4、数据分析

5、数据展示

flume_第1张图片

在数据采集和搜索工具中flume框架占有一定的市场分量

flume

flume是一种分布式,可靠的高可用的服务,用于有效的收集,聚合和移动大量日志数据,它具有基于数据流的简单灵活的体系结构,它具有调整可靠性机制以及许多故障转移和恢复机制,具有强大的功能和容错能力,它使用一个简单的可扩展数据模型语序在线分析应用程序

官网http://flume.apache.org/

flume最开始是由cludera开发的实时日志收集系统,受到了业界的认可与广泛应用,但随着flume功能的扩展,flume的代码工程臃肿,核心组件设计不合理,核心配置不标准等缺点渐渐暴露出来,尤其是在发行版本0.9.4中日志传输不稳定的现象尤为严重

为了解决这些问题2011年10月22号,cloudera对flume进行了里程碑式的改动,重构核心组件,核心配置以及代码架构,并将flume纳入apache旗下,从clouderaflume改名为apacheflume

版本区别

为了区别与之前版本的区分开,重构后的版本称为flumeNG(next generation)重构前的版本成为flumeog(original generation)flume目前只有linux系统的启动脚本没有windows环境的启动脚本

flume的体系结构

flume运行的核心式agent,flume是以agent为最小的独立运行单元,一个agent就是一个jvm,他是一个完整的数据收集工具,含有三个核心组件,分别是source,channel,sink 通过这些组件 event可以从一个地方流向另一个地方,

flume_第2张图片

组件及其作用

--client

客户端,client生产数据,运行在一个独立的线程中

--event

一个数据单元,消息头和消息体组成(events可以式日志记录,avro对象等)

--flow

event从源点达到目的点的迁移的抽象

--agent

一个独立的flume进程,运行在jvm中,包含组件source,channel,sink

每台机器运行一个agent,但是一个agent可以包含多个sources和sinks

--source

数据收集组件,source从client收集数据,传递给channel

--channel

管道,负责接收source端的数据,然后阿静数据推送到sink端

--sink

负责从channel端拉取数据,并将器推送到持久化系统或是下一个agent

--selector

选择器,作用域source端,然后决定数据发往哪个目标

--interceptor

拦截器,flume允许使用拦截器拦截护具,允许使用拦截器链,作用与source和sink阶段

flume安装

解压

tar -zxvf apache-flume-1.8.0-bin.tar.gz -C /usr/local/

更名

cd /usr/local/
mv apache-flume-1.8.0-bin/ flume

配置环境变量

vi /etc/profile
​
export FLUME_HOME=/usr/local/flume
export PATH=$FLUME_HOME/bin:$PATH
​
刷新环境变量
source /etc/profile

验证环境变量

flume-ng version

配置文件

cd flume/conf/
cp fume-env.sh.template flume-env.sh
vi fume-env.sh 
​
export JAVA_HOME=/opt/soft/jdk

flume的部署

数据模型

-单一数据模型
-多数据流模型

单一数据模型

在单个agent内由单个source,channel,sink建立一个单一的数据流模型
整个数据流为
web server->source-->channel--->sink->hdfs

flume_第3张图片

多数据流模型

多个agent串行传输数据流模型

flume_第4张图片

多个agent汇聚数据流模型

flume_第5张图片

单个agent多数据流模型

flume_第6张图片

在flume提供的数据流模型中几个原则很重要
source--->channel
    单个source组件可以和多个channel组合建立数据流,既可以replicating和multiplexing
    多个source可以写入单个channel
channel-->sink
    多个sinks又可以组合成sinkgroups从channel中获得数据,既可以loadbalancing和failover机制
    多个sinks也可以从单个channel中取数据
    单个sink只能从单个channel中取数据
    

配置介绍

定义组件名称

要定义单个代理中的流,您需要铜鼓哦通道链接源和接收器,您需要列出给定代理的元,接收器和通道,然后将源和接收器指向一个通道,一个源实例可以指定多个通道,但是一个所接受器实例只能指定一个通道

# list the sources, sinks and channels for the agent
.sources = 
.sinks = 
.channels =  
​
# set channel for source
.sources..channels =   ...
​
# set channel for sink
.sinks..channel = 

# list the sources, sinks and channels for the agent
agent_foo.sources = avro-appserver-src-1
agent_foo.sinks = hdfs-sink-1
agent_foo.channels = mem-channel-1
​
# set channel for source
agent_foo.sources.avro-appserver-src-1.channels = mem-channel-1
​
# set channel for sink
agent_foo.sinks.hdfs-sink-1.channel = mem-channel-1

配置组件属性

# properties for sources
.sources.. = 
​
# properties for channels
.channel.. = 
​
# properties for sinks
.sources.. = 

agent_foo.sources = avro-AppSrv-source
agent_foo.sinks = hdfs-Cluster1-sink
agent_foo.channels = mem-channel-1
​
# set channel for sources, sinks
​
# properties of avro-AppSrv-source
agent_foo.sources.avro-AppSrv-source.type = avro
agent_foo.sources.avro-AppSrv-source.bind = localhost
agent_foo.sources.avro-AppSrv-source.port = 10000
​
# properties of mem-channel-1
agent_foo.channels.mem-channel-1.type = memory
agent_foo.channels.mem-channel-1.capacity = 1000
agent_foo.channels.mem-channel-1.transactionCapacity = 100
​
# properties of hdfs-Cluster1-sink
agent_foo.sinks.hdfs-Cluster1-sink.type = hdfs
agent_foo.sinks.hdfs-Cluster1-sink.hdfs.path = hdfs://namenode/flume/webdata
​
#...

常用的flumesource

# Avro source:
    avro
# Syslog TCP source:
    syslogtcp
# Syslog UDP Source:
    syslogudp
# HTTP Source:
    http    
# Exec source:
    exec
# JMS source:
    jms
# Thrift source:
    thrift  
# Spooling directory source:
    spooldir
# Kafka source:
    org.apache.flume.source.kafka,KafkaSource
.....   

常用的flumechannel

# Memory Channel
    memory
# JDBC Channel
    jdbc
# Kafka Channel
    org.apache.flume.channel.kafka.KafkaChannel
# File Channel
    file

常用的flume sinks

# HDFS Sink
    hdfs
# HIVE Sink
    hive
# Logger Sink
    logger
# Avro Sink
    avro
# Kafka Sink
    org.apache.flume.sink.kafka.KafkaSink
# Hbase Sink
    hbase

拦截器的使用

在flume运行过程中,flume有能力在运行阶段修改、删除event,这是用过拦截器(interceptors)来实现的,拦截器由下面几个特点,

拦截器需要实现org.apache.flume.interceptor.Interceptor接口

拦截器可以修改或者删除时间基于开发者的在选择器中选择任何条件,

拦截器采用了责任链模式,多个拦截器可以按知道你的顺序拦截

一个拦截器返回的时间列表被传递给链中 下一个拦截器

如果一个拦截器需要删除事件,它只需要在返回的事件中不包含要删除的事件即可

常用拦截器

1、timestamp Interceptor:时间拦截器,将当前时间戳(毫秒) 加入到event header中,key名字为:timestamp,值为当前时间戳,用的不是很多

2、host Interceptor:主机名拦截器。将运行flume agent的主机名或者I地址加入到events header中,key名字为:host(也可以自定义)

3、static Interceptor:静态拦截器,用于在event header中加入一组静态的key和value

选择器的使用

flume中的channel选择器作用域source阶段,是决定souce接受的特定时间写入到哪个channel的组件,他们告诉channle处理器,然后由其将时间写入到channel

agent中各个组件的交互

由于flume不是两阶段提交,事件被写入到一个channel,然后使劲按在写入下一个channel之前提交,如果写入channel出现异常,那么之前已经写入到其他channel的相同事件不能回滚,当这样的异常发生时,channel处理器抛出channelException异常,事务失败,如果source试图再次写入相同的事件,(大多数情况下,会再次写入,只有syslog,exec等source不能重试,因为没有办法生成相同的数据),重复的事件将写入到channel中,而先前的提交是成功的,,这样在flume中就发生了重复

channel选择器 的配置是通过channel处理器完成的,channel选择器可以指定一组channel是必须的,另一组可选的

flume分类两种选择器,如果source配置用没有指定选择器,那么会自动复制channel选择器

replication:该选择器复制每个事件到通过source的channel选择器,通过选择事件应该写入到哪个channel,基于一个特定的事件头的值进行路由

你可能感兴趣的:(flume,flume)