1.介绍
FlumeBase是一个建立在Flume之上的数据驱动的流处理系统。这个系统允许用户动态的向数据收集环境插入查询并且监控被Flume收集到的事件流。这些查询可能是抽样调查输入的数据,也可能是指定固定的监控,也可能是数据转换或者是质量过滤任务。这些查询是用一个类似于SQL的名为“rtsql”语言编写的。
FlumeBase可以把数据反馈给一个在交互的shell环境下的用户。它也可以配置成把输出的事件流返回到Flume网络中,用于被其他的工具使用或者持久化到Hbase、HDFS或者其他的存储介质中。
这个系统强调对被Flume捕获到的输入数据的低延迟分析。“rtsql”语言的名字强调了系统的实时查询特性,也说明了衍生于基于SQL的查询语言语法。FlumeBase被期望于在把被Flume捕捉的数据被用类似于Hadoop一样的工具去深入分析(可能是高延时的)之前,可以允许你执行有效的in-line数据转换或者过滤,或者有时效性的消息或者是一个更广泛系统的调谐。
警告
FlumeBase是一个实验性的系统!现在还不能满足生产环境使用的要求。把这个系统连接到Flume生产环境的节点上可能会导致数据丢失,错配置或者其他比较严重的问题。
这篇文档说明了怎样安装和配置FlumeBase系统。接着说明了一下rtsql语言,用于向运行环境提交查询和控制终端客户端的命令。这个文档的使用对象是:
l 系统管理员
l 数据分析师
l 数据工程师
对于那些了解Flume、SQL,只是想知道FlumeBase可以做什么的人,只需要按照一下部分中的步骤做就可以。这只是个在FlumeBase世界里短短5分钟的旅行。
首先拷贝一下文本到一个名为data.txt的文件中:
1,aaron,purple,42
2,bob,blue,11
3,cindy,green,312
安装Flume0.9.3,Hadoop0.20和Java1.6。如果你运行的是Cloudera的CDH3B4,你已经安装了这些。比较老的版本的用户需要进行更新。可以参考第3节的安装部分获得更详细的说明。
解压FlumeBase安装包:
$ tar vzxf flumebase-(version).tar.gz
启动FlumeBase的shell:
$ cd flumebase-(version)/
$ bin/flumebase shell
默认情况下,FlumeBase是被在这个shell相同进程中内嵌在FlumeBase服务器和Flume本身的配置齐全的环境所配置的。现在让我们定义一个基于这个文件的流,并且查询它。
rtsql> CREATE STREAM data(id int, name string, favcolor string,
-> luckynumber int) FROM LOCAL SOURCE 'tail("/path/to/data.txt")';
CREATE STREAM
rtsql> SELECT * FROM data;
你在运行在一个本地的(代管的)Flume的逻辑节点上的流,这个节点读取data.txt的所有行。你接着运行了一个从这个流中每一个事件提取所有的字段的查询。文件中的每一行相当于一个不同的事件。
在另外一个终端中,现在执行下面的命令:
$ echo 4,dave,orange,611 >> /path/to/data.txt
你应该可以观察到,一旦Flume检测到了一行新的记录(大约一秒钟的延迟),这行记录将被传递给FlumeBase,并最终输出到你的控制台中。
这个提交的查询已经创建了一个流,它会一直运行。如果更多的数据通过那个文件进入Flume,我们将持续处理它。现在我们来取消这个流。
rtsql> \d 1
(随着FlumeBase解除了内部的逻辑节点,可能会有Flume输出的一个错误信息,这很正常。通常情况下,运行在一个单一的进程中会比较杂乱,因为客户端和服务器的活动会被堆放在一个单一的控制台中。对一个干净的会话体验,请按照第三节安装部分的说明,把客户端和服务器运行在单独的进程中。
现在我们来运行另外一个查询:
rtsql> SELECT favcolor FROM data WHERE luckynumber = 42;
几秒钟以后,这个流将被Flume逻辑节点中的数据初始化。注意,我们只从我们的原始数据集中获取一列。如果你通过向文件中添加更多的行添加事件,当事件中有luckynumber列为42时,你将看到它们出现在FlumeBase的控制台。
这就到了我们旅程的尾声。要退出FlumeBase,请运行:
rtsql> \q
这个用户指定的剩余部分将更详细的描述如何配置多处理的配置、rtsql语言和shell操作。
FlumeBase在你的机器上运行之前需要一些先决条件:
l Java 6.0
l Hadoop 0.20
l Flume 0.9.3
因为FlumeBase是用Java实现,因此它也是跨平台的。系统的测试只是在Linux上进行的。它似乎也可以在cywin或者其他的操作系统上运行,但是不能保证可以正常运行。
The following prerequisite knowledge is required to understand this documentation:
FlumeBase本身是用一个tar包发布的。可以通过解压一个tar包来安装FlumeBase。
$ tar vzxf flumebase-(version).tar.gz
这将解压到一个名为flumebase-(version)/的目录。
默认情况下,FlumeBase被配置成运行在一个组合了交互式shell和执行引擎的单进程中。关闭shell也将关闭执行环境,包含运行着的所有查询。这可能对评估FlumeBase来讲很有用,但是对于比较正式的场景下,执行环境应该运行在一台服务器的守护进程上。客户端被配置为连接到这个服务器,或者用户明确的指定去这样做。
为了达到在评估FlumeBase中0配置的目的,FlumeBase进程也自己包含了一个内嵌的Flume主节点。如果要和一个已存在的流动数据源交互,也需要重新配置为指向一个已经存在的Flume部署环境。
在查询执行引擎所要运行在的服务器上安装FlumeBase。接着编辑etc/flumebase-site.xml
文件,包含下列的值。
表1:FlumeBase服务器的配置项 |
|
属性 |
值 |
|
The path to $FLUME_HOME on your server. |
|
The port where the FlumeBase server listens for clients. |
|
This should be set to |
|
The hostname of the foreign Flume master to connect to. |
|
The port the foreign Flume master listens on. |
|
FlumeBase uses Flume collectors to receive data from the broader Flume network. set |
一些环境变量还控制了FlumeBase怎样找出各种路径,怎样实例化它的JVM。对这些环境变量的默认值可以在一个etc/flumebase-env.sh
文件中设置。为了方便已经有一个版本的模板文件供参考。FlumeBase将使用一个pidfile来保证多个服务器的实例不会竞争端口。Pidfile将被放在$FLUMEBASE_PID_DIR
指定的目录中。一个运行在后台的FlumeBase server把日志写入到$FLUMEBASE_LOG_DIR
指定的目录的一个文件中。
最终,要运行在分布式的模式中,Flume的master节点需要注册FlumeBase的插件。你应该从FlumeBase的安装目录中复制flumebase-(version).jar
文件到FlumeBase的master节点的/usr/lib/flume/lib下。接下来,编辑在master上的flume-site.xml去包含下面的设置:
<property>
<name>flume.plugin.classes</name>
<value>com.odiago.flumebase.flume.FlumePlugin</value>
</property>
你可能需要重启一下Flume的master进程以使这些设置生效。
要学习怎样启动一个server,请看第七部分。
在每个用户用于提交查询到FlumeBase系统的客户端上都安装一个FlumeBase的副本。这个客户端必须可以对FlumeBase server打开一个TCP连接。为了在FlumeBase的控制台看到输出的事件,FlumeBase server也必须可以反过来对客户端建立一个TCP连接。
在client的机器上的etc/flumebase-site.xml
设置一下内容:
表2:FlumeBase的客户端配置 |
|
属性 |
值 |
|
The path to $FLUME_HOME on the client. |
|
The host:port of the FlumeBase server to connect to. If set to |
|
Defaults to |
|
FlumeBase uses a Thrift RPC connection to relay query output back to the client. The client listens on the port specified by this property. |
FlumeBase系统是由一个命令行客户端、一个成为执行环境的服务器和负责收集和传输数据的Flume系统组成。这些可能被配置为单独的、分布式的进程、或者相对的在一个机器上甚至是在一个进程中。
命令行客户端是这里面最简单的组件。这个进程直接被一个用户运行(可能是一个服务器、但是更多的是他的桌面电脑或者笔记本)。它需要连接到执行环境。这个客户端提供给用户一个提示信息,这个提示中可能会有新的查询或者控制语句被给出。
每一个查询(比如说,SELECT语句)会产生一个在执行环境中的流。用户可能需要订阅正在运行的流(这对于用户新创建的流是自动完成的)。当一个订阅的流发出一个输出事件,它的文本将被打印到客户端的终端上。
关闭客户端不会终止任何已提交的流,它们运行在执行环境中,执行环境是一个单独的可以被多个用户共享的常驻进程。一个执行环境保存着所有流的定义(用CREATE STREAM创建
),并处理运行中的流。所以执行环境一般运行在专用的服务器上。为了测试的需要,可能也会包含在和命令行客户端相同的进程中。(当执行环境内嵌到客户端的时候,关闭客户端将关闭所有的流,并且不能够在获得这些流)
提交的查询可以在流的数据上做计算。流被定义为一个事件集,就类似于在以表为基础的SQL执行环境中的记录。这些事件直接和Flume中的事件连接。用户需要在查询之前先定义这个流,这个定义指定了在这个事件中的字段,包括怎样把事件主体转换成字段和这个流起源于哪里。每一个查询流本身是一个流,它的输出是一系列的事件,这些输出的事件是基于用户指定的计算处理过程和这个查询流所输入的事件集。
默认情况下,被用户提交的查询将导致一个没有名称标识的查询流,这个查询流只会把它的输出传送给订阅的客户端实例。这些查询流在没有用户订阅的时候持续的运行,但是这时候所生成的输出结果将被丢弃掉(而且也没办法在此获取)。
用户可以给运行的查询流绑定一个名称(或者在使用CREATE STREAM AS SELECT语句提交一个查询流的时候这样做
)。这个名称被作为一个Flume逻辑节点的名称,这个逻辑节点把这个查询流的结果作为一个Avro编码的事件集广播出去。用户可以接着使用Flume的shell把这个逻辑节点配置成把一个该输出结果的拷贝定向到一个监控的应用,比如持久化存储(比如HDFS)或者其他的应用。
FlumeBase通过修改在CREATE STREAM语句中指定的节点的接收器的定义来从一个Flume的网络读取。当一个逻辑节点被确定为一个流的源头,它的接收器定义被重写为一个包含它原有的接收器和一个新的代理接收器的新的接收器,这个新的代理接收器负责把这个节点的输出推送给在FlumeBase执行环境中的一个
collector source 。(FlumeBase将拥有一个内嵌的Flume物理节点,这节点将拥有托管给它的一个逻辑节点作为接受和传送事件流的必要条件).当一个流被丢弃掉(使用DROP STREAM或者\shutdown!直接关掉执行环境
)的时候,最初的逻辑节点的定义会被恢复为提供数据流的那个逻辑节点。
在FlumeBase执行环境和Flume之间的交互式通过Flume的master节点的thrift接口完成的。寄宿在一个执行环境中的物理节点是被Flume的master节点所控制的,而且是对于所有的Flume节点都是这样的。因为这个原因,查询流可能需要花费几秒钟去初始化或者取消,因为这些都依赖于Flume方面的配置。一旦初始化成功,查询流将在事件的处理上有较低的延时。如果没有外部的Flume网络可用,你可以配置Flume的执行环境来维护一个内嵌的Flume的master节点,以用于测试或者单机计算的目的。
FlumeBase server允许一个不需要持续的shell会话的server进程去处理查询。FlumeBase shell实例可以连接到一个本地或者远程的server实例去提交查询。在运行FlumeBase server之前请参考前面的讲述配置好server。
FlumeBase server可以通过在FlumeBase的安装目录下运行bin/flumebase server来启动一个前台的server进程。
FlumeBase server也可以通过运行bin/flumebase start启动
在后台运行。 运行日志将被输出到$FLUMEBASE_LOG_DIR
(默认为$FLUMEBASE_HOME/logs
)中的一个日志文件。如果server出现不正常的情况,运行bin/flumebase start -debug
可以开启调试的日志。
可以在FlumeBase的shell中停止一个运行的server。要知道怎样操作,请参考8.2节。
要从命令行关闭server,可以通过运行bin/flumebase stop
完成。这可能需要花费几秒钟,因为FlumeBase需要发送一套指令到Flume的master节点以还原它的流到初始的状态并拔除运行的查询。一个强制的杀掉(比如,kill 9)FlumeBase server 进程的方式是不推荐的。
FlumeBase shell使得用户可以和FlumeBase的环境交互。默认的FlumeBase的配置是连接到在相同的进程中的一个作为shell的单一线程。你也可以连接到一个运行在其他进程(可能是相同的机器或者是不同的机器)中的远程执行环境。
FlumeBase shell可以被用来发送rtsql语句到执行环境。它还定义了一些用于用户对shell或者执行环境本身的控制命令。
要启动FlumeBase的shell,请在FlumeBase的安装目录下运行bin/flumebase shell
。
这如上面所说的,FlumeBase的默认设置文件会导致自动连接到本地的环境。你可以运行下面的命令连接到远程的环境:
rtsql> \open server [port]
你可以运行下面的命令明确的连接到本地环境:
rtsql> \open local
shell一次只能连接到一个环境。一个\open命令自动断开之前连接的任何执行环境。你可以执行下面的铭刻明确地断开与执行环境的连接:
rtsql> \disconnect
你可以使用如下的命令关闭shell:
rtsql> \q
下面的命令与上面的功能相同:
rtsql> exit;
你可以运行下面的命令关闭执行环境(这将关闭所有运行着的查询流):
rtsql> \shutdown!
每一个SELECT语句都被实例化成在执行环境中的一个查询流。查询流是持久的,它们无限期的连续从对应的Flume数据源读取数据,即使和客户端断开了连接。
你可以运行下面的命令得到一个所有运行着的查询流的清单:
rtsql> \f
下面给出了上面的命令返回的信息的各字段含义:
表6.运行的流清单的字段 |
|
列 |
描述 |
Watch? |
如果你正在你的控制台监视这个流的输出,这个列就包含一个*。 |
FlowId |
该查询流对应的数值ID。对流的控制的命令会用到这个ID 。 |
Stream |
如果这个查询流的输出是作为一个流(比如 |
Query |
用于创建该流的rtsql的查询语句 |
默认情况下,当你提交一个查询流时(也就是运行一个SELECT语句),你就在监视它的输出。被这个查询流生成的任何事件都将被打印到你的控制台。你可以通过\u
或者 \unwatch命令取消对一个查询流的监控。
下面的命令取消了对flowid为3的查询流的监视:
rtsql> \u 3
(你可以先通过\f命令找到一个查询流的flowId)
你可以使用\w
或者\watch命令重新订阅一个查询流。下面的命令重新订阅了上面相同查询流的输出:
rtsql> \w 3
你可以配置你的会话不在你创建查询流的时候自动的监视它的输出。你可以接下来明确的监视你创建的任何查询流,如果你需要查看它的输出的话。这个特性是被在回话配置中的flumebase.flow.autowatch
配置项所控制。
你可以使用\d或者\D命令完全取消一个查询流。这个命令后面需要有一个要取消的查询流的FlowId 。\d的命令不阻塞,\D将一直等到查询流完成之后再返回。
rtsql> \d 3
如果一个查询流是通过CREATE STREAM AS SELECT
语句创建的,和这个查询流相关的流的名称可以通过\dname命令在不停止这个查询流的情况下被移除。
rtsql> CREATE STREAM foo AS SELECT x FROM bar;
Started flow: flow[mId=5]
rtsql> \dname 5
从查询流5中移除了流的名称
一个新的流的名称接下来可以关联到相同的查询流上:
rtsql> \name 5 baz
在查询流5上创建了名为“baz”的名称。
一个流的名称可以通过\name命令被关联到任何运行着的查询流上。这用相同的名称创建了一个新的Flume逻辑节点作为流。它的源头带有包含了被查询流输出的字段的avro表示形式。一个查询流一次只能和一个流的名称相关联。
每一个客户端都会有一个和它相关的配置,这最初是由配置文件来初始化的。这些配置是一个键值对的集合,这里的键和值都是字符串。这些配置信息可以使用\set命令查看。
rtsql> \set
io.seqfile.compress.blocksize = '1000000'
io.skip.checksum.errors = 'false'
fs.checkpoint.size = '67108864'
...
配置的键是分层次的。你可以通过输入\set prefix.
: 查看任何一个前缀后跟一个”.”的配置键的信息。
rtsql> \set flumebase.
flumebase.flume.master.port = '35873'
flumebase.flume.master.host = 'localhost'
flumebase.autoconnect = 'local'
你也可以查看任何指定的键的信息:
rtsql> \set flumebase.autoconnect
flumebase.autoconnect = 'local'
这个命令也可以被用来给键设置相应的值:
rtsql> \set flumebase.flume.master.port=12345
flumebase.flume.master.port = '12345'
设置配置值并不影响之前提交的任何查询流。新创建的查询流可能会被所设置的配置键控制。
任何时候输入一个命令,都可以通过追加一个\c到当前行的方式把这个命令取消。
rtsql> SELECT something where I made a typo
-> and then continued \c
rtsql>
可以通过输入help或者\h来获取帮助信息,这将给出所有可以使用的命令的清单:
rtsql> \h
All text commands must end with a ';' character.
Session control commands must be on a line by themselves.
Session control commands:
\c Cancel the current input statement.
\d flowId Drop the specified flow.
\D flowId Drop a flow and wait for it to stop.
...