天天看點

Hadoop學習筆記(一)第一章  初識Hadoop第二章 關于MapReduce

第一章  初識Hadoop

  • 資料!資料!

”大資料勝于好算法。“意思是說對于某些應用,不論算法有多牛,基于小資料的推薦效果往往都不如基于大量可用資料的一般算法的推薦效果。

  • 不僅僅是批處理

名詞”Hadoop“有時被用于指代一個更大的、多個項目組成的生态系統,而不僅僅是HDFS和MapReduce。這些項目都屬于分布式計算和大規模資料處理範疇。這些項目就包括了:

1.第一個提供線上通路的元件是HBase,一種使用HDFS做底層存儲的鍵值存儲模型。HBase不僅提供對單行的線上讀/寫通路,還提供對資料塊讀/寫的匹操作。

2.Hadoop2中YARN是一個叢集資源管理系統,允許任何一個分布式程式基于Hadoop叢集的資料而運作。

  • 相較于其他系統的優勢

1.關系型資料庫管理系統:

這裡有兩個問題:①為什麼不用資料庫來進行大規模資料分析?②為什麼需要Hadoop?

答案來自于計算機硬碟的一個發展趨勢:尋址時間的提升遠遠趕不上傳輸速率的提升。如果資料通路模式中包含大量的硬碟尋址,那麼讀取大量資料集就必然會花更長的時間(傳輸速率取決于硬碟的帶寬,流資料讀取模式主要取決于傳輸速率)。關系型資料庫采用傳統的B樹結構(這種資料結構受限于尋址的速率),如果資料庫系統隻更新一小部分記錄,那麼是有優勢的。但資料庫系統如果有大量資料更新時,B樹的效率就明顯落後于MapReduce,因為需要使用“排序/合并”來重建資料庫。在許多情況下,可以将MapReduce視為關系型資料庫管理系統的補充。

MapReduce比較适合解決需要以批處理方式分析整個資料集的問題,尤其是一些特定目的的分析。RDBMS适用于索引後資料集的點查詢和更新,建立索引的資料庫系統能夠提供對小規模資料的低延遲資料檢索和快速更新。MapReduce适合一次寫入,多次讀取資料的應用,關系型資料庫則更适合持續更新的資料集。

Hadoop和關系型資料庫的另一個差別在于它們所操作的資料集的結構化程度。Hadoop對非結構化或半結構化資料非常有效,因為它是在處理資料時才對資料進行解釋(讀時模式),避免了RDBMS資料加載階段帶來的高開銷,因為在Hadoop中僅僅是一個檔案拷貝操作。

第二章 關于MapReduce

MapReduce是一種可用于資料處理的程式設計模型。MapReduce程式本質上是并行運作的,是以可以将大規模的資料分析任務分發給任何一個擁有足夠多機器的資料中心。MapReduce的優勢就在于處理大規模資料集。

原始資料→Map(鍵值對)→sort→Reduce(鍵值對)→output

MapReduce工作原理:

            ⓵實作一個map函數⓶實作一個reduce函數⓷運作作業

➀public void map(key,values,Context context)

{

context.write(key,values);//map的輸出與reduce的輸入類型比對

}

②public void reduce(key,values,Context context)

{

context.write(key,values);//reduce的輸出類型也與輸入比對

}

③建立Job對象。

Job job = new Job();

job.setJarByClass(type.class);//方法傳入作業類型

job.setJobName();//設定作業名稱

//構造Job對象後,指定輸入和輸出路徑

FileInputFormat.addInputPath(job,new Path(...));

FileOutputFormat.setOutputPath(job,new Path(...));//這裡也是reduce的輸出路徑,之前目錄不應該存在(否則會覆寫掉資料)。

job.setMapperClass(type1.class);//這裡參數是map函數的類型

job.setReduceClass(type2.class);//這裡參數是reduce函數的類型

//最後輸出job作業的鍵值

job.setOutputKeyClass(key.class);

job.setOutputValueClass(value.class);//其鍵值于reduce類型比對

橫向擴充:現在開始鳥瞰整個系統以及有大量輸入時的資料流,為了實作橫向擴充,我們需要把資料存儲在分布式檔案系統中。通過使用Hadoop資源管理系統YARN,Hadoop可以将MapReduce計算轉移到存儲有部分資料的各台機器上。

  • 資料流

MapReduce作業是用戶端需要執行的一個工作單元:它包括輸入資料、MapReduce程式和配置資訊。Hadoop将作業分成若幹個任務來執行,其中包括兩類人物:map任務和reduce任務。這些任務運作在叢集的節點上,并通過YARN進行排程。如果一個任務失敗,它将在另一個不同的節點上自動重新排程運作。

Hadoop将MapReduce的輸入資料劃分成等長的小資料塊,成為輸入分片或簡稱“分片”。對于大多數作業來說,一個合理的分片大小趨向于HDFS的一個塊的大小,預設是128MB,不過可以針對叢集調整這個預設值(對所有建立的檔案),或在每個檔案建立時指定。

Hadoop在存儲有輸入資料的節點上運作map任務,可以獲得最佳性能,因為它無需使用寶貴的叢集帶寬資源。這就是所謂的“資料本地化優化”。最佳分片的大小應該與塊大小相同:因為它是確定可以存儲在單個節點上的最大輸入塊的大小。如果分片跨越兩個資料塊,那麼對于任何一個HDFS節點,基本上都不可能同時存儲這兩個資料塊,是以分片中的部分資料需要通過網絡傳輸到map任務運作的節點。與使用本地資料運作整個map任務相比,這種方法顯然效率更低。

map任務将其輸出寫入本地硬碟,而非HDFS。這是為什麼?因為map的輸出是中間結果:該中間結果由reduce任務處理後才産生最終輸出結果,而且一旦作業完成,map的輸出結果就可以删除。是以把map中間結果儲存到HDFS上未免小題大做了。reduce任務并不具備資料本地化的優勢,單個reduce任務的輸入通常來自于所有mapper的輸出。資料在reduce端合并,然後由使用者定義的reduce函數處理。reduce的輸出通常存儲在HDFS中以實作可靠存儲。

map任務和reduce任務之間的資料流稱為shuffle(混洗),因為每個reduce任務的輸入都來自許多map任務。shuffle調整混洗參數對作業總執行時間的影響非常大。最後當資料處理可以完全并行(即無需混洗時),可能會出現無reduce任務的情況。在這種情況下,唯一的非本地節點資料傳輸是map任務将結果寫入HDFS。

  • combiner函數

叢集上的可用帶寬限制了MapReduce作業的數量,是以盡量避免map和reduce任務之間的資料傳輸是有利的。Hadoop允許使用者針對map任務的輸出指定一個combiner,combiner函數的輸出作為reduce函數的輸入。由于combiner屬于優化方案,是以Hadoop無法确定要對一個指定的map任務輸出記錄調用多少次combiner。換而言之,不管調用combiner多少次,reducer的輸出結果都是一樣的。

繼續閱讀