實戰Scribe日誌蒐集和數據分析

簡單說一下,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來生成語言接口。
相關文章
相關標籤/搜索