一:Hdfs?Sink
Flume可以很方便以扩展的方式写入数据到hdfs,基于分层的方式可以有效分担namenode集群的压力,一个hdfs?sink可以写数据到多个bucket中,但是一个事件将只会进入到一个bucket中,每当数据被成功写入hdfs,数据才会从channel中删除,如果失败或者超时,channel会回滚事物且关闭要写入的文件。
想一下,我们有这样一个需求,需要将数据写入到当前时间所在的目录下面,以便跟踪和区分数据,不出所料,hdfs?sink?提供了很强大的时间戳转义,基于报头的值,sink可以替换多个转义序列为相应的值,hdfs?sink将时间戳的值定义为从1970年1月1日以来00:00:00格式的总秒数。
关于hdfs?sink时间戳的转义可以参见官网:http://flume.apache.org/FlumeUserGuide.html。
hdfs?sink?有很多配置参数,可以方便在一个很好的粒度级别来控制hdfs?sink的表现,下面列举一些重要的配置。
type:?hdfs
hdfs.path:sink写入的目录路径
hdfs.filePrefix:文件名的前缀
hdfs.inUsePrefix:hdfs正在写入的文件名的前缀
hdfs,inUseSuffix:hdfs正在写入的文件名的后缀
hdfs,timeZone:在创建bucket路径时的时区
hdfs.rollInterval:文件在保存之前的时间
hdfs.rollSize:文件在保存之前写入文件的最大事件数
hdfs.batchSize:每批次写入事件的最大值
hdfs.useLocalTimeStamp?:?默认是false,如果设置为true,那么hdfs?sink将会使用当前agent的时间戳用来基于时间的分桶
hdfs.round:用来标明事件的时间戳是否向下取整
hdfs.roundUnit:配置时间的单位
hdfs.fileType:使用的文件格式,默认是SequenceFile
hdfs.threadsPoolSize:线程池中执行hdfs操作的线程数
二:Hbase?Sink
Hbase是一个列式数据库,flume支持2种hbase,一种是安全的hbase?sink,但是是阻塞的,执行效率比较慢,另一种是aysnc?hbase?sink,该sink是非阻塞的,使用多线程写入数据到hbase,执行效率更快,但是其不支持安全的Hbase。
Hbase的参数配置和hdfs差不多,下面列举一些不一样的地方
Type:hbase
Table:sink写入事件的表,这个表必须再hbase中先存在,因为flume不会自动建表
columnFamily:创建的列所在的列族
batchSize:每次批量写事件的数量
zookeeperQuorum,hbase集群依赖的zookeeper服务列表,hbase自带了默认的,如果你的机器没有ZK集群服务的话
三:flume收集日志到hdfs和hbase
?3.1:写入hdfs
? 在flume安装路径的conf目录下,新建一个文件hdfs-test.conf,修改后保存退出。具体配置如下:
? 2个Source,2个Channel,2个sink。不同的sink经不同的channel写入到不同的hdfs目录下面,k1会根据配置的参数将数据放在当前机器时间的目录下面,k2则是一个普通的目录。
然后启动hdfs:
然后进入flume安装路径下的bin目录执行:
运行后可以看到:
打开hdfs管理界面
3.2?写入Hbase
? hbase是一个列式数据库,flume的配置文件如下:
启动hbase:
先看一下,咱们采集的文件hbase.log的内容
然后进入flume安装目录下bin下启动配置的hbase.conf。
发现hbase里面表testflume对应已经有数据了。
?
原文:http://tanjie090508.iteye.com/blog/2287668