Flume 概述 & 架构 & 组件介绍

前置

Sqoop的作用:
RDBMS <==> Hadoop (关系型数据库与Hadoop生态圈中的存储框架,结合Sqoop做导入导出操作)

在生产环境上,数据库中的文件是一部分,除此之外的文件与日志才是大头、对我们而言是十分重要的,但是会有如下的问题:

  • 文件与日志是无法用Sqoop进行操作的

通常日志采集框架有:Flume、Logstash、Beat(这3个都可以进行收集,Beat更轻量级,主流还是Flume)

Flume概述 & 架构

概述

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

官网介绍
Flume是一个分布式、可靠的、可用的服务
能够高效的去收集数据、聚合数据、移动数据
适用场景:处理大批量的log data(是一个日志收集的工具)
Flume是一个简单的而又灵活的架构基于流式的数据流(通常情况下Flume + Kafka + 流式处理引擎进行打造)
当出现故障的时候,可以故障转移,有重新恢复的机制

Flume的组件
collecting: source(源端)
aggregating: tmp storage(中间端,临时存储的地方)
moving: target(移动到目的点去)
从源端进行收集,聚合到一个地方(临时存储),最后移动到最终的目的地去

Flume在使用过程当中,默认就支持使用压缩存储格式也是支持的;负载均衡也是OK的
使用的时候不需要开发任何代码,只要写一个配置文件把Agent配置一下就OK了
在有些场景是需要配置多个Agent让其组合起来使用

架构

Flume 概述 & 架构 & 组件介绍_第1张图片

组件Agent的组成

  • Source 收集(从外部的服务器上把数据收集过来)
  • Channel 聚合(收集过来以后,先放到channel里面)
  • Sink 移动(然后,通过Sink将Channel里面的数据拿过来,写到外面去,典型的就是HDFS)

Flume发展的两个阶段:
Flume是由Cloudera公司所提出来的

  • OG(老一代)
  • NG(新一代)

组件介绍

三个组件对应的分类(只列举了常见的):

  • Flume Sources:

    • Avro Source
      avro和thrift都是序列化常用的一种机制
    • Thrift Source
    • Exec Source
      就是命令行这种的,linux中tail -F这类的就可以用Exec Source这类的来作为source
    • JMS Source(用的不多)
    • Spooling Directory Sourc
      比如说,你要监控某一个日志的时候:
      使用Exec Source的tail -F只能指定到某一个文件上面去
      如果要指定到某一个文件夹上面去,怎么办呢?
      就是使用Spooling Directory Source
    • Taildir Source
      在1.6版本里,是没有这个的;在1.7版本里才有了这个
      这个Source的功能是十分强大的:Exec是一个文件、Spooling是一个文件夹
      那么如果我想监控一个文件夹下面的一个文件怎么办呢?
      既监控一个文件夹下面新增的文件,也可以支持一个文件夹下面已有文件内容的append
      这样就可以采用Taildir Source,综合了Exec和Spooling两者的功能
    • Kafka Source
    • NetCat TCP Source
      即我们所熟知的nc命令
    • Custom Source
      如果没有满足需求的话,可以自己定义去实现一个Source;不过用的很少,基本都满足了
  • Flume Sink:

    • HDFS Sink
    • Hive Sink
    • Logger Sink
      即写到控制台
    • Avro Sink
    • Thrift Sink
    • HBase Sink
      HBaseSink / AsyncHBaseSink
      分为同步和异步2种方式进行写
    • ElasticSearchSink
    • Kafka Sink
    • HTTP Sink
    • Custom Sinke
      自定义Sink
  • Flume Channels:

    • Memory Channels
      如果内存足够的话,就丢到内存中去
    • JDBC Channels
    • Kafka Channels
    • File Channels
      这种方式,就会把文件写到磁盘上面去,这样对磁盘的压力就会稍微大一些

提出疑问
为什么Source的数据要先到Channels再到Sink呢??放一个Channel的目的是什么??
目的是为了缓冲
比如Java IO里面、MapReduce、Spark Shuffle,在写数据的时候都是先写到buffer里面,buffer满了,再然后flush到磁盘上面去
这样做,能减少与磁盘的交互次数,减少IO,提升性能

环境搭建

所使用的版本:flume-ng-1.6.0-cdh5.7.0

要求:

  1. Java Runtime Environment - Java 1.8 or later
  2. Memory - Sufficient memory for configurations used by sources, channels or sinks
    内存要足够;尤其是对于channel而言,如果使用的是Memory Channels,那么内存必须要足够
  3. Disk Space - Sufficient disk space for configurations used by channels or sinks
    磁盘空间要大
  4. Directory Permissions - Read/Write permissions for directories used by agent
    权限要有,因为从一个地方收集数据然后再写到磁盘上面去,必须要有足够的权限

步骤:

  • 解压flume到/opt/app目录下
  • 修改conf/flume-env.sh
    添加export JAVA_HOME=/opt/app/jdk1.8.0_45
  • 配置环境变量

你可能感兴趣的:(Flume)