一、理论研究

 1.1 总览  

  Flume是一个分布式的可靠的日志收集系统,主要是用于从各种数据源收集、聚合并移动大批量的日志数据到存储系统;它本身具有许多故障转移和恢复机制,具有强大的容错能力;它使用下面这样一个简单的可扩展的数据流模型来进行在线分析。

 1.2 核心概念

Event:一个FLume事件是贯通整个Agent的基本的数据单元。Event从Source流到Channel再到Sink组件,主要是通过Event接口实现。一个Event包含一个字节数组(body)和一些可选的字符串表示的属性(headers)。

   Agent:一个Agent就是一个独立的JVM进程。整个进程可以简单的描述为:Source从外部数据源消费特殊格式的Events,然后将这些事件存储到Channel中,Channel作为缓冲区会保存事件直到事件被Sink消费为止,当Sink消费到Channel中的事件,再将其从Channel中移除并将事件存放到外部的数据仓库比如hdfs或者下一个数据量的Source中。

 1.3 可靠性

  单跳可靠性:存储在Channel中的事件只有当它被存储在下一个Agent的Channel或者终端仓库中才会被Sink移除,这是Flume提供的一种end-to-end的数据流可靠性传输机制。

  多跳可靠性:Flume通过使用这样一种事务的方法来保证Events的可靠性传输,主要是由Channel提供的事务里,封装了Source和Sink对Event进行有效的存储和恢复。上一个Agent中的Sink和当前Agent的Source将开启它们的事务方法来保证数据安全的存储在当前Agent的Channel中,这是一种point-to-point的可靠性传输机制。

 1.4 可恢复性

  缓存在Channel中的事件将会管理数据的恢复。Flume支持持久化的File Channel,当Channel类型为File Channel时数据将持久化到本地文件系统,当然也有Memory Channel会简单的将数据存储在内存队列中,Momery Channel速度很快但是一旦Agent挂了,数据将不可恢复。

二、实验

 2.1 环境准备

  1. centos、JDK1.8、maven3;
  2. 从git下载源码后实验mvn编译或者直接cdh界面安装flume;
  3. 足够的日志空间和内存以及数据写入权限;
  4. 配置好flume的环境变量后,命令行输入flume-ng version查看版本验证安装是否成功。

 2.2 实验案例

  flume的根目录下的conf文件夹中的flume-conf.properties.template文件时一个配置文件的模板,该文件对Agent进行了详细的配置。一个或多个Agent的配置可以写在一个配置文件中,配置主要包括Agent中的每一个source、sink和Channel的属性以及这些组件是如何连在一起并组成数据流模型的。在Flume的实验中,我们主要通过配置文件来建立Flume模型,并通过bin/flume-ng来启动Flume的Agent。flume-ng命令需要指定agent的名称以及配置路径和配置文件名称,更多参数配置可以通过输入flume-ng help来了解。

 实验一、本地tcp端口发送消息到flume,然后日志输出结果

  首先,编写配置文件

  1. # example.conf: A single-node Flume configuration
  2.  
  3. # Name the components on this agent
  4. a1.sources = r1
  5. a1.sinks = k1
  6. a1.channels = c1
  7.  
  8. # Describe/configure the source
  9. a1.sources.r1.type = netcat
  10. a1.sources.r1.bind = localhost
  11. a1.sources.r1.port =
  12.  
  13. # Describe the sink
  14. a1.sinks.k1.type = logger
  15.  
  16. # Use a channel which buffers events in memory
  17. a1.channels.c1.type = memory
  18. a1.channels.c1.capacity =
  19. a1.channels.c1.transactionCapacity =
  20.  
  21. # Bind the source and sink to the channel
  22. a1.sources.r1.channels = c1
  23. a1.sinks.k1.channel = c1

  以上配置定义了一个叫a1的单节点agent,a1拥有一个从端口44444监听数据的source,一个将数据缓存到内存的channel以及将日志数据输出到日志窗口的sink组件。当然一个配置文件中可以包含多个agent的配置,因此在启动flume-ng的时候需要指定agent的名称。启动命令类似于下面这种:

  1. $ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console

  以上命令中,在参数conf中指定配置文件的路径比如flume目录下的配置文件夹conf,该路径下包含flume-env.sh和log4j.propertites(该文件中默认配置了日志输出原始数据以及配置数据:-Dorg.apache.flume.log.printconfig=true -Dorg.apache.flume.log.rawdata=true),这样agent可以在指定的环境下运行并且以日志格式将数据输出到界面。

  然后,可以在通过netcat命令往本地端口44444写数据,并在flume的终端的日志信息中找到包含的事件。

 实验二、oracle增量数据写入flume,结果写入到hdfs

  前期准备:从https://github.com/keedio/flume-ng-sql-source获取源码使用命令mvn package编译flume对接sql的源码成jar包并将jar包放在flume主目录下的lib文件夹中,注意以下说明中的版本对应。

  配置编写:

# example.conf: A single-node Flume configuration

# Name the components on this a2
a2.sources = r2
a2.sinks = k2
a2.channels = c2

# For each one of the sources, the type is defined
a2.sources.r2.type = org.keedio.flume.source.SQLSoure
a2.sources.r2.hibernate.connection.url = jdbc:oracle:thin:@ip:port/sid
a2.sources.r2.hibernate.connection.user = username
a2.sources.r2.hibernate.connection.password = passwd
a2.sources.r2.hibernate.connection.autocommit = true
a2.sources.r2.hibernate.dialect = org.hibernate.dialect.Oracle10gDialect
a2.sources.r2.hibernate.connection.driver_class = oracle.jdbc.driver.OracleDriver

# Query delay, each configured milisecond the query will be sent
a2.sources.r2.run.query.delay=10000

# Status file is used to save last readed row
a2.sources.r2.status.file.path = /var/log/flume
a2.sources.r2.status.file.name = r2.status

# Custom query
a2.sources.r2.start.from = 197001010
a2.sources.r2.custom.query = SELECT emplid,effdt from sys.test where emplid>'$@$'

# Standard Query

# a2.sources.r2.table = sys.test

# a2.sources.r2.columns.to.select = emplid,effdt

a2.sources.r2.batch.size = 1000
a2.sources.r2.max.rows = 1000
a2.sources.r2.hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
a2.sources.r2.hibernate.c3p0.min_size = 1
a2.sources.r2.hibernate.c3p0.max_size = 10

#sink's type must be defined
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = /flume/oracle
a2.sinks.k2.hdfs.fileType = DataStream
a2.sinks.k2.hdfs.writeFormat = Text
a2.sinks.k2.hdfs.rollSize = 1024000000
a2.sinks.k2.hdfs.rollInterval = 0
a2.sinks.k2.hdfs.rollCount = 0

# The channel can be defined as follows.
a2.channels.c2.type = memory
a2.channels.c2.capacity = 10000
a2.channels.c2.transactionCapacity = 1000

# connected source and sink with channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

  注意事项:start.from配置的是查询的增量字段对应的起始数据(增量字段默认为查询语句的第一个列名称),如果使用custom.query的查询语句不在where语句中使用'$@$'对增量字段进行过滤,将会导致数据会重复写入,每隔run.querry.delay的时间间隔将会运行一次会执行一次查询语句,并将数据读入到channel中,然后更新status文件中的lastIndex即'$@$',该索引作为下一次执行查询时的开始字段的索引起始位置,大于改索引的所有记录将会输入到channel,建议直接使用standard Query来给通过columns.to.select配置列,以及table指定查询的表,这两个配置项配置了将会在后台执行SELECT <columns.to.select> FROM <table>,并且从初始化的数据开始自动执行增量查询。

 实验三、avro发送文件到flume,结果写入到rocket mq

  准备:源码见https://gitee.com/mxb/rocketmq-flume,将rocketmq相关的包和该源码编译的包全部打包在一起放进lib文件夹下,具体包如下图:

  配置:

  1. agent1.sources=source1
  2. agent1.channels=channel1
  3. agent1.sinks=sink1
  4.  
  5. agent1.sources.source1.type=avro
  6. agent1.sources.source1.bind=0.0.0.0
  7. agent1.sources.source1.port=
  8. agent1.sources.source1.channels=channel1
  9.  
  10. agent1.sinks.sink1.type=com.handu.flume.sink.rocketmq.RocketMQSink
  11. agent1.sinks.sink1.namesrvAddr=rocketmq_namesrv:
  12. agent1.sinks.sink1.producerGroup=MyProducerGroup_1
  13. agent1.sinks.sink1.topic=FromFlume
  14. agent1.sinks.sink1.tag=Tag1
  15. agent1.sinks.sink1.channel=channel1
  16.  
  17. agent1.channels.channel1.type=memory
  18. agent1.channels.channel1.capacity=
  19. agent1.channels.channel1.transactionCapacity=
  20. agent1.channels.channel1.keep-alive=

  avro发消息:

  1. $FLUME_HOME/bin/flume-ng avro-client -H localhost -p -F $FLUME_HOME/README

  编写一个mq的consumer的进程接收消息,输出对应TOPIC下的的消息body中将会包含README的内容。

Flume理论研究与实验的更多相关文章

  1. Ontology理论研究和应用建模

    转自:https://www.cnblogs.com/yes-V-can/p/8151275.html 目录 1 关于Ontology 1.1 Ontology的定义 1.2 Ontology的建模元 ...

  2. [ETL] Flume 理论与demo(Taildir Source & Hdfs Sink)

    一.Flume简介 1. Flume概述 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据: ...

  3. 两轮自平衡小车双闭环PID控制设计

                                                                                            两轮自平衡小车的研究意义 ...

  4. HTML5图形图像处理技术研究

    摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...

  5. Storm安装与实验

    接上一篇Kafka的安装与实验: http://www.cnblogs.com/charlesblc/p/6046023.html 还有再上一篇Flume的安装与实验: http://www.cnbl ...

  6. Deep Learning中的Large Batch Training相关理论与实践

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在分布式训练时,提高计算通信占比是提高计算加速比的有效手段,当网络通信优化到一 ...

  7. NNs(Neural Networks,神经网络)和Polynomial Regression(多项式回归)等价性之思考,以及深度模型可解释性原理研究与案例

    1. Main Point 0x1:行文框架 第二章:我们会分别介绍NNs神经网络和PR多项式回归各自的定义和应用场景. 第三章:讨论NNs和PR在数学公式上的等价性,NNs和PR是两个等价的理论方法 ...

  8. zz姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖

    姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖 近日,美国艾尔弗·斯隆基金会(The Alfred P. Sloan Foundation)公布了2019年斯隆研究奖(Sloan Research ...

  9. 201771030115-牛莉梅 实验一 软件工程准备-<初学《构建之法--现代软件工程》的疑问>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...

随机推荐

  1. 【SpringBoot | Druid】SpringBoot整合Druid

    SpringBoot整合Druid Druid是个十分强大的后端管理工具,具体的功能和用途请问阿里爸爸 1. 在pom.xml中导入包 <!-- alibaba 的druid数据库连接池 --& ...

  2. Kafka幂等性原理及实现剖析

    1.概述 最近和一些同学交流的时候反馈说,在面试Kafka时,被问到Kafka组件组成部分.API使用.Consumer和Producer原理及作用等问题都能详细作答.但是,问到一个平时不注意的问题, ...

  3. js 关于apply和call的理解使用

    关于call和apply,以前也思考良久,很多时候都以为记住了,但是,我太难了.今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 一.apply函数定义与理解 ...

  4. oracle插入,更新,删除数据

    插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...

  5. 2019-9-11:渗透测试,Kill远控软件,初接触

     初步使用Kill远控软件,使win7靶机被远控 该文章仅供学习,利用方法来自网络文章,仅供参考   1,打开运行Kill,选择系统设置,设置监听端口,通讯密码,点击保存设置 2,点击服务生成,上线参 ...

  6. 用Helm3构建多层微服务

    Helm是一款非常流行的k8s包管理工具.以前就一直想用它,但看到它产生的文件比k8s要复杂许多,就一直犹豫,不知道它的好处能不能抵消掉它的复杂度.但如果不用,而是用Kubectl来进行调式真的很麻烦 ...

  7. 【Luogu P1090】合并果子

    Luogu P1090 [解题思路] 刚看到这题的时候,第一反应就是每次取两个最小,然后重新排序,再取最小.但是这样会TLE. 既然找最小的,那就可以利用单调队列了.显然输入的数据是不具有单调性的,但 ...

  8. 算法整理(php语言完成),持续更行中......

    一下所有实例中,均在同一个方法中,所以算法使用内部函数完成 归并排序 public function test1Action () { $tmp = 0; $al_merge = function($ ...

  9. 1、Docker 简介

    目录 Docker 起源 Docker 架构 特性 局限 名称空间隔离 原理 Control Groups (cgroups) Docker Docker 啥是docker? Docker 是一个开源 ...

  10. Select下拉框onchange事件获取option的value值

    首先方法中使用到了jqury,首先导入jqury的插件: 如果jqury的小插件没有的话,就去网上下载一个吧,jqury比原生的js使用起来方便了很多,这里也提供一个我的jqury的下载地址: jqu ...