你要的Hadoop,也不是很難吧--大數據入門到提高<一>

你要的Hadoop,也不是很難吧--大數據入門到提高<一>

來自專欄大數據5 人贊了文章

在這個數據爆炸的時代,再靠以前的excel分析數據的方法,未免會顯得有些吃力了。當然一些情況下對無數個TB的大數據的存儲也是頭疼的問題。當然某些帥氣的小夥子,就開始搞分散式存儲咯,如是hadoop就應運而生了(其實並不是應運而生的,hadoop的幾個關鍵架構都是參考的google的一些開源論文然後搞出來的,HDFS、YARN、MapReduce都是,因為google不提供對代碼不開源,當然這對於帥氣的攻城獅們也就是小問題了)

這一篇博客主要粗略的認識一下hadoop,以及幾個核心的架構。那麼就按照下面的結構來填充完整我們的這篇科普文章了:

1、hadoop的基本認識和介紹

2、HDFS的認識和介紹

3、YARN,萬能的資源調度

4、分散式計算框架----MapReduce

5、hadoop偽分散式和分散式環境的搭建以及使用

一、hadoop的基本認識和介紹

  1. 不知道大家會不會和我一樣好奇hadoop這個單詞是什麼意思,或者有什麼由來或者含義?比如過個是某個單詞googoly由來,然而,經過一番google之後,發現,原來hadoop是下面這哥們非常疼他的孩子,而他的孩子又很喜歡一個黃色的大象玩具,正巧這個時候說話又不怎麼說利索,又正巧他的兒子還給這個玩具取了個名字----hadoop,其實也不知道兒子(Doug的兒子,手動滑稽一下)是不是發的這個音。反正,現在hadoop就是我們支持分散式集群處理海量數據的一個框架了。

Doug Cutting

  1. 閑扯結束,那麼就正式開始對hadoop的了解和學習了。首先hadoop分為廣義的hadoop和狹義的hadoop。

狹義的hadoop:指的是包括分散式存儲HDFS,分散式計算MapReduce,資源管理系統YARN的這三個東西。後面我們會具體一一的介紹,以及如何使用。這裡只要知道有這樣的一個概念就行了;

廣義的hadoop:這個概念就比較大了,廣義的hadoop指的是hadoop的整個生態圈。生態圈是什麼鬼,下面這張圖,說明一切

我們從下往上看,最下面是HDFS,因為一切的基礎得在文件系統上,所以生態圈都是建立在文件系統上的。再往上是YARN,資源調度系統,可以調度管理運行在HDFS上的其他框架,比如Oozie,Pig,Hive等框架,再往左邊,Zookeeper,這個就有點意思了,右邊的框架大多是動物,什麼大象啊,豬啊,蜜蜂(假裝是蜜蜂)啊,所以就來個動物園管理員,當然實際功能也是和管理員差不多了。

廣義框架太多,對於我們這種新手來說,有可能直接就從入門到放棄了,那麼就退而求其次,來個狹義的先整整吧。

二、HDFS的認識和介紹

1、簡介

同上理,HDFS的名字由來,這個就不是某兒子的玩具了。HDFS:Hadoop Distributed File System。這是不是一下就明朗了,hadoop的分散式文件系統,自然也就是存儲文件的系統咯。當然官網也給出了一個這樣的定義:A distributed file system that provides high-throughput access to application data.一種分散式文件系統,可提供對應用程序數據的高吞吐量訪問。曉得了大概的用途,接下來我們再來講一下這個框架的具體架構。

2、架構

首先,上一張圖,這就是HDFS的架構

是不是一下就明朗了呢?你說,明朗個毛線,幾個框框,幾根箭頭,再寫點英文,讓我明朗什麼!!

當然,我們應該從中間找到重點辭彙,比如Namenode, Datanode, Client, Metadata,哈哈,挑選出了大部分不認識的單詞。不要急,我們慢慢來分析分析:

開始之前,先拋出一個概念,一個Master帶N個Slaves的模型。

WTF!!什麼鬼,其實這個概念中的Master就是指Namenode,而Slaves就是指的Datanode了。所以這下就突然明朗了不少了。圖中是不是就是一個namenode 帶了兩個datanode的模型。

那麼接下來你會不會問namenode和datanode有什麼用?當然,不管你問不問,我都會講的。

Namenode作用:

1)負責客戶端的請求響應

2)負責元數據(文件的名稱、副本係數,block存放的位置(datanode))的管理

這裡,客戶端的請求不難理解,就是用戶去訪問HDFS上存儲的數據(包括讀寫等操作)。第二個作用是對元數據的管理,首先什麼是元數據?元數據就是所需要訪問的數據的名稱、副本係數、所存儲的位置。再來,副本係數是什麼?這個就比較簡單了,就是我們需要的文件存放在HDFS上放了多少份,後面我們將HDFS的副本存放機制在仔細講一下。所以2)其實是1)的延生,有了請求,namenode再去根據請求的內容找到對應的位置。

Datanode作用:

1)存儲用戶文件相應的數據塊

2)定時向namenode發送心跳信息,彙報本節點以及所有block的信息和健康狀況。

第一條就很好理解了,其實第二條發送心跳信息也不難理解,就是隔一段時間,將本節點的存儲的數據的信息,比如文件名字、文件大小等信息,以及本節點是否正常工作,如果出現問題也及時向namenode發送,這樣namenode 就能做出相應的動作。

現在再回過頭去看上面的那張圖,是不是就豁然了。你說還有一個單詞沒有講噠,Rack,只能說您真細心。這個Rack是什麼呢,Rack就是機架,放namenode和datanode機器的機架,這裡有兩個機架,表明我們的datanode和namenode是分別放在不同的機架上的,如果出現一個機架斷電了,還有另外一個機架上存有副本,所以,數據還在,可以繼續嗨,不用落到刪了庫就要跑路的尷尬境地。

接下來再講講HDFS的數據讀寫數據的具體操作過程以及容錯和備份的具體流程:

3、具體讀寫數據的操作流程

blog.csdn.net/scdxmoe/a

打開連接自己看吧,是一組漫畫,講得很具體,很生動形象……

所以程序猿還是很厲害的,什麼都會,說不定下一個你遇到的程序員就是一個擁有黑鷹駕駛證的程序員勒,當然再牛逼的程序猿也是絕逼不會修電腦的,這點我敢保證!

4、副本存放策略

先上圖吧,熟悉的機架!橙色表示namenode,綠色表示datanode。這張圖想說明的是,當有數據來存放到HDFS上時,首先會找到和namenode 相同或則靠的最近的一個datanode存放一個副本(同一個機架),然後其他的兩個副本(這裡默認的副本係數是3)會存放到不同的機架上的不同節點上,這樣就很好的保證的容錯。不至於數據會因為節點的掛掉或者什麼原因而丟失,當然,如果正巧存放某個數據的那幾個節點掛掉了,那…..只能跑路了

接著插入第二幅圖,這裡有個概念—Block。 HDFS存放數據,不是我們的文件有多大,就是直接以原始文件大小開始存放,而是先將要存入的文件分成很多個block,每個block的默認大小是64M,這個大小是可以設置的,然後按照我們的副本係數去進行分散式的存儲,比如默認的副本係數是3,那麼每一個block就會分成3份,分別存放到3個不同的datanode上。到這裡,你可能會問,要是我要存放一個很多個G的數據,那不是要分成好多個block,然後當我再去讀取這個數據的時候那不是好麻煩。這個問題,是我們多慮了,因為這個分block的過程,以及組合的過程是我們用戶完全不知的,也就是透明的,我們存入的是什麼數據,取出來看到的還是什麼數據,中間過程我們不用去關心,就相當於一個黑盒子一樣。其實block的目的也就主要是為了節省空間和減小開銷。

接下來,看圖,上面的一個框框裡面的東西,我們在前面已經講過了,其實就是Metadata

Filename: /users/sameerp/data/part-0

numReplicas: 2

block-ids: 1,3

什麼意思?文件名字,副本係數,分成的block的id號

再來看datanodes下面的部分:

文件名為:/users/sameerp/data/part-0 的文件,他的副本係數是2,也就是每個block會存分成兩個存放到兩個不同的datanode上,而分成的這兩個block的id分別是1,3.

這樣,我們是不是就輕鬆的從第1個框框(datanode)和第3個框框中找到id為1的block了,同樣在第5個框框和第6個框框中找到id為3的block。

對這個存放策略瞭然了

好了,文件系統大概就寫這麼多了,具體hadoop歷史,架構,讀寫文件流程等都基本簡單過了一遍,那麼接下來就來講下資源調度框架YARN

三、YARN,萬能的資源調度

1、YARN如何資源調度

YARN,yet another resource negotiator 另一種資源協調者?反正就大概是這個意思吧,(不要在意我這種英語渣的瞎翻譯就是了),就是一個資源調度框架。這個是什麼意思呢,我是這樣理解的,比如有很多有名的東西,像什麼Spark on YARN,MapReduce on YARN,Flink on YARN 等等,這裡,我把yarn框架理解成一個像windows,linux這樣的操作系統,而Spark,Mapreduce,Flink這些框架就相當於我們安裝在操作系統上的應用,比如qq,微信,idea什麼的。這些應用需要多大的存儲空間,需要多少內存,佔用多少CPU資源,都統一由操作系統來調度和處理,而YARN也正是扮演一個這樣的角色。就像下面的一個圖描述的一樣,各種框架運行在YARN之上

好了,比喻也講完了,接下來依然看圖,說明真相。這裡,各種資源如果單獨去運行在一個機器上,那麼就像第一幅圖一樣,對資源的利用率不高,造成很多資源,比如磁碟,內存等的浪費。但是,當我們用了YARN之後,就想第二幅一樣,將各個時刻,各種情況的資源都用利用起來,可能原來要三台機器才能完成的工作,現在一台機器就能妥妥的搞定。所以,YARN有完美的解放了一點點生產力,讓世界的部分部分資源的到了充分利用。

好了,原理講解完了,我們繼續來寫一寫YARN的架構具體是怎麼一回事?

2、YARN架構介紹

當然,依然老規矩,上圖,畢竟有圖有真相嘛。

像我們前面介紹HDFS的架構的時候一樣,從圖中找關鍵字先,Client , Resource Manager , Node Manager , Container , App Mstr(ApplicationMaster),這裡我們依舊是來一個個解析關鍵詞:

Resource Manager:

整個集群同一時間提供服務的Resource Manager只有一個,負責集群資源的統一管理和調度; 處理客戶端的請求;

監控Node Manager:一旦某個Node Manager掛了,那麼該Node Manager上運行的任務需要告訴我們的ApplicationMaster來如何進行處理。

Node Manager

整個集群中有多個,負責自己本身節點資源管理和使用;

定時向Resource Manager彙報本節點的資源使用情況;

接收並處理來自RM的各種命令:啟動Container;

處理來自AM的命令;

單個節點的資源管理;

ApplicationMaster:

每個應用程序對應一個:MapReduce、Spark,負責應用程序的管理;

為應用程序向RM申請資源(core、memory),分配給內部task;

需要與NM通信:啟動/停止task,task是運行在container裡面,AM也是運行在container裡面;

Container:

封裝了CPU、Memory等資源的一個容器;

是一個任務運行環境的抽象;

Client:

提交作業

查詢作業的運行進度

殺死作業

好吧,幾個節點的關鍵作用就基本上時這些了。然後我們再以提交一個作業為例,然後捋一捋整個流程。假如我們向YARN上提交一個MapReduce作業(其實我應該先寫MapReduce,再寫YARN的,也無所謂了,反正都在一篇文章里了)。我們就是Client,提交的MapReduce就是一個ApplicationMaster,然後要運行這個作業,需要多少內存,多少core等資源,就向Resource Manager去申請資源,申請到後,Resource Manager便向Node Manager發送消息,告訴他,給MapReduce多少內存,多少core。然後Node Manager就從自家的倉庫里把這些資源取出來裝到一個盆子里(Container),給MapReduce到旁邊自己去玩去,然後MapReduce就用申請到的這些資源去跑對應的代碼,比如我們將要講的WordCount程序。

所以接下來就是MapReduce了。

四、分散式計算框架----MapReduce

對於MapReduce,官網上是這樣給出的介紹:Hadoop MapReduce是用於輕鬆編寫應用程序,以可靠,容錯的方式在大型集群(數千個節點)的商用硬體上並行處理大量數據(多TB數據集)的一個框架。

然後官網上又給出了MapReduce如何處理作業的:MapReduce作業通常將輸入數據集拆分為獨立的塊,這些塊由map任務以完全並行的方式處理。框架對地圖的輸出進行排序,然後輸入到reduce任務。通常,作業的輸入和輸出都存儲在文件系統中。該框架負責調度任務,監視它們並重新執行失敗的任務。

當然,不喜歡看這種有點晦澀的官方用語的看官,不要急,我們依舊會有老規矩的,上圖:

這是網上找的一個MapReduce做wordcount的流程圖,也就是將官方的語言圖片化了。依然老規矩,我們先找下圖片中的關鍵字,Input,Splitting ,Mapping,Shuffling,Reducing,Final result。Input和Final Result就不用多講了吧。重點說說中間的幾個單詞:

Splitting顧名思義,就是拆分的意思。把我們的輸入做拆分,這裡就是把輸入的一個文件按 照行做拆分之後,運行到不同的分散式節點上;

Mapping進行完Splitting之後,緊接著進行的步奏,在不同的節點上,再將先前分成的每一行的詞,拆分成單個的詞,並給這些詞標註上一個1,就是所謂的<K,V>;

Shuffling這個是整個操作中比較關鍵的一部,mapping操作是在不同的節點上進行的,這一步就是將在不同節點上的相同單詞放到同一個節點上;

Reducing:這個一步看圖也就基本能夠明白了,就是把Shuffling操作後的詞的詞頻做一個累加的操作,也就是該詞出現了多少次。然後將結果彙集到一起,輸出。

是不是總的來說,很好理解啊。好了,MapReduce的流程就是這個樣子了,最後再來看下它的架構,這個架構其實和YARN的有點類似,當然還是看圖,看圖後是不是發現,基本上和YARN是一個味道的貨色,當然關鍵詞表達的意思也是幾乎一致的。所以,我就不再單獨介紹了。那麼MapReduce就基本介紹到這兒吧。因為下一講還準備深入的講一下wordcount是實現。

五、hadoop偽分散式和分散式環境的搭建以及使用

分散式集群搭建:jianshu.com/p/1352ce8c8

偽分散式集群搭建:blog.csdn.net/qq_336894

自己點開鏈接看就完美了哈,因為我覺得裝東西永遠是最坑的,因為你不知道會遇到什麼問題,但是方法確實固定的,當遇到問題時只有見招拆招了。當然,最完美的參考還是官網的安裝教程的,因為是萬變源:

hadoop.apache.org/docs/

所以最好還是參考官網的安裝教程吧。

最後,說下我的安裝情況,我的是裝在centos的虛擬機上的,然後有個問題,可以注意一下,就是分散式和偽分散式的問題。其實我覺得,對於我們學習來說,沒有必要去裝分散式集群,當然,如果你有足夠多的電腦,就當我沒有說。如果是和我一樣的窮逼或者沒有條件的,就直接在電腦上裝個虛擬機,然後把東西裝在裡面就OK了,其實這個偽分散式基本上是和分散式一樣的,而且我們把代碼放到上面去跑,也完全和分散式沒有任何差別,所以就不要糾結這些問題了。當然,我也裝了分散式的集群,再我的一台破筆記本上,就是在虛擬機裡面多複製幾個,然後把他們的ip都改了,就成了很多台設備了.....

好了,這一講就基本上到這裡了,期待下一講,用代碼來把這個HDFS,YARN,MapReduce串起來吧。

碼字不容易啊

都看到這裡了,點個贊吧!

最後當如果有什麼想法,或者建議的,可以加我的qq 948173024,撩起來!


推薦閱讀:

最早的大數據應用原來來自於一群物理學家為了更方便的工作
如何通過MES技術防止製造數據造假
數據治理怎麼做?這篇萬字長文終於講清楚了!
真正被利用的大數據僅為1%?尼爾森助您賦能決策,數創未來!

TAG:大數據 | Hadoop | 大數據處理 |