淺談雲端計算和大資料技術

淺談雲端計算和大資料技術
背景:
隨著計算機技術的發展,資料量日益增長,現有技術也很難滿足業務的發展需求,在程式碼的層層迭代和優化之後,還是很難滿足資料的增長需求,迫切需要一項新的技術來從事資料計算,因為就產生了雲端計算和大資料這些技術,那麼在此背景下,簡單介紹一下我對雲端計算和大資料技術的理解。
1. 雲端計算
1.1雲端計算的概念
能通過網路訪問可擴充套件的、靈活的、可共享的物理或虛擬資源池,並按需自助獲取和管理這些資源的模式。其中資源例項包括伺服器、作業系統、網路、軟體、應用和儲存裝置等。
1.1.1 Iaas
Iaas: Infrastructure as a Service,基礎設施即服務。這裡的基礎設施包括:
伺服器:IBM小型機等
網路:頻寬、IP、路由等
儲存裝置:CPU、記憶體、磁碟
以前這些資源都是我們的固有資源,但是雲端計算以後,雲的服務商可以通過雲的方式提供給我們這些資源。例如:360雲盤、百度雲盤、新浪雲盤等
1.1.2 Paas
Paas: Platform as a service,平臺即服務。這裡的平臺包括:
Web伺服器:Tomcat,Jboss,jetty
資料庫伺服器:Oracle,MySql等
軟體應用平臺:Struts2,Hibernate,Spring等
雲盤必須給使用者提供一個介面,使用者通過該介面能夠上傳檔案、上傳視訊、上傳圖片、建立網路相簿等等。而這個介面實際上就是一個平臺,使用者可以藉助該平臺完成各種操作。
1.1.3 Saas
Saas:Software as a service,軟體即服務。這裡的軟體包括:
應用軟體:視訊播放器、文字編輯器
行業軟體: ERP、OA等
雲盤可以提供使用者線上播放視訊的功能,也可以通過雲盤檢視word文件。因為雲盤給使用者提供了視訊軟體服務、檔案檢視服務。
1.1.4 一切都是服務
不管Iaas,Paas,Saas,有一個共同的特點,不管是基於裝置、平臺還是軟體,都是提供服務的。所以說:雲端計算就是提供服務的。
1.1.5 資源池化
資源池化就是把Iaas,Paas,Saas層的資源(CPU、儲存、網路等)放入到資源池中(雲伺服器)。雲伺服器進行集中管理。所以雲端計算裡所有的服務都是通過資源池裡的資源而提供的。
1.1.6 雲服務的特徵
1. 多租用
一個雲伺服器可以給多個人共享,共享資源池中的內容,雲盤肯定是可以給很多使用者所用的,而且大家瞭解的使用者也不少,多租用有如下的特點:
資源隔離:每個使用者都有自己的雲盤,在自己的雲盤上存放自己的內容,這些內容對於別人來說是不可見的
資源共享:如果一個使用者需要另外一個使用者的資源,這個使用者可以通過短連線的方式提供給另外一個使用者。
互操作性:在不同的平臺下相互操作相同的軟體。你在Android系統下把手機的聯絡人備份到雲盤中,然後你換手機了,Ios的作業系統,同樣利用雲盤中的恢復功能可以把手機的聯絡人恢復。這樣在Android和Ios兩個作業系統之間實現了互操作性。
2. 快速伸縮和彈性
無狀態化服務(與資料無關):雲伺服器端不記錄使用者的行為,這樣可以大大減少服務之間的耦合性。只需要利用服務的框架直接呼叫就可以了。
快速供應:雲伺服器可以對Iaas,Paas,Saas層的資源做到快速供應。只要使用者需要,並且有時候支付一定的費用,就能供應。阿里雲就是一個很好的例子.
靈活、可伸縮:雲伺服器可以動態的給使用者分配磁碟空間,按照使用者的需求量的大小分配,所以是非常靈活和可伸縮的。包括Iaas,Paas,Saas層的各種資源都可以做到靈活可伸縮。
分散式拓撲:一個雲伺服器必定是一個分散式拓撲結構的伺服器。
動態可發現:雲伺服器可以對使用者使用CPU、記憶體、磁碟等資源的情況做監控,所以當一個使用者的某些資源情況出現了不足,伺服器是可以動態發現的。
3. 按需自助服務
靈活的負載分配:伺服器可以根據你使用的情況很靈活的做到負載均衡。這樣一個公司的運維人員做的事情就可以變得簡單。
標準服務提供:百度、騰訊、阿里都有自己的API開放出來,這樣例如我們開發一個系統,要用到交通的擁堵情況,可以呼叫百度的API把資料提取出來。這樣的服務現在已經標準化了。
服務快速啟動和自動化:在沒有云的時代,運維的共組是很麻煩的,需要在客戶那裡啟動服務,並且進行除錯,但是現在有了雲伺服器,很多工作就可以讓雲來做。
增量部署和測試:當你在雲伺服器申請的節點不夠用時,可以利用雲伺服器做增量部署,讓雲伺服器幫你自動部署和測試。這些工作都可以放在雲端來做。
4、廣泛的網路訪問
訪問雲服務的終端可以是多種多樣的,pad、手機、電腦等
5、可計量的服務
雲伺服器通過使用者使用資源池中的內容以及上述的一些列特徵,可以做到
監控、計量、計費、報表的服務。
2. 大資料
2.1 資料劃分
現有資料按照結構劃分,可以分為結構化資料和非結構化資料。
2.1.1 結構化資料
結構化資料就是我們在工作中經常用到的mysql、oracle、db2、sybase等這些資料庫
所以結構化資料的特徵是:邏輯嚴謹、資料不能破壞、格式一致。
2.1.2 非結構化資料
如圖示例為電信格式的資料
這裡寫圖片描述
上述的資料是使用者用手機上網的各種統計。這樣的資料稱為非結構化資料。非結構化資料沒有特別嚴謹的邏輯結構。是由一些欄位和值組成,欄位之間以約定分隔符分隔。說明一種行為方式。這樣的資料特點為:結構不嚴謹、資料量很大、允許資料丟失。
2.2 大資料場景
上述的非結構化資料,要按照指定規則進行統計,那麼就需要用到大資料來進行計算。
在品牌業務中,我們會根據日誌去統計效果資料,平均每個日誌檔案大小也在上百兆或者GB之上,如果採用java演算法,則計算就比較困難,採用大資料計算,計算比較簡單,同時也節省了系統資源。
下面分別介紹一下傳統資料庫和分散式檔案系統的特點
2.2.1 傳統資料庫方式
這裡寫圖片描述
說明:
1) 把上述的大量的資料分開到幾個資料庫中進行儲存。
2) 資料通過網路從資料庫伺服器傳輸到Web伺服器
3) 對Web伺服器中的資料進行統計
缺點:
1) 如果資料量很大,叢集的數量就會很大,這樣資料庫伺服器本身維護起來就比較困難
2) 大量的資料通過資料庫傳輸到Web伺服器端,這樣會導致大量的資料在網路上傳輸,影響效能。
所以這種從資料到計算的方式當資料量大到一定程度以後就會有瓶頸了。
2.2.2 分散式檔案系統
基於以上應用的特點,關係型資料庫是不能給出特別好的解決方案的
這裡寫圖片描述
說明
1) 上述有三種節點
data2,data3,data4為基礎資料節點,稱為datanode,檔案可以分別儲存到這三個節上,replication為每一個節點的備份節點,如果data2節點宕機,那麼replication節點將起作用(可以通過設定資料的備份份數)。data1為匯聚節點,稱為namenode,儲存data2,data3,data4的後設資料資訊
2) data2,data3,data4節點的功能有兩個:儲存資料、進行計算
3) data2,data3,data4把計算的結果通過網路傳遞給data1節點
4) 在data1節點上進行總的計算
好處:因為在data2,data3,data4節點上已經進行了計算,所以在網路上傳輸的資料量大大減少了,提高了資料傳輸效率。
2.2.3 分散式檔案系統特點
這裡寫圖片描述
上圖比3.2.2的圖多了一個管理節點。
1) client:客戶端利用程式訪問需要獲取的資料。
2) 管理節點:記錄了資料的後設資料資訊(位置資訊)
管理節點和資料節點必須保持通訊,通過心跳機制來保證資料節點的存活,如果管理節點知道data2宕機了,就可以把請求轉發給replication節點
當增加資料節點的時候,管理節點也必須增加該資料節點的後設資料資訊
3) 資料節點::資料節點記錄了大量的資料資訊,資料節點可以進行計算,資料節點定時以心跳的方式保持與管理節點的聯絡如果資料節點宕機,replication節點立刻起作用。
這樣的處理方式是可以處理大量的非結構化資料的。
整體的流程可以比喻為:倉庫和管理員,當使用者想獲取倉庫的物品時,首先需要和管理員打招呼,通過管理員可以獲取倉庫物品,同理,當向倉庫放物品時,首先就需要和管理員登記,然後將物品放到登記的指定位置,方便物品的存取。
3. HDFS
3.1 Hdfs的優點
3.1.1 支援超大檔案
支援超大檔案。超大檔案在這裡指的是幾百MB、 GB甚至TB大小的檔案。一般來說hadoop的檔案系統會儲存TB級別或者PB級別的資料。
3.1.2 檢測和快速應對硬體故障
在叢集的環境中,硬體故障是常見的問題。因為有多臺伺服器連線在一起,這樣會導致高故障率。因此故障檢測和自動恢復是hdfs檔案系統的一個設計目標。
3.1.3 流式資料訪問
Hdfs的資料處理規模比較大,應用一次需要訪問大量的資料,同時這些應用一般都是批量處理,而不是使用者互動式處理。應用程式能以流的形式訪問資料集。主要的是資料的吞吐量,而不是訪問速度。
3.1.4 簡化的一致性模型
大部分hdfs操作檔案時,需要一次寫入,多次讀取。所以一個檔案一旦經過建立、寫入、關閉後,一般就不需要修改了。這樣簡單的一致性模型,有利於提高吞吐量。
3.2 Hdfs的缺點
3.2.1 低延遲資料訪問
低延遲資料。需要實時獲取的資料,需要資料在毫秒或秒的範圍內得到響應。由於hadoop針對高資料吞吐量做了優化,犧牲了獲取資料的延遲,所以對於低延遲來說,不適合用hadoop來做。
3.2.2 大量的小檔案
Hdfs支援超大的檔案,是通過資料分佈在資料節點,資料的後設資料儲存在名位元組點(namenode)上。名位元組點的記憶體大小,決定了hdfs檔案系統可儲存的檔案數量。雖然現在的系統記憶體都比較大,但大量的小檔案還是會影響名位元組點的效能。
3.2.3 不支援超強的事務
沒有像關係型資料庫那樣,對事務有強有力的支援。
3.3 Hdfs的體系結構
這裡寫圖片描述
從上圖可以看出
NameNode節點:在Hadoop1.x的版本中,NameNode節點只有一個,所以NameNode節點為非HA的(不是高可用的,後面會詳細討論)。在Hadoop2.X的版本中,NameNode節點可以有很多個。所以在Hadoop2.x的版本中,NameNode節點是HA的(高可用的)。該節點主要負責管理檔案系統名稱空間、叢集配置和資料塊的複製等(可以理解為儲存後設資料資訊)
DataNode節點:是檔案儲存的基本單元,它以資料塊的形式儲存了hdfs中檔案的內容和資料塊的資料校驗資訊。
SecondaryNameNode節點:配合NameNode節點管理後設資料
3.4 資料塊
在HDFS中,一個特別重要的概念:資料塊(Block)。前面介紹到,在HDFS中儲存的檔案都是超大資料的檔案,我們可以把這個超大規模的檔案以一個標準切分成幾塊,分別儲存到不同的磁碟上。這個標準就稱為Block。(Hadoop1.x預設Block大小為64MB,Hadoop2.x為128MB)。這樣做有以下幾點好處:
1、 檔案塊可以儲存在不同的磁碟上。在HDFS系統中,一個檔案可以分成不同的Block儲存在不同的磁碟上。
2、 簡化儲存系統。這樣不需要管理檔案,而是管理檔案塊就可以了。
3、 在HDFS系統中,(dfs.replication屬性配置)預設會複製3份。
3.5 NameNode
這裡寫圖片描述
如圖為NameNode做的事情:維護著整個檔案系統的檔案目錄樹
這裡寫圖片描述
從上圖可以看出,NameNode維護兩層關係。第一關係為檔案/目錄的元資訊和檔案的資料塊的關係,/txt/exec/a.txt分為三個資料塊儲存b1,b2,b3。/word/exec/b.doc分為兩個資料塊儲存b4,b5。第二關係為資料塊資訊與資料節點之間的關係。從圖中也可以看出來b1在DataNode1,DataNode2,DataNode3節點都有。b2在DataNode1,DataNode2,DataNoden節點。依次類推。以上的資訊以兩種形式儲存在本地檔案系統中。一種是名稱空間映象(File System Image,FSImage,也稱為檔案系統映象),另一種是名稱空間映象的編輯日誌(Edit Log)。
在HDFS執行的過程中,NameNode節點還能獲取HDFS整體執行的狀態資訊。如系統的可用空間、已經使用的空間、各資料節點的當前狀態等。
3.5.1 名稱空間映象FSImage
名稱空間映象儲存著某一特定時刻HDFS的目錄樹、元資訊和資料塊索引資訊。
3.5.2 編輯日誌EditLog
當在HDFS中,後續對FSImage的改動則放在編輯日誌中。FSImage與EditLog共同提供了一個完整的NameNode的第一關係。
3.5.3 注意事項
NameNode中與DataNode相關的資訊不保留在NameNode的FSImage和EditLog中。NameNode每次啟動時,都會動態的重新建立這些資訊,這些資訊成為了NameNode的第二關係(資料塊與datanode之間的關係)。執行時,客戶端通過NameNode節點獲取上述的資訊,然後和DataNode節點進行互動,讀寫檔案資料。所以NameNode中的DataNode的資訊是保留在記憶體中的,每次啟動的時候動態的建立。因為使用者在HDFS的客戶端操作檔案的時候,有可能會增加檔案、刪除檔案,這樣可能會導致block的變化,從而導致DataNode的變化。可以說NameNode上與DataNode相關的位置資訊是實時更新的,所以每次啟動NameNode的時候需要重新載入一次。
3.5.4 SecondaryNameNode
使用者定期合併FSImage和EditLog。在大規模叢集的情況下,SecondaryNameNode是單獨一臺機器的。該節點根據叢集配置的時間間隔,不停地獲取HDFS某一個時間點的FSImage和EditLog,合併得到一個新的FSImage。這個新的FSImage會上傳到NameNode節點上,替換原來的NameNode上的FSImage,並清空上述日誌。這種機制稱為Checkpoint機制。這樣避免了EditLog過大,導致NameNode啟動時間過長的問題。但是如果NameNode出現故障,SecondaryNameNode是不能幫助NameNode進行自動恢復的。
這裡寫圖片描述
DataNode
1)
上圖為在secondarynamenode中發生的事情:
1、 SecondaryNameNode通過RPC技術遠端呼叫NameNode中的getEditLogSize方法,獲取到NameNode節點上編輯日誌的大小
2、 如果編輯日誌很小,SecondaryNameNode就不需要合併後設資料映象和編輯日誌。
3、 繼續通過RPC技術遠端呼叫rollEditLog方法,啟動一次checkpoint過程
4、 NameNode在呼叫rollEditLog方法之前,需要建立一個新的編輯日誌檔案edit.new。後續對檔案系統後設資料的改動,都會記錄到edit.new檔案中。
5、 SecondaryNameNode通過RPC技術把NameNode中的fsimage和edit檔案讀取過來,在記憶體中進行合併(3,4)
6、 在SecondaryNameNode中,在記憶體中合併的檔案為fsimage.ckpt。
7、 NameNode通過RPC技術把fsimage.ckpt下載到本地,把fsimage.ckpt覆蓋掉原來的fsimage,形成新的fsimage,把原來的edit.new改成edit。
3.6 DataNode
在資料節點上,hdfs檔案塊以Linux檔案系統上的普通檔案進行儲存。客戶端進行檔案內容操作時,先由NameNode節點告訴客戶端每個資料塊駐留在哪個資料節點,然後客戶端直接與資料節點進行通訊,處理與資料塊對應的本地檔案。同時,資料節點會和其他資料節點進行通訊,複製資料塊,保證資料的冗餘性。
DataNode節點會不斷向NameNode節點報告。初始化時,每個資料節點將當前儲存的資料塊告知NameNode節點。後續DataNode節點在工作的過程中,資料節點仍會不斷的更新 NameNode節點與之對應的後設資料資訊,並接受來自NameNode節點的指令,建立、移動或者刪除本地磁碟上的資料塊。
3.7 Hdfs的操作
3.7.1 建立目錄
這裡寫圖片描述
客戶端呼叫HDFS的FileSystem例項,也就是DistributedFileSystem的mkdir方法,該物件通過遠端呼叫NameNode節點上的遠端方法mkdir ,讓NameNode執行具體的建立子目錄操作。在目錄樹資料結構上的對應位置建立新的目錄節點,同時記錄這個操作並持久化到日誌中。在整個操作期間,客戶端和NameNode都不需要和DataNode節點互動。
3.7.2 刪除檔案
這裡寫圖片描述
同以上的步驟,先在NameNode上執行節點名字的刪除,但是DataNode上存放的資料塊也必須刪除。當NameNode執行delete方法時,它只標記操作涉及的需要被刪除的資料塊,而不會主動聯絡這些資料塊所在的DataNode節點。當儲存著這些資料塊的DataNode節點向NameNode節點傳送心跳時,在心跳應答裡,NameNode節點會向DataNode發出指令,從而把資料刪除掉。所以在執行完delete方法後的一段時間內,資料塊才能被真正的刪除掉。
3.7.3 讀檔案
這裡寫圖片描述
客戶端通過FileSystem.open()開啟檔案,在開啟檔案的時候,實際上建立了一個DFSInputStream輸入流,返回給了客戶端,客戶端使用這個輸入流讀取資料,在輸入流中會通過ClientProtocol.getBlockLocations方法來確定NameNode節點上標識的檔案資料塊的儲存位置(在DataNode節點上)。完成上述步驟,客戶端就知道了要讀取的檔案在哪個DataNode節點上,在哪個資料塊中。當執行FSDataInputStream的read方法時,客戶端的FSDataInputStream會和最近的資料節點建立聯絡。
3.7.4 寫檔案
這裡寫圖片描述
客戶端呼叫FileSystem的create方法建立檔案,這個時候會遠端呼叫NameNode,在檔案系統的名稱空間中建立一個新的檔案,NameNode建立新檔案時需要執行各種各樣的檢查,如NameNode是否正常工作,被建立的檔案已經存在,客戶端是否有在父目錄中建立檔案的許可權等。這些檢查都通過以後,NameNode會建立一個新的檔案,並記錄建立操作到編輯日誌edit中。當建立完成一個新的空檔案以後,客戶端需要向NameNode節點申請資料塊,執行addBlock方法。該方法執行成功以後,會返回一個LocatedBlock物件,該物件包含了新資料塊的資料塊標識和版本號。根據該LocatedBlock物件,客戶端就可以和對應的DataNode聯絡,然後通過寫操作,把一個一個Block寫入到DataNode中。當寫完一個資料包以後,DataNode節點通過呼叫NameNode節點的DatanodeProtocol遠端介面的blockReceived方法,向NameNode提交資料塊資訊。當把所有的資料寫完以後,就會呼叫close方法關閉流。
3.7.5 DataNode的啟動和心跳
這裡寫圖片描述
從上圖可以看出,當DataNode啟動的時候
1、 檢查版本號:
檢查本地的版本號和NameNode中的版本號是否一致
2、 把DataNode節點註冊到NameNode中
3、 DataNode需要向NameNode報告其資料節點的blocks資訊
4、 之後DataNode會一直向NameNode發出心跳資訊
4. Mapreduce
4.1 Mapreduce計算框架
Mapreduce執行分為map和reduce函式,Map函式為分支函式,根據key值,按照一定的功能進行分揀。reduce函式為聚合函式,根據key值,按照一定的功能進行聚合。
4.2 Mapreduce特點
mapreduce的計算框架要完成的事情如下:
1、 處理特別大量的資料。
2、 Map函式的節點部署,包括為所有節點分配cpu資源、記憶體資源、磁碟資源等。
3、 當很多map函式在進行計算的時候,如果有一個節點宕機了,整個計算框架必須得知道哪一個map函式所在的節點宕機。
4、 當map函式計算完畢以後,把結果就傳遞給reduce函式,reduce函式需要知道map函式計算完畢。
5、 資料量過大,分配到不同map執行節點執行。
3,4,5步驟可以稱為資源的排程。
所以mapreduce除了計算以外,還有資源分配和資源排程的事情。叢集節點過多對於計算來說就比較難了。所以框架既要完成計算,又要完成資源分配和資源排程任務。
4.3 Mapreduce的執行結構圖
這裡寫圖片描述
從5.3的分析可以看出,整個mapreduce計算框架可以分為資源分配、資源排程、計算三方面的內容。其中,資源分配是由mapreduce計算框架內部完成的,資源排程也是由mapreduce計算框架內部完成的。而計算的部分,使用者只參與了map階段和reduce階段的計算。從執行結構圖可以看出,步驟大致應該是這樣的:
1、 mapreduce計算框架先從hdfs系統中,把檔案提取出來
2、 用InputFormat進行適度的分割
3、 把分割完成的每一行送入到使用者提前寫好的map函式中進行分揀,所以使用者寫的map函式是由InputFormat呼叫的
4、 重複呼叫map函式,直到檔案所有的內容都被處理了
5、 把map運算完畢後的結果送入到程式設計師寫好的reduce函式
6、 Reduce函式進行規約處理(聚合運算)
7、 把reduce函式運算後的結果送入到OutputFormat中
8、 由OutputFormat把運算結果按照指定的格式輸出到hdfs中
從上面的順序可以看出,程式設計師只要寫兩部分內容即可:map和reduce。
4.4 Wordcount
給定指定的一個檔案,例如aa.txt檔案,計算該檔案中相同的單詞出現的數量
1、 思路
這裡寫圖片描述
根據需求可以得到:
Map中,key值為單詞,value為1即可
從圖中可以看出,map函式得到的是一個為1的集合
2、 map函式
這裡寫圖片描述
說明:
1、 MyMapper繼承了一個類Mapper,從上述程式碼可以看出Mapper是一個泛型類,定義了四個泛型KEYIN為輸入的key,VALUEIN為輸入的value,KEYOUT為輸出的key,VALUEOUT為輸出的value。
2、 MyMapper中的四個泛型引數給出的定義為:輸入key:LongWritable(偏移量),輸入value:Text,輸出key為Text(當前行文字),輸出value為LongWritable。
3、 LongWritable型別為實現了物件序列化介面的一個long型,因為要在網路上傳輸,所以必須實現物件的序列化。
4、 Text型別實現了物件序列化介面的一個文字型別。
3、 Reduce函式
這裡寫圖片描述
說明:
map函式的輸出的key,value就是reduce函式的輸入的key,value。
reduce函式輸出的不是直接落地(在hdfs系統中形成檔案),輸出的也是一個key,value,由OutputFormat負責落地
4.5 Mapreduce詳解
在mapreduce中,不管是map演算法還是reduce演算法實際上都稱為task,即map task和reduce task。
4.5.1 Map task
這裡寫圖片描述
說明:
1、 要處理的檔案儲存在hdfs中,是以block的形式儲存的。
2、 Maptask會把檔案的塊block送入到InputFormat中
3、 InputFormat的功能有兩個
1、 資料切分
按照一定的策略,將輸入資料切分成若干個split,以便確定Map Task
的數目。
2、 為Mapper提供輸入資料
給定某個split,能將其解析成一個個key/value對。
4.5.2 InputFormat
InputFormat主要使用者描述輸入資料的格式,它提供以下兩個功能
1. 資料切分:按照某個策略將輸入資料切分成若干個split,以便確定Map Task的數量。
2. 為 Mapper提供輸入資料:給定某個split,能將其解析成一個個key/value對。
4.5.3 OutputFormat
OutputFormat主要用於描述輸出資料的格式,它能夠將使用者提供的key/value對寫入特定格式的檔案。