Flume之二

本文详细介绍了使用Flume进行文件采集到HDFS,包括按需忽略特定文件格式,以及Avro数据传输,展示了从一台机器到另一台机器的数据流动,并讨论了如何收集Windows FTP日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求1:采集本地一个文件夹下文件到hdfs上

定义agent如下:

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=spooldir
a1.sources.r1.spooldir=/home/hadoop/data/spool_data

a1.channels.c1.type=memory
a1.channels.c1.capacity=10000                                //保存在channel中的最大event数
a1.channels.c1.tarasactionCapacity=10000              //每次最多从sources抽取并送到sinks端的event数

a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path=hdfs://hadoop000:8020/data/flume/spool
a1.sinks.k1.hdfs.batchSize=10                    //刷新到hdfs上的event数量,默认值100
a1.sinks.k1.hdfs.fileType=DataStream     //可以是SenquenceFile,DataStream,CompressedStream。默认值为SenquenceFile
a1.sinks.k1.hdfs.writeFormat=Text         
a1.sinks.k1.hdfs.rollInterval=0                              //每隔多长时间,临时文件滚动成目标文件

a1.sinks.k1.hdfs.rollSize=10485760                      //当临时文件达到该大小时,滚动成目标文件
a1.sinks.k1.hdfs.rollCount=10000                          // 当events数据达到该数量时候,将临时文件滚动成目标文件


a1.sinks.k1.channel=c1

a1.sources.r1.channels=c1

保存为spool.conf文件,然后执行以下命令启动flume:

./flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/spool.conf \

-Dflume.root.logger=INFO,console

此时本地目录/home/hadoop/data/spool_data下如果有新的文件产生,则文件内容会被采集到hdfs的相应目录下

----------------------------------------------------------------------------------------------------------

需求2:按分钟收集本地目录下非.txt后缀的文件数据到hdfs上,以文件名格式“page-views.201804251259.bzip2”保存

定义agent如下:

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=spooldir
a1.sources.r1.spooldir=/home/hadoop/data/spool_data
a1.sources.r1.ignorePattern=^(.)*\\.txt       //忽略本地目录下以.txt结尾的文件

a1.channels.c1.type=memory
a1.channels.c1.capacity=10000

a1.channels.c1.tarasactionCapacity=10000


a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path=hdfs://hadoop000:8020/data/flume/logs/%Y%m%d%H%M    //%Y%m%d%H%M代表年月日分钟
a1.sinks.k1.hdfs.useLocalTimeStamp=true  //设置了%Y%m%d%H%M就需要打开一个时间戳,默认为false
a1.sinks.k1.hdfs.batchSize=10
a1.sinks.k1.hdfs.fileType=DataStream    //文件格为CompressedStream要配置一个hdfs.codeC值,即压缩格式
a1.sinks.k1.hdfs.codeC=bzip2   //采用bzip2格式,文件名会加.bzip格式
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.filePrefix=page-views  //文件名前缀为page-views
a1.sinks.k1.hdfs.rollInterval=0
a1.sinks.k1.hdfs.rollSize=10485760
a1.sinks.k1.hdfs.rollCount=10000

a1.sinks.k1.channel=c1
a1.sources.r1.channels=c1


保存为spool1.conf文件,然后执行以下命令启动flume:

./flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/spool1.conf \

-Dflume.root.logger=INFO,console

此时本地目录/home/hadoop/data/spool_data下如果有新的非以.txt结尾的文件产生,则文件内容会被采集到hdfs上,以相应的文件名保存

----------------------------------------------------------------------------------------------------------------


在1.7版本之后,出现了一个TailDir Source,既可以监控文件,也可以监控目录(仅作了解)


-----------------------------------------------------------------------------------------------------------------

需求3:实现一台机器到另一台机器的文件传输(avro)

A机器:avro-client ==>B机器: avro-source ==> memory-channel ==> logger

定义B机器的agent文件:

a1.sources=r1
a1.sinks=k1
a1.channels=c1


a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0  //本机
a1.sources.r1.port=44444  


a1.channels.c1.type=memory


a1.sinks.k1.type=logger

a1.sinks.k1.channel=c1
a1.sources.r1.channels=c1

保存为avro.conf ,然后执行以下命令启动flume:

./flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/avro.conf \

-Dflume.root.logger=INFO,console

在a机器上执行:

./flume-ng avro-client --host localhost --port 44444  --filename /home/hadoop/data/ruozedata.txt

这种方式只能传一次,完了就会中断

------------------------------------------------------------------------------------------------------------------------

对于需求3的实现,由于存在只能传一次的弊端,我们可以这样多次传输:

需求4:实现A机器到另B机器的文件传输(avro),将其打印在B机器控制台上

定义A机器的agent:

a1.sources=r1
a1.sinks=k1
a1.channels=c1


a1.sources.r1.type=exec
a1.sources.r1.command=tail -F /home/hadoop/data/logs  //本机


a1.channels.c1.type=memory


a1.sinks.k1.type=avro
a1.sinks.k1.hostname=0.0.0.0    //与B机器像对应
a1.sinks.k1.port=44444             //与B机器相对应


a1.sinks.k1.channel=c1

a1.sources.r1.channels=c1


保存为avro-a.conf



定义B机器的agent:

b1.sources=r1
b1.sinks=k1
b1.channels=c1

b1.sources.r1.type=avro

b1.sinks.k1.bind=0.0.0.0    //与A机器像对应
b1.sinks.k1.port=44444    //与A机器相对应


b1.channels.c1.type=memory

b1.sinks.k1.type=logger

b1.sinks.k1.channel=c1

b1.sources.r1.channels=c1

保存为avro-b.conf

现在B机器上执行:

./flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/avro-b.conf \

-Dflume.root.logger=INFO,console

然后在A机器上执行:

./flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/avro-a.conf \

-Dflume.root.logger=INFO,console


此时A机器目标目录下文件内容会被打印在B机器的控制台上

------------------------------------------------------------------------------------------------------

需求4的实现中,文件源端也需要配置一个agent,假设让你接收Windows端的日志,这就行不通了呀

需求5:收集windows的ftp软件产生的日志:

添加依赖:

<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-log4j12</artifactId>

    <version>1.7.5</version>

</dependency>

添加依赖后记得右击->maven->reimport以下

具体代码如下:

public class LogApp{

    private static Logger log=Logger.getLogger(LogApp.class.getName());

    public static void main (String [] args) throws Exception{

        int index=0;

        while(true){

            Thread sleep(1000);

            log.info("current value is:"+index++):

        }

    }

}

此时在项目工程中新建一个resources,选择resources,单击搜索框左边,选择Modules,找到resources,将其选择Mask as Resources。

在resources下新建一个log4j.properties,将log4j数据导入到里面。


完成以上步骤,运行代码,FTP软件控制台会不断打印出日志,我们要求将该日志通过flume收集并输出到控制台

我们可以借助于flume的log4j.appender来实现


定义agent文件:

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=avro

a1.channels.c1.type=memory

a1.sinks.k1.type=logger

a1.sinks.k1.bind=0.0.0.0    
a1.sinks.k1.port=44444  


b1.sinks.k1.channel=c1

b1.sources.r1.channels=c1

将以下代码添加至log4j.properties文件中

log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Hostname = hadoop000
log4j.appender.flume.Port = 44444
log4j.appender.flume.UnsafeMode = true

然后添加依赖:

<dependency>

    <groupId>org.apache.flume.flume-ng-clients</groupId>

    <artifactId>sflume-ng-log4jappender</artifactId>

    <version>1.6.0</version>

</dependency>


添加依赖后记得右击->maven->reimport以下

此时运行代码,控制台上将打印windows上的日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值