Hadoop相關基礎知識

由於我的對這塊的知識也不熟悉,因此大多內容來源於網絡.node

1.      Hadoop項目框架程序員

 

2.      Hadoopweb

Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構算法

用戶能夠在不瞭解分佈式底層細節的狀況下,開發分佈式程序。充分利用集羣的威力進行高速運算和存儲。數據庫

Hadoop實現了一個分佈式文件系統(Hadoop DistributedFile System),簡稱HDFSHDFS有高容錯性的特色,而且設計用來部署在低廉的(low-cost)硬件上;並且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。編程

Hadoop的框架最核心的設計就是:HDFSMapReduce。HDFS爲海量的數據提供了存儲,則MapReduce爲海量的數據提供了計算。小程序

 

3.      HDFS後端

HDFS(Hadoop Distributed File System,Hadoop分佈式文件系統),它是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,適合那些有着超大數據集(large data set)的應用程序。緩存

 

HDFS的設計特色是:服務器

一、大數據文件,很是適合上T級別的大文件或者一堆大數據文件的存儲,若是文件只有幾個G甚至更小就沒啥意思了。

二、文件分塊存儲,HDFS會將一個完整的大文件平均分塊存儲到不一樣計算器上,它的意義在於讀取文件時能夠同時從多個主機取不一樣區塊的文件,多主機讀取比單主機讀取效率要高得多得都。

三、流式數據訪問,一次寫入屢次讀寫,這種模式跟傳統文件不一樣,它不支持動態改變文件內容,而是要求讓文件一次寫入就不作變化,要變化也只能在文件末添加內容。

四、廉價硬件,HDFS能夠應用在普通PC機上,這種機制可以讓給一些公司用幾十臺廉價的計算機就能夠撐起一個大數據集羣。

五、硬件故障,HDFS認爲全部計算機均可能會出問題,爲了防止某個主機失效讀取不到該主機的塊文件,它將同一個文件塊副本分配到其它某幾個主機上,若是其中一臺主機失效,能夠迅速找另外一塊副本取文件。

 

HDFS的關鍵元素:

Block:將一個文件進行分塊,一般是64M。

NameNode:保存整個文件系統的目錄信息、文件信息及分塊信息,這是由惟一一臺主機專門保存,固然這臺主機若是出錯,NameNode就失效了。在Hadoop2.*開始支持activity-standy模式----若是主NameNode失效,啓動備用主機運行NameNode。

DataNode:分佈在廉價的計算機上,用於存儲Block塊文件。

 

4.      MapReduce

GFSBigTable已經爲咱們提供了高性能、高併發的服務,可是並行編程可不是全部程序員都玩得轉的活兒,若是咱們的應用自己不能併發,那GFS、BigTable也都是沒有意義的。MapReduce的偉大之處就在於讓不熟悉並行編程的程序員也能充分發揮分佈式系統的威力。

簡單歸納的說,MapReduce是將一個大做業拆分爲多個小做業的框架(大做業和小做業應該本質是同樣的,只是規模不一樣),用戶須要作的就是決定拆成多少份,以及定義做業自己。

 

     例子:統計詞頻

若是我想統計下過去10年計算機論文出現最多的幾個單詞,看看你們都在研究些什麼,那我收集好論文後,該怎麼辦呢?

 

方法一:我能夠寫一個小程序,把全部論文按順序遍歷一遍,統計每個遇到的單詞的出現次數,最後就能夠知道哪幾個單詞最熱門了。

這種方法在數據集比較小時,是很是有效的,並且實現最簡單,用來解決這個問題很合適。

 

方法二:寫一個多線程程序,併發遍歷論文。

這個問題理論上是能夠高度併發的,由於統計一個文件時不會影響統計另外一個文件。當咱們的機器是多核或者多處理器,方法二確定比方法一高效。可是寫一個多線程程序要比方法一困難多了,咱們必須本身同步共享數據,好比要防止兩個線程重複統計文件。

 

方法三:把做業交給多個計算機去完成。

咱們可使用方法一的程序,部署到N臺機器上去,而後把論文集分紅N份,一臺機器跑一個做業。這個方法跑得足夠快,可是部署起來很麻煩,咱們要人工把程序copy到別的機器,要人工把論文集分開,最痛苦的是還要把N個運行結果進行整合(固然咱們也能夠再寫一個程序)。

 

方法四:讓MapReduce來幫幫咱們吧!

MapReduce本質上就是方法三,可是如何拆分文件集,如何copy程序,如何整合結果這些都是框架定義好的。咱們只要定義好這個任務(用戶程序),其它都交給MapReduce。

 

在介紹MapReduce如何工做以前,先講講兩個核心函數map和reduce以及MapReduce的僞代碼。

3. map函數和reduce函數

map函數和reduce函數是交給用戶實現的,這兩個函數定義了任務自己。

map函數:接受一個鍵值對(key-value pair),產生一組中間鍵值對。MapReduce框架會將map函數產生的中間鍵值對裏鍵相同的值傳遞給一個reduce函數。

reduce函數:接受一個鍵,以及相關的一組值,將這組值進行合併產生一組規模更小的值(一般只有一個或零個值)。

在統計詞頻的例子裏,map函數接受的鍵是文件名,值是文件的內容,map逐個遍歷單詞,每遇到一個單詞w,就產生一箇中間鍵值對<w, "1">,這表示單詞w咱又找到了一個;MapReduce將鍵相同(都是單詞w)的鍵值對傳給reduce函數,這樣reduce函數接受的鍵就是單詞w,值是一串"1"(最基本的實現是這樣,但能夠優化),個數等於鍵爲w的鍵值對的個數,而後將這些「1」累加就獲得單詞w的出現次數。最後這些單詞的出現次數會被寫到用戶定義的位置,存儲在底層的分佈式存儲系統(GFS或HDFS)。

4. MapReduce是如何工做的

 

上圖是論文裏給出的流程圖。一切都是從最上方的user program開始的,user program連接了MapReduce庫,實現了最基本的Map函數和Reduce函數。圖中執行的順序都用數字標記了。

 

MapReduce庫先把user program的輸入文件劃分爲M份(M爲用戶定義),每一份一般有16MB到64MB,如圖左方所示分紅了split0~4;而後使用fork將用戶進程拷貝到集羣內其它機器上。

user program的副本中有一個稱爲master,其他稱爲worker,master是負責調度的,爲空閒worker分配做業(Map做業或者Reduce做業),worker的數量也是能夠由用戶指定的。

被分配了Map做業的worker,開始讀取對應分片的輸入數據,Map做業數量是由M決定的,和split一一對應;Map做業從輸入數據中抽取出鍵值對,每個鍵值對都做爲參數傳遞給map函數,map函數產生的中間鍵值對被緩存在內存中。

緩存的中間鍵值對會被按期寫入本地磁盤,並且被分爲R個區,R的大小是由用戶定義的,未來每一個區會對應一個Reduce做業;這些中間鍵值對的位置會被通報給master,master負責將信息轉發給Reduce worker。

master通知分配了Reduce做業的worker它負責的分區在什麼位置(確定不止一個地方,每一個Map做業產生的中間鍵值對均可能映射到全部R個不一樣分區),當Reduce worker把全部它負責的中間鍵值對都讀過來後,先對它們進行排序,使得相同鍵的鍵值對彙集在一塊兒。由於不一樣的鍵可能會映射到同一個分區也就是同一個Reduce做業(誰讓分區少呢),因此排序是必須的。

reduce worker遍歷排序後的中間鍵值對,對於每一個惟一的鍵,都將鍵與關聯的值傳遞給reduce函數,reduce函數產生的輸出會添加到這個分區的輸出文件中。

當全部的Map和Reduce做業都完成了,master喚醒正版的user program,MapReduce函數調用返回user program的代碼。

全部執行完畢後,MapReduce輸出放在了R個分區的輸出文件中(分別對應一個Reduce做業)。用戶一般並不須要合併這R個文件,而是將其做爲輸入交給另外一個MapReduce程序處理。整個過程當中,輸入數據是來自底層分佈式文件系統(GFS)的,中間數據是放在本地文件系統的,最終輸出數據是寫入底層分佈式文件系統(GFS)的。並且咱們要注意Map/Reduce做業和map/reduce函數的區別:Map做業處理一個輸入數據的分片,可能須要調用屢次map函數來處理每一個輸入鍵值對;Reduce做業處理一個分區的中間鍵值對,期間要對每一個不一樣的鍵調用一次reduce函數,Reduce做業最終也對應一個輸出文件。

 

我更喜歡把流程分爲三個階段。第一階段是準備階段,包括一、2,主角是MapReduce庫,完成拆分做業和拷貝用戶程序等任務;第二階段是運行階段,包括三、四、五、6,主角是用戶定義的map和reduce函數,每一個小做業都獨立運行着;第三階段是掃尾階段,這時做業已經完成,做業結果被放在輸出文件裏,就看用戶想怎麼處理這些輸出了。

 

5. 詞頻是怎麼統計出來的

結合第四節,咱們就能夠知道第三節的代碼是如何工做的了。假設我們定義M=5,R=3,而且有6臺機器,一臺master。

 

這幅圖描述了MapReduce如何處理詞頻統計。因爲map worker數量不夠,首先處理了分片一、三、4,併產生中間鍵值對;當全部中間值都準備好了,Reduce做業就開始讀取對應分區,並輸出統計結果。

 

 

5.      HIVE

什麼是Hive?

Hive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,並提供類SQL查詢功能。

•本質是將SQL轉換爲MapReduce程序       

爲何使用Hive?

  人員學習成本過高  項目週期要求過短  我只是須要一個簡單的環境

  MapReduce如何搞定  複雜查詢好難  Join如何實現

•操做接口採用類SQL語法,提供快速開發的能力

•避免了去寫MapReduce,減小開發人員的學習成本

•擴展功能很方便


Hive與傳統數據庫對比

 

6.      HBase

HBase是什麼?

HBase是一個構建在HDFS上的分佈式列存儲系統

HBase是基於Google BigTable模型開發的,典型的key/value系統;

HBase是Apache Hadoop生態系統中的重要一員,主要用於海量結構化數據存儲

從邏輯上講,HBase將數據按照表、行和列進行存儲。

與hadoop同樣,Hbase目標主要依靠橫向擴展,經過不斷增長廉價的商用服務器,來增長計算和存儲能力。

 

HBase表的特色

:一個表能夠有數十億行,上百萬列;

無模式每行都有一個可排序的主鍵和任意多的列,列能夠根據須要動態的增長,同一張表中不一樣的行能夠有大相徑庭的列;

面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;

稀疏:空(null)列並不佔用存儲空間,表能夠設計的很是稀疏;

數據多版本:每一個單元中的數據能夠有多個版本,默認狀況下版本號自動分配,是單元格插入時的時間戳

數據類型單一:Hbase中的數據都是字符串,沒有類型

 

HBase的數據模型

RowKey:是Byte array,是表中每條記錄的「主鍵」,方便快速查找,Rowkey的設計很是重要。

Column Family:列族,擁有一個名稱(string),包含一個或者多個相關列

Column:屬於某一個columnfamily,familyName:columnName,每條記錄可動態添加

Version Number:類型爲Long,默認值是系統時間戳,可由用戶自定義

Value(Cell):Byte array

每一個column family存儲在HDFS上的一個單獨文件中,空值不會被保存

Key 和 Versionnumber在每一個 column family中均有一份;

HBase 爲每一個值維護了多級索引,即:<key, column family, column name, timestamp>

 

HBase的存儲方式

物理存儲:

一、  Table中全部行都按照row key的字典序排列

二、  Table在行的方向上分割爲多個Region

三、  Region按大小分割的,每一個表開始只有一個region,隨着數據增多,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region,以後會有愈來愈多的region;

四、  Region是Hbase中分佈式存儲和負載均衡最小單元,不一樣Region分佈到不一樣RegionServer上。


五、  Region雖然是分佈式存儲的最小單元,但並非存儲的最小單元。Region由一個或者多個Store組成,每一個store保存一個columns family;每一個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內存中,StoreFile存儲在HDFS

StoreFile以HFile格式保存在HDFS上

 

 

 

 

 

HBase的架構及其組件

 

Hbase基本組件說明:

Client

包含訪問HBase的接口,並維護cache來加快對HBase的訪問,好比region的位置信息

 

Master

1.       爲Region server分配region(Table在行的方向上分割爲多個Region)

2.       負責Region server的負載均衡

3.       發現失效的Region server並從新分配其上的region(zookeeper)

4.       管理用戶對table的增刪改查操做

 

Region Server

1.      Regionserver維護region,處理對這些region的IO請求                  `

2.      Regionserver負責切分在運行過程當中變得過大的region(當表中的行數增多時,region達到閥值的時候會進行分割)

 

 

Zookeeper做用(我的理解至關於一個容災機制)

1.      經過選舉,保證任什麼時候候,集羣中只有一個master,Master與RegionServers 啓動時會向ZooKeeper註冊

2.      存貯全部Region的尋址入口

3.      實時監控Region server的上線和下線信息。並實時通知給Master  

4.       存儲HBase的schema和table元數據(這個schema應該怎麼理解?)

5.      Zookeeper的引入使得Master再也不是單點故障(除非全部服務器掛了,不然zookeeper能夠保證其正常運行)


 

7.  pig

什麼是pig?

Pig是一個基於Hadoop的大規模數據分析平臺,它提供的SQL-LIKE語言叫Pig Latin該語言的編譯器會把類SQL的數據分析請求轉換爲一系列通過優化處理的MapReduce運算。Pig爲複雜的海量數據並行計算提供了一個簡單的操做和編程接口。

pig的特色

      一、專一于于大量數據集分析(ad-hocanalysis , ad-hoc 表明:a solution that has been custom designed for a specific problem );

      二、運行在集羣的計算架構上,YahooPig 提供了多層抽象,簡化並行計算讓普通用戶使用;這些抽象完成自動把用戶請求queries翻譯成有效的並行評估計劃,而後在物理集羣上執行這些計劃;

     三、提供相似 SQL 的操做語法;

     四、開放源代碼;

pig的主要用戶 yahoo  twitter

 

8.  Zookeeper

         ZooKeeper 顧名思義 動物園管理員,他是拿來管大象(Hadoop)、 蜜蜂(Hive) 、 小豬(Pig)  的管理員, Apache Hbase和 Apache Solr以及LinkedIn sensei  等項目中都採用到了Zookeeper。ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,ZooKeeper是以Fast Paxos算法爲基礎,實現同步服務,配置維護和命名服務等分佈式應用。

Zookeeper 從程序員的角度來說能夠理解爲Hadoop的總體監控系統。若是namenode,HMaster宕機後,這時候Zookeeper 的從新選出leader

 

9.  Hive/pig與HBase的區別

Hive的底層能夠是HBase或者HDFS上存儲的文件。

Hive的做用是把HQL翻譯成MapReduce程序,從而減小分析人員每次都要寫冗長Java程序的工做量。單次Hive查詢都須要耗費分鐘級以上的時間(哪怕一個再小的表),所以沒法做爲web後端的數據庫使用

HBase能夠替代MySQL使用,至少淘寶就是這麼作了。HBase是建造在HDFS基礎上的分佈式數據庫,能夠支持海量數據(比MySQL高一到兩個量級)的存儲和查詢。還不容易丟失數據。HBase爲查詢而生的,它經過組織起節點內全部機器的內存,提供一個超大的內存Hash表,它須要組織本身的數據結構,包括磁盤和內存中的,而Hive是不作這個的,表在HBase中是物理表,而不是邏輯表,搜索引擎使用它來存儲索引,以知足查詢的實時性需求。

pig和hive對於開發人員,直接使用JavaAPIs多是乏味或容易出錯的,同時也限制了Java程序員在Hadoop上編程的運用靈活性。因而Hadoop提供了兩個解決方案,使得Hadoop編程變得更加容易。

Pig是一種編程語言,它簡化了Hadoop常見的工做任務。Pig可加載數據、表達轉換數據以及存儲最終結果。Pig內置的操做使得半結構化數據變得有意義(如日誌文件)。同時Pig可擴展使用Java中添加的自定義數據類型並支持數據轉換。

HiveHadoop中扮演數據倉庫的角色。Hive添加數據的結構在HDFS(hivesuperimposes structure on data in HDFS),並容許使用相似於SQL語法進行數據查詢。與Pig同樣,Hive的核心功能是可擴展的。

Pig和Hive老是使人困惑的。Hive更適合於數據倉庫的任務,Hive主要用於靜態的結構以及須要常常分析的工做。Hive與SQL類似促使其成爲Hadoop與其餘BI工具結合的理想交集。Pig賦予開發人員在大數據集領域更多的靈活性,並容許開發簡潔的腳本用於轉換數據流以便嵌入到較大的應用程序。Pig相比Hive相對輕量,它主要的優點是相比於直接使用Hadoop Java APIs可大幅削減代碼量。正由於如此,Pig仍然是吸引大量的軟件開發人員。

相關文章
相關標籤/搜索