标题：scribe
简介
  Scribe是Facebook开源的日志收集系统，在Facebook内部已经得到大量的应用。它能够从各种日志源上收集日志，存储到一个中央存储系统（可以是NFS，分布式文件系统等）上，以便于进行集中统计分析处理。它为日志的“分布式收集，统一处理”提供了一个可扩展的，高容错的方案。当中央存储系统的网络或者机器出现故障时，scribe会将日志转存到本地或者另一个位置，当中央存储系统恢复后，scribe会将转存的日志重新传输给中央存储系统。其通常与Hadoop结合使用，scribe用于向HDFS中push日志，而Hadoop通过MapReduce作业进行定期处理。[1]
架构
如右图所示，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中）。[1]
流程与原理
scribe为日志收集提供了一种容错且可扩展的方案。scribe可以从不同数据源，不同机器上收集日志，然后将它们存入一个中央存储系统，以便于进一步处理。当采用HDFS作为中央系统时，可以进一步利用Hadoop进行处理数据，于是scribe+HDFS+MapReduce方案便诞生了。  [1]
各种类型store介绍
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，……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。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）。[1]
安装与使用
1.安装Thrift依赖软件必须得安装的是：g++， boost，autoconf，libevent，Apache ant， JDK， PHP，python
其它脚本语言根据需要安装2.安装Thirft大体流程是见扩展阅读11~16
#安装完Thirft后，记得运行一下它提供的example，看是否安装成功。方法：在thrift源代码目录有一个叫tutorial的目录，进行其中后运行thrift命令生成相应的服务代码：
$thrift -r –gen cpp tutorial.thrift // -r对其中include的文件也生成服务代码 -gen是生成服务代码的语言
#运行完之后会在当前目录看到一个gen-cpp目录，其中就是thrfit命令生成的代码。这时你cd到tutorial/cpp目录,运行make，生成相应的CppServer与CppClient程式。
#此时你可以分别运行CppServer和CppClient，让它们通信。3.安装Hadoop如果你发现Hadoop中自带的已经编译好的libhdfs不可用（libhdfs在$HADOOOP_HOME/c++中），可自己编译生成libhdfs，方法是，在$HADOOP_HOME下，输入: ant compile-c++-libhdfs -Dislibhdfs=true ，同时设置Hadoop的CLASSPATH。4.安装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/lib/amd64/server -L/home/dong/hadoop-0.20.2/build/c++/Linux-amd64-64/lib -ljvm -lhdfs”
$make
$sudo make install
安装成功验证方法参见扩展阅读8。5.可能的错误（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 <module>
from scribe import scribe
ImportError: No module named scribe
解决方法：python找不到scribe模块，需要把scribe package包含进来，如：
$export PYTHONPATH=”/usr/lib/python2.6/site-packages/”
（3）Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/ hadoop/conf/Configuration
解决方法，将Hadoop的classpath加到环境变量中，如：
$export CLASSPATH=$HADOOP_HOME/hadoop-core-0.20.2+320.jar[2]