flume 框架

flume  数据采集框架 和telnet相同,都是监听数据,采集数据

     缺点:数据容易丢失,在机器死机就会丢失数据

 

  是一个分布式的对日志进行海量数据收集框架。(就是把数据收集回来后加工下再发出去)

 在hadoop0上部署一个flume agent(使用flume把数据从linux的文件夹上传到hdfs中)

 

总结:flume部署到每台服务器中去收集数据的,

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

配置文件如下

   注明: (flume是单门采集数据的工具,不需要运行在hadoop之上,也不需要拷贝到子节点,之是在在安装flume机器上配置环境变量即可)

 

0. 配置环境变量 vim /etc/profile   

export FLUME_HOME=/usr/local/work/flume
export PATH=.:$PATH:$FLUME_HOME/bin
之后: source /etc/profile
 
1.把apache-flume-1.4.0-bin.tar.gz和apache-flume-1.4.0-src.tar.gz在hadoop0上解压缩
解压: tar -zxvf apache-flume-1.4.0-bin.tar.gz
      tar -zxvf apache-flume-1.4.0-src.tar.gz 
 
重命名: mv apache-flume-1.4.0-bin flume
        
2.把解压缩后的apache-flume-1.4.0-src文件夹下的内容全部复制到apache-flume-1.4.0-bin文件夹中。(合并文件夹)      
 cp -rf apache-flume-1.4.0-src/* /usr/local/flume/     (命令要求中全是:10个都是 : y )
 
3.修改flume/conf 目录下的两个文件的名称(去掉文件的后缀),修改为:flume-env.sh 和 flume-conf.properties
    查看:more flume-env.sh  
    其中在 vim flume-env.sh中设置了JAVA_HOME=/usr/local/jdk
     保存退出
 
--------------------------------
命令行
 [root@hadoop100 apache-1.4.0-bin]#hadoop fs -ls /
创建文件夹:
 [root@hadoop100 apache-1.4.0-bin]#hadoop fs -mkdir /apache_logs
 
上传/apache_logs要有要分析的数据
 
   hadoop fs -put /usr/local/haoma.dat /usr/local/flume/apache_logs
   hadoop fs -put /usr/local/ziliao/date_2013_05_30.log /file/data20140302  
 
   (注意:  上传数据,data20140302就是新建的文件,装date_2013_05_30.log的内容的)
 
cmd下 hadoop0下删除日志:
 
删除hadoop上指定文件
 
hadoop fs –rm [文件地址]
hadoop fs –rm /user/t/ok.txt
 
删除hadoop上指定文件夹(包含子目录等)
 
hadoop fs –rm [目录地址]
hadoop fs –rmr /user/t
 
 
 
-------------------------------------------
 
4.1 在flume/conf目录下创建一个文件,叫做a1.conf,添加文件内容如下:
 
(或者 上传一个已经配置好的文件a1.conf 即可)
  
############################################################################################
简单例子:
配置  HDFS Sink时首先需要将 
                          $HADOOP_HOME/hadoop-core-1.0.4.jar
                        和$HADOOP_HOME/lib/commons-configuration-1.6.jar 
                          拷贝到$FLUME_HOME/lib/下
 
############################################################################################
 
地址栏输入:file:///C:/Users/Administrator/AppData/Local/Temp/Rar$EXa0.648/apache-flume-1.4.0-bin/docs/FlumeUserGuide.html#flume-sources
即可查看flume官方文档说明
 
=============================================================================================
 
 
#配置代理
#a1是一个代理名称,#a1 表示agent名称,s1是source的名称,sink1是sink的名称,c1是channel的名称
a1.sources = s1
a1.sinks = sink1
a1.channels = c1
 
#配置一个专用于从文件夹中读取数据的source
a1.sources.s1.type = spooldir           #spooldir表示从文件夹读取数据 
a1.sources.s1.spoolDir = /apache_logs #值apache_logs表示数据文件的目录
a1.sources.s1.fileSuffix=.abc #值.abc表示数据文件被处理完后,被重命名的文件名后缀
a1.sources.s1.channels = c1 #值c1表示source接收数据后送到的channel的名称
 
#配置一个专用于把输入写入到hdfs的sink
a1.sinks.sink1.type = hdfs                               #配置输出到HDFS中  
a1.sinks.sink1.hdfs.path=hdfs://hadoop100:9000/apache_logs #值表示目的地
a4.sinks.k1.hdfs.filePrefix = events-
a4.sinks.k1.hdfs.rollCount = 0
a4.sinks.k1.hdfs.rollsize = 67108864
a4.sinks.k1.hdfs.rollInterval = 60     
a1.sinks.sink1.hdfs.fileType=DataStream  #值DataStream表示文件类型,不会被压缩
a1.sinks.sink1.hdfs.writeFormat=Text         #针对DataStream,使用Text输出格式
a1.sinks.sink1.channel = c1         #值c1表示sink处理数据的来源
 
#配置一个内存中缓存处理的channel(寄存数据)
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000      (多大容量)
a1.channels.c1.transactionCapacity = 100   (写入次数)
--------------------------------------------------------
整理如下:
#定义agent名, source、channel、sink的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1
 
#具体定义source
a4.sources.r1.type = spooldir
a4.sources.r1.spoolDir = /usr/local/soft/logs   #这路径是本地存放数据的位置
 
#具体定义channel
a4.channels.c1.type = memory
a4.channels.c1.capacity = 1000
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://master200:9000/flume/sms/%Y-%m-%d-%H:%M:%S  #这是上传数据的内容位置,以时间来为数据文件命名
a4.sinks.k1.hdfs.filePrefix = events-
a4.sinks.k1.hdfs.rollCount = 0
a4.sinks.k1.hdfs.rollsize = 67108864
a4.sinks.k1.hdfs.rollInterval = 60    
 #######################
a4.sinks.k1.hdfs.fileType = DataStream           #值DataStream表示文件类型,不会被压缩
#组装source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1
 
--------------------------------
主节点机器上启动Flume :   在flume目录下执行:
  
启动Flume命令
 
   bin/flume-ng agent -n a4 -c conf/ -f conf/flume.conf -Dflume.root.logger=INFO,console 
  # bin/flume-ng agent -n a4 -c conf/ -f conf/flume.conf -Xmx100m -Dflume.root.logger=INFO,console 
 
要是执行不了,就重新启动hadoop :start-all.sh 再试试
 
#########################################################################################
 
见证效果 详解:
 
 在命令行1窗口:启动上面flume命令之后,发现在运行状态下
(这时1窗口是监控本地.../logs有没有被存放进来数据,已被发现有数据存放时,就开始把数据按照路径上传到hdfs中), 
这时 要另起一个命令行窗口2,在此开始上传数据(按照上面配置,来存放数据到logs里面,就被发现,这时窗口1就开始运行显示被上传数据信息),
这过程 就是flume的运行过程!
 
步骤一:窗口1命令行: 开启 bin/flume-ng agent -n a4 -c conf/ -f conf/flume.conf -Dflume.root.logger=INFO,console  开始监控logs有没有数据
 
步骤二:窗口2命令行:cp data2.dat /usr/local/work/logs    开始cp数据到logs
 
步骤三:查看窗口一显示数据变化(显示数据上传过程,即是成功!)
 
注意:
/usr/local/soft/logs   #这路径是本地存放数据的位置
 
hdfs://master200:9000/flume/sms/%y-%m-%d  #这是上传数据的内容位置,以时间来为数据文件命名
 
 
 
总结: 监控一个文件 窗口1命令: tail -F /文件    窗口2:命令: echo "1">>文件   在写窗口2时,窗口1就接收到窗口2的数据.
也可以监控一个端口
 
#########################################################################################
 
 
 
cmd下 hadoop0下删除日志 
删除hadoop上指定文件
 
hadoop fs –rm [文件地址]
hadoop fs –rm /user/t/ok.txt
 
删除hadoop上指定文件夹(包含子目录等)
 
hadoop fs –rm [目录地址]
hadoop fs –rmr /user/t
 
cmd下操作 jconsole(电脑自带)   就打开java监视和管理控制台(ganglia,amban,hue等工具)
 
Ganglia是一个跨平台可扩展的,高 性能计算系统下的分布式监控系统,如集群和网格。它是基于分层设计,它使用广泛的技术,如XML数据代表,便携数据传输,RRDtool用于数据存储和可 视化。它利用精心设计的数据结构和算法实现每节点间并发非常低的。它已移植到广泛的操作系统和处理器架构上,目前在世界各地成千上万的集群正在使用。
 
 
 
#测试flume安装配置是否成功
# Describe the source   
a1.sources = r1  
a1.sinks = k1  
a1.channels = c1  
  
# Describe/configure the source  
a1.sources.r1.type = avro  
a1.sources.r1.bind = localhost  
sources.r1.port = 44444 
  
# Describe the sink  
# 将数据输出至日志中  
a1.sinks.k1.type = logger  
 
# Use a channel which buffers events in memory  
a1.channels.c1.type = memory  
a1.channels.c1.capacity = 1000  
a1.channels.c1.transactionCapacity = 100  
  
# Bind the source and sink to the channel  
a1.sources.r1.channels = c1  
a1.sinks.k1.channel = c1
 
========================================================