1. 程式人生 > >Hadoop核心架構內部機理詳解

Hadoop核心架構內部機理詳解

HDFS的體系架構

整個Hadoop的體系結構主要是通過HDFS來實現對分散式儲存的底層支援,並通過MR來實現對分散式並行任務處理的程式支援。

HDFS採用主從(Master/Slave)結構模型,一個HDFS叢集是由一個NameNode和若干個DataNode組成的(在最新的Hadoop2.2版本已經實現多個NameNode的配置-這也是一些大公司通過修改hadoop原始碼實現的功能,在最新的版本中就已經實現了)。NameNode作為主伺服器,管理檔案系統名稱空間和客戶端對檔案的訪問操作。DataNode管理儲存的資料。HDFS支援檔案形式的資料。

從內部來看,檔案被分成若干個資料塊,這若干個資料塊存放在一組DataNode上。NameNode執行檔案系統的名稱空間,如開啟、關閉、重新命名檔案或目錄等,也負責資料塊到具體DataNode的對映。DataNode負責處理檔案系統客戶端的檔案讀寫,並在NameNode的統一排程下進行資料庫的建立、刪除和複製工作。NameNode是所有HDFS元資料的管理者,使用者資料永遠不會經過NameNode。

如圖:HDFS體系結構圖

圖中涉及三個角色:NameNode、DataNode、Client。NameNode是管理者,DataNode是檔案儲存者、Client是需要獲取分散式檔案系統的應用程式。

檔案寫入:

   1)  Client向NameNode發起檔案寫入的請求。

   2)  NameNode根據檔案大小和檔案塊配置情況,返回給Client它管理的DataNode的資訊。

   3)  Client將檔案劃分為多個block,根據DataNode的地址,按順序將block寫入DataNode塊中。

檔案讀取:

   1)  Client向NameNode發起讀取檔案的請求。

   2)  NameNode返回檔案儲存的DataNode資訊。

   3)  Client讀取檔案資訊。

      HDFS作為分散式檔案系統在資料管理方面可借鑑點:

檔案塊的放置:一個Block會有三份備份,一份在NameNode指定的DateNode上,一份放在與指定的DataNode不在同一臺機器的DataNode上,一根在於指定的DataNode在同一Rack上的DataNode上。備份的目的是為了資料安全,採用這種方式是為了考慮到同一Rack失敗的情況,以及不同資料拷貝帶來的效能的問題。

MapReduce體系架構

MR框架是由一個單獨執行在主節點上的JobTracker和執行在每個叢集從節點上的TaskTracker共同組成。主節點負責排程構成一個作業的所有任務,這些任務分佈在不同的不同的從節點上。主節點監視它們的執行情況,並重新執行之前失敗的任務。從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接受到提交作業和配置資訊之後,就會將配置資訊等分發給從節點,同時排程任務並監控TaskTracker的執行。JobTracker可以運行於叢集中的任意一臺計算機上。TaskTracker負責執行任務,它必須執行在DataNode上,DataNode既是資料儲存節點,也是計算節點。JobTracker將map任務和reduce任務分發給空閒的TaskTracker,這些任務並行執行,並監控任務執行的情況。如果JobTracker出了故障,JobTracker會把任務轉交給另一個空閒的TaskTracker重新執行。

HDFS和MR共同組成Hadoop分散式系統體系結構的核心。HDFS在叢集上實現了分散式檔案系統,MR在叢集上實現了分散式計算和任務處理。HDFS在MR任務處理過程中提供了檔案操作和儲存等支援,MR在HDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成分散式叢集的主要任務。

Hadoop上的並行應用程式開發是基於MR程式設計框架。MR程式設計模型原理:利用一個輸入的key-value對集合來產生一個輸出的key-value對集合。MR庫通過Map和Reduce兩個函式來實現這個框架。使用者自定義的map函式接受一個輸入的key-value對,然後產生一箇中間的key-value對的集合。MR把所有具有相同的key值的value結合在一起,然後傳遞個reduce函式。Reduce函式接受key和相關的value結合,reduce函式合併這些value值,形成一個較小的value集合。通常我們通過一個迭代器把中間的value值提供給reduce函式(迭代器的作用就是收集這些value值),這樣就可以處理無法全部放在記憶體中的大量的value值集合了。

流程簡而言之,大資料集被分成眾多小的資料集塊,若干個資料集被分在叢集中的一個節點進行處理併產生中間結果。單節點上的任務,map函式一行行讀取資料獲得資料的(k1,v1),資料進入快取,通過map函式執行map(基於key-value)排序(框架會對map的輸出進行排序)執行後輸入(k2,v2)。每一臺機器都執行同樣的操作。不同機器上的(k2,v2)通過merge排序的過程(shuffle的過程可以理解成reduce前的一個過程),最後reduce合併得到,(k3,v3),輸出到HDFS檔案中。

談到reduce,在reduce之前,可以先對中間資料進行資料合併(Combine),即將中間有相同的key的<key,value>對合並。Combine的過程與reduce的過程類似,但Combine是作為map任務的一部分,在執行完map函式後僅接著執行。Combine能減少中間結果key-value對的數目,從而降低網路流量。

Map任務的中間結果在做完Combine和Partition後,以檔案的形式存於本地磁碟上。中間結果檔案的位置會通知主控JobTracker,JobTracker再通知reduce任務到哪一個DataNode上去取中間結果。所有的map任務產生的中間結果均按其key值按hash函式劃分成R份,R個reduce任務各自負責一段key區間。每個reduce需要向許多個map任務節點取的落在其負責的key區間內的中間結果,然後執行reduce函式,最後形成一個最終結果。有R個reduce任務,就會有R個最終結果,很多情況下這R個最終結果並不需要合併成一個最終結果,因為這R個最終結果可以作為另一個計算任務的輸入,開始另一個平行計算任務。這就形成了上面圖中多個輸出資料片段(HDFS副本)。

Hbase資料管理

Hbase就是Hadoop database。與傳統的mysql、oracle究竟有什麼差別。即列式資料與行式資料由什麼區別。NoSql資料庫與傳統關係型資料由什麼區別:

Hbase VS Oracle

     1、  Hbase適合大量插入同時又有讀的情況。輸入一個Key獲取一個value或輸入一些key獲得一些value。

     2、  Hbase的瓶頸是硬碟傳輸速度。Hbase的操作,它可以往資料裡面insert,也可以update一些資料,但update的實際上也是insert,只是插入一個新的時間戳的一行。Delete資料,也是insert,只是insert一行帶有delete標記的一行。Hbase的所有操作都是追加插入操作。Hbase是一種日誌集資料庫。它的儲存方式,像是日誌檔案一樣。它是批量大量的往硬碟中寫,通常都是以檔案形式的讀寫。這個讀寫速度,就取決於硬碟與機器之間的傳輸有多快。而Oracle的瓶頸是硬碟尋道時間。它經常的操作時隨機讀寫。要update一個數據,先要在硬碟中找到這個block,然後把它讀入記憶體,在記憶體中的快取中修改,過段時間再回寫回去。由於你尋找的block不同,這就存在一個隨機的讀。硬碟的尋道時間主要由轉速來決定的。而尋道時間,技術基本沒有改變,這就形成了尋道時間瓶頸。

     3、  Hbase中資料可以儲存許多不同時間戳的版本(即同一資料可以複製許多不同的版本,准許資料冗餘,也是優勢)。資料按時間排序,因此Hbase特別適合尋找按照時間排序尋找Top n的場景。找出某個人最近瀏覽的訊息,最近寫的N篇部落格,N種行為等等,因此Hbase在網際網路應用非常多。

     4、  Hbase的侷限。只能做很簡單的Key-value查詢。它適合有高速插入,同時又有大量讀的操作場景。而這種場景又很極端,並不是每一個公司都有這種需求。在一些公司,就是普通的OLTP(聯機事務處理)隨機讀寫。在這種情況下,Oracle的可靠性,系統的負責程度又比Hbase低一些。而且Hbase侷限還在於它只有主鍵索引,因此在建模的時候就遇到了問題。比如,在一張表中,很多的列我都想做某種條件的查詢。但卻只能在主鍵上建快速查詢。所以說,不能籠統的說那種技術有優勢。

     5、 Oracle是行式資料庫,而Hbase是列式資料庫。列式資料庫的優勢在於資料分析這種場景。資料分析與傳統的OLTP的區別。資料分析,經常是以某個列作為查詢條件,返回的結果也經常是某一些列,不是全部的列。在這種情況下,行式資料庫反應的效能就很低效。

      行式資料庫:Oracle為例,資料檔案的基本組成單位:塊/頁。塊中資料是按照一行行寫入的。這就存在一個問題,當我們要讀一個塊中的某些列的時候,不能只讀這些列,必須把這個塊整個的讀入記憶體中,再把這些列的內容讀出來。換句話就是:為了讀表中的某些列,必須要把整個表的行全部讀完,才能讀到這些列。這就是行資料庫最糟糕的地方。

      列式資料庫:是以列作為元素儲存的。同一個列的元素會擠在一個塊。當要讀某些列,只需要把相關的列塊讀到記憶體中,這樣讀的IO量就會少很多。通常,同一個列的資料元素通常格式都是相近的。這就意味著,當資料格式相近的時候,資料就可以做大幅度的壓縮。所以,列式資料庫在資料壓縮方面有很大的優勢,壓縮不僅節省了儲存空間,同時也節省了IO。(這一點,可利用在當資料達到百萬、千萬級別以後,資料查詢之間的優化,提高效能,示場景而定)

Hive資料管理

Hive是建立在Hadoop上的資料倉庫基礎架構。它提供了一系列的工具,用來進行資料提取、轉換、載入,這是一種可以儲存、查詢和分析儲存在Hadoop中的大規模資料機制。可以把Hadoop下結構化資料檔案對映為一張成Hive中的表,並提供類sql查詢功能,除了不支援更新、索引和事務,sql其它功能都支援。可以將sql語句轉換為MapReduce任務進行執行,作為sql到MapReduce的對映器。提供shell、JDBC/ODBC、Thrift、Web等介面。優點:成本低可以通過類sql語句快速實現簡單的MapReduce統計。作為一個數據倉庫,Hive的資料管理按照使用層次可以從元資料儲存、資料儲存和資料交換三個方面介紹。

(1)元資料儲存

     Hive將元資料儲存在RDBMS中,有三種方式可以連線到資料庫:

     ·內嵌模式:元資料保持在內嵌資料庫的Derby,一般用於單元測試,只允許一個會話連線

     ·多使用者模式:在本地安裝Mysql,把元資料放到Mysql內

     ·遠端模式:元資料放置在遠端的Mysql資料庫

(2)資料儲存

      首先,Hive沒有專門的資料儲存格式,也沒有為資料建立索引,用於可以非常自由的組織Hive中的表,只需要在建立表的時候告訴Hive資料中的列分隔符和行分隔符,這就可以解析資料了。

      其次,Hive中所有的資料都儲存在HDFS中,Hive中包含4中資料模型:Tabel、ExternalTable、Partition、Bucket。

      Table:類似與傳統資料庫中的Table,每一個Table在Hive中都有一個相應的目錄來儲存資料。例如:一個表zz,它在HDFS中的路徑為:/wh/zz,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的資料倉庫的目錄,所有的Table資料(不含External Table)都儲存在這個目錄中。

      Partition:類似於傳統資料庫中劃分列的索引。在Hive中,表中的一個Partition對應於表下的一個目錄,所有的Partition資料都儲存在對應的目錄中。例如:zz表中包含ds和city兩個Partition,則對應於ds=20140214,city=beijing的HDFS子目錄為:/wh/zz/ds=20140214/city=Beijing;

      Buckets:對指定列計算的hash,根據hash值切分資料,目的是為了便於並行,每一個Buckets對應一個檔案。將user列分數至32個Bucket上,首先對user列的值計算hash,比如,對應hash=0的HDFS目錄為:/wh/zz/ds=20140214/city=Beijing/part-00000;對應hash=20的,目錄為:/wh/zz/ds=20140214/city=Beijing/part-00020。

      ExternalTable指向已存在HDFS中的資料,可建立Partition。和Table在元資料組織結構相同,在實際儲存上有較大差異。Table建立和資料載入過程,可以用統一語句實現,實際資料被轉移到資料倉庫目錄中,之後對資料的訪問將會直接在資料倉庫的目錄中完成。刪除表時,表中的資料和元資料都會刪除。ExternalTable只有一個過程,因為載入資料和建立表是同時完成。世界資料是儲存在Location後面指定的HDFS路徑中的,並不會移動到資料倉庫中。

(3)資料交換

     ·使用者介面:包括客戶端、Web介面和資料庫介面

     ·元資料儲存:通常是儲存在關係資料庫中的,如Mysql,Derby等

     ·Hadoop:用HDFS進行儲存,利用MapReduce進行計算。

      關鍵點:Hive將元資料儲存在資料庫中,如Mysql、Derby中。Hive中的元資料包括表的名字、表的列和分割槽及其屬性、表的屬性(是否為外部表)、表資料所在的目錄等。

      Hive的資料儲存在HDFS中,大部分的查詢由MapReduce完成。

總結:

通過對Hadoop分散式計算平臺最核心的分散式檔案系統HDFS、MapReduce處理過程,以及資料倉庫工具Hive和分散式資料庫Hbase的介紹。基本涵蓋了Hadoop分散式平臺的所有技術核心。從體系架構到資料定義到資料儲存再到資料處理,從巨集觀到微觀的系統介紹,為Hadoop平臺上大規模的資料儲存和任務處理打下基礎。

相關推薦

Hadoop核心架構內部機理

HDFS的體系架構 整個Hadoop的體系結構主要是通過HDFS來實現對分散式儲存的底層支援,並通過MR來實現對分散式並行任務處理的程式支援。 HDFS採用主從(Master/Slave)結構模型,一個HDFS叢集是由一個NameNode和若干個DataNode組成的

Thinking in BigData(八)大資料Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理

      純乾貨:Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理詳解。       通過這一階段的調研總結,從內部機理的角度詳細分析,HDFS、MapReduce、Hbase、Hive是如何執行,以及基於Hadoop資料倉庫的構建和分散式資

Hadoop核心架構

釋出時間: 2014-7-4 14:14:04     通過對Hadoop分散式計算平臺最核心的分散式檔案系統HDFS、MapReduce處理過程,以及資料倉庫工具Hive和分散式資料庫Hbase的介紹,基本涵蓋了Hadoop分散式平臺的所有技術核心。   通過這一階段的

Hadoop核心架構HDFS+MapReduce+Hbase+Hive

通過對Hadoop分散式計算平臺最核心的分散式檔案系統HDFS、MapReduce處理過程,以及資料倉庫工具Hive和分散式資料庫Hbase的介紹,基本涵蓋了Hadoop分散式平臺的所有技術核心。 通過這一階段的調研總結,從內部機理的角度詳細分析,HDFS、MapRed

hadoop大數據平臺架構之DKhadoop

優勢 基礎 可用 核心 技術 並行處理 項目 完整 簡化 hadoop大數據平臺架構之DKhadoop詳解大數據的時代已經來了,信息的爆炸式增長使得越來越多的行業面臨這大量數據需要存儲和分析的挑戰。Hadoop作為一個開源的分布式並行處理平臺,以其高拓展、高效率、高可靠等優

hadoop大資料平臺架構之DKhadoop

大資料的時代已經來了,資訊的爆炸式增長使得越來越多的行業面臨這大量資料需要儲存和分析的挑戰。Hadoop作為一個開源的分散式並行處理平臺,以其高拓展、高效率、高可靠等優點越來越受到歡迎。這同時也帶動了hadoop商業版的發行。這裡就通過大快DKhadoop為大家詳細介紹一下h

Elasticsearch基本概念及核心配置文件

last log4j 強烈 內存 文檔 size oca 機制 集群   Elasticsearch5.X,下列的是Elasticsearch2.X系類配置,其實很多配置都是相互兼容的 1. 配置文件 config/elasticsearch.yml 主配置文件

10.javaweb核心標簽庫

bean對象 靜態 管理 請求 技術 範例 begin odin url 一、JSTL簡介及在項目中安裝配置 1, 簡介 使用JSTL標簽的目的就是不希望jsp中出現java邏輯代碼 分類 2, JSTL的安裝配置 首先將jar包中的各個標簽庫配置

Android進階筆記:AIDL內部實現 (二)

ucc == 筆記 null stack 直接 android 最好 public 接著上一篇分析的aidl的流程解析。知道了aidl主要就是利用Ibinder來實現跨進程通信的。既然是通過對Binder各種方法的封裝,那也可以不使用aidl自己通過Binder來實現跨進

19、《每天5分鐘玩轉Docker容器技術》學習--Overlay Network內部結構

hostman cloudman cloud openstack docker 一、環境描述以容器方式運行 Consul:通過 http://192.168.56.129:8500 訪問 Consul修改 docker02 和 docker03 的 docker daemon 的配置文件,

Java開源生鮮電商平臺-Java後端生成Token架構與設計(源碼可下載)

red 基於 一次 frame service state dha 概述 class Java開源生鮮電商平臺-Java後端生成Token架構與設計詳解(源碼可下載) 目的:Java開源生鮮電商平臺-Java後端生成Token目的是為了用於校驗客戶端,防止重復提交. 技

Kubernetes核心概念之Service

clusterip ips aml 開放 lan font led IT 架構 Service是k8s中非常重要的組成單元,作用是作為代理把在POD中容器內的服務發布出去,提供一套簡單的發現機制和服務代理,也就是運維常說的‘前端’概念,那麽它如何實現代理功能以及自動

Hadoop核心架構(1)

追加 特性 框架 實用 endif 出現 ive 擁有 get 在大數據的發展過程中,出現了一批專門應用與大數據的處理分析工具,如Hadoop,Hbase,Hive,Spark等,我們先從最基礎的Hadoop開始進行介紹 Hadoop是apache基金會下所開發的分布式基礎

架構設計-支付寶、京東、美團、去哪兒的支付系統架構整體設計!!!

支付產品模組是按照支付場景來為業務方提供支付服務。這個模組一般位於支付閘道器之後,支付渠道之前。 它根據支付能力將不同的支付渠道封裝成統一的介面,通過支付閘道器來對外提供服務。所以,從微服務的角度,支付產品本身也是一個代理模式的微服務,它透過支付閘道器響應業務方請求, 進行一些統一處理後,分發到不同

hadoop環境安裝配置步驟

hadoop環境安裝配置步驟詳解 在上一篇的分享文章中我是給大家分享了執行部署hadoop的一些安裝準備工作,這篇接上一篇繼續為大家分享一些個人的學習經驗總結。我學習用的是大快發行版DKHadoop,所以所有的經驗分享都是以DKHadoop為基礎,這裡要先說明一下。個人覺得DKHadoop對

PHP核心-Zend引擎的

在前面的章節介紹了PHP的生命週期,PHP的SAPI,SAPI處於PHP整個架構較上層,而真正指令碼的執行主要由Zend引擎來完成, 這一小節我們介紹PHP指令碼的執行。 目前程式語言可以分為兩大類: 第一類是像C/C++, .NET, Java之類的編譯型語言, 它們的共性是: 執

Hadoop Mapreduce的shuffle過程

1、map task讀取資料時預設呼叫TextInputFormat的成員RecoreReader,RecoreReader呼叫自己的read()方法,進行逐行讀取,返回一個key、value; 2、返回的key、value交給自定義的map方法,輸出的context.write(key,value),再交

[媒體轉碼]視訊內容誰來保護?阿里雲視訊加密架構及原理

視訊行業的從業者——尤其是線上教育、財經分析等重視內容版權的播放平臺都知道,視訊安全是一個非常重要的基礎需求。使用者通過一次付費行為,就可以拿到付費視訊的播放URL,將播放URL進行二次分發,這種行為叫做盜鏈;使用者直接將視訊下載到本地,然後再進行二次上傳分發,這種行為叫做盜播,這兩種行為都會給內容

Android架構元件WorkManager

       WorkManager架構元件是用來管理後臺工作任務。這個時候你可能會奇怪了Android不是已經 有很多管理後臺任務的類了麼,比如JobScheduler, AlarmManger、在比如AsyncTask, ThreadPool。Wo

Java 進階——多執行緒優化之執行緒池 ThreadPoolExecutor的核心容器阻塞佇列(一)

#引言 多執行緒我想無論是後端開發,還是對於App開發者來說都不會陌生,何況Android強制要求不能在主執行緒中做網路請求,於是乎,在很多初學者或者App的原始碼中會出現會多的new Thread…的方式,這樣的程式碼是不優雅而且存在很多的隱患,假如說在使用者