Flume初探

系列前言

  • 数据采集和管道的选择有很多,flume、fluentd、logstash等等
  • 但是logstash跟elk一套技术栈、fluentd看了眼kafka的sink写的非常复杂版本管理极乱
  • flume同是apache家的项目,和一种大数据组件兼容性好得多,最后选择了flume进行学习和搭建使用

阅读路径

  1. 谷歌搜索flume中文介绍
  2. 阅读官方文档介绍性章节
  3. 阅读官方文档配置细节章节
  4. 寻找成熟的dockerfile和compose

搭建运行

镜像

  • 在dockerhub、google和github上搜索相关镜像并没有找到特别公认成熟的镜像
  • 最后学习了几个dockerfile中的安装过程后,归纳编写dockerfile如下:
    • 注意由于选择了从mirror镜像站中下载flume的tar包,因此从安全角度来讲应该在dockerfile中下载flume官网的哈希文件对下载的包进行验证
    • 过程见https://github.com/bigcontainer/bigcont/blob/master/flume/Dockerfile
FROM openjdk:8-alpine

ARG FL_MIRROR=https://mirror.bit.edu.cn/apache
ARG FL_VERSION=1.9.0

#Verify https://hub.docker.com/r/bigcontainer/flume/dockerfile
ADD ${FL_MIRROR}/flume/${FL_VERSION}/apache-flume-${FL_VERSION}-bin.tar.gz /opt/
ADD hello.conf /etc/flume/flume.conf
RUN cd /opt && tar zxvf apache-flume-${FL_VERSION}-bin.tar.gz && mv apache-flume-${FL_VERSION}-bin flume

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add bash

WORKDIR /opt/flume
ENTRYPOINT ["bin/flume-ng", "agent"]
CMD ["-n", "agent", "-c", "conf", "-f", "/etc/flume/flume.conf", "-Dflume.root.logger=INFO,console"]
  • 开始学大数据组件发现这些java写的打了包的项目安装起来还真的挺方便的,下载解压就可以了
  • 需要注意-c指定的是默认从哪个文件夹读取配置文件
    • 在/opt/flume/conf中会存放一些默认的配置文件,如logger相关的默认配置
    • 因此如果-c指定其他文件夹可能会报找不到xx配置的错误
    • 同时此时-f就需要写绝对路径了,不然flume会在/opt/flume/conf/中寻找那个名字的配置文件

编排

  • flume的docker-compose.yml也很简单,如下代码块
  • 需要注意的是
    • 首先是把配置文件中声明监听的端口映射出去
    • 其次是把编写的配置文件挂载到容器的/etc/flume/flume.conf
    • 最后挂载其他相关的文件,如连接kafka所使用的jks和jass配置
      • 由于在flume运行时指定jaas配置文件,而这个一般是通过java程序启动时指定,或者环境变量指定的
      • 然而我不想改动flume的启动脚本,同时环境变量的方式经过多次尝试没有成功
      • 最后查到java会默认寻找家目录中的.java.login.config文件作为jaas配置文件读取,因此也就把jaas挂载在了这里
services:
  flume:
    build:
      context: ./flume
    image: flume:1.9.0
    restart: unless-stopped
    volumes:
      - "./flume/flume.conf:/etc/flume/flume.conf"
      - "./keytool/pki/jks/truststore.jks:/etc/jks/truststore.jks"
      - "./kafka/jaas/kafka_client_jaas.conf:/root/.java.login.config"
    ports:
        - "172.26.0.2:24001:24001"

配置约定

数据流配置

  • flume最关键的配置就是flume.conf里为每个agent配置的source、channel、sinks
  • 当前我用flume收集数据并存入kafka的流图如下
# global
agent.sources = sniffer monitor
agent.channels = c1
agent.sinks = k1


# topic specific source
agent.sources.sniffer.type = netcat
agent.sources.sniffer.bind = 0.0.0.0
agent.sources.sniffer.port = 24001
agent.sources.sniffer.ack-every-event = false
agent.sources.sniffer.channels = c1
agent.sources.sniffer.interceptors = i1
agent.sources.sniffer.interceptors.i1.type = static
agent.sources.sniffer.interceptors.i1.preserveExisting = false
agent.sources.sniffer.interceptors.i1.key = topic
agent.sources.sniffer.interceptors.i1.value = sniffer

agent.sources.monitor.type = netcat
agent.sources.monitor.bind = 0.0.0.0
agent.sources.monitor.bind = 24003
agent.sources.monitor.ack-every-event = false
agent.sources.monitor.channels = c1
agent.sources.monitor.interceptors = i1
agent.sources.monitor.interceptors.i1.type = static
agent.sources.monitor.interceptors.i1.key = topic
agent.sources.monitor.interceptors.i1.value = monitor


# memory channel
agent.channels.c1.type = memory

# kafka sink
agent.sinks.k1.channel = c1
agent.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
agent.sinks.k1.allowTopicOverride = true
agent.sinks.k1.kafka.topic = monitor
agent.sinks.k1.kafka.bootstrap.servers = kafka:9093
agent.sinks.k1.kafka.flumeBatchSize = 20
agent.sinks.k1.kafka.producer.acks = 1
agent.sinks.k1.kafka.producer.linger.ms = 1
agent.sinks.k1.kafka.producer.security.protocol = SASL_SSL
agent.sinks.k1.kafka.producer.sasl.mechanism = PLAIN
agent.sinks.k1.kafka.producer.ssl.truststore.location = /etc/jks/truststore.jks
agent.sinks.k1.kafka.producer.ssl.truststore.password = 123456
  • sources包含两个source,分别运行netcat协议(普通的recv,是否回显可选)监听24001和24003端口
    • 每个source使用interceptors给event设置header,key为topic,value为要将此event导入的kafka的topic名称
    • 同时也注意
      • 每个source都可以设置event流入多个channel
      • 多个source的event也可以流入同一个channel
      • 但是sink只能从一个channel中读取event最后发送出去
  • channel使用的常见的内存队列
  • sink部分使用的kafka类型
    • 相关的配置文件在flume官方文档都有详细解释
    • .allowTopicOverride允许通过event的header的配置将其导入进不同的topic中去
    • .topic是evnet默认导入的topic
    • .producer.security.protocol等相关的kafka认证参数和前面文章中kafka配置认证参数是基本一致的,在这里成体系的组件的好处的体现出来了

Finally

  • flume使用起来想简单可以很简单
    • 写一个简单的配置就能够运行作为数据流的搬运工
  • flume使用起来想复杂也可以很复杂
    • 官方文档介绍了单agent中复杂的流复制合并过滤等配置
    • 也介绍了多agent协作完成任务
    • 还可以自定义flum的source和sink,在其中自定义运行更加灵活的逻辑
  • 感谢开源项目为世界带来的进步

你可能感兴趣的:(Flume初探)