XY个人记
Apache Flume 用于移动大规模批量流数据到 HDFS 系统。从Web服务器收集当前日志文件数据到HDFS聚集用于分析,一个常见的用例是Flume。
Flume最早是Cloudera提供的日志收集系统,目前是Apache下的一个孵化项目,Flume支持在日志系统中定制各类数据发送方,用于收集数据。Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据。它具有基于流数据流的简单灵活的架构。它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错能力。它使用简单的可扩展数据模型,允许在线分析应用程序。Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase。
Flume 支持多种来源,如:
-
“tail”(从本地文件,该文件的管道数据和通过Flume写入 HDFS,类似于Unix命令“tail”)
-
系统日志
-
Apache log4j (允许Java应用程序通过Flume事件写入到HDFS文件)。
Flume的工作方式有两种Flume-og(Cloudera)和Flume-ng(Apache)。
Flume-og采用了多Master的方式。为了保证配置数据的一致性,Flume引入了ZooKeeper,用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点。Flume Master间使用gossip协议同步数据。
Flume-ng最明显的改动就是取消了集中管理配置的 Master 和 Zookeeper,变为一个纯粹的传输工具。Flume-ng另一个主要的不同点是读入数据和写出数据现在由不同的工作线程处理(称为 Runner)。 在 Flume-og 中,读入线程同样做写出工作(除了故障重试)。如果写出慢的话(不是完全失败),它将阻塞 Flume 接收数据的能力。这种异步的设计使读入线程可以顺畅的工作而无需关注下游的任何问题。而我们现在用的就是Flume-ng。
Flume-ng
Flume-ng只有一个角色的节点:agent的角色,agent由source、channel、sink组成。
Source:Source用于采集数据,Source是产生数据流的地方,同时Source会将产生的数据流传输到Channel
Channel:连接 sources 和 sinks ,这个有点像一个队列。
Sink:从Channel收集数据,将数据写到目标源,可以是下一个Source也可以是HDFS或者HBase。
Event是Flume数据传输的基本单元
source监控某个文件,将数据拿到,封装在一个event当中,并put/commit到channel当中,channel是一个队列,队列的优点是先进先出,放好后尾部一个个event出来,sink主动去从channel当中去拉数据,sink再把数据写到某个地方,比如HDFS上面去。
设置多代理流程
为了跨多个代理或跳数据流,先前代理的接收器和当前跳的源需要是avro类型,接收器指向源的主机名(或IP地址)和端口。
合并
日志收集中非常常见的情况是大量日志生成客户端将数据发送到连接到存储子系统的少数消费者代理。例如,从数百个Web服务器收集的日志发送给写入HDFS集群的十几个代理。
这可以通过使用avro接收器配置多个第一层代理在Flume中实现,所有这些都指向单个代理的avro源(同样,您可以在这种情况下使用简单的方式 sources/sinks/clients)。第二层代理上的此源将接收的事件合并到单个信道中,该信道由接收器消耗到其最终目的地。
多路复用流程
Flume支持将事件流多路复用到一个或多个目的地。这是通过定义可以复制或选择性地将事件路由到一个或多个通道的流复用器来实现的。
上面的例子显示了来自代理“foo”的源代码将流程扇出到三个不同的通道。这个扇出可以复制或多路复用。在复制流的情况下,每个事件被发送到所有三个通道。对于多路复用情况,当事件的属性与预配置的值匹配时,事件将传递到可用通道的子集。例如,如果一个名为“txnType”的事件属性设置为“customer”,那么它应该转到channel1和channel3,如果它是“vendor”,那么它应该转到channel2,否则转到channel3。可以在代理的配置文件中设置映射。
安装配置Flume
解压、并修改配置文件flume-env.sh
$ tar -zxf ../../software/apache-flume-1.7.0-bin.tar.gz -C ./
$ mv apache-flume-1.7.0-bin flume-1.7.0
$ cp flume-env.sh.template flume-env.sh
配置flume-env.sh中的
JAVA_HOME=/opt/modules/jdk1.7.0_67
运行之前先添加一些flume依赖的hdfs的jar包,添加到flume的lib目录
完成后配置是否成功
bin/flume-ng version
bin/flume-ng.sh 查看flume的flume-ng命令相关命令
Usage: bin/flume-ng <command> [options]...
commands:
agent run a Flume agent
avro-client run an avro Flume client
global options:
--conf,-c <conf> use configs in <conf> directory
agent options:
--name,-n <name> the name of this agent (required)
--conf-file,-f <file> specify a config file (required if -z missing)
avro-client options:
--rpcProps,-P <file> RPC client properties file with server connection params
--host,-H <host&g