大數據學習之路(二)

數據的收集

  • 外部數據收集(互聯網數據收集)

網絡爬蟲:從頁面獲取的策略分為幾個大類:深度優先、寬度優先和最佳優先三種。

  • 深度優先

該策略從起始網頁開始,選擇一個URL進入,分析這個網頁中的URL,然後再選擇另一個URL進入。如此一個鏈接一個鏈接地抓取下去,直到處理完整條路線之後再處理下一條路線。可以用棧來實現。

存在的問題:通常門戶網站的鏈接往往是最具價值的,評級也很高,但隨著每一層的深入,網頁的價值就會相應地有所下降。這就暗示了重要網頁通常距離種子較近,而過度深入抓取到的網頁卻價值很低。合理的控制深度是該種策略的關鍵。

  • 寬度優先(廣度優先)

這個策略是指在抓取過程中,只有在完成當前層次的搜索之後,才進行下一層次的搜索。可以用隊列實現。

  • 最佳優先(聚焦、定向)

當需要爬取的網頁數量很龐大的時候,無論是深度優先還是寬度優先可能都不能高效地獲取用戶所關心的內容,而最佳優先策略只訪問經過網頁分析算法預測為“相關”的網頁,在一定程度上緩解了之前兩種策略重“量”不重“質”的局面。

如何判斷新獲取的網頁和用戶定義的候選網頁之間的相似度呢?

常見的算法模型:布爾模型、基於偏序的布爾模型、向量空間模型、概率模型和語言模型,等等。

在數據的爬取方面,Nutch和Heritrix都是不錯的開源系統,可以幫助我們快速實現爬取。

兩者區別:

  • Nutch集成了Lucene對於抓取內容的索引和檢索是非常方便的。Heritrix時,用戶需要自己負責文件格式的轉換、索引和檢索等工作。Heritrix網絡蜘蛛的功能更為強大,可以專注於網絡信息的下載。

  • 從對待爬取內容的處理方式上看,Nutch只獲取並保存可索引的內容,且可以對下載內容進行過濾修改,而Heritrix則適用於各種類型的信息,力求保持網頁原貌。另外,Nutch一般是通過刷新操作將舊內容替換為新內容的,而Heritrix則是不斷追加新內容。

  • 從用戶使用來看,Nutch採用命令行運行和控制。而Heritrix有Web控制管理界面,更為人性化一些。Nutch的定製能力不算很強,而Heritrix可控制的參數比較多,只是配置起來有點麻煩。

  • 內部數據收集

收集的模型,內部數據的收集主要分為推送(Push)和拉取(Pull)兩大類。Flume、Scribe和Logstash等開源方案,提供了拉取或推送的採集模式,提供了不同的特性和選擇。”

  • Flume

大數據學習之路(二)

我們可以將源頭想象成為一個水龍頭,沉澱器是一個水桶,而通道就是水管。水管兩頭分別接上水龍頭和水桶,當水龍頭打開,水就源源不斷地通過水管流入水桶。

Flume的優勢是支持集群,並且數據流可以多級嵌套。

  • Facebook的Scribe和Logstash

它們是採用推送模式的代表。

數據存儲

NoSQL(Not Only SQL)它泛指非關係型的數據庫。

HDFS(Hadoop Distributed File System)和對應的分佈式非關係型(非結構化)數據庫系統HBase。

Hadoop優勢:

  • 透明性:使用者可以在不瞭解Hadoop分佈式底層細節的情況下,開發分佈式程序,充分利用集群的威力進行高速運算和存儲。

  • 高擴展性:擴展分為縱向擴展和橫向擴展,縱向擴展將增加單機的資源,總會達到瓶頸;而橫向將增加集群中的機器數量,獲得近似線性增加的性能,不容易達到瓶頸。Hadoop集群中的節點資源,採用的就是橫向方式,可以方便地進行擴充,並獲得顯著的性能提升。

  • 高效性:由於採用了多個資源並行處理,使得Hadoop不再受限於單機操作(特別是較慢的磁盤I/O讀寫),可以快速地完成大規模的任務。加上其所具有的可擴展性,隨著硬件資源的增加,性能將會得到進一步的提升。

  • 高容錯和高可靠性:Hadoop中的數據都有多處備份,如果數據發生丟失或損壞,能夠自動從其他副本(Replication)進行復原。同理,失敗的計算任務也可以分配到新的資源節點,進行自動重試。

  • 低成本:正是因為Hadoop有良好的擴展性和容錯性,所以沒有必要再為其添置昂貴的高端服務器。廉價的硬件,甚至是個人計算機都可以成為資源節點。

Hadoop框架的最核心元素就是HDFS和MapReduce。HDFS為海量的數據提供了存儲,而MapReduce為海量的數據提供了計算。

如何理解HDFS的體系架構?

快消品公司的虛擬案例

  • 擴建倉庫:單個倉庫的擴建,就是所謂的縱向擴展。縱向擴展很容易達到瓶頸,建立倉庫是這樣,計算機系統也同樣如此。例如單機的硬盤和內存,不可能無限制地被加大。這時就需要考慮橫向擴展了,在郊區新建一個倉庫,在計算機系統中就是增加新的機器作為資源節點,不過這些機器節點存儲的不再是純淨水,而是數據。在HDFS中,這些存儲數據的節點被稱為數據節點(Data Node)。

  • 增加協調部門:協同部門可以實時收集各個倉庫的運作情況,並決策將進貨存放在哪裡更為合適。在HDFS中,扮演這個角色的節點稱為命名節點(Name Node),它維護著系統中的大量元數據,負責管理文件系統的命名空間(Name Space)和控制外部的訪問,包括打開、關閉、重命名文件或目錄,將數據塊映射到具體的數據節點等。隨著協同部門職能重要性的日益增加,總公司可能還會將其管理內容進行備份,這就是次要命名節點(Secondary Name Node)。次要命名節點和命名節點的區別在於,它不會與數據節點和其他任務節點溝通,也不接收HDFS上的任何變化記錄。次要命名節點最主要的目標就是與命名節點通信,根據配置定期地獲取命名節點上的HDFS元數據快照,因此效率是非常高的。

  • 在多個倉庫中進行備貨:意外總是會發生,為了防止意外導致缺貨的情況發生,可以採用的一項策略是將貨物存儲在多地的倉庫中。在HDFS中也有同樣的理念,這就是備份或副本(Replication)。存儲在數據節點上的數據庫可以有多個副本,並分發到其他節點上。這樣在某個數據節點上丟失的數據,可以在其他數據節點上找到並恢復。容錯性得以提升。

大數據學習之路(二)

HDFS存在如下幾個弱點:

  • 不適合實時性很強的數據訪問。(數據查詢)

  • 無法高效存儲大量小文件。

  • HDFS對多用戶的寫入及文件任意修改的支持也不足。文件併發時的寫入者只有1個,而且寫操作只能在文件末尾追加新的數據,還不能在文件的任意位置進行插入。

  • HBase

基於HDFS的數據庫系統。它是一個分佈式的、面向列的開源數據庫,適合於非結構化數據的數據庫,最大的特點是基於列而不是基於行的模式進行存儲。

關係型數據庫優勢,查詢簡單,有強事務。

HBase幾個關鍵概念:

  • 表格(Table):HBase同樣用二維表格來組織數據。

  • 行(Row):在表格裡,每一行代表一條記錄,每行通過行鍵(Row Key)進行唯一標識。

  • 列族(Column Family):瞭解這點很關鍵,行裡的字段按照列族進行分組,可以看作一堆屬性或字段的集合。

  • 列限定符(Column Qualifier):列族裡包括多個屬性,限定符可以幫助定位列族裡的數據。與列族不同,列限定符沒有必要預先被定義,因此每行可以擁有不同數量和名稱的限定符。

  • 單元(Cell):二維表裡的單元格,通過行鍵、列族和列限定符來唯一確定。存儲在其中的值稱為單元值(Cell Value)。

  • 版本(Version):注意,這是HBase與很多數據庫的不同之處。即使單元被確定了,裡面的單元值仍然可以根據時間的不同擁有多個版本。版本用時間戳(Timestamp)來標識。讀取的時候如果沒有指定時間戳,那就默認獲取最近的版本。

大數據學習之路(二)

  • MongonDB(文檔型存儲)

它的主要功能特性為面向集合存儲,且擁有自由的Schema模式定義方式。所謂的“面向集合”,意思是數據被分組存儲在數據集中,該數據集稱為一個集合(Collection)。每個集合在數據庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。

MongoDB和HBase也存在差異

  • 底層的支持:HBase是架構在HDFS之上的,它會將數據按照列拆分開來存儲,對MapReduce支持得非常好。而MongoDB則會直接將整個數據存儲在文件系統之上,與HDFS沒有關聯。

  • 數據模型:HBase的數據模型和關係型的二維表非常相似,其靈活性體現在列式存儲上。而MongoDB的數據模型是以文檔為基本單位的,其靈活性體現在文檔可以支持多種複雜的結構。

非持久化存儲系統,Memcached、Berkeley DB和Redis。不過,需要注意的是,系統屬於持久化還是非持久化,有時劃分得並沒有那麼絕對。這裡的劃分主要是按照這些系統目前在業界最常見的應用方式進行的。

  • Memcached

儘管Memcached是“分佈式”緩存服務器,但服務器端並沒有完整的分佈式功能,例如切片(Sharding)和副本(Replication),各個Memcached服務器之間也不會互相通信以共享信息,因此需要應用端來實現類似的邏輯。

  • Redis

它是一個開源的、高性能的、基於鍵–值型的緩存和存儲系統。支持分佈式集群。Redis的特性主要包括:提供了極高的性能、支持多種數據類型、支持事務性(一定程度上)、可設定生命週期、提供持久化存儲等。

數據處理

根據處理的及時性不同,主要分為離線處理和在線處理。介於二者之間,還會介紹提升及時性的消息機制。

  • 離線批量處理(MapReduce)

水源分級的整個流程。

大數據學習之路(二)

MapReduce框架包含幾個重要的組成模塊:

  • 數據分割(Data Splitting):將數據源進行切分,並將分片發送到Mapper上。例如對文檔的每一行作為最小的處理單元。

  • 映射(Mapping):Mapper根據應用的需求,將內容按照鍵-值的匹配,存儲到散列結構中。

  • 洗牌(Shuffling):將鍵-值的配對不斷地發給Reducer進行歸約。如果存在多個Reducer,還會使用分配(Partitioning)對Reducer進行選擇。

  • 歸約(Reducing):分析接收到的一組鍵值配對,如果是鍵內容相同的配對,就將它們的值合併。

  • 為了提升洗牌階段的效率,可以選擇減少發送到歸約階段的鍵-值配對。

大數據學習之路(二)

大數據學習之路(二)


分享到:


相關文章: