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,在其中自定义运行更加灵活的逻辑
  • 感谢开源项目为世界带来的进步
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259