使用Flume收集数据

安装并配置Flume

下载解压flume NG二进制文件apache-flume-1.6.0-bin.tar.gz

$ tar -xzf /opt/apache-flume-1.6.0-bin.tar.gz

创建符号链接,指向Flume安装路径

$ ln -s /opt/apache-flume-1.6.0 /opt/flume

定义环境变量,设置PATH

FLUME_HOME=/opt/flume

PATH=${FLUME_HOME}/bin:${PATH}

验证已把Hadoop函数库路径加入到CLASSPATH变量中(Flume要用到Hadoop函数库,因此需要检查Classpath,确认其中已包含了Hadoop函数库的目录)

$ echo ${CLASSPATH}

在Hadoop目录下创建Flume的conf路径

$ mkdir /home/hadoop/flume/conf

把所需的文件拷贝到刚创建的conf目录中

$ cp /opt/flume/conf/log4j.properties /home/hadoop/flume/conf

$ cp /opt/flume/conf/flume-env.sh.sample /home/hadoop/flume/conf/flume-env.sh

编辑flume-env.sh并设置JAVA_HOME

Flume各个部件

Flume进程的配置包含三个部件:信源、信宿和信道。Flume还提供了一个自定义信源、信道和信宿的接口。

信源在接收到足够数据可以生成一个Flume事件时,它会把新创建的事件发给信道,但如何处理事件却是对信源不可见的。在大多数情况下,事件就相当于一行接一行的文本。但是,事件并非全部是文本数据。例如,UDP syslogd信源所接收到的每个数据包当做一个事件,并在系统中传输。Flume NG支持使用一种序列生成器作为信源(主要用于测试),以及读取syslogd数据的信源(既支持TCP也支持UDP)

Flume支持logger、file_roll、HDFS、HBase、Avro(用于代理链)、null(用于测试)和IRC(用于互联网中继聊天服务)信宿,信宿等着从信道接收事件,接收到数据后,会把事件分发给各自的目标主机,还负责处理超时、重试以及循环之类的问题。

logsink和filesink完成的任务完全相同,log信宿比其它信宿更适合用作调试工具,它不仅仅记录Flume捕获的信源信息,同时加入了许多元数据和事件。然而,文件信宿准确地记录输入数据,因为这些数据经过Flume时没有发生任何变化(如果要修改数据,也是可以实现的)。在大多数情况下,用filesink捕获输入数据,但在开发过程中可能需要用到logsink。

信道负责传输事件的通信机机制和保留机制。因为信源和信宿在读写数据方面可能有较大差异,或者信源有时需要暂停数据写入(例如在切换到新文件的时候,或处理系统I/O阻塞的时候),所以需要信道在信源和信宿之间缓存数据。使用Memory信道时,代理从信源把事件读入内存,然后传给信宿,若代理进程在该过程中崩溃,那么此时Memory信道中的所有数据都会永久丢失。而file和JDBC信道会永久存储事件,以防这种意外的数据丢失。在从信源读取事件之后,file信道将事件内容写入文件系统上的文件,只有代理成功将事件传给信宿后,才会删除该文件。类似地,JDBC信道使用一个内嵌的Derby数据库以可恢复的形式存储事件。

配置文件

新建agent1.conf文件,并保存至Flume的工作路径(/home/hadoop/flume),下面前三行中的每一行都可以有多个值,以空格为分隔符。为了简便可以在一个配置文件中完成多个代理的设置。某个代理也可以包含多个流

agent1.sources=netsource execsource avrosource

agent1.sinks=logsink filesink hdfssink avrosinkavro信宿不会把事件写入本地文件呀HDFS文件,而是把事件发给远程Avro信源

agent1.channels=memorychannel filechannel jdbcchannel


agent1.sources.netsource.type=netcat(监听某个端口上的网络连接)

agent1.sources.netsource.bind=localhost

agent1.sources.netsource.port=3000

agent5.sources.netsource.interceptors=ts(加入拦截器,在从信源向信宿传输事件的过程中操作和修改事件。不仅可以实现数据的自动分块,简化了数据管理,而且便于MapReduce作业使用这些数据)

agent5.sources.netsource.interceptors.ts.type=org.apache.flume.interceptor.TimestampInterceptor

agent2.sources.execsource.type=exec(该信源在主机上执行一条命令并将输出作为Flume代理的输入。exec信源能使用多条命令以生成持续的数据流,还可以配置在命令终止的时候重启命令)

agent2.sources.execsource.command=cat /home/hadoop/message(启动代理前,$ echo "Hello again Flume!"> /home/hadoop/message)

agent3.sources.avrosource.type=avro(avro是一个数据序列化框架,负责对数据进行封包,并所数据从网络中的一个地方传到另一个地方)

agent3.sources.avrosource.bind=localhost

agent3.sources.avrosource.port=4000

agent3.sources.avrosource.threads=5


agent1.sinks.logsink.type=logger(把输出写入一个日志文件)

agent2.sinks.filesink.type=FILE_ROLL

agent2.sinks.filesink.sink.directory=/home/hadoop/flume/files

agent2.sinks.filesink.sink.rollInterval=0(默认情况下,Flume每隔30秒将输出滚动写入到一个新文件中。为了便于在单个文件中跟踪Flume的输出,这里设置为0)

agent4.sinks.hdfssink.type=hdfs

agent4.sinks.hdfssink.hdfs.path=/flume(最好把这些数据写入位置视为临时集结区,Flume先把数据写入这个位置再进行处理。在数据处理结束之后,这些数据应该被移到长期目录结构)

agent5.sinks.hdfssink.hdfs.path=/flume-%Y-%m-%d

agent4.sinks.hdfssink.hdfs.filePrefix=log-

agent4.sinks.hdfssink.hdfs.rollInterval=0

agent4.sinks.hdfssink.hdfs.rollCount=3(每个文件最多只能存储3条数据)

agent4.sinks.hdfssink.hdfs.fileType=DataStream

agent6.sinks.avrosink.type=avro

agent6.sinks.avrosink.hostname=localhost

agent6.sinks.avrosink.port=4000



agent1.channels.memorychannel.type=memory

agent1.channels.memorychannel.capacity=1000

agent1.channels.memorychannel.transactionCapacity=100

agent2.channels.filechannel.type=file

agent2.channels.filechannel.checkpointDir=/home/hadoop/flume/fc/checkpoint

agent2.channels.filechannel.dataDirs=/home/hadoop/flume/fc/data

agent3.channels.jdbcchannel.type=jdbc


agent1.sources.netsource.channels=memorychannel

agent1.sources.logsink.channel=memorychannel

agent2.sources.execsource.channels=filechannel

agent2.sinks.filesink.channel=filechannel

agent7.sinks.netsource.channels=memorychannel1 memorychannel2


agent7.sources.netsource.selector.type=replicating(信源选择器有两种工作模式:replicating;multiplexing,它会依据事件的特定头部字段值判断向哪个信道发事件)

启动一个Flume代理

$ flume-ng agent --conf conf --conf-file agent1.conf --name agent1 -Dflume.root.logger=INFO,console(日志输出到控制台,即同时输出到代理窗口)

在另一个窗口中,远程连接本地主机的3000端口,然后输入一些文本

$ curl telnet://localhost:3000 (打开远程连接会话的传统方式是使用telnet程序)

使用Ctrl+C关闭curl远程会话

查看位于Flume工作目录下的flume.log文件内容,当中就是输入的文本

$ tail flume.log

若是使用agent3配置(从远程客户端接收数据),则在另一个窗口中,使用Flume Avro客户端向agent3发送文件,avro客户端可用于读取文件内容并把它发给网络上任何位置的avro信源

$ flume-ng avro-client -H localhost -p 4000 -F /home/hadoop/message2

若使用agent4配置,启动代理并curl发送事件后,查看输出目录中的文件内容。Flume用.tmp后缀标记正在写入的文件,而MapReduce作业只处理完整文件。

$ hdfs dfs -ls /flume

$ hdfs dfs -cat "/flume/*"

agent6是实现多层Flume网络,信源和信宿都是avro类型。Flume支持用户构建非常复杂的分布式事件收集网络,不同类型的多个代理可以把事件会给链条中的下一个代理,成为事件汇集点。

agent7把事件写入多个信宿,设置信源选择器的类型为replicating,也就是说,所有事件都会同时发送给定义的两个信道。

信宿处理器把所有信宿看做一个信宿组,它会依据各个信宿的类型在事件到达时采取不同的措施。Flume定义了两种信宿处理器:故障恢复(failover)和负载均衡(loadbalancing)信宿处理器。loadbalancing每次向信宿发送一个事件,它采用轮询或随机算法选择下次要使用的信宿。如果某个信宿出现故障,信宿处理器会向另一个信宿发送相同事件,但发生故障的信宿仍然保留在信宿池中。与此不同,failover把所有信宿视为一个优先表,只有高优先级信宿发生故障后,它才会使用低优先级信宿。它会从优先表中删除发生故障的信宿,在经过一段冷却期后重试该信宿是否修复。

Sqoop和Flume

根据数据类型来选择。在很大程度上,Flume被设计成用于处理日志数据。如果用户在多个关系数据库中存有日志数据,使用Flume应该是个不错的选择。

非日志数据可能需要执行一些只有Sqoop才能完成的操作。如指定目标列的子集,需要处理结构化数据的各个字段,想要与Hive集成,此时无法使用Flume完成。当然,这些工具能协同完成更复杂的任务。我们可以使用Flume把事件汇聚到HDFS,使用MapReduce进行处理,然后通过Sqoop导出到一个关系数据库中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值