Flum基础实战

Flume 架构实战

Flume是什么

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。当前Flume有两个版本Flume 0.9X版本的统称Flume-og,Flume1.X版本的统称Flume-ng。由于Flume-ng经过重大重构,与Flume-og有很大不同,使用时请注意区分。

Flum基础实战_第1张图片

Flume特点

  • 可靠性
    • 数据不丢失
  • 可扩展性
    • 各组件数目可扩展
  • 高性能
    • 高吞吐量,可以满足海量日志的搜集
  • 可管理
    • 动态增加、删除组件
  • 文档丰富、社区活跃
    • Hadoop生态应用及其广泛

Flume NG架构

Flum基础实战_第2张图片

flume的核心是把数据从数据源(source)收集过来,在将收集到的数据送到指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。
Flum基础实战_第3张图片

Flume核心概念

  • Cleint
  • Event
  • Agent
    • Source
    • Channel
    • Sinks
    • 其他组件 Interceptor、Channel Selector、Sink Processor

Cleint

客户端

Event

  • Flume事件的传输基本单元
  • Flume以事件的形式从事件源传输到最终目的地
  • 一个完整的event包括:event headers、event body
    • Header容纳了key-value的无序集合,其中key在一个header中是唯一的
    • Body 一般指数据主体

在整个数据的传输的过程中,流动的是event,即事务保证是在event级别进行的。event将传输的数据进行封装,是flume传输数据的基本单位,如果是文本文件,通常是一行记录,event也是事务的基本单位。event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。
Flum基础实战_第4张图片

一个完整的event包括:event headers、event body (即文本文件中的单行记录),如下所以:
在这里插入图片描述

Agent

  • Agent由Source、Channel、Sink组件以及其他组件构成
  • Agent利用这些组件负责将Event从一个节点传输到另外一个节点
  • Agent是Flume 流的基本组成部分
  • Flume提供了对Agent的配置、监控、生命周期管理等
    Flum基础实战_第5张图片

Agent-Source

从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift
Flum基础实战_第6张图片

Agent-Channel

flume组件,负责存储Event数据为保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。

Agent-sink

flum组件中数据的指定的存储目的地(sink)

Agent-拦截器、选择器…

Flum基础实战_第7张图片

安装Flume

  • 解压apache-flume-1.7.0-bin.tar
[root@hadoop usr]# tar -zxvf apache-flume-1.7.0-bin.tar
  • 安装JDK1.7配置JAVA_HOME环境变量

  • 验证是否安装成功
    Flum基础实战_第8张图片

  • Flume 配置文件格式
    Flum基础实战_第9张图片

  • 启动flum

[root@hadoop apache-flume-1.7.0-bin]#  ./bin/flume-ng agent --conf conf -f conf/flume-conf.properties -n agent -Dflume.root.logger=INFO,console
  • 测试

在windows环境命令框下使用telnet 命令进行测试

source Channel sink 的不同类型

  • Source:
    netcat:网猫
    a1.sources.s1.type = netcat
    a1.sources.s1.bind = 192.168.21.147
    a1.sources.s1.port = 8888
    exec:
    a1.sources.s1.type = exec
    a1.sources.s1.command = tail -F /var/log/secure

    spooldir:(监控,某个目录下是否有新文件,不支持文件内容跟新)
    a1.sources.s1.type = spooldir
    a1.sources.s1.spoolDir = /root/spooldir
    a1.sources.s1.fileHeader = true
    a1.sources.s1.deletePolicy = never/immediate
    a1.sources.s1.includePattern = 正则
    a1.sources.s1.ignorePattern = 正则
    TAILDIR:
    a1.sources.s1.type = TAILDIR
    a1.sources.s1.positionFile = /root/flumepos/taildir_position.json
    a1.sources.s1.filegroups =f1 f2
    a1.sources.s1.filegroups.f1 = /root/taildir1/..log
    a1.sources.s1.filegroups.f2 = /root/taildir2/.
    .log

  • channel:
    memory:
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000

    KafkaChannel:

      a1.channels.c2.type = org.apache.flume.channel.kafka.KafkaChannel
      a1.channels.c2.kafka.bootstrap.servers = hadoop:9092
      a1.channels.c2.kafka.topic = nginx
      a1.channels.c2.kafka.consumer.group.id = flume-consumer
    
  • Sink:
    logger(debug使用)
    a1.sinks.sk1.type = logger
    file_roll
    a1.sinks.sk1.type = file_roll
    a1.sinks.sk1.sink.directory = /root/dir1
    a1.sinks.sk1.sink.rollInterval=0
    HDFS:
    a1.sinks.sk1.type = hdfs
    a1.sinks.sk1.hdfs.path= /root/dir1
    a1.sinks.sk1.hdfs.filePrefix = events-
    a1.sinks.sk1.hdfs.rollInterval=0
    a1.sinks.sk1.hdfs.rollSize=
    a1.sinks.sk1.hdfs.rollCount=0
    HBase:
    a1.sinks.sk1.type = hbase
    a1.sinks.sk1.table = baizhi:t_order_log
    a1.sinks.sk1.columnFamily = cf1
    a1.sinks.sk1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer
    a1.sinks.sk1.zookeeperQuorum=CentOS:2181
    Kafka :
    a1.sinks.sk1.type = org.apache.flume.sink.kafka.KafkaSink
    a1.sinks.sk1.kafka.topic = mytopic
    a1.sinks.sk1.kafka.bootstrap.servers =CentOS:9092,CentOS:9093,CentOS:9094
    a1.sinks.sk1.kafka.flumeBatchSize = 20
    a1.sinks.sk1.kafka.producer.acks = 1
    a1.sinks.sk1.kafka.producer.linger.ms = 1
    a1.sinks.ski.kafka.producer.compression.type = snappy

  • 拦截器:Host Interceptor、Timestamp Interceptor、Search and Replace Interceptor
    Regex Filtering Interceptor、Regex Extractor Interceptor、Static Interceptor
    UUID Interceptor

      a1.sources.r1.interceptors = i1
      a1.sources.r1.interceptors.i1.type = timestamp
    

示例:

以spooldir类型收集 使用KafkaChannel 然后使用hdfsskins存到hdfs中

[root@hadoop apache-flume-1.7.0-bin]# vi conf/nginxLog.properties
# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k2
a1.channels = c2

# Describe/configure the source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /usr/local/nginx/access_log/
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = timestamp


# Describe the sink
#a1.sinks.k1.type = logger


a1.sinks.k2.type = hdfs
a1.sinks.k2.hdfs.path = /flume/events/%y-%m-%d/
a1.sinks.k2.hdfs.filePrefix = events-
a1.sinks.k2.hdfs.useLocalTimeStamp = true
#a1.sinks.k2.hdfs.round = true
#a1.sinks.k2.hdfs.roundValue = 10
#a1.sinks.k2.hdfs.roundUnit = minute
a1.sinks.k2.hdfs.fileType=DataStream

a1.channels.c2.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c2.kafka.bootstrap.servers = hadoop:9092
a1.channels.c2.kafka.topic = nginx
a1.channels.c2.kafka.consumer.group.id = flume-consumer

# Bind the source and sink to the channel
a1.sources.r1.channels = c2
a1.sinks.k2.channel = c2

你可能感兴趣的:(Hadoop,BigData)