flume-ng+Hadoop实现日志收集

1.概述
flume是cloudera公司的一款高性能、高可能的分布式日志收集系统。
flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
flume传输的数据的基本单位是event,如果是文本文件,通常是一行记录,这也是事务的基本单位。
flume运行的核心是agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。通过这些组件,event可以从一个地方流向另一个地方,如下图所示。

flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分
 
source可以接收外部源发送过来的数据。不同的source,可以接受不同的数据格式。比如有目录池(spooling directory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有文件产生,就会立刻读取其内容。
channel是一个存储地,接收source的输出,直到有sink消费掉channel中的数据。channel中的数据直到进入到下一个channel中或者进入终端才会被删除。当sink写入失败后,可以自动重启,不会造成数据丢失,因此很可靠。
sink会消费channel中的数据,然后送给外部源或者其他source。如数据可以写入到HDFS或者HBase中。
flume允许多个agent连在一起,形成前后相连的多级跳。
如下图:

flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分

 
flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分
 

2.核心组件介绍
2.1 sources
Client端操作消费数据的来源,Flume支持Avro,log4j,syslog和http post(body为json格式)。可以让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。也可以 写一个Source,以IPC或RPC的方式接入自己的应用,Avro和Thrift都可以(分别有NettyAvroRpcClient和 ThriftRpcClient实现了RpcClient接口),其中Avro是默认的RPC协议。具体代码级别的Client端数据接入,可以参考官方手册
对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本可以实现无缝接入,不需要对现有程序进行任何改动。 
对于直接读取文件Source,有两种方式: 
  1. ExecSource: 以运行Linux命令的方式,持续的输出最新的数据,如tail -F 文件名指令,在这种方式下,取的文件名必须是指定的。 ExecSource可以实现对日志的实时收集,但是存在Flume不运行或者指令执行出错时,将无法收集到日志数据,无法保证日志数据的完整性。
  2. SpoolSource: 监测配置的目录下新增的文件,并将文件中的数据读取出来。需要注意两点:拷贝到spool目录下的文件不可以再打开编辑;spool目录下不可包含相应的 子目录。SpoolSource虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋近于实时。如果应用无法实现以分钟切割日志文件的话, 可以两种收集方式结合使用。 在实际使用的过程中,可以结合log4j使用,使用log4j的时候,将log4j的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。 log4j有一个TimeRolling的插件,可以把log4j分割文件到spool目录。基本实现了实时的监控。Flume在传完文件之后,将会修改文件的后缀,变为.COMPLETED(后缀也可以在配置文件中灵活指定)
2.2 Channel
当前有几个channel可供选择,分别是Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比较常见的是前三种channel。
MemoryChannel可以实现高速的吞吐,但是无法保证数据的完整性。
MemoryRecoverChannel在官方文档的建议上已经建义使用FileChannel来替换。
FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。 
File Channel是一个持久化的隧道(channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。Memory Channel是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果java进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到 RAM大小的限制,而File Channel这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。
更多资料请查看:

http://flume.apache.org/FlumeUserGuide.html#file-channel
http://flume.apache.org/FlumeUserGuide.html#memory-channel

2.3 sink
Sink在设置存储数据时,可以向文件系统、数据库、hadoop存数据,在日志数据较少时,可以将数据存储在文件系中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到Hadoop中,便于日后进行相应的数据分析.
更多sink的内容可以参考官方手册


3.准备安装文件
JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
flume+hadoop下载地址:http://archive-primary.cloudera.com/cdh4/cdh/4/

经过多版本的使用对比,得出结论,flume-ng和hadoop的版本一定要对应,否则会有各种各样的错误。
flume-ng:flume-ng-1.3.0-cdh4.2.0.tar.gz
hadoop:hadoop-2.0.0-cdh4.2.0.tar.gz
jdk:jdk-7u45-linux-x64.rpm

4.JDK的安装配置
# mkdir /usr/java
# rpm -ivh jdk-7u45-linux-x64.rpm --prefix /usr/java
安装完成后会自动生成则有/usr/java/jdk1.7.0_45文件夹
配置环境变量,修改/etc/profile文件(系统有效)或修改.bashrc文件(个人用户有效)
# vim /etc/profile
在末尾添加以下内容:
#java
export JAVA_HOME=/usr/java/jdk1.7.0_45
export JRE_HOME=/usr/java/jdk1.7.0_45/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
让/etc/profile文件修改后立即生效 ,可以使用如下命令:
# source /etc/profile
或重新登录
接下来,删除原有的jdk环境。
在添加删除程序里面,卸掉基本系统/java平台后还不够:
  首先,在终端中输入“rpm -qa|grep gcj”,查看gcj的版本号,在这里得到的结果是:
  java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
  libgcj-4.1.2-48.el5
  其次,卸载系统自带jdk。在终端中输入“yum -y remove java java-1.4.2-gcj-compat-1.4.2.0-40jpp.115”,然后等待,等待系统卸载完自带的jdk。最终在终端中显示“Complete!”,卸载完成。 
测试安装情况,查看版本号:java -version
flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分
 
5.hadoop的配置
 Hadoop有官方发行版与cloudera版,其中cloudera版是Hadoop的商用版本。
 Hadoop有三种运行方式:单节点方式、单机伪分布方式与集群方式。
   Hadoop分别从三个角度将主机划分为两种角色。
第一,划分为master和slave,即主人与奴隶;
第二,从HDFS的角度,将主机划分为 NameNode和DataNode(在分布式文件系统中,目录的管理很重要,管理目录的就相当于主人,而NameNode就是目录管理者);
第三,从MapReduce的角度,将主机划分为JobTracker和TaskTracker(一个job经常被划分为多个task,从这个角度不难理解它们之间的关系)。

为方便测试,我们安装伪分布式,salve为localhost(即为自身).
5.1 在/etc/hosts文件中添加名称映射
# vim /etc/hosts
192.168.10.89   master
192.168.10.89   slave1
5.2 关闭selinux和iptables
# sed  -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 
# service iptables stop
# chkconfig iptables off
5.3 设置SSH无密码登陆
首先在master主机上面设置好了SSH无密码登陆之后,然后将生成的id_dsa.pub文件拷贝到salve1上面去
# ssh-keygen -t rsa
#输入后,会提示创建.ssh/id_rsa、id_rsa.pub的文件,其中第一个为密钥,第二个为公钥。过程中会要求输入密码,为了ssh访问过程无须密码,可以直接回车 。
# cat ~/.ssh/id_rsa.pub >  ~/.ssh/authorized_keys
# chmod 700 ~/.ssh/authorized_keys
将公钥复制到被salve1上
# scp ~/.ssh/id_rsa.pub root@salve1:~/.ssh/authorized_keys
测试:
[root@master ~]# ssh salve1
The authenticity of host 'salve1 (192.168.20.111)' can't be established.
RSA key fingerprint is af:7f:cd:1d:6e:b0:76:a2:7d:de:8c:f6:a0:60:7b:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'salve1' (RSA) to the list of known hosts.
Last login: Fri Apr 25 01:33:12 2014 from 192.168.20.112
[root@salve1 ~]# 
5.4把hadoop-2.0.0-cdh4.2.0.tar.gz解压到/usr/local下并重命名为hadoop
# tar zxvf hadoop-2.0.0-cdh4.2.0.tar.gz
# mv hadoop-2.0.0-cdh4.2.0 /usr/loca/hadoop
5.5配置hadoop, 配置文件在/usr/local/hadoop/etc/hadoop目录下
5.5.1在hadoop-env.sh文件中添加JAVA_HOME
# cd /usr/local/hadoop/etc/hadoop/
# vim hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_45
5.5.2 在core-site.xml文件中添加配置信息
# vim core-site.xml
<configuration>
        <property>
               <name>fs.default.name</name>
               <value>hdfs://master:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
        </property>
        <property>
                <name>hadoop.native.lib</name>
                <value>true</value>
                <description>Should native hadoop libraries, if present, be used.</description>
        </property>
</configuration>
fs.default.name为namenode的交互端口,注意不要使用已经占用的端口就好
hadoop.tmp.dir是用来存储其他临时目录的根目录


5.5.3在hdfs-site.xml文件中添加配置信息
# vim hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/name</value>
</property>

<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/data</value>
</property>

<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
dfs.name.dir:存贮在本地的名字节点数据镜象的目录,作为名字节点的冗余备份
dfs.data.dir:datanode存储数据的根目录
dfs.replication:冗余数量,备份的数据量
dfs.http.address:namenode的http协议访问地址与端口


5.5.4在yarn-site.xml文件中添加配置信息
# vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
        <name>yarn.resoucemanager.address</name>
        <value>master:8032</value>
</property>
<property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
</property>
<property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
</property>
<property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:8033</value>
</property>
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce.shuffle</value>
</property>
</configuration>

5.5.5在slaves文件中写入hadoop datanode数据节点
# vim slaves 
slave1
5.6配置hadoop环境变量
# vim /etc/profile
在末尾添加以下内容:
export HADOOP_HDFS_HOME=/usr/local/hadoop
export YARN_HOME=/usr/local/hadoop
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_VERSION=0.20.2
export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native/Linux-amd64-64
export PATH=$PATH:$HADOOP_HOME/bin
配置生效
# source /etc/profile
ps:如果没有Linux-amd64-64目录可到这里下载:http://pan.baidu.com/s/1c0b6AQW
5.7格式化hadoop,在hadoop.master站点上执行
# hadoop namenode -format 
5.8启动关闭hadoop,显示hdfs状态等
# /usr/local/hadoop/sbin/start-all.sh
Starting namenodes on [master]
master: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-master.out
slave1: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-master.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-master.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-root-resourcemanager-master.out
slave1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-master.out
# jps
8347 Jps
7328 ResourceManager
6844 NameNode
7135 SecondaryNameNode
7441 NodeManager
6968 DataNode
# hadoop dfsadmin -report
# hadoop fs -ls /
注意:
hadoop 2.0取消了jobtracker和tasktracker,以YARN来代替,所以如果运行start jobtracker一类的,会报错。
#且hadoop,hdfs,map/reduce功能都分离出了单独脚本,所以不能用hadoop-daemon.sh启动所有了。
./yarn-daemon.sh start resourcemanager
#这个就相当于原来的jobtracker,用作运算资源分配的进程,跟namenode可放在一起。
./yarn-daemon.sh start nodemanager
#这个相当于原来的tasktracker,每台datanode或者叫slave的服务器上都要启动。


5.9 web端查看
flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分

flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分
  
6.flume的配置 
6.1把flume-ng-1.3.0-cdh4.2.0.tar.gz解压到/usr/loca/下并重命名为flume
# tar zxvf flume-ng-1.3.0-cdh4.2.0.tar.gz 
# mv apache-flume-1.3.0-cdh4.2.0-bin /usr/local/flume
# cd /usr/local/flume
6.2修改配置文件
flume的配置文件位于/usr/local/flume/conf目录下
6.2.1配置flume-env.sh文件
# vim flume-env.sh
# Enviroment variables can be set here.

JAVA_HOME=/usr/java/jdk1.7.0_45

# Give Flume more memory and pre-allocate, enable remote monitoring via JMX
JAVA_OPTS="-Xms128m -Xmx512m -Dcom.sun.management.jmxremote"
6.2.2配置服务端flume.conf文件
# vim flume.conf 
# Define a memory channel called ch1 on agent1
agent1.channels.ch1.type = memory
agent1.channels.ch1.capacity = 100000
agent1.channels.ch1.transactionCapacity = 100000
agent1.channels.ch1.keep-alive = 30

# Define an Avro source called avro-source1 on agent1 and tell it
# to bind to 0.0.0.0:41414. Connect it to channel ch1.
agent1.sources.avro-source1.channels = ch2
agent1.sources.avro-source1.type = avro
agent1.sources.avro-source1.bind = 0.0.0.0
agent1.sources.avro-source1.port = 41414
agent1.sources.avro-source1.threads = 20
#-->默认是replicationg,还有multiplexer
#agent1.sources.avro-source1.selector.type = multiplexer

agent1.channels.ch2.type = file
#-->检测点文件所存储的目录
agent1.channels.ch2.checkpointDir = /opt/flume/checkpoint
#-->数据存储所在的目录设置
agent1.channels.ch2.dataDirs = /opt/flume/data
#-->隧道的最大容量
#agent1.channels.ch2.capacity = 10000
#-->事务容量的最大值设置
#agent1.channels.ch2.transactionCapacity = 1000
#-->检测点之间的时间值设置(单位微秒)
#agent1.channels.ch2.checkpointInterval = 100000
#-->一个单一日志的最大值设置(以字节为单位)
#agent1.channels.ch2.maxFileSize = 2146435071
#-->一个存放操作的等待时间值(秒)设置
agent1.channels.ch2.keep-alive = 30

# Define a logger sink that simply logs all events it receives
# and connect it to the other end of the same channel.
agent1.sinks.log-sink1.channel = ch2
agent1.sinks.log-sink1.type = hdfs
#-->HDFS directory path (eg hdfs://master:9000/flume/log/%Y%m%d/)
agent1.sinks.log-sink1.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%{host}/%{name}
#-->Name prefixed to files created by Flume in hdfs directory
agent1.sinks.log-sink1.hdfs.filePrefix = %{host}_log
agent1.sinks.log-sink1.hdfs.useLocalTimeStamp = true
agent1.sinks.log-sink1.hdfs.inUseSuffix = .tmp
#-->Hdfs writeFormat( Text or Writable )
agent1.sinks.log-sink1.hdfs.writeFormat = Text
#SequenceFile   File format: currently SequenceFile or DataStream
agent1.sinks.log-sink1.hdfs.fileType = DataStream
#-->多少秒切割一个文件Number of seconds to wait before rolling current file (0 = never roll based on time interval)
agent1.sinks.log-sink1.hdfs.rollInterval = 600
#-->存储文件大小1KB=1028Byte,1MB=1024KB,File size to trigger roll, in bytes (0: never roll based on file size)
agent1.sinks.log-sink1.hdfs.rollSize = 0
#-->多少行写入一个文件Number of events written to file before it rolled (0 = never roll based on number of events)
agent1.sinks.log-sink1.hdfs.rollCount = 0
#number of events written to file before it flushed to HDFS
agent1.sinks.log-sink1.hdfs.batchSize = 10
agent1.sinks.log-sink1.hdfs.txnEventMax = 1000
agent1.sinks.log-sink1.hdfs.callTimeout = 60000
agent1.sinks.log-sink1.hdfs.appendTimeout = 60000
#-->Number of threads per HDFS sink for HDFS IO ops (open, write, etc.)
#agent1.sinks.log-sink1.hdfs.threadsPoolSize = 100
#-->Compression codec. one of following : gzip, bzip2, lzo, snappy,如果fileType类型为DataStream,则不能设codeC
#agent1.sinks.log-sink1.hdfs.codeC = gzip  

#another sink
#agent1.sinks.log-sink2.channel = ch2
#"file_roll"表示将数据存入本地文件系统
#agent1.sinks.log-sink2.type = FILE_ROLL
#指定数据存放目录
#agent1.sinks.log-sink2.sink.directory = /root/flumelogs
#设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据  
#(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中,设为0时表示只有一个文件存放数据) 
#agent1.sinks.log-sink2.sink.rollInterval = 0


# Finally, now that we've defined all of our components, tell
# agent1 which ones we want to activate.
agent1.channels = ch2
agent1.sources = avro-source1
agent1.sinks = log-sink1
6.2.3配置客户端agent1.conf文件
# vim agent1.conf 
# avro2log.conf: A single-node Flume configuration
# excute next command in flumeng home dir
# bin/flume-ng agent --conf conf  --conf-file conf/avro2log.conf --name agent1 -Dflume.root.logger=INFO,console
# Name the components on this agent
agent1.sources = source1
agent1.sinks = sink1
agent1.channels = channel1

# Describe/configure source1
#agent1.sources.source1.type = exec
#agent1.sources.source1.command=cat /root/1.log

#检测文件夹
agent1.sources.source1.type = spooldir
agent1.sources.source1.spoolDir = /root/test
agent1.sources.source1.interceptors = i1
agent1.sources.source1.interceptors.i1.type = timestamp
agent1.sources.source1.fileHeader = false

#监测文件夹变动
#agent1.sources.source1.type = com.jinoos.flume.DirectoryTailSource 
#agent1.sources.source1.dirs=s0
#agent1.sources.source1.dirs.s0.path=/root/test

#agent1.sources.source1.type = com.ultrapower.ultracollector.flume.source.file.FileSource
##agent1.sources.source1.path = /root/1.log
#agent1.sources.source1.encoding = utf-8

#agent1.sources.source1.interceptors = logformat
#agent1.sources.source1.interceptors.logformat.type=org.apache.flume.interceptor.LogFormatInterceptor$Builder

# Describe sink1
agent1.sinks.sink1.type = avro
agent1.sinks.sink1.hostname = 192.168.10.89
agent1.sinks.sink1.port = 41414

# Use a channel which buffers events in memory
agent1.channels.channel1.type = memory
agent1.channels.channel1.capacity = 100000
agent1.channels.channel1.transactionCapactiy = 100
agent1.channels.channel1.keep-alive = 30

# Bind the source and sink to the channel
agent1.sources.source1.channels = channel1
agent1.sinks.sink1.channel = channel1
6.2.4配置文件头信息header文件
# vim header
host=test1.com
name=chensiyao
6.3启动flume服务端
# /usr/local/flume/bin/flume-ng agent -c conf -f /usr/local/flume/conf/flume.conf -n agent1  -Dflume.root.logger=DEBUG,console
Info: Including Hadoop libraries found via (/usr/local/hadoop/bin/hadoop) for HDFS access
Info: Excluding /usr/local/hadoop/share/hadoop/common/lib/slf4j-api-1.6.1.jar from classpath
Info: Excluding /usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.6.1.jar from classpath

...

14/06/30 12:04:43 INFO instrumentation.MonitoredCounterGroup: Monitored counter group for type: SOURCE, name: avro-source1: Successfully registered new MBean.
14/06/30 12:04:43 INFO instrumentation.MonitoredCounterGroup: Component type: SOURCE, name: avro-source1 started
14/06/30 12:04:43 INFO source.AvroSource: Avro source avro-source1 started.
6.4启动flume客户端
 6.4.1agent启动,常驻内存
# /usr/local/flume/bin/flume-ng agent -c conf -f /usr/local/flume/conf/agent1.conf  -n agent1 -Dflume.root.logger=DEBUG,console

6.4.2定时运行脚本运行avro-client,推送指定的文件和需要的header(动态改)
# /usr/local/flume/bin/flume-ng avro-client --conf /usr/local/flume/conf/ -H 192.168.10.89 -p 41414 -F /root/1.log -R /usr/local/flume/conf/header1 -Dflume.root.logger=DEBUG,console
Info: Sourcing environment configuration script /usr/local/flume/conf/flume-env.sh
Info: Including Hadoop libraries found via (/usr/local/hadoop/bin/hadoop) for HDFS access
Info: Excluding /usr/local/hadoop/share/hadoop/common/lib/slf4j-api-1.6.1.jar from classpath
Info: Excluding /usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.6.1.jar from classpath
...
2014-06-30 12:11:49,173 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.parseHeaders(AvroCLIClient.java:101)] Inserting Header Key [name] header value [chensiyao]
2014-06-30 12:11:49,176 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.parseHeaders(AvroCLIClient.java:101)] Inserting Header Key [host] header value [test1.com]
2014-06-30 12:11:49,191 (main) [DEBUG - org.apache.flume.api.NettyAvroRpcClient.configure(NettyAvroRpcClient.java:495)] Batch size string = 5
2014-06-30 12:11:49,199 (main) [WARN - org.apache.flume.api.NettyAvroRpcClient.configure(NettyAvroRpcClient.java:620)] Using default maxIOWorkers
2014-06-30 12:11:52,211 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.run(AvroCLIClient.java:234)] Finished
2014-06-30 12:11:52,211 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.run(AvroCLIClient.java:237)] Closing reader
2014-06-30 12:11:52,211 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.run(AvroCLIClient.java:241)] Closing RPC client
2014-06-30 12:11:52,217 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.main(AvroCLIClient.java:84)] Exiting
6.5到hadoop上查看文件
# hadoop fs -ls /flume/20140630/test1.com/chensiyao
Found 1 items
-rw-r--r--   1 root supergroup          0 2014-06-30 12:11 /flume/20140630/test1.com/chensiyao/test1.com_log.1404101513663
# hadoop fs -cat /flume/20140630/test1.com/chensiyao/test1.com_log.1404101513663
[Mon Jun 30 12:06:52 CST 2014] This is test:1
[Mon Jun 30 12:06:52 CST 2014] This is test:2
[Mon Jun 30 12:06:52 CST 2014] This is test:3
...
可以看到日志文件已写入hadoop,成功!

7.flume升阶实现分布式和高可用的架构
建议使用loadbalnce+failover,实现了架构的可扩展性和高可用性, 一台物理服务器上agent的数量不要超过core的数量
flume-ng+Hadoop实现日志收集 - 天空下的缘分 - 天空下的缘分
 实现方法:
修改flume.conf,添加多个sink,并增加sinkgroups配置
...

agent1.sinks = log-sink1  log-sink2

#use loadbalnce+failover
agent1.sinkgroups = g1
agent1.sinkgroups.g1.sinks = log-sink1 log-sink2
agent1.sinkgroups.g1.processor.type = load_balance
agent1.sinkgroups.g1.processor.selector = round_robin
agent1.sinkgroups.g1.processor.backoff = true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值