是否能夠用開源工具快速地搭建廣告系統?能夠確定的說,基本是能夠的。不少重要的模塊,如上章所講的architecture裏的模塊不少均可以藉助開源工具實現。程序員
在實際的廣告系統中咱們會用到不少的開源工具。下面我將分別講述幾個開源開具。基本上全部的大的廣告系統公司都要使用Hadoop平臺,除了google。Hadoop是廣告平臺中建模的基礎,Hadoop有不少子項目,有的子項目與Hadoop有密切的聯繫,有的子項目僅是在Hadoop框架體系下深挖出來的一些Idea。簡單介紹一下,Hadoop如今核心的項目只剩下來兩個,HDFS和MapReduce,之前Hadoop有不少子項目,中間兩列之前都是Hadoop的子項目,但不少如今都已經獨立出來,成爲頂級項目了。Hadoop自己是一個大數據的存儲和計算的平臺。算法
圖中的工具能夠分爲兩類,一類是離線的數據處理,另外一類是在線的數據處理。離線的數據處理,經常使用的是HBase,它是基於Hadoop的列存儲數據庫,並非關係型數據庫,是NoSql型數據庫。和HBase功能類似的數據庫有不少,好比google的BigTable,和HBase對應的HyperTable,HyperTable是c語言寫的工具,效率比HBase高一些,還有Facebook開源的Cassandra。它們都是解決大數據上半結構化存儲的問題,在實際的系統中均可能會用到。sql
oozie是把Hadoop上的流程控制工具,好比咱們天天的日誌處理,要等日誌收到後,進行各類分析,好比有的進行CTR預測,有的進行Audience Targeting,有的交由BI系統,它們這些分析之間可能有一些依賴關係。Hadoop提供了一個管理這些依賴的工具就是oozie,oozie能夠認爲是比較底層的,能夠用API開發的一個framework,我我的感受是很很差用,也沒看到有多少用人這個工具,但它在設計上比較完善。數據庫
Hadoop上有兩個很重要的腳本語言,Pig和Hive。它們的做用有些類似,功能都是但願將Hadoop上的非結構化的數據,能夠用sql語言的方式來訪問和加工。這樣在拉一些簡單的數據報表時,就不用寫MapReduce程序去獲得數據,只用寫pig或hive的腳本。Pig和Hive的區別是:若是你的數據是用分隔符分好的數據,你就能夠寫Pig腳本直接訪問了,因此用起來比較直接方便。而Hive須要預先加工,創建相似於Index的數據才能夠操做。因此Pig更接近於程序員的習慣,Hive更適合作BI的習慣。服務器
Mahout是一個在Hadoop上用Map/Reduce作數據挖掘,機器學習的工具,我我的感受除了幾個算法外,其它的算法並不太好用。但這也是機器學習算法的本質決定的,機器學習算法須要根據數據和實際狀況作調整,加工,因此若是不瞭解內部實現,調整模型比較麻煩。數據結構
在線部分,最經常使用的是ZooKeeper,ZooKeeper是分佈式環境下解決一致性問題的開源解決方案,它對應的是更有名的Google的Chubby。ZooKeeper和Chubby的理論基礎不徹底一致。Chubby是嚴格按照Paxos算法來實現的,Paxos是Lamport是提出的解決分佈式環境下的一致性問題的一個完備的算法,而ZooKeeper是這個算法的簡化版,它把Paxos簡化成兩段式提交後實現的一個版本,沒法在理論上證實它是正確的,但實踐中沒有問題,這個是咱們在作在線服務中常常要用到的一個工具。框架
Avro知道的人可能並很少,由於並不經常使用它,經常使用的是Facebook的Thrift,它解決的是分佈式環境裏的跨語言通訊的問題,很是好用,而Avro僅是Hadoop的做者實現的一個代替產品,Google的ProtoBuffer也是相似的工具。機器學習
S4類比於更經常使用的Twitter的Storm,是咱們上章Architecture裏的流式計算平臺,進行日誌快速處理反饋的一個計算平臺。S4是最先Yahoo!用於搜索廣告系統分析目的而開發的,Storm是爲了知足Twitter上一些快速的計算任務,好比快速計算Fans數,Repost數。兩種有必定不一樣,S4主要優化的是吞吐量,它徹底不用磁盤,而Storm還要用到少許的磁盤操做,由於它要保證數據的一致性,保證每一條數據至少被處理一次,但它不保證僅被處理一次。分佈式
Chuhwa對應的是Facebook的Scribe,它是上章Architecture裏提到的Data Highway,它是分佈式的日誌收集工具,一個廣告系統有不少的廣告投放引擎,這些投放引擎,Data Highway準實時地把多個服務器的日誌準實時地都收集到一塊兒,準實時地投到Hadoop或是Storm上,如今還有一個經常使用的是Flume。工具
Elephant-Bird是一個有意思的小工具,它是配合Pig使用的,若是咱們的系統中大量使用Thrift或是ProtoBuffer,它的結構都是序列化的,二進制的,你用Pig沒法直接訪問,Twitter爲了解決這個問題提供了Elephant-Bird工具,使用Elephant-Bird後,Pig就能夠直接訪問序列化的數據了。
圖中有陰影的表示是我我的感受好用的工具,但僅表明我我的觀點。在這裏我也想介紹一點我我的對開源社區的一些見解,如今開源社區已經和若干年前已經徹底不一樣,如今再也不是一個質量不能保證,內容比較蕪雜的環境了。緣由是有不少大公司在竭盡全力地在支持開源項目,比較典型的是Twitter,Yahoo!,Facebook。咱們認爲開源工具可選的緣由是這些工具是在Twitter,Facebook這種數據量上進行驗證的,而其它公司很難有真實的環境去測試這種大規模數據的,好比Facebook在測試Scribe的時候,數據達到過每秒10T,因此開源工具的質量和可靠性很是高。
在搭建一個廣告系統的時候,遇到的第一個問題可能就是多模塊的語言不統一,Facebook在這方面是比較開放的,它提供了一個工具Thrift,它容許工程師各自喜歡或是習慣的語言去開發,Thift就是一個跨語言服務快速搭建的工具。它的使用方法很是簡單,第一步是用struct定義語言無關的通訊數據結構,用IDL語言描述,好比下面的KV,它有兩個字段一個是32位int類型的key,一個是string類型的value。Thrift會將IDL語言的定義轉爲你所須要的語言(好比c語言)的定義。
struct KV
{
1:optional i32 key=10;
2:optional string value=「x」
}
搭建服務也是在IDL文件裏寫,好比KVCache是存KV pair的一個服務,它有幾個接口,set,get和delete,這些定義都是語言無關的,你根據定義實現本身的邏輯。
service KVCache
{
void set(1:i32 key, 2:string value);
string get(1:32 key); void delete(1:i32 key);
}
若是不是進行特殊的協議層優化,Thrift就能夠知足需求了。而且它能實現結構和接口的向後兼容(backward compatible),類型的工具備Hadoop的Avro和google的ProtoBuffer。