定义

  • Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。
  • 支持在日志系统中定制各类数据发送方(服务器本地磁盘文件夹、网络端口数据),用于收集数据
  • 同时,Flume提供对数据进行简单处理,并写到各种数据接受方(HDFS、Kafka)的能力。

主要作用

实时读取服务器本地磁盘的数据,将数据写入到HDFS。

flume 实现定义source flume的source作用_数据

Flume组成架构

flume 实现定义source flume的source作用_数据_02


flume 实现定义source flume的source作用_Source_03

你是如何实现Flume数据传输的监控的

使用第三方框架Ganglia实时监控Flume。

Flume的Source,Sink,Channel的作用?你们Source是什么类型?

1、作用
(1)Source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括exec、spooling directory等
(2)Channel组件对采集到的数据进行缓存,可以存放在Memory或File中。
(3)Sink组件是用于把数据发送到目的地的组件,目的地包括Hdfs、Kafka、Hbase、自定义等。
2、我们采用的Source类型为:
TailDir Source:可以断点续传、配置多目录。(注:Exec Source可以实时搜集数据,但是数据将会丢失。Spooling Directory Source监控目录,不支持断点续传。)

Flume的Channel Selectors

flume 实现定义source flume的source作用_flume 实现定义source_04

Flume参数调优

  1. Source
    增加Source个(使用Tair Dir Source时可增加FileGroups个数)可以增大Source的读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个Source 以保证Source有足够的能力获取到新产生的数据。
  2. Channel
    type 选择memory时Channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据。type选择file时Channel的容错性更好,但是性能上会比memory channel差。使用file Channel时dataDirs配置多个不同盘下的目录可以提高性能
  3. Sink
    增加Sink的个数可以增加Sink消费event的能力

Flume的ETL和分类型拦截器

本项目中自定义了两个拦截器,分别是:

  1. ETL拦截器:主要用于,过滤时间戳不合法和Json数据不完整的日志
  2. 日志类型区分拦截器:将启动日志和事件日志区分开来,方便发往Kafka的不同Topic。

自定义拦截器步骤:

  1. 自定义一个类实现 Interceptor
  2. 重写四个方法
    (1)initialize初始化
    (2)单个Event intercept处理方法
    (3)多个Event处理方法,在这个方法中调用单Event intercept方法
    (4)close 方法
  3. 静态内部类,实现Interceptor.Builder

HDFS Sink小文件处理

(1)HDFS存入大量小文件,有什么影响?
元数据层面:所以小文件过多,会占用Namenode服务器大量内存,影响Namenode性能和使用寿命
计算层面:默认情况下MR会对每个小文件启用一个Map任务计算,非常影响计算性能。同时也影响磁盘寻址时间。
(2)HDFS小文件处理
官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount

基于以上hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0,hdfs.roundValue=10,hdfs.roundUnit= second几个参数综合作用,效果如下:
(1)tmp文件在达到128M时会滚动生成正式文件
(2)tmp文件创建超10秒时会滚动生成正式文件
举例:在2018-01-01 05:23的时侯sink接收到数据,那会产生如下tmp文件:/20180101/atguigu.201801010520.tmp,即使文件内容没有达到128M,也会在05:33时滚动生成正式文件