scribe
scribe
Scribe是Facebook开源的日志收集系统,在Facebook内部已经得到的应用。它能够从各种日志源上收集日志,存储到一个中央存储系统(可以是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。
简介
它为日志的“分布式收集,统一处理”提供了一个可扩展的,高容错的方案。当中央存储系统的网络或者机器出现故障时,scribe会将日志转存到本地或者另一个位置,当中央存储系统恢复后,scribe会将转存的日志重新传输给中央存储系统。其通常与Hadoop结合使用,scribe用于向hdfs中push日志,而Hadoop通过MapReduce作业进行定期处理。
架构
如右图所示,Scribe从各种数据源上收集数据,放到一个共享队列上,然后push到后端的中央存储系统上。当中央存储系统出现故障时,scribe可以暂时把日志写到本地文件中,待中央存储系统恢复性能后,scribe把本地日志续传到中央存储系统上。需要注意的是,各个数据源须通过thrift(由于采用了thrift,客户端可以采用各种语言编写向scribe传输数据(每条数据记录包含一个category和一个message)。可以在scribe配置用于监听端口的thrift线程数(默认为3)。在后端,scribe可以将不同category的数据存放到不同目录中,以便于进行分别处理。后端的日志存储方式可以是各种各样的store,包括file(文件),buffer(双层存储,一个主储存,一个副存储),network(另一个scribe服务器),bucket(包含多个store,通过hash的将数据存到不同store中),null(忽略数据),thriftfile(写到一个Thrift TFileTransport文件中)和multi(把数据同时存放到不同store中)。
流程原理
scribe为日志收集提供了一种容错且可扩展的方案。scribe可以从不同数据源,不同机器上收集日志,然后将它们存入一个中央存储系统,以便于进一步处理。当采用hdfs作为中央系统时,可以进一步利用Hadoop进行处理数据,于是scribe+HDFS+MapReduce方案便诞生了。
类型介绍
file
将日志写到文件或者NFS中。支持两种文件格式,即std和hdfs,分别表示普通文本文件和HDFS。可配置的选项有:
max_size:文件大小上限,即当文件大小达到max_size时,创建新的文件继续存储数据。
rotate_period:文件创建周期,可以是hourly,daily,never和number[sufix]。sufix可以是s(second),m(minute),h(hour),d(day),w(week)。
sub_directory:子目录名字
base_filename:文件前缀,如news,则会依次将数据存储到文件news_20110403_00000,news_20110403_00001,……
null
这也是一种常用的store。用户可以在配置文件中配置一种叫default的category,如果数据所属的category没有在配置文件中设置相应的存储方式,则该数据会被当做default。如果用户想忽略这样的数据,可以将它放入null store中。
其它store的介绍,可参见扩展阅读资料1。
需要注意的是,Scribe会将数据首先缓存到buffer中,待buffer满后再flush到hdfs上。当数据量非常少时,由于缓存的原因,部分数据可能未写到HDFS中,这时用户可以调整scribe的相关配置参数或者关闭scribe(如减小max_size),使数据全部写到HDFS中。如果用户采用减小max_size的方案,此时需要注意,HDFS不能很好的保存小文件(可能会丢失数据,见扩展阅读资料3)。
buffer
这是最常用的一种store。该store中包含两个子store,其中一个是primary store,另一个是secondary store。日志会优先写到primary store中,如果primary store出现故障,则scribe会将日志暂存到secondary store中,待primary store恢复性能后,再将secondary store中的数据拷贝到primary store中。其中,secondary store仅支持两种store,一个是file,另一个是hdfs
安装使用
Thrift需求
必须得安装的是:g++, boost,autoconf,libevent,apache ant, JDKPHPPython
其它脚本语言根据需要安装
安装Thirft
大体流程是见扩展阅读11~16
#安装完Thrift后,记得运行一下它提供的example,看是否安装成功。方法:在thrift源代码目录有一个叫tutorial的目录,进行其中后运行thrift命令生成相应的服务代码:
-r –gen cpp tutorial.thrift // -r对其中include的文件也生成服务代码 -gen是生成服务代码的语言
#运行完之后会在当前目录看到一个Gen.Gcpp目录,其中就是thrfit命令生成的代码。这时你cd到tutorial/cpp目录,运行make,生成相应的CppServer与CppClient程式。
#此时你可以分别运行CppServer和CppClient,让它们通信。
安装Hadoop
如果你发现Hadoop中自带的已经编译好的libhdfs不可用(libhdfs在/C++中),可自己编译生成libhdfs,方法是,在: ant compile-C++libhdfs -Dislibhdfs=true ,同时设置Hadoop的CLASSPATH
安装Scribe
运行boottrap脚本(见扩展阅读17)
#(主要目的是生成configure,如果出现类似于configure: error: Could not link against !的错误,不要管,进行下一步好了!)
$./configure –with-boost=/usr/local/boost –prefix=/usr/local/scribe –with-hadooppath=/home/dong/hadoop-0.20.2/ –enable-hdfs CPPFLAGS=”-I/opt/jdk1.6.0_21/include/ -I/opt/jdk1.6.0_21/include/linux -I/home/dong/hadoop-0.20.2/src/C++/libhdfs” LDFLAGS=”-L/opt/jdk1.6.0_21/jre/lib/amd64 -L/opt/jdk1.6.0_21/jre/天秤座/amd64/server -L/home/dong/hadoop-0.20.2/build/c++/Linux-amd64-64/lib -ljvm -lhdfs”
make install
安装成功验证方法参见扩展阅读8。
错误以及解决方法
(1)运行boottrap脚本时,产生以下错误:
checking whether the Boost::System library is available… yes
checking whether the Boost::Filesystem library is available… yes
configure: error: Could not link against !
当安装的boost目录不在默认的/usr目录下时,用户需要配置boost安装目录,如:
$./configure –with-boost=/usr/local/boost –prefix=/usr/local/scribe
(2)运行examples时,产生以下错误:
Traceback (most recent call last):
File “examples/scribe_cat”, line 24, in \u003cmodule\u003e
from scribe import scribe
ImportError: No module named scribe
解决方法:Python找不到scribe模块,需要把scribe package包含进来,如:
PythonPATH=”/usr/lib/python2.6/site-packages/”
(3)Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/ hadoop/conf/Configuration
解决方法,将HadoopCLASSPATH加到环境变量中,如:
CLASSPATH=/hadoop-core-0.20.2+320.jar
参考资料
目录
概述
简介
架构
流程原理
类型介绍
file
null
buffer
安装使用
Thrift需求
安装Thirft
安装Hadoop
安装Scribe
错误以及解决方法
参考资料