flume 总结

1 下载、配置、安装

1.1 下载

在官网 http://flume.apache.org/download.html 下载 apache-flume-1.7.0-bin.tar.gz 文件,解压缩。

1.2 配置、安装

进入解压缩文件夹下的 conf 文件夹,执行 cp flume-env.sh.template flume-env.sh,在 flume-env.sh 中添加 JAVA_HOME=jdk_path jdk_path 为 java 绝对路径。

执行 /flume-1.7.0-bin/bin/flume-ng version 出现版本信息证明配置安装成功。

2 flume 架构

flume 架构是基于 agent,agent 是由 source、channel、sink 组成。其中 source 相当于生产者,channel 相当于消息队列,sink 相当于消费者。

数据在 flume 中是以 event 为单位的,source 将数据打包为 event 传入 channel、sink 从 channel 中取数据。event 从 source 到 channel 和从 channel 到 sink 都是事务级别的。

由于 flume 是基于 agent 的,所以 flume 支持多级结构、扇入、扇出

3 agent 配置

一个 agent 中至少包括 source、channel、sink 各一个。

a1.sources = r1
a1.sinks = k1
a1.channels = c1
  • 1
  • 2
  • 3

a1 为 agent 的名称。

以下内容均不完全,详情参考 http://flume.apache.org/FlumeUserGuide.html

3.1 source 配置

本文只列出了几种类型。

3.1.1 监听网络端口

avro source : 以 avro 格式处理数据

# 必须配置
a1.sources.r1.type = avro
a1.sources.r1.bind = 127.0.0.1
a1.sources.r1.port = 3366
a1.sources.r1.channels = c1
#可选配置
# ssl 认证
a1.sources.r1.ssl = false
a1.sources.r1.keystore =
a1.sources.r1.keystore-password =
# ip 过滤
a1.sources.r1.ipFilter = false
a1.sources.r1.ipFilterRules
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

thrift source :以 thrift 格式处理数据

# 必须配置
a1.sources.r1.type = thrift
a1.sources.r1.bind = 127.0.0.1
a1.sources.r1.port = 3366
a1.sources.r1.channels = c1 #可选配置
# ssl 认证
a1.sources.r1.ssl = false
a1.sources.r1.keystore =
a1.sources.r1.keystore-password =
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

还有 http 类型等详见 http://flume.apache.org/FlumeUserGuide.html

3.1.2 监控文件

spooldir source :监控文件夹下新增文件

# 必须配置
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = directory
a1.sources.r1.channels = c1 #可选配置
#是否带头部信息
a1.sources.r1.fileHeader = true
#忽略后缀文件
a1.sources.r1.ignorePattern = .*mv
#最大一行大小
a1.sources.r1.deserializer.maxLineLength = 50000
# 发现新文件 5s 后处理
a1.sources.r1.pollDelay = 5000
#对完成文件添加后缀 .COMPLETED
#a1.sources.r1.fileSuffix = .COMPLETED
#完成文件后是否删除 never or immediate
#a1.sources.r1.deletePolicy = never
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

**exec source** :监控文件夹下新增文件
  • 1
# 必须配置
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F file
a1.sources.r1.channels = c1 #可选配置
#挂掉后是否重启
a1.sources.r1.restart = false
# stderr 是否写入日志
a1.sources.r1.logStdErr = false
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.2 channel 配置

memory channel

# 必须配置
a1.channels.c1.type = memory
# channel 队列最大长度
a1.channels.c1.capacity = 1000
# 事务队列最大长度
a1.channels.c1.transactionCapacity = 100
# 超时时间
a1.channels.c1.keep-alive = 3
a1.channels.c1.byteCapacityBufferPercentage = 20
# 最大内存
a1.channels.c1.byteCapacity = 800000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

**file channel**
  • 1
# 必须配置
a1.channels.c1.type = file
# 记录传输进度文件目录
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint
# 记录日志目录
a1.channels.c1.dataDirs = /mnt/flume/data
# 事务队列最大长度
a1.channels.c1.transactionCapacity = 10000
# 每个文件最大大小
a1.channels.c1.maxFileSize = 2146435071
# 小于此空间大小将停止传输
a1.channels.c1.minimumRequiredSpace = 524288000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.3 sink 配置

avro sink

# 必须配置
a1.sinks.s1.type = avro
a1.sinks.s1.hostname = 127.0.0.1
a1.sinks.s1.port = 3366
a1.sinks.s1.channels = c1
#可选配置
# ssl 认证
a1.sinks.s1.ssl = false
a1.sinks.s1.truststore =
a1.sinks.s1.truststore-password =
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

thrift sinks :以 thrift 格式处理数据

# 必须配置
a1.sinks.s1.type = thrift
a1.sinks.s1.hostname = 127.0.0.1
a1.sinks.s1.port = 3366
a1.sinks.s1.channels = c1
#可选配置
# ssl 认证
a1.sinks.s1.ssl = false
a1.sinks.s1.truststore =
a1.sinks.s1.truststore-password =
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

**file roll sink**
  • 1
# 必须配置
a1.sinks.s1.type = file_roll
a1.sinks.k1.sink.directory = /var/log/flume
#可选配置
# 每 30 秒生成一个文件
a1.sinks.k1.sink.rollInterval = 30
# 事务队列大小
a1.sinks.k1.sink.batchSize = 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4 failover 和 load balancing

flume 的 failover 和 load balancing 都是针对 sink 的。

failover

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在 sinkgroups 中,先启用的 priority 大的 sink。只有在当前的 sink 挂掉后,flume 才会启用 sinkgroups 中其余最大的。


load balancing

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
# balance : round_robin, random
a1.sinkgroups.g1.processor.selector = random
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5 扇出

对 source 的扇出有 replicatingmultiplexing 两种方式。

replicating

在 source 配置后添加以下配置

#以复制方式扇出
a1.sources.r1.selector.type = replicating
a1.sources.r1.channels = c1 c2
  • 1
  • 2
  • 3

**multiplexing**
  • 1

在 source 配置后添加以下配置。
复用方式需要在消息中附加头部消息,对头部内容进行匹配后扇出。

#以复用方式扇出
a1.sources.r1.selector.type= multiplexing
a1.sources.r1.channels= c1 c2
# 判断 header 中 state 字段
a1.sources.r1.selector.header= state
# state 字段为 CZ 发送到 c1
a1.sources.r1.selector.mapping.CZ= c1
# state 字段为 US 发送到 c2
a1.sources.r1.selector.mapping.US= c2
# 未匹配的数据发送到 c1
a1.sources.r1.selector.default= c1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6 二次开发

sink 开发

public class MySink extends AbstractSink implements Configurable {
private static final Logger logger = LoggerFactory.getLogger(TimeFileSink.class );
private String myProp; @Override
public void configure(Context context) {
String myProp = context.getString("myProp", "defaultValue"); // Process the myProp value (e.g. validation) // Store myProp for later retrieval by process() method
this.myProp = myProp;
} @Override
public void start() {
// Initialize the connection to the external repository (e.g. HDFS) that
// this Sink will forward Events to ..
} @Override
public void stop () {
// Disconnect from the external respository and do any
// additional cleanup (e.g. releasing resources or nulling-out
// field values) ..
} @Override
public Status process() throws EventDeliveryException {
Status status = null; // Start transaction
Channel ch = getChannel();
Transaction txn = ch.getTransaction();
txn.begin();
try {
// This try clause includes whatever Channel operations you want to do Event event = ch.take(); // Send the Event to the external repository.
// storeSomeData(e); txn.commit();
status = Status.READY;
} catch (Throwable t) {
txn.rollback(); // Log exception, handle individual exceptions as needed status = Status.BACKOFF; // re-throw all Errors
if (t instanceof Error) {
throw (Error)t;
}
}
return status;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

在开发过程中只要重写 configureprocess函数就可。

其中 configure 函数是从配置文件获取所需的配置,使用 context.getString 获取字符串,context.getInteger 获取数字。

在新建的类中,会不断的调用 process 函数

Channel ch = getChannel();
Transaction txn = ch.getTransaction();
// 获取事件
Event event = ch.take();
//提交事务
txn.commit();
//回滚事务
txn.rollback();
//关闭
txn.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

完成开发后把 .class 文件打包为 .jar ,把 .jar 包放入 plugins.d/personal/lib/ 目录下(不存在自建,personal 随意)。在配置文件中 a1.sinks.s1.type 后添加自定义的完整包路径。

source 开发

同 sink 开发。

7 启动 flume

bin/flume-ng agent -c conf/ -f conf/flume_spool.conf -n a1 -Dflume.root.logger=INFO,console

-c 配置文件目录
-f 加载的配置文件
-n 配置文件中 agent 名称
-Dflume.root.logger=INFO,console 将 flume 运行中产生的大于 INFO 级别的消息输出到控制台
-Dflume.root.logger=INFO,LOGFILE 将 flume 运行中产生的大于 INFO 级别的消息输出到日志,详细在 conf 目录下的 log4j.properties 文件
  • 1
  • 2
  • 3
  • 4
  • 5

总结

有些东西并没有写入,有问题可以给我留言,看到会第一时间回复的。
本人第一次写博客,有很多不完美的地方请大家指出,O(∩_∩)O谢谢。

---------------------

本文来自 lazyun 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Phoenix_Lzy/article/details/70477519?utm_source=copy

flume 学习总结的更多相关文章

  1. Flume学习总结

    Flume学习总结 flume是一个用来采集数据的软件,它可以从数据源采集数据到一个集中存放的地方. 最常用flume的数据采集场景是对日志的采集,不过,lume也可以用来采集其他的各种各样的数据,因 ...

  2. flume学习(三):flume将log4j日志数据写入到hdfs(转)

    原文链接:flume学习(三):flume将log4j日志数据写入到hdfs 在第一篇文章中我们是将log4j的日志输出到了agent的日志文件当中.配置文件如下: tier1.sources=sou ...

  3. Flume学习应用:Java写日志数据到MongoDB

    概述 Windows平台:Java写日志到Flume,Flume最终把日志写到MongoDB. 系统环境 操作系统:win7 64 JDK:1.6.0_43 资源下载 Maven:3.3.3下载.安装 ...

  4. Flume学习 & Kafka & Storm 等 & Log4J 配置

    正在学习这篇文章: http://blog.csdn.net/ymh198816/article/details/51998085 和工作中接触的电商.订单.分析,可以结合起来. 开宗明义,这幅图片: ...

  5. flume学习安装

    近期项目组有需求点击流日志须要自己收集,学习了一下flume而且成功安装了.相关信息记录一下. 1)下载flume1.5版本号  wget http://www.apache.org/dyn/clos ...

  6. flume学习以及ganglia(若是要监控hive日志,hive存放在/tmp/hadoop/hive.log里,只要运行过hive就会有)

    python3.6hdfs的使用 https://blog.csdn.net/qq_29863961/article/details/80291654 https://pypi.org/  官网直接搜 ...

  7. flume学习

    下载 自定义sink(mysql) 1.ide打开下载后的源码 2.代码如下: /** * Licensed to the Apache Software Foundation (ASF) under ...

  8. Flume学习——BasicTransactionSemantics

    org.apache.flume.channel.BasicTransactionSemantics An implementation of basic Transaction semantics ...

  9. Flume学习——Flume中事务的定义

    首先要搞清楚的问题是:Flume中的事务用来干嘛? Flume中的事务用来保证消息的可靠传递. 当使用继承自BasicChannelSemantics的Channel时,Flume强制在操作Chann ...

  10. Flume学习——Flume的架构

    Flume有三个组件:Source.Channel 和 Sink.在源码中对应同名的三个接口. When a Flume source receives an event, it stores it ...

随机推荐

  1. SNF快速开发平台MVC-瀑布式分页组件

    1.   瀑布式分页 目前已经比较流行了,以往的这种点击分页已经不能满足广大网民的需求了.像百度图片等等,网站都有滚动滚轮直接分页的功能,这样体验也确实好了不少,所以我们也决定在我们的框架内进行集成此 ...

  2. KMP算法——从入门到懵逼到了解

    本博文參考http://blog.csdn.net/v_july_v/article/details/7041827 关于其它字符串匹配算法见http://blog.csdn.net/WINCOL/a ...

  3. python工具 - 从文件名读取特定信息到excel表格

    情景:文件名中包含学号和用户名,其中用户名在前学好在后,学号为2位,如harry33.txt.natasha12.txt. 要求:将多个文件名中的用户名与学号分开并保存到excle中. 代码部分: i ...

  4. golang:吐槽multipart的设计

    最近在做邮件解析的工作,因此接触到multipart库,用了之后才发现golang的multipart有一点设计很诡异. 红线标出来的话意思是:当Content-Transfer-Encoding的值 ...

  5. pivot 与 unpivot函数

    pivot 与 unpivot函数 pivot 与 unpivot 函数是SQL05新提供的2个函数 灰常灰常的实用 ----------------------------------------- ...

  6. django admin upload 上传图片到oss Django Aliyun OSS2 Storage

    https://github.com/xiewenya/django-aliyun-oss2-storage Install pip install django-aliyun-oss2-storag ...

  7. c++ clr编译dll在c#调用时出现“试图加载不正确的格式”“找不到dll”错误的解决

    用depends发现缺了一堆API-MS-WIN什么的dll,网上查找是因为少了VC++2010,VC++2015等一系列,装好后仍然不行,原来这种错误并不是该原因导致的,也并不缺少那些dll(dep ...

  8. ( 转 )超级惊艳 10款HTML5动画特效推荐

    今天我们要来推荐10款超级惊艳的HTML5动画特效,有一些是基于CSS3和jQuery的,比较实用,特别是前几个HTML5动画,简直酷毙了,现在将它们分享给大家,也许你能用到这些HTML5动画和jQu ...

  9. feign调用接口session丢失解决方案

    微服务使用feign相互之间调用时,因为feign默认不传输Header,存在session丢失的问题.例如,使用Feign调用某个远程API,这个远程API需要传递一个鉴权信息,我们可以把cooki ...

  10. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...