您的位置:首页 > 其它

Hive入门--4.flume-数据收集工具

2016-07-22 12:25 351 查看

Flume简介

  flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。

  flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。



Flume安装

1. 解压 flume安装包到 /itcast/ 目录下

tar -zxvf /*flume安装包*/ /itcast/

2. 修改 flume配置文件:

2.1 flume-env.sh

修改文件名称:

mv flume-env.sh.template flume-env.sh

添加
java_home
,保证
flume
所使用的jdk和hdfs是一样的(可以使用
echo JAVA_HOME
查看当前机器所使用的javaHome所在路径)

2.2 编写agent配置文件a4.conf

定义agent名, source、channel、sink的名称

a4.sources = r1

a4.channels = c1

a4.sinks = k1

具体定义source

a4.sources.r1.type = spooldir #具体实现类是通过反射加载的

a4.sources.r1.spoolDir = /root/logs #监听这个目录

具体定义channel

a4.channels.c1.type = memory #

a4.channels.c1.capacity = 10000 #多少条数据进行一次发送

a4.channels.c1.transactionCapacity = 100 #事物的容量

定义拦截器,为消息添加时间戳

a4.sources.r1.interceptors = i1

a4.sources.r1.interceptors.i1.type= org.apache.flume.interceptor.TimestampInterceptor$Builder

具体定义sink

a4.sinks.k1.type = hdfs

a4.sinks.k1.hdfs.path = hdfs://ns1/flume/%Y%m%d #根据时间动态生成

a4.sinks.k1.hdfs.filePrefix = events- #产生日志的前缀

a4.sinks.k1.hdfs.fileType = DataStream #纯文本方式接收

不按照条数生成文件

a4.sinks.k1.hdfs.rollCount = 0 #多少条flush成1个文件

HDFS上的文件达到128M时生成一个文件

a4.sinks.k1.hdfs.rollSize = 134217728 #文件达到多大时flush成一个文件

HDFS上的文件达到60秒生成一个文件

a4.sinks.k1.hdfs.rollInterval = 60 #flush成一个文件的时间间隔

组装source、channel、sink

a4.sources.r1.channels = c1

a4.sinks.k1.channel = c1

3. 启动flume

先切换到
/itcast/apache-flume-1.5.0-bin/
目录下:

输入命令:

bin/flume-ng agent -n a4 -c conf -f conf a4.conf -Dflume.root.logger=INFO,console

命令解释:



启动后有可能遇到如下的错误,这里一一列举出来,出错的童鞋对号入座:

错误1:



解决:说明缺少jar包,拷贝
/itcast/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar
/itcast/apache-flume-1.5.0-bin/lib/
文件夹下

使用scp命令:



错误2:



解决:说明缺少jar包,拷贝
/itcast/hadoop-2.6.0/share/hadoop/common/lib/commons-configuration-.jar
/itcast/apache-flume-1.5.0-bin/lib/
文件夹下



错误3:



解决:将/itcast/hadoop-2.6.0/share/hadoop/common/lib/ hadoop-auth-2.6.0.jar拷贝到flume/lib目录下

错误4:



解决:在 /root目录下创建logs目录 :mkdir /root/logs

错误5:



解决:告知flume ns1的配置信息

1)拷贝core-site.xml和 hdfs-site.xml到flume的conf目录下

scp /itcast/hadoop-2.6.0/etc/hadoop/{core-site.xml, hdfs-site.xml}

192.168.1.204:/itcast/apache-flume-1.5.0-bin/conf


2)修改/etc/hosts 文件,让该主机知道itcast01 和itcast02的IP地址

添加itcast01 和itcast02 ip和主机名的映射

3)拷贝hadoop-hdfs-2.6.0.jar



如果出现如下的内容并且显示在不断滚动,说明没问题了,flume启动成功!

启动成功之后的样子应该是这样的:



3.1 写入测试

现在如果向 /root/logs 目录下丢进文件,flume则会将这个文件下的内容写入hdfs中

先执行命令:

bin/flume-ng agent -n a4 -c conf -f conf/a4.conf
-Dflume.root.logger=INFO,console


启动flume之后,将日志文件 access_2013_05_30.log 放到 logs 文件夹下:





通过网页查看hdfs,发现多了一个目录 /flume ,在这个目录下的文件有 20160618 ,说明文件是以时间命名的



/flume/20160618 这个文件夹下



问题:为什么生成的是3个文件,我写入的不是1个吗?而且这3个文件大小加起来刚好等于日志文件access_2013_05_30.log的大小

原因:这里sink设置了每60秒滚动写入一次或者当缓冲区文件大小达到134217728字节(128M)时进行滚动写入。

通过计算时间,写入总共花费几分钟,那势必第二个滚动选项是无法满足的,所以文件每60s的时候刚刚读入了一部分,接着就被写入hdfs中了。

4.flume的另外一种配置

source—exec

channel—memory

sink—logger

启动方式和之前的一样,只是读入的配置文件不同:

bin/flume-ng agent -n a2 -f /home/hadoop/a2.conf -c conf -Dflume.root.logger=INFO,console

a2.conf配置文件:

定义agent名, source、channel、sink的名称

a2.sources = r1

a2.channels = c1

a2.sinks = k1

具体定义source

a2.sources.r1.type = exec

a2.sources.r1.command = tail -F /home/hadoop/a.log

具体定义channel

a2.channels.c1.type = memory

a2.channels.c1.capacity = 1000

a2.channels.c1.transactionCapacity = 100

具体定义sink

a2.sinks.k1.type = logger

组装source、channel、sink

a2.sources.r1.channels = c1

a2.sinks.k1.channel = c1

监控当有数据写入这个log文件中时,flume将这些数据采集并打印在控制台上

a) 就像tail –F file 命令一样

# echo 111111 >> log
# echo 222222 >> log
# echo 333333 >> log


以阻塞形式打印,向log文件中追加记录



b) 以a2.conf配置文件运行flume

将a2.conf文件拷贝到flume/conf 目录下

在/root目录下创建文件log

运行命令:

bin/flume-ng agent -n a2 -f /itcast/apache-flume-1.5.0-bin/conf/a2.conf
-c conf -Dflume.root.logger=INFO,console
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hive