scribe

Scribe是Facebook開源的日誌收集系統,在Facebook內部已經得到的套用。它能夠從各種日誌源上收集日誌,存儲到一個中央存儲系統(可以是NFS,分散式檔案系統等)上,以便於進行集中統計分析處理。

基本介紹

  • 中文名:scribe
  • 來源Facebook
  • 用途:收集日誌
  • 性質:分析處理
簡介,架構,流程原理,類型介紹,file,null,buffer,安裝使用,Thrift需求,安裝Thirft,安裝Hadoop,安裝Scribe,錯誤以及解決方法,

簡介

它為日誌的“分散式收集,統一處理”提供了一個可擴展的,高容錯的方案。當中央存儲系統的網路或者機器出現故障時,scribe會將日誌轉存到本地或者另一個位置,當中央存儲系統恢復後,scribe會將轉存的日誌重新傳輸給中央存儲系統。其通常與Hadoop結合使用,scribe用於向HDFS中push日誌,而Hadoop通過MapReduce作業進行定期處理。
scribe

架構

如右圖所示,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為日誌收集提供了一種容錯且可擴展的方案。scribe可以從不同數據源,不同機器上收集日誌,然後將它們存入一個中央存儲系統,以便於進一步處理。當採用HDFS作為中央系統時,可以進一步利用Hadoop進行處理數據,於是scribe+HDFS+MapReduce方案便誕生了。
scribe

類型介紹

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, JDK, PHP,python
其它腳本語言根據需要安裝

安裝Thirft

大體流程是見擴展閱讀11~16
#安裝完Thrift後,記得運行一下它提供的example,看是否安裝成功。方法:在thrift原始碼目錄有一個叫tutorial的目錄,進行其中後運行thrift命令生成相應的服務代碼:
$thrift -r –gen cpp tutorial.thrift // -r對其中include的檔案也生成服務代碼 -gen是生成服務代碼的語言
#運行完之後會在當前目錄看到一個gen-cpp目錄,其中就是thrfit命令生成的代碼。這時你cd到tutorial/cpp目錄,運行make,生成相應的CppServer與CppClient程式。
#此時你可以分別運行CppServer和CppClient,讓它們通信。

安裝Hadoop

如果你發現Hadoop中自帶的已經編譯好的libhdfs不可用(libhdfs在$HADOOOP_HOME/c++中),可自己編譯生成libhdfs,方法是,在$HADOOP_HOME下,輸入: 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/lib/amd64/server -L/home/dong/hadoop-0.20.2/build/c++/Linux-amd64-64/lib -ljvm -lhdfs”
$make
$sudo 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 <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

相關詞條

熱門詞條

聯絡我們