scribe :scribe

更新时间:2024-09-20 21:43

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

参考资料

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: