大数据(一)flume

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

以下主要版本是 Flume-ng.

Flume的应用主要用于大数据方面,最开始开发出来也是用来对接KAFKA和HDFS。下图是大概是flume的结构图

如上图:Flume大概概念有agent,source,sick,event等

agent: 为一个JVM进程,它以一个事件的形式将数据从源头送到目的,包括Source,Channel,Sink.

source:负责接收数据的组件,包括avro,exec,spooling directory,netct,syslog,http,kafka等等

常用到的有spooling directory,监听目录下的日志文件,收集日志,

                  avro, 监听本地端口的数据,多用于收集到汇集端

channel:source和sink之间的缓冲区,允许多个source和sink连接,channel是线程安全的,

               channel有2种,一种是memory内存存储,性能高,但如果flume重启,数据会丢失,一个是file文件存储,需要I/O,

性能没有memory好,但数据不会丢失。

sink:  sink将channel的数据批量的写入到目的端。目的端包括hdfs,kafka,avro.file等。

           sink是完全事务性的,在批量移除channel的数据前,会启动事务,一旦数据成功写入到目的端,事务将被提交,

           这里确保数据不会被丢失。

event:数据传输的基本单元,以事件的形式将数据从源头传输到目的地。

flume安装: http://archive.apache.org/dist/flume,先去下载需要的版本

我这里下载的是1.7的版本 

tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /opt/module/

cd /opt/module/

mv apache-flume-1.7.0-bin flume

cd flume/conf

mv flume-env.sh.template flume-env.sh

vi flume-env.sh

#指定 JAVAHOME

export JAVA_HOME=/opt/module/jdk1.8.0_144,安装完成。

 

之前就讲过,每启动Flume任务就是一个agent,agent是一个Jvm进程,里面包括source,channel,sink,

下面是一个Flume监听日志文件,然后发送kafka的配置文件

#define
# a1 就是一个agent的别名,每个配置文件只能有1个
a1.sources = r1   # 配置a1的source 别名 r1
a1.sinks = k1     # 配置a1的sinks 别名 r1 多个输出用 空格 隔开
a1.channels = c1  # 配置channels

# source 数据来源配置 这里是监听本地某个日志文件
a1.sources.r1.type = exec # r1的类型,可以为avro、thrift、exec、jms、spooling directory等
a1.sources.r1.command = tail -F  /tmp/bigDate.log  # 上面为exec,这里就是监听一个日志文件,将刷新的日志收集
a1.sources.r1.shell = /bin/bash -c  # 用bash执行

# sink  数据输出落地端 这里配置的是输出到kafka
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = 10.0.100.129:6667  #kafkaip和端口
a1.sinks.k1.kafka.topic = first    # 主题
a1.sinks.k1.kafka.flumeBatchSize = 20  # 多少条推一次
a1.sinks.k1.kafka.producer.acks = 1   
a1.sinks.k1.kafka.producer.linger.ms = 1   # 延迟1毫秒

# channel
a1.channels.c1.type = memory   # channel的类型,有memory和file
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100  #事务

# bind  关系互相绑定
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

启动指令:bin/flume-ng agent --conf conf/ --name a1 --conf-file job/group3/flume1-logger-flume.conf -Dflume.root.logger=INFO,console

这里的执行了配置文件flume1-logger-kafka.conf,   a1 是配置文件里agent的别名。

启动完之后,就可以往/tmp/bigDate.log里写数据,

ehco 'mytest' > /tmp/bigDate.log

每写一次,flume的source会收集变成event时间,发送到channel, sink 会监听channel(memory,数据放内存),

有数据过来,或者是20条,或者是1毫秒,将数据发送到kafka,这就是数据的整个流程.

当然在flume我们可以做一些简单的处理(拦截器),比如验证数据的格式,复制数据,将数据发送不同的sink端等

这里不建议去连接数据库或者是redis的地方,因为大数据,数据量大的话,做这些会让flume压力巨大

猜你喜欢

转载自blog.csdn.net/shrek11/article/details/106015610