首页 > 技术文章 > flume传输日志文件到HDFS过程讲解

kongzhagen 2020-04-02 21:41 原文

 

Flume定义:

Flume是Cloudera提供的一个高可用的、高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构, 灵活简单。

 

为什么选用Flume

  主要作用: 实时读取服务器本地磁盘的数据, 将数据写入到HDFS

 

 Flume的组织架构

  最简单的组织架构, 单agent

 

   Flume流式处理过程

 

 

  说明:

    source: 数据输入端

      常见类型: spooling directory, exec, syslog, avro, netcat等

    channel:位于source和sink之间的缓冲区

      memory: 基于内存缓存, 允许数据有丢失

      file: 持久化channel, 系统宕机不会丢失数据

    sink: 数据输出端

      常见的目的地有: HDFS, Kafka, logger, avro, File, 自定义

    Put事务流程:

      doPut: 将批数据写入临时缓冲区putList

      doCommit: 检查channel内存队列是否足够合并

      doRollback: 内存队列空间不足, 回滚数据

    Take事务流程:

      doTake: 将批数据提取到临时缓冲区takeList

      doCommit: 如果数据全部发送成功, 则清空临时缓冲区takeList

      doRollback: 如果数据发送过程中出现异常, 则将临时缓冲区takeList中数据返还给channel

 

  多agent

  

 

 

 

 

  事件流多路传输到一个或多个目标, 通过定义一个流复用器来实现.

 

 

 

 

 

  多路日志收集型

 

 

 

 

Flume安装

  Flume官网地址: http://flume.apache.org/

  文档地址: http://flume.apache.org/FlumeUserGuide.html

  下载地址: http://flume.apache.org/download.html

  安装步骤:

  1、将apache-flume-1.7.0-bin.tar.gz上传到/opt/software目录下

  2、解压到/opt/module目录下

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

  3、将目录apache-flume-1.7.0-bin改为名flume

    # mv apache-flume-1.7.0-bin flume

  4、将flume-env.sh.template改名为flume-env.sh, 并修改其配置

    # mv flume/conf/flume-env.sh.template flume/conf/flume-env.sh

    # vi flume/conf/flume-env.sh

      export JAVA_HOME=/opt/module/jdk1.8.0_161

  5、验证安装是否成功 

  # flume/bin/flume-ng version
  Flume 1.7.0
  Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
  Revision: 511d868555dd4d16e6ce4fedc72c2d1454546707
  Compiled by bessbd on Wed Oct 12 20:51:10 CEST 2016
  From source with checksum 0d21b3ffdc55a07e1d08875872c00523

 

实时读取本地文件到HDFS

  1、flume必须持有hadoop相关的包才能将数据输出到hdfs, 将如下包上传到flume/lib下

    涉及到的包如下, 以hadoop-2.9.2为例:

    commons-configuration-1.6.jar

    commons-io-2.4.jar

    hadoop-auth-2.9.2.jar

    hadoop-common-2.9.2.jar

    hadoop-hdfs-2.9.2.jar

    hadoop-hdfs-client-2.9.2.jar

    htrace-core4-4.1.0-incubating.jar

    stax2-api-3.1.4.jar

    woodstox-core-5.0.3.jar

  2、修改/etc/hosts, 加入hadoop的地址

    10.xx.xx.xx hadoo

  3、创建配置文件flume-file-hdfs.conf

    # cd flume/

    # mkdir jobs

    # touch jobs/flume-file-hdfs.conf

  4、添加内容如下

    

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
#定义source为可执行命令
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/module/flume/logs/flume.log
#执行shell脚本的绝对路径
a1.sources.r1.shell = /bin/bash -c

# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop:9000/flume/%Y%m%d/%H
#上传文件的前缀
a1.sinks.k1.hdfs.filePrefix = logs-
#是否按照时间滚动文件
a1.sinks.k1.hdfs.round = true
#多少时间单位创建一个新文件夹
a1.sinks.k1.hdfs.roundValue = 1
#时间单位
a1.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个event才flush一次hdfs
a1.sinks.k1.hdfs.batchSize = 100
#文件类型, 是否压缩
a1.sinks.k1.hdfs.fileType = DataStream
#多久生成一个新文件
a1.sinks.k1.hdfs.rollInterval = 60
#每个文件的大小
a1.sinks.k1.hdfs.rollSize = 10240
#文件的滚动与event数量无关
a1.sinks.k1.hdfs.rollCount = 0
#最小冗余
a1.sinks.k1.hdfs.minBlockReplicas = 1

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
# 容量
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

 5、启动flume

  # bin/flume-ng agent --conf conf/ --conf-file jobs/flume-file-hdfs.conf --name a1  -Dflume.root.logger=DEBUG,console 

 6、查看hdfs系统文件是否接收到文件

  # hdfs dfs -ls /flume
  Found 1 items
  drwxr-xr-x - root supergroup 0 2020-04-02 22:37 /flume/20200402

 

 flume传输日志文件到hdfs成功了。

  

友情提示:

  hadoop伪分布部署: https://www.cnblogs.com/kongzhagen/p/6872297.html

 

推荐阅读