簡單說一下,Scribe是Facebook開源的分佈式日誌蒐集系統,架構簡單,日誌格式靈活,且支持異步發送消息和隊列。很是適合用於用戶行爲分析的基礎數據收集,支持hadoop。配合thrift,能夠跨語言和平臺進行數據收集,很是優秀,性能也很是卓越。
Scribe提供兩種不一樣的架構可供選擇,單Server,或C/S。從系統調用上說,Scribe之因此性能卓越,是由於採用了epoll方式,這個就不解釋了。簡單描述一下Scribe能夠設置的幾種架構方式。
不過要明確一個概念,Scribe不是抓取日誌的東西,而是Push日誌的東西
1、架構設計
1. Server,適用於壓力較小的網站或服務。日誌流程以下
用戶 --> WebServer --> Scribe --> 存儲 --> 分析 --> 展現
用戶 --> WebServer -------|
記錄日誌的程序框架由thrift自動生成,只需include或者import便可。
2.C/S結構,適合訪問量大的網站和服務,並可根據須要進行平行擴展,採用散列的方式分配服務器壓力。
用戶 --> WebServer1 --> ScribeClient --> ScribeServer-->存儲-->分析-->展現
用戶 --> WebServer2--------|
用戶 --> WebServer3--------|
Client及Server都可進行水平擴展,在程序中設置hash訪問。
2、安裝配置及使用方法(FreeBSD爲例)
1.安裝Scribe
最新的ports列表中,Scribe及fb303均配置爲損壞,因此咱們用直接安裝二進制的方式進行,事實上,這樣更加簡單快捷。
#pkg_add -r scribe
#pkg_add -r thrift
#pkg_add -r fb303
這樣就完事了。
在ubuntu下,你須要apt-get依賴包,在centos下,抱歉,yum太糟糕了。你須要本身下一堆的依賴文件,而後rpm安裝或者花幾個小時去逐個編譯。
主要的依賴包包括,python,python-dev,boost,boost-lib,perl,libtool,pkgconfig,m4,autoconf,automake,g++,ruby,ruby-dev.再多的我也記不清了。
FreeBSD下還須要作一件事,就是提取配置文件,我建議你下載scribe和thrift的源碼包,而後解壓縮,但不要編譯安裝,咱們須要的只是他的配置文件。
而後執行
#cd /usr/ports/net/scribe/work/scribe-2.2/examples
#cp example* /usr/local/etc/
#cd /usr/local/etc/
#mv example1.conf scribe.conf
#cd /usr/local/etc/rc.d
#./scribe start
這樣你的scribe server就啓動了。
2.生成你的頭文件
這須要用到thrift
請找到fb303.thrift和scribe.thift,至於怎麼找,本身想辦法把。放到相同的目錄下,修改scribe.thrift中包含fb303的路徑爲當前路徑。而後執行
#thrift -r --gen php scribe.thrift
會在當前目錄下生成gen-php的文件夾,你所須要的php框架文件都在這個文件夾下。
若是你須要生成c++,java,python,ruby甚至erlang, haskball,就將命令行中的php替換爲這些單詞。
3.編寫你的第一個scribe收集程序。
把你的gen-php mv 成thrift或者其餘你喜歡的名字而後vi一個文件,內容以下:
<?
$GLOBALS['THRIFT_ROOT'] = './thrift';
include_once $GLOBALS['THRIFT_ROOT'] . '/scribe/scribe.php';
include_once $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php';
include_once $GLOBALS['THRIFT_ROOT'] . '/transport/TFramedTransport.php';
include_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php';
$msg1['category'] = 'Test';
$msg1['message'] = "a,b,c,d,e,f,g";
$entry1 = new LogEntry($msg1);
$messages = array($entry1);
$socket = new TSocket('localhost', 1463, true);
$transport = new TFramedTransport($socket);
$protocol = new TBinaryProtocol($transport, false, false);
$scribe_client = new scribeClient($protocol, $protocol);
$transport->open();
$scribe_client->Log($messages);
$transport->close();
?>
經過web瀏覽器訪問這個程序,我如今假設你已經有一個webserver了。而後去/tmp/scribetest/下查看生成日誌文件,正常的話,會生成一個叫Test的文件夾,下面有一個叫Test_00000的文件,內容就是:a,b,c,d,f,g。你能夠寫任何的東西,只要你以爲未來統計起來方便。
3.配置scribe
固然僅僅這樣是不夠的,咱們須要自定義配置文件好完成諸如日誌的rotate,存儲路徑的設定,甚至是直接往hadoop裏面寫數據。
我給出一個典型的配置文件,這裏包含了rotate,路徑設定,多重存儲等。
port=1463
max_msg_per_second=2000000
check_interval=3
<
store
>
category=default
type=multi
target_write_size=20480
max_write_interval=1
buffer_send_rate=2
retry_interval=30
retry_interval_range=10
<
store0
>
type=file #類型,文件
fs_type=std #方式,包括std和hdfs
file_path=/data/logs #存儲路徑
base_filename=thisisoverwritten
max_size=1000000000 #日誌文件最大,超過將自動rotate,字節計算
rotate_period=daily #以時間rotate,能夠寫成300s(秒),hourly
add_newlines=1
create_symlink=no #不建立符號連接
</
store0
>
<
store1
>
type=file
fs_type=hdfs
file_path=hdfs://localhost:9090/logs
base_filename=thisisoverwritten
max_size=1000000
add_newlines=1
create_symlink=no
</
store1
>
</
store
>
用到hadoop的話,你須要爲scribe編譯libhdfs。
2、日誌分析
因爲日誌格式是由你本身定義的,因此分析起來會比較輕鬆。
1.一個日誌文件,1.log,字段以","分割。
202.163.4.5,12345678901,111,123
202.153.3.6,12345678901,111,124
202.153.7.3,12345678901,112,125
202.17.23.3,12345678901,112,126
211.98.76.5,12345678901,113,127
218.22.24.5,13330080923,113,128
須要統計第四列非空的行數(awk實現):
#cat 1.awk
BEGIN{ total=0;FS="," }
{
$4!~//;
total+=1;
}
END{ print total}
#awk -f 1.awk 1.log
6
#
統計第三列去重,並統計出現的次數
#cat 2.awk
BEGIN{FS=","}
{
a[$3]++;
}
END {for(i in a)print i,":" a[i]}
#awk -f 2.awk 1.log
111:2
112:2
113:2
#
計算第四列的總和
#cat 3.awk
BEGIN{FS=",";sum=0}
{
sum+=$4;
}
END{print sum}
#awk -f 3.awk 1.log
753
#
基本的使用和統計就是這樣,很是輕鬆就能統計不少數據,比分析NCSA的日誌方便太多了。
hadoop要寫的話就太多了,另開篇幅吧。
2011-11-19更新
特別說明:不要認爲Scribe只能用於網站應用,他能夠用於任何方面的數據收集,若是你有客戶端程序,能夠用thrift生成C++ header,加入到你的源碼中,而後編譯生成客戶端,進行用戶數據收集。亦或生成java源碼,加入到android應用中進行分發並收集數據。
目前thrift支持的語言包括C++,C#,php,python,cocoa,haskell,erlang,as3,java,javame,javascript,html,ocaml,perl,ruby,smalltalk和xsd。
包括hadoop在內的一系列系統,都使用thrift來生成語言接口。