一、理论研究

 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,然后日志输出结果

  首先,编写配置文件

# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1 # Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = # Describe the sink
a1.sinks.k1.type = logger # Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity =
a1.channels.c1.transactionCapacity = # Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

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

$ 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文件夹下,具体包如下图:

  配置:

agent1.sources=source1
agent1.channels=channel1
agent1.sinks=sink1 agent1.sources.source1.type=avro
agent1.sources.source1.bind=0.0.0.0
agent1.sources.source1.port=
agent1.sources.source1.channels=channel1 agent1.sinks.sink1.type=com.handu.flume.sink.rocketmq.RocketMQSink
agent1.sinks.sink1.namesrvAddr=rocketmq_namesrv:
agent1.sinks.sink1.producerGroup=MyProducerGroup_1
agent1.sinks.sink1.topic=FromFlume
agent1.sinks.sink1.tag=Tag1
agent1.sinks.sink1.channel=channel1 agent1.channels.channel1.type=memory
agent1.channels.channel1.capacity=
agent1.channels.channel1.transactionCapacity=
agent1.channels.channel1.keep-alive=

  avro发消息:

$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. nyoj 739 笨蛋难题四

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...

  2. Vue项目使用CSS变量实现主题化

    主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件.现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了.最近,使用C ...

  3. gdb(ddd,kdevelop等)调试ZeroIce开发的应用程序,中断信号引起的问题

    不作文,只记要点. 1.Ice::Application的程序框架默认对SIGHUP, SIGINT, SIGTERM进行处理.目的就是捕捉Ctrl+C发出信号有序地结束程序.这个功能扰乱了我们使用g ...

  4. Andorid开发中遇到的问题

    最近开始学习开发Android App,找了本教程,学了一些基本知识后,就开始着手做一个例子. 我始终觉得在做中学,可能会稍微快一点.很快,一个具有初步功能的App被我撸出来了. 在模拟器上运行,我发 ...

  5. salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)

    此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取pi ...

  6. Python 操作Gitlab-API 实现批量的合并分支

    1.需求:每次大批量上线完成后,都会进行将hotfix合并到Master,合并到test/uat等等重复操作(上线发布后自动合并master已完成). 2.现实:在完成发布后自动合并master后,可 ...

  7. sqlalchemy 源码分析之create_engine引擎的创建

    引擎是sqlalchemy的核心,不管是 sql core 还是orm的使用都需要依赖引擎的创建,为此我们研究下,引擎是如何创建的. from sqlalchemy import create_eng ...

  8. Android 如何动态添加 View 并显示在指定位置。

    引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...

  9. 题解 P2669 【金币】

    似乎我这个"蒟蒻"跟各位DALAO想的不太一样 首先,输入n,使用一层循环搞定 具体思路: 使用ans作为累加器,k记录发几枚金币,s负责不断赋值给累加器,sum当这些天数的金币发 ...

  10. Mybatis工作流程源码分析

    1.简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单 ...