需求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.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.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上的日志