Hadoop權威指南復讀(一)

     最近又重新回讀權威指南,感覺曾經都只是淺顯的略過,可能確實是學的多了就會看到事物不一樣的那一面哈……所以這一遍爭取記錄下來一些心得和所學吧,也會在記錄的同時查看很多前人的筆記,所以還是要感謝各位在網絡上的分享!

    參考鏈接如下:http://www.zdingke.com/2019/08/27/schema-on-read%E4%B8%8Eschema-on-write/

                             https://blog.csdn.net/rokii/article/details/2137450

     一.摘要及重要信息記錄

     1.數據集:

     Amazon Web Services

     Infochimps.org

     美國國家氣候數據中心NCDC

     2.摘要:

          MapReduce作爲一個批量查詢處理器,其每個查詢需要處理整個數據集或至少一個數據集的絕大部分。

          尋址時間的提升遠遠不敵於傳輸速率的提升。尋址是將磁頭移動到特定硬盤位置進行讀寫操作的過程,而傳輸速率取決於硬盤的帶寬

          MapReduce適合一次寫入,多次讀取數據的應用,關係型數據庫適合持續更新的數據集。(RDBMS適用於索引後數據集的點查詢和更新)

          結構化數據指有既定格式的實體化數據(XML)。半結構化數據指可能有格式,但經常只作爲對數據結構的一般性指導(電子表格:存在表格結構,但是具體數據格式不固定)。非結構化數據指沒有特定的內部數據結構。

          數據本地化特性是Hadoop數據處理的核心。

          處理海量數據時面臨的問題是協調性和可靠性(任務完成時間與所有節點完成最長任務時間有關,即任務分配問題;任務結果聚合問題)

          Hadoop本身提供了一套可優化網絡序列化傳輸的基本類型(org.apache.hadoop.io),而不直接使用Java內嵌的類型。

          Hadoop會再存儲有輸入數據的節點上運行map任務,即可不使用集羣帶寬資源,達成數據本地化的優化。

          reduce任務不具備數據本地化的優勢,因爲單個reduce任務的輸入通常來自所有mapper的輸出。排過序的map輸出通過網絡傳輸發送到運行的reduce任務的節點,而後在reduce端合併並處理。並且處於安全的考慮,reduce輸出的每個HDFS塊,第一個副本存儲在本地節點,其他副本存儲在其他機架節點中,所以將reduce的輸出寫入HDFS確實需要佔用網絡帶寬。

          集羣上的可用帶寬限制了MapReduce作業的數量,因此儘量避免map和reduce任務之間的數據傳輸可以使用combiner作爲優化。由於combiner屬於優化方案,所以Hadoop無法確定要對一個指定map輸出記錄調用多少次combiner,即不管調用多少次,reducer的輸出結果都是一樣的。

     二.提及概念

     1.獨立冗餘磁盤陣列(RAID)

          獨立冗餘磁盤陣列是一種通過將相同數據同時存儲在多個硬盤的不同地方上,從而提高存儲系統的存儲和讀取數據的吞吐量的方法。也就可以達到單個磁盤驅動成倍數增加的傳輸速率。並且由於數據存儲時還會使用數據校驗,也大大提高了數據的容錯能力。RAID0不具有冗餘能力,RAID1,4,5等則通過增加磁盤數量的方式提高了校驗和容錯的能力。

     2.讀時模式與寫時模式

          讀時模式:數據在此模式下,並不在加載時進行對數據的ETL工作等,直到進行查詢操作才進行。適用於非結構化數據,如Hadoop對非結構化和半結構化的數據非常有效,因爲其是在處理數據時纔對數據進行解釋,正是讀時模式。

          寫時模式:如同傳統數據庫中查詢數據等操作所示,只要數據不符合模式,則拒絕加載數據並報錯。適用於結構化數據。

     3.無共享框架(Shared Nothing Architecture)

          Shared Nothing Architecture(無分享架構)是一個分佈式的架構,每個節點都是獨立的。即通過將必要共享信息集中存儲在數據庫中或緩存中,使得各個節點保持無狀態性,同時保證各節點之間的數據互通性,即均從集中存儲的位置獲取,一旦變更也能及時同步,提高性能和效率。

     4.Lucene和Nutch

          Lucene和Nutch的最大的區別在於前者是工具,是一個提供很多全文搜索方式的函數庫,而後者是在前者的基礎上的一個應用。後者在集成前者的功能的基礎上還增加了數據採集等Web相關的內容。

          Lucene,Solr和Elasticsearch:

          Lucene仍然是是提供函數的工具包,Solr和Elasticsearch都是基於Lucene開發的產品級搜索引擎。

     5.awk

          awk是Linux系統下的一個文本分析工具,可以通過參數化的操作完成文本內數據的分析。

          其基本的書寫格式爲:awk   [options]   ' {[pattern] action} ' {filenames}

          options:標明用於分割的字符串或正則表達式,也可以是賦值一個用戶定義的變量。

          {[pattern] action}:標明要做的動作

          {filenames}:要進行該操作的文件夾名稱

          awk內存在很多內置變量,如-F實際上表示的就是內置變量中的FS(設置輸入域分隔符),此外還有OFS(輸出域分隔符),ORS(輸出記錄分隔符)等。

          eg. awk -F ',' '{print $1,$2}' test.txt(表示用','分割test.txt內字符串,並輸出第一項和第二項)

     6.org.apache.hadoop.io

          這裏我以Hadoop-2.7.4爲例,其中常用的類型有ArrayWritable,BooleanWritable,BytesWritable,ByteWritable,DoubleWritable,FloatWritable,IntWritable,LongWritable,MapWritable,NullWritable,ObjectWritable,ShortWritable,Text等用於Map傳輸和Reduce接收。此外,其中很多類都是實現了WritableComparable接口。即在Writable的基礎上添加了compareTo的方法,該方法可以用於判斷key是否唯一。所以由於Hadoop數據傳輸過程中,key與value的數據類型的關係仍保持着K/V對的特性,所以能用作key的值同樣可以作爲value,相反則由於不唯一的關係不可使用。

     7.MapReduce main程序:輸出路徑應該是不存在的(防止長時間運行的作業結果被覆蓋),默認情況下Reduce函數的輸出和Map函數的輸入類型相同,如果不同,則需要通過setMapOutputKeyClass和setMapOutputValueClass來設置Map函數的輸出類型。

     8.MapReduce作業(job):客戶端需要執行的一個工作單元,包括輸入數據,MapReduce程序和配置信息。Hadoop將作業分成若干個任務(task),包括兩類任務:map任務和reduce任務,通過YARN進行調度。如果一個任務失敗,將在另一個不同的節點上自動重新調度運行(應注意的是前言提到的當reduce任務失敗時可能需要重新獲取mao任務的數據,即會同樣導致相關map任務的重新運行)。

     9.分片:Hadoop將MapReduce的輸入數據劃分成等長的小數據塊,即輸入分片。Hadoop爲每個分片構建一個map任務,並由該任務來運行用戶定義的map函數從而處理分片的每條記錄(一般而言,一個合理的分片大小趨向於HDFS的一個塊大小:128M)。

     10.本地數據,本地機架,跨機架:機架感知(RackAwareness)是爲了處理當某些特殊問題發生時避免不同節點之間的跨機架通信,而是儘可能發生在同一個機架之內,但與此同時,爲了避免整體機架發生問題,各節點又會將數據塊的副本放在多個機架上。考慮到副本的放置策略是使數據可靠並且開銷更小,所以數據塊被創建時,第一個副本放在本地節點中,第二個副本放在相同機架不同節點中,第三個副本放在不同機架的節點中。

     11.combiner:Combiner作爲Map和Reduce的中間可選流程,能夠減少Map發到Reducer上的數據量,提高Reducer的工作效率和處理效率,但是我們仍會需要Reducer作爲最終數據處理的一個不可替代的流程。

     在我的理解中,如果有Combiner的存在,流程大致可以爲(Map—>Combiner(數據預處理)—>Reducer(數據最終處理)),在這樣的流程中減輕了大數據量從Map端輸出,從而減少網絡帶寬和Reducer之上的負載。但是如果沒有了Reducer,也就是用Combiner取代了Reducer,流程則可能爲(Map—>Combiner(數據最終處理)—>Reducer(數據接收))那這樣的話,Combiner就做了Reducer的工作,並且將所有的壓力轉移到了中間流程上,實際上與原有的Map直接到Reducer端的流程就沒有本質的區別了,也就沒有什麼所謂的性能提升了。也就是說Combiner的核心是幫助削減Map的輸出,而不是幫助Reducer做最終的數據處理。並且Combiner只處理單臺機器生成的數據,也就是說Reducer是能處理多個Mapper的數據的,Combiner只能處理一個Mapper的輸入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章