大数据Flume学习之旅第二篇

239 阅读5分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」。

一、Flume 进阶

1、Flume 事物

image.png

2、Flume Agent 内部原理

image.png

重要组件:

  1. ChannelSelector

    ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型,分别是 Replicating(复制)和 Multiplexing(多路复用)。

    ReplicatingSelector 会将同一个 Event 发往所有的 Channel,Multiplexing 会根据相应的原则,将不同的 Event 发往不同的 Channel。

  2. SinkProcessor

    SinkProcessor共有三种类型 , 分别是DefaultSinkProcessor 、LoadBalancingSinkProcessor 和 FailoverSinkProcessor

    DefaultSinkProcessor 对应的是单个的Sink , LoadBalancingSinkProcessor 和 FailoverSinkProcessor 对应的是 Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor 可以错误恢复的功能。

3、Flume 拓扑结构

3.1、简单串联

image.png

这种模式是将多个 flume 顺序连接起来了,从最初的 source 开始到最终 sink 传送的目的存储系统。此模式不建议桥接过多的 flume 数量, flume 数量过多不仅会影响传输速率,而且一旦传输过程中某个节点 flume 宕机,会影响整个传输系统。

3.2、复制和多路复用

image.png

Flume 支持将事件流向一个或者多个目的地。这种模式可以将相同数据复制到多个channel 中,或者将不同数据分发到不同的 channel 中,sink 可以选择传送到不同的目的地。

3.3、负载均衡和故障转移

image.png

Flume支持使用将多个sink逻辑上分到一个sink组,sink组配合不同的SinkProcessor可以实现负载均衡和错误恢复的功能。

3.4、聚合

image.png

这种模式是我们最常见的,也非常实用,日常 web 应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用 flume 的这种组合方式能很好的解决这一问题,每台服务器部署一个 flume 采集日志,传送到一个集中收集日志的flume,再由此 flume 上传到 hdfs、hive、hbase 等,进行日志分析。

4、Flume 企业开发案例

4.1、复制和多路复用

  1. 案例需求

    使用 Flume-1 监控文件变动,Flume-1 将变动内容传递给 Flume-2,Flume-2 负责存储到 HDFS。同时 Flume-1 将变动内容传递给 Flume-3,Flume-3 负责输出到 LocalFileSystem。

  2. 需求分析

    image.png

  3. 实现步骤

    1. 准备工作

      • 在/opt/module/flume/job 目录下创建 group1 文件夹

        [moe@hadoop102 job]$ mkdir group1
        
      • 在/opt/module/datas/目录下创建 flume3 文件夹

        [moe@hadoop102 module]$ mkdir datas
        [moe@hadoop102 module]$ cd datas/
        [moe@hadoop102 datas]$ mkdir flume3
        [moe@hadoop102 datas]$ ll
        
    2. 创建 flume-file-flume.conf

      配置 1 个接收日志文件的 source 和两个 channel、两个 sink,分别输送给 flume-flume-hdfs 和 flume-flume-dir。

      编辑配置文件

      [moe@hadoop102 group1]$ vim flume-file-flume.conf
      

      添加如下内容

      # Name the components on this agent
      a1.sources = r1
      a1.sinks = k1 k2
      a1.channels = c1 c2
      
      # 将数据流复制给所有 channel
      a1.sources.r1.selector.type = replicating
      
      # Describe/configure the source
      a1.sources.r1.type = exec
      a1.sources.r1.command = tail -F /opt/module/hive-3.1.2/logs/hive.log
      a1.sources.r1.shell = /bin/bash -c
      
      # Describe the sink
      # sink 端的 avro 是一个数据发送者
      a1.sinks.k1.type = avro
      a1.sinks.k1.hostname = hadoop102
      a1.sinks.k1.port = 4141
      a1.sinks.k2.type = avro
      a1.sinks.k2.hostname = hadoop102
      a1.sinks.k2.port = 4142
      
      # Describe the channel
      a1.channels.c1.type = memory
      a1.channels.c1.capacity = 1000
      a1.channels.c1.transactionCapacity = 100
      a1.channels.c2.type = memory
      a1.channels.c2.capacity = 1000
      a1.channels.c2.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a1.sources.r1.channels = c1 c2
      a1.sinks.k1.channel = c1
      a1.sinks.k2.channel = c2
      
      
    3. 创建 flume-flume-hdfs.conf

      编辑配置文件

      [moe@hadoop102 group1]$ vim flume-flume-hdfs.conf
      

      添加如下内容

      # Name the components on this agent
      a2.sources = r1
      a2.sinks = k1
      a2.channels = c1
      
      # Describe/configure the source
      # source 端的 avro 是一个数据接收服务
      a2.sources.r1.type = avro
      a2.sources.r1.bind = hadoop102
      a2.sources.r1.port = 4141
      
      # Describe the sink
      a2.sinks.k1.type = hdfs
      a2.sinks.k1.hdfs.path = hdfs://hadoop102:8020/flume2/%Y%m%d/%H
      
      #上传文件的前缀
      a2.sinks.k1.hdfs.filePrefix = flume2-
      #是否按照时间滚动文件夹
      a2.sinks.k1.hdfs.round = true
      #多少时间单位创建一个新的文件夹
      a2.sinks.k1.hdfs.roundValue = 1
      #重新定义时间单位
      a2.sinks.k1.hdfs.roundUnit = hour
      #是否使用本地时间戳
      a2.sinks.k1.hdfs.useLocalTimeStamp = true
      #积攒多少个 Event 才 flush 到 HDFS 一次
      a2.sinks.k1.hdfs.batchSize = 100
      #设置文件类型,可支持压缩
      a2.sinks.k1.hdfs.fileType = DataStream
      #多久生成一个新的文件
      a2.sinks.k1.hdfs.rollInterval = 30
      #设置每个文件的滚动大小大概是 128M
      a2.sinks.k1.hdfs.rollSize = 134217700 
      #文件的滚动与 Event 数量无关
      a2.sinks.k1.hdfs.rollCount = 0
      
      # Describe the channel
      a2.channels.c1.type = memory
      a2.channels.c1.capacity = 1000
      a2.channels.c1.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a2.sources.r1.channels = c1
      a2.sinks.k1.channel = c1
      
      
    4. 创建 flume-flume-dir.conf

      编辑配置文件

      [moe@hadoop102 group1]$ vim flume-flume-dir.conf
      

      添加如下内容

      # Name the components on this agent
      a3.sources = r1
      a3.sinks = k1
      a3.channels = c2
      
      # Describe/configure the source
      a3.sources.r1.type = avro
      a3.sources.r1.bind = hadoop102
      a3.sources.r1.port = 4142
      
      # Describe the sink
      a3.sinks.k1.type = file_roll
      a3.sinks.k1.sink.directory = /opt/module/datas/flume3
      
      # Describe the channel
      a3.channels.c2.type = memory
      a3.channels.c2.capacity = 1000
      a3.channels.c2.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a3.sources.r1.channels = c2
      a3.sinks.k1.channel = c2
      
      

      提示:输出的本地目录必须是已经存在的目录,如果该目录不存在,并不会创建新的目录。

    5. 执行配置文件

      分别启动对应的 flume 进程:flume-flume-dir,flume-flume-hdfs,flume-file-flume。

      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a2 -f job/group1/flume-flume-hdfs.conf
      
      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a3 -f job/group1/flume-flume-dir.conf
      
      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a1 -f job/group1/flume-file-flume.conf
      
    6. 启动 Hadoop 和 Hive

      [moe@hadoop102 ~]$ start-dfs.sh
      [moe@hadoop103 ~]$ start-yarn.sh
      [moe@hadoop102 hive]$ bin/hive
      hive (default)>
      
    7. 检查 HDFS 上数据

      image.png

    8. 检查/opt/module/datas/flume3 目录中数据

      image.png

4.2、负载均衡和故障转移

  1. 案例需求

    使用 Flume1 监控一个端口,其 sink 组中的 sink 分别对接 Flume2 和 Flume3,采用FailoverSinkProcessor,实现故障转移的功能。

  2. 需求分析

    image.png

  3. 实现步骤

    • 准备工作

      在/opt/module/flume/job 目录下创建 group2 文件夹

      [moe@hadoop102 job]$ mkdir group2
      
    • 创建 flume-netcat-flume.conf

      配置 1 个 netcat source 和 1 个 channel、1 个 sink group(2 个 sink),分别输送给flume-flume-console1 和 flume-flume-console2。

      编辑配置文件

      [moe@hadoop102 group2]$ vim flume-netcat-flume.conf
      

      添加如下内容

      # Name the components on this agent
      a1.sources = r1
      a1.channels = c1
      a1.sinkgroups = g1
      a1.sinks = k1 k2
      
      # Describe/configure the source
      a1.sources.r1.type = netcat
      a1.sources.r1.bind = localhost
      a1.sources.r1.port = 44444
      a1.sinkgroups.g1.processor.type = failover
      a1.sinkgroups.g1.processor.priority.k1 = 5
      a1.sinkgroups.g1.processor.priority.k2 = 10
      a1.sinkgroups.g1.processor.maxpenalty = 10000
      
      # Describe the sink
      a1.sinks.k1.type = avro
      a1.sinks.k1.hostname = hadoop102
      a1.sinks.k1.port = 4141
      a1.sinks.k2.type = avro
      a1.sinks.k2.hostname = hadoop102
      a1.sinks.k2.port = 4142
      
      # Describe the channel
      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.sinkgroups.g1.sinks = k1 k2
      a1.sinks.k1.channel = c1
      a1.sinks.k2.channel = c1
      
      
    • 创建 flume-flume-console1.conf

      编辑配置文件

      [moe@hadoop102 group2]$ vim flume-flume-console1.conf
      

      添加如下内容

      # Name the components on this agent
      a2.sources = r1
      a2.sinks = k1
      a2.channels = c1
      
      # Describe/configure the source
      a2.sources.r1.type = avro
      a2.sources.r1.bind = hadoop102
      a2.sources.r1.port = 4141
      
      # Describe the sink
      a2.sinks.k1.type = logger
      
      # Describe the channel
      a2.channels.c1.type = memory
      a2.channels.c1.capacity = 1000
      a2.channels.c1.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a2.sources.r1.channels = c1
      a2.sinks.k1.channel = c1
      
      
    • 创建 flume-flume-console2.conf

      编辑配置文件

      [moe@hadoop102 group2]$ vim flume-flume-console2.conf
      

      添加如下内容

      # Name the components on this agent
      a3.sources = r1
      a3.sinks = k1
      a3.channels = c2
      
      # Describe/configure the source
      a3.sources.r1.type = avro
      a3.sources.r1.bind = hadoop102
      a3.sources.r1.port = 4142
      
      # Describe the sink
      a3.sinks.k1.type = logger
      
      # Describe the channel
      a3.channels.c2.type = memory
      a3.channels.c2.capacity = 1000
      a3.channels.c2.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a3.sources.r1.channels = c2
      a3.sinks.k1.channel = c2
      
      
    • 执行配置文件 分别开启对应配置文件:flume-flume-console2,flume-flume-console1,flume-netcat-flume。

      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a3 -f job/group2/flume-flume-console2.conf
      
      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a2 -f job/group2/flume-flume-console1.conf
      
      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a1 -f job/group2/flume-netcat-flume.conf
      
    • 使用 netcat 工具向本机的 44444 端口发送内容

      [moe@hadoop102 flume]$ nc localhost 44444
      
    • 查看 Flume2 及 Flume3 的控制台打印日志

    • 将 Flume2 kill,观察 Flume3 的控制台打印情况。

      注:使用 jps -ml 查看 Flume 进程。

4.3、聚合

  1. 案例需求

    hadoop102 上的 Flume-1 监控文件/opt/module/group.log,hadoop103 上的 Flume-2 监控某一个端口的数据流,Flume-1 与 Flume-2 将数据发送给 hadoop104 上的 Flume-3,Flume-3 将最终数据打印到控制台。

  2. 需求分析

    image.png

  3. 实现步骤

    • 准备工作

      分发 Flume

      [moe@hadoop102 module]$ xsync flume
      

      在 hadoop102、hadoop103 以及 hadoop104 的/opt/module/flume/job 目录下创建一个group3 文件夹。

      [moe@hadoop102 job]$ mkdir group3
      [moe@hadoop103 job]$ mkdir group3
      [moe@hadoop104 job]$ mkdir group3
      
    • 创建 flume1-logger-flume.conf

      配置 Source 用于监控 /opt/module/group.log 文件,配置 Sink 输出数据到下一级 Flume。

      在 hadoop102 上编辑配置文件

      [moe@hadoop102 group3]$ vim flume1-logger-flume.conf
      

      添加如下内容

      # Name the components on this agent
      a1.sources = r1
      a1.sinks = k1
      a1.channels = c1
      
      # Describe/configure the source
      a1.sources.r1.type = exec
      a1.sources.r1.command = tail -F /opt/module/group.log
      a1.sources.r1.shell = /bin/bash -c
      
      # Describe the sink
      a1.sinks.k1.type = avro
      a1.sinks.k1.hostname = hadoop104
      a1.sinks.k1.port = 4141
      
      # Describe the channel
      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
      
      
    • 创建 flume2-netcat-flume.conf

      配置 Source 监控端口 44444 数据流,配置 Sink 数据到下一级 Flume

      在 hadoop103 上编辑配置文件

      [moe@hadoop103 group3]$ vim flume2-netcat-flume.conf
      

      添加如下内容

      # Name the components on this agent
      a2.sources = r1
      a2.sinks = k1
      a2.channels = c1
      
      # Describe/configure the source
      a2.sources.r1.type = netcat
      a2.sources.r1.bind = hadoop103
      a2.sources.r1.port = 44444
      
      # Describe the sink
      a2.sinks.k1.type = avro
      a2.sinks.k1.hostname = hadoop104
      a2.sinks.k1.port = 4141
      
      # Use a channel which buffers events in memory
      a2.channels.c1.type = memory
      a2.channels.c1.capacity = 1000
      a2.channels.c1.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a2.sources.r1.channels = c1
      a2.sinks.k1.channel = c1
      
      
    • 创建 flume3-flume-logger.conf

      配置 source 用于接收 flume1 与 flume2 发送过来的数据流,最终合并后 sink 到控制台。

      在 hadoop104 上编辑配置文件

      [moe@hadoop104 group3]$ vim flume3-flume-logger.conf
      

      添加如下内容

      # Name the components on this agent
      a3.sources = r1
      a3.sinks = k1
      a3.channels = c1
      
      # Describe/configure the source
      a3.sources.r1.type = avro
      a3.sources.r1.bind = hadoop104
      a3.sources.r1.port = 4141
      
      # Describe the sink
      a3.sinks.k1.type = logger
      
      # Describe the channel
      a3.channels.c1.type = memory
      a3.channels.c1.capacity = 1000
      a3.channels.c1.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      a3.sources.r1.channels = c1
      a3.sinks.k1.channel = c1
      
      
    • 执行配置文件

      分别开启对应配置文件:flume3-flume-logger.conf,flume2-netcat-flume.conf,flume1-logger-flume.conf。

      [moe@hadoop104 flume]$ bin/flume-ng agent -c conf/ -n a3 -f job/group3/flume3-flume-logger.conf
      
      [moe@hadoop103 flume]$ bin/flume-ng agent -c conf/ -n a2 -f job/group3/flume2-netcat-flume.conf
      
      [moe@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a1 -f job/group3/flume1-logger-flume.conf
      
    • 在 hadoop102 上向/opt/module 目录下的 group.log 追加内容

      [moe@hadoop102 module]$ echo 'moe love zoe' >> group.log
      
    • 在 hadoop103 上向 44444 端口发送数据

      [moe@hadoop103 flume]$ nc hadoop103 44444
      
    • 检查 hadoop104 上数据

      image.png

二、友情链接

大数据Flume学习之旅第一篇