《大数据技术原理与应用》林子雨(第二版)--总结
廈大子雨老師的這本書內容不多,但是很全面,推薦適合大數據入門。本篇文章主要是自己根據書中內容,以QA的形式做下總結,且對書后答案做了解答。
文章目錄
- 第一篇 大數據基礎
- 大數據處理架構Hadoop
- 1. 試述 hadoop 和谷歌的 mapreduce、gfs 等技術之間的關系
- 2. 試述 Hadoop 具有哪些特性。
- 3. 試述 Hadoop 在各個領域的應用情況。
- 4. 試述 Hadoop 生態系統以及每個部分的具體功能
- 5. 配置Hadoop時,Java的路徑JAVA_HOME是在哪一個配置文件中進行設置的?
- 6. 所有節點的HDFS路徑是通過fs.default.name來設置的,請問它是在哪個配置文件中設置的?
- 7. 試著列舉單機模式和偽分布模式的異同點。
- 8. Hadoop偽分布式運行啟動后所具有的進程都有哪些?
- 第二篇 大數據存儲與管理
- 分布式文件系統HDFS
- 1. 什么是分布式文件系統?
- 2. 分布式文件系統結構有什么特點,且是如何實現高水平擴展的?
- 3. HDFS如何保證節點可能出現故障的情況?
- 4. 試述 HDFS 中的塊和普通文件系統中的塊的區別。
- 5. 試述 HDFS 中的名稱節點和數據節點的具體功能。
- 6. 為什么HDFS不適合存儲大量小文件?
- 7. 在分布式文件系統中,中心節點的設計至關重要,請闡述HDFS是如何減輕中心節點的負擔的?
- 8. HDFS只設置唯一一個主節點,在簡化系統設計的同時也帶來了一些明顯的局限性,請闡述局限性具體表現在哪些方面?
- 9. 試述HDFS的冗余數據保存策略。
- 10. 數據復制主要是在數據寫入和數據恢復時發生,HDFS數據復制是采用流水線復制的策略,請闡述該策略的細節。
- 11. HDFS是如何探測錯誤發生以及如何進行恢復的?
- 12. 闡述HDFS在不發生故障的情況下讀文件的過程。
- 13. 闡述HDFS在不發生故障的情況下寫文件的過程。
- 分布式數據庫HBase
- 1. 試述在 Hadoop 體系架構中 HBase 與其他組成部分的相互關系。
- 2. 請闡述 HBase 和 BigTable 的底層技術的對應關系
- 3. 請闡述 HBase 和傳統關系數據庫的區別
- 4. 說明 HBase 數據模型。
- 5. 分別解釋 HBase 中行鍵、列鍵和時間戳的概念
- 6. 闡述 HBase 的概念視圖和物理視圖的不同
- 7. 試述 HBase 各功能組建及其作用
- 8. 闡述 HBase 的數據分區機制。
- 9. HBase 中的分區是如何定位的。
- 10. 試述 HBase 的三層結構中各層次的名稱和作用。
- 11. 闡述 HBase 的三層結構下,客戶端是如何訪問到數據的。
- 12. 試述 HBase 系統基本架構以及每個組成部分的作用。
- 13. 請闡述 Region 服務器向 HDFS 文件系統中讀寫數據的基本原理
- 14. 試述 HStore 的工作原理
- 15. 試述 HLog 的工作原理
- 16. 在 HBase 中,每個 Region 服務器維護一個 HLog,而不是為每個 Region 都單獨維護一個 HLog。請說明這種做法的優缺點。
- 17. 當一臺 Region 服務器意外終止時,Master 如何發現這種意外終止情況?為了恢復這臺發生意外的 Region 服務器上的 Region,Master 應該做出哪些處理 (包括如何使用 HLog 進行恢復)?
- 18. 行式存儲和列式存儲的區別是什么?
- 19. HBase是列式存儲數據庫嗎?
- NoSQL數據庫
- 1. NoSQL 數據庫的四大類型,并解釋其含義。
- 2. 試述 CAP 理論的具體含義。
- 3. 試述數據庫的 ACID 四性的含義
- 4. 請解釋軟狀態、無狀態、硬狀態的具體含義。
- 5. 試述不一致性窗口的含義。
- 第三章 大數據處理與分析
- MapReduce
- 1. MapReduce 模型采用 Master(JobTracker)-Slave(TaskTracker) 結構,試描述 JobTracker 和 TasKTracker 的功能。
- 2. TaskTracker出現故障會有什么影響?該故障是如何處理的?
- 3. MapReduce計算模型的核心是Map函數和Reduce函數,試述這兩個函數各自的輸入,輸出以及處理過程。
- 4. 試述 MapReduce 的工作流程 (需包括提交任務、Map、Shuffle、Reduce 的過程)。
- 6. Shuffle過程是MapReduce工作流程的核心,試分析Shuffle過程的作用。
- 7. 分別描述Map端和Reduce端的Shuffle過程(需包括spill、Sort、Merge、Fetch的過程)
- 8. MapReduce 中有這樣一個原則: 移動計算比移動數據更經濟。試述什么是本地計算,并分析為何要采用本地計算。
- 9. 試說明一個 MapReduce 程序在運行期間,所啟動的 Map 任務數量和 Reduce 任務數量各是由什么因素決定的。
- 10. 是否所有的 MapReduce 程序都需要經過 Map 和 Reduce 這兩個過程? 如果不是,請舉例說明。
- 11. 分析為何采用 Combiner 可以減少數據傳輸量? 是否所有的 MapReduce 程序都可以采用 Combiner? 為什么?
- 12. MapReduce 程序的輸入文件、輸出文件都存儲在 HDFS 中,而在 Map 任務完成時的中間結果則存儲在本地磁盤中。試分析中間結果存儲在本地磁盤而不是 HDFS 上有何優缺點?
- 13. 早期版本的HDFS,其默認塊大小為64MB,而較新版本默認為128MB,采用較大的塊具有什么影響和優缺點?
- 14. 試著畫出使用MapReduce來對英語句子“Whatever is worth doing is worth doing well”進行單詞統計的過程。
- 15. 在基于MapReduce的單詞統計中,MapReduce是如何保證相同的單詞數據會劃分到同一個Reducer上進行處理以保證結果的正確性?
- Hadoop再探討
- 1. HDFS1.0 中只包含一個名稱節點會帶來哪些問題(單點故障問題)。
- 2. 請描述 HDFS HA 架構組成組建及其具體功能。
- 3. 請分析 HDFS HA 架構中數據節點如何和名稱節點保持通信。
- 4. 為什么需要HDFS聯邦,它能解決什么問題?
- 5. 描述HDFS 聯邦中 “塊池” 的概念,分析為什么 HDFS 聯邦中的一個名稱節點失效,也不會影響到與它相關的數據節點繼續為其他名稱節點提供服務。
- 6. 請闡述 MapReduce1.0 體系結構中存在的問題。
- 7. 請描述 YARN 架構中各組件的功能。
- 8. YARN 框架中執行一個 MapReduce 程序時,從提交到完成需要經歷的具體步驟。
- 9. 請對 YARN 和 MapReduce1.0 框架進行優劣勢對比分析。
- 10. 請分別描述 Pig、Tez 和 Kafka 的功能。
- Spark
- 1. 闡述如下 Spark 的幾個主要概念:RDD、DAG、階段、分區、窄依賴、寬依賴。
第一篇 大數據基礎
大數據處理架構Hadoop
1. 試述 hadoop 和谷歌的 mapreduce、gfs 等技術之間的關系
Hadoop 的核心是分布式文件系統 HDFS 和 MapReduce。HDFS 是谷歌文件系統 GFS 的開源實現,具有較高的讀寫速度、很好的容錯性和可伸縮性,支持大規模數據的分布式存儲。MapReduces 是針對谷歌 MapReduce 的開源實現,允許用戶在不了解分布式系統底層細節的情況下開發并行應用程序,采用MapReduce來整合分布式文件系統上的數據,可保證分析和處理數據的高效性。
2. 試述 Hadoop 具有哪些特性。
① 高可靠性(采用冗余數據存儲方式,一個副本宕機時,其他副本也可以正常對外服務);
② 高效性
③ 高可擴展性
④ 高容錯性
⑤ 成本低
3. 試述 Hadoop 在各個領域的應用情況。
2007 年,雅虎在 Sunnyvale 總部建立了 M45——一個包含了 4000 個處理器和 1.5PB 容量的 Hadooop 集群系統;
Facebook主要將 Hadoop 平臺用于日志處理,推薦系統和數據倉庫等方面;
百度主要使用 Hadoop 于日志的存儲和統計、網頁數據的分析和挖掘、商業分析、在線數據反饋、網頁聚類等。
4. 試述 Hadoop 生態系統以及每個部分的具體功能
Hadoop生態系統包括:Ambari(安裝、部署、配置和管理工具),zookeeper(分布式協作服務),HBase(分布式數據庫),Hive(數據倉庫),Pig(數據流處理),Mahout(數據挖掘庫),MapReduce(分布式計算框架),YARN(資源調度和管理框架),HDFS(分布式文件系統),Flume(日志收集),Sqoop(數據庫ETL)。
其中每個部分的具體功能如下:
HDFS 是 Hadoop 項目的兩個核心之一,它是針對谷歌文件系統的開源實現。其放寬了一部分POSIX約束,從而實現以流的方式訪問文件系統中的數據。
HBase 是一個提高可靠性、高性能、可伸縮、實時讀寫、分布式的列式數據庫,一般采用 HDFS 作為其底層數據存儲。
MapReduce是一種編程模型, 是針對谷歌 MapReduce 的開源實現,用于大規模數據集的并行運算。核心思想是分而治之,把輸入的數據集切分為若干獨立的數據塊,分發給一個主節點管理下的各個分節點來共同并行完成,最后通過整合各個節點的中間結果得到最終結果。
Hive 是一個基于 Hadoop 的數據倉庫工具,可以用于對 Hadoop 文件中的數據集進行數據整理、特殊查詢和分布存儲。
Mahout的功能主要是提供一些可擴展的機器學習領域經典算法的實現,目的是幫助開發人員更加方便快捷的創建智能應用程序。
Pig 是一種數據流語言和運行環境,適合于使用 Hadoop 和 MapReducce 平臺上查詢大型半結構化數據集。
Zoookepper 是針對谷歌 Chubby 的一個開源實現,是高效和可靠的協同工作系統,提供分布式鎖之類的基本服務,用于構建分布式應用,減輕分布式應用程序所承擔的協調任務。
Flume的功能是在日志系統中定制各類數據的發送方用于收集數據,同時提供對數據進行簡單處理并寫到各種數據接收方的能力。
Sqoop用來在Hadoop和關系數據庫之間交換數據,可以改進數據的互操作性。
Ambari支持Hadoop集群的安裝,部署配置和管理。
5. 配置Hadoop時,Java的路徑JAVA_HOME是在哪一個配置文件中進行設置的?
在安裝Hadoop時,Hadoop文件夾中的"etc/hadoop"目錄下的hadoop-env.sh文件,將JAVA_HOME環境變量指定到本機的JDK目錄即可。
$export JAVA_HOME=/usr/lib/jvm/default-java6. 所有節點的HDFS路徑是通過fs.default.name來設置的,請問它是在哪個配置文件中設置的?
在conf/core-site.xml中設置,core-site是用來配置HDFS和MapReduce常用的I/O設置等。
7. 試著列舉單機模式和偽分布模式的異同點。
相同點:偽分布式安裝是指在一臺機器上模擬一個小的集群,但是集群中只有一個節點。單機模式同樣是在一臺機器上完成部署,因此相同點是都在一臺機器上。
不同點:單機hadoop無需進行配置,偽分布式需要通過配置文件來對各個組件的協同工作進行設置;單機模式是在本地的文件系統, 偽分布式需要將本地文件上傳到HDFS的文件夾中(無需網絡,因為都在同一臺機器)。
8. Hadoop偽分布式運行啟動后所具有的進程都有哪些?
6個進程:NodeManager,jps,NameNode,SecondaryNameNode,DataNode,ResourceManager。
第二篇 大數據存儲與管理
本章主要介紹大數據存儲與管理的相關技術,主要包括:HDFS,分布式數據庫HBase,NoSQL數據庫和云數據庫。
HDFS提供了服務器集群中進行大規模分布式文件存儲的能力,HBase是一個分布式數據庫,主要用來存儲非結構化和半結構化的松散數據,NoSQL支持超大規模的數據存儲,云數據庫是部署在云環境的數據庫。
本章重點在于:分布式文件系統及分布式數據庫的實現原理和應用方法,難點在HDFS存儲原理及HBase實現原理。
分布式文件系統HDFS
1. 什么是分布式文件系統?
分布式文件系統是一種通過網絡實現文件在多臺主機上進行分布式存儲的文件系統。其設計一般采用“客戶機/服務器”模式,客戶端以特定的通信協議通過網絡與服務器建立連接,提出文件訪問請求,客戶端和服務器可以通過設置訪問權來限制請求方對底層數據存儲塊的訪問。
2. 分布式文件系統結構有什么特點,且是如何實現高水平擴展的?
① 普通文件系統的塊是512個字節,每次讀寫的數據量必須是磁盤塊的整數倍,分布式文件系統HDFS的一個塊默認是64MB,如果一個文件小于一個數據塊的大小,它并不占用整個數據塊的存儲空間;
② 分布式系統的物理結構上是由計算機集群的多個節點構成的,這些節點分別是主節點和從節點。
③ 為了保證數據的完整性,分布式文件系統通常采用多副本存儲。
3. HDFS如何保證節點可能出現故障的情況?
HDFS通常采用多副本存儲,文件塊會被復制為多個副本,存儲在不同的節點上,且存儲同一文件塊的不同副本的各個節點會分布在不同的機架上,這樣,在單個節點出現故障時,就可以快速調用副本重啟單個節點上的計算過程,而無需重啟整個計算過程,整個機架出現故障時也不會丟失所有文件塊。
4. 試述 HDFS 中的塊和普通文件系統中的塊的區別。
在傳統的文件系統中,為了提高磁盤讀寫效率,一般以數據塊為單位,而不是以字節為單位。 HDFS 中的塊,默認一個塊大小為 64MB,而 HDFS 中的文件會被拆分成多個塊,每個塊作為獨立的單元進行存儲。HDFS 在塊的大小的設計上明顯要大于普通文件系統。
5. 試述 HDFS 中的名稱節點和數據節點的具體功能。
主節點負責文件和目錄的創建刪除重命名,同時管理著從節點和文件塊的映射關系,因此客戶端只有訪問名稱節點才能找到請求的文件塊所在的位置,進而到相應位置讀取所需的文件塊。
從節點負責數據的存儲和讀取,存儲時由主節點分配存儲位置,然后由客戶端把數據直接寫入到相應的從節點;在讀取時客戶端從主節點中獲得從節點和文件塊的映射關系,然后就可以到相應位置訪問文件塊。
6. 為什么HDFS不適合存儲大量小文件?
① HDFS采用NameNode來管理文件系統的元數據,這些元數據被保存在內存中,從而使客戶端可以快速的獲取文件實際存儲位置。但當小文件比較多時,名稱節點要花大量的內存來保存這些元數據信息,這樣會導致元數據的檢索效率變低;
② MapReduce處理大量小文件時,會產生過多的map任務,線程管理開銷會大大增加;
③ 訪問大量小文件的速度要遠低于訪問幾個大文件的速度,因為訪問小文件要不斷從一個數據節點跳到另一個數據節點,影響性能。
7. 在分布式文件系統中,中心節點的設計至關重要,請闡述HDFS是如何減輕中心節點的負擔的?
我認為從兩個方面考慮:一個是HDFS的主從架構,另一個是第二名稱節點。
首先HDFS采用了主從架構模型,一個HDFS集群包括一個名稱節點和若干個數據節點。名稱節點作為中心服務器,負責管理文件系統的命名空間及客戶端對文件的訪問。數據節點一般是一個節點運行一個數據節點進程,負責處理文件系統客戶端的讀寫請求,在名稱節點的統一調度下進行數據庫的創建、刪除和復制等操作。
其實是第二名稱節點,為了有效的解決EditLog逐漸變大帶來的問題,HDFS設計時采用了第二名稱節點,其可以完成EditLog和FsImage的合并操作,減小EditLog文件大小,縮短名稱節點的重啟時間。其次可以作為名稱節點的檢查點,來保存名稱節點的元數據信息。
8. HDFS只設置唯一一個主節點,在簡化系統設計的同時也帶來了一些明顯的局限性,請闡述局限性具體表現在哪些方面?
① 命名空間的限制。名稱節點是保存在內存中的,因此名稱節點能夠容納對象(文件、塊)的個數會受到內存空間大小的限制;
② 性能的瓶頸,整個分布式文件系統的吞吐量受限于單個名稱節點的吞吐量(單位時間內成功地傳送數據的數量);
③ 隔離問題。只有一個命名空間無法對不同應用程序進行隔離;
9. 試述HDFS的冗余數據保存策略。
HDFS采用多副本的方法對數據進行冗余存儲,通常一個數據塊的多個副本會被分布到不同的數據節點上。
10. 數據復制主要是在數據寫入和數據恢復時發生,HDFS數據復制是采用流水線復制的策略,請闡述該策略的細節。
HDFS的數據復制采用了流水線復制的策略,其顯著的提高了數據復制過程的效率:
① 當客戶端往HDFS中寫入一個文件時,這個文件會首先被寫入本地,并被切分成若干個塊,每個塊的大小是由HDFS的設定值決定的;
② 每個塊向HDFS集群中的名稱節點發起寫請求,名稱節點會根據系統中各個數據節點的使用情況,選擇一個數據節點列表返回給客戶端;
③ 客戶端會把數據首先寫入列表中的第一個數據節點,同時把列表傳給第一個數據節點;
④ 當第一個數據節點接收到4KB數據時,寫入本地,且向列表中的第二個數據節點發起連接請求,把自己已經接收到的4KB數據和列表傳給第二個數據節點,當第二個數據節點接收到4KB數據時,寫入本地,且向列表中第三個數據節點發送請求,一次類推,由列表中的多個數據節點形成一條數據復制的流水線,最后當文件寫完時,數據復制完成。
11. HDFS是如何探測錯誤發生以及如何進行恢復的?
HDFS的錯誤可以分為3種情況:名稱節點出錯,數據節點出錯以及數據出錯。
① 名稱節點出錯:名稱節點發生宕機(或者是FsImage和EditLog發生損壞)。首先到遠程掛載的網絡文件系統種獲取備份的元數據信息,放到第二名稱節點上進行恢復,并把第二名稱節點作為名稱節點來使用。
② 數據節點出錯:數據節點發生故障或者斷網,從而導致數據節點無法定期向名稱節點發送心跳。名稱節點會定期檢查心跳,通過數據冗余復制來生產新的副本。
③ 數據出錯:如何探測–文件被創建時,客戶端會對每一個文件塊進行信息摘錄,并把這些信息寫入同一個路徑的隱藏文件里。當客戶端讀取文件時,會先讀取該信息文件,然后利用該信息文件對每個讀取的數據塊進行校驗。如何恢復-- 當校驗出錯時,客戶端會請求到另外一個數據節點讀取該文件塊,并向名稱節點報告這個文件塊有誤。
12. 闡述HDFS在不發生故障的情況下讀文件的過程。
① 打開文件:客戶端通過FileSystem.open()打開文件,調用open方法后,DistributedFileSystem會創建輸入流;
② 獲取數據塊信息:輸入流哦通過getBlockLocations方法獲得文件開始部分數據塊的保存位置。對于該數據塊,名稱節點返回保存該數據庫的所有數據節點的地址,同時根據距離客戶端的遠近對數據節點進行排序,同時返回給客戶端數據塊的數據節點地址;
③ 讀取請求:客戶端調用read()函數開始讀取數據,輸入流根據前面的排序結果,選擇距離客戶端最近的數據節點建立連接并讀取數據;
④ 讀取數據:數據從該數據節點讀到客戶端;
⑤ 獲得數據塊信息:輸入流通過getBlockLocations()方法查找下一個數據塊(如果客戶端緩存中已經包含了該數據塊的位置信息,就不需要調用該方法。)
⑥ 讀取數據:找到該數據塊的最佳數據節點(距離客戶端最近),讀取數據;
⑦ 關閉文件:當客戶端讀取完畢數據時,通過close函數關閉輸入流。
13. 闡述HDFS在不發生故障的情況下寫文件的過程。
① 創建文件請求:客戶端通過create方法創建文件輸出流;
② 創建文件元數據:輸出流通過RPC遠程調用名稱節點,在文件系統的命名空間中創建一個新的文件,名稱節點會執行一些檢查,通過后,會返回給客戶端使用這個輸出流來寫入數據;
③ 寫入數據:客戶端用輸出流的write方法向HDFS中對應的文件寫入數據;
④ 寫入數據包:客戶端由輸出流寫入的數據會首先被分為一個個的分包,這些分包被放入DFSOutputStream對象的內部隊列,輸出流FSDataOutputStream會向名稱節點申請保存文件和副本數據塊的若干個數據節點,這些數據節點形成一個數據流管道。按照流水線復制的方法,將數據包留經管道上的各個數據節點。
⑤ 接受確認包:接受到數據的數據節點需要向發送者發送確認包,確認包從管道一次經故各個數據節點最終發往客戶端,當客戶端收到應答時,將對應的分包從內部隊列中清除,直到數據全部寫完;
⑥ 關閉文件:通知名稱節點關閉文件,完成一次正常的寫文件過程。
分布式數據庫HBase
1. 試述在 Hadoop 體系架構中 HBase 與其他組成部分的相互關系。
HBase 利用 Hadoop MapReduce 來處理 HBase 中的海量數據,實現高性能計算;利用 Zookeeper 作為協同服務,實現穩定服務和失敗恢復;使用 HDFS 作為高可靠的底層存儲,利用廉價集群提供海量數據存儲能力; Sqoop 為 HBase 的底層數據導入功能,Pig 和 Hive 為 HBase 提供了高層語言支持,HBase 是 BigTable 的開源實現。
2. 請闡述 HBase 和 BigTable 的底層技術的對應關系
① 文件存儲系統:BigTable基于GFS,HBase基于HDFS;
② 海量數據處理:BigTable基于MapReduce,HBase基于Hadoop MapReduce;
③ 協同服務管理:BigTable基于Chubby,HBase基于Zookeeper;
3. 請闡述 HBase 和傳統關系數據庫的區別
①數據類型:關系數據庫采用關系模型,HBase采用數據模型。數據模型就是把數據存儲為未經解釋的字符串,用戶可以將不同格式的結構化數據和非結構化數據都序列化成字符串保存在HBase中,然后通過自己的程序把字符串解析成不同的數據類型;
② 數據操作:關系數據庫中會涉及復雜的多表連接,HBase中通常只采用單表的主鍵查詢;
③ 存儲模式:關系數據庫基于行存儲,HBase基于列存儲。
4. 說明 HBase 數據模型。
關系數據庫通過行和列來確定表中一個具體的值,HBase中通過行鍵,列族,列限定符和時間戳來確定一個單元格。
5. 分別解釋 HBase 中行鍵、列鍵和時間戳的概念
① 行鍵是唯一的,在一個表里只出現一次,否則就是在更新同一行,行鍵可以是任意的字節數組。
② 列族需要在創建表的時候就定義好,數量也不宜過多。列族名必須由可打印字符組成,創建表的時候不需要定義好列。
③ 時間戳,默認由系統指定,用戶也可以顯示設置。使用不同的時間戳來區分不同的版本。
6. 闡述 HBase 的概念視圖和物理視圖的不同
(沒總結好)
7. 試述 HBase 各功能組建及其作用
(1)庫函數:鏈接到每個客戶端;
(2)一個 Master 主服務器:主服務器 Master 主要負責表和 Region 的管理工作;
(3)許多個 Region 服務器:Region 服務器是 HBase 中最核心的模塊,負責維護分配給自己的 Region,并響應用戶的讀寫請求
8. 闡述 HBase 的數據分區機制。
HBase 采用分區存儲,根據行鍵的值對表中的行進行分區,每個行區間構成一個分區,叫做Region。一個大的表會被分拆許多個 Region,這些 Region 會被分發到不同的服務器上實現分布式存儲。
每個Region都有一個RegionID來標識其唯一性。為了定位每個Region所在的位置,就可以構建一張映射表,**映射表的每行包含兩項內容:Region標識符,及Region服務器標識。**從而知道某個Region被保存在哪個Region服務器中,這個映射表被叫做".META.表"。
9. HBase 中的分區是如何定位的。
通過構建的映射表的每個條目包含兩項內容,一個是 Regionde 標識符,另一個是 Region 服務器標識,這個條目就標識 Region 和 Region 服務器之間的對應關系,從而就可以知道某個 Region 被保存在哪個 Region 服務器中。
10. 試述 HBase 的三層結構中各層次的名稱和作用。
①第一層 Zookeeper 文件,記錄了 - ROOT - 表的位置信息;
② 第二層 -ROOT - 表,記錄了. META. 表的 Region 位置信息,-ROOT - 表只能有一個 Region。通過 - ROOT - 表,就可以訪問. META. 表中的數據;
③ 第三層: .META. 表,記錄了用戶數據表的 Region 位置信息,.META. 表可以有多個 Region,保存了 HBase 中所有用戶數據表的 Region 位置信息;
11. 闡述 HBase 的三層結構下,客戶端是如何訪問到數據的。
首先訪問 Zookeeper,獲取 - ROOT 表的位置信息,然后訪問 - Root - 表,獲得. MATA. 表的信息,接著訪問. MATA. 表,找到所需的 Region 具體位于哪個 Region 服務器,最后才會到該 Region 服務器讀取數據。
12. 試述 HBase 系統基本架構以及每個組成部分的作用。
(1)客戶端
客戶端包含訪問 HBase 的接口,同時在緩存中維護著已經訪問過的 Region 位置信息,用來加快后續數據訪問過程
(2)Zookeeper 服務器
Zookeeper 可以幫助選舉出一個 Master 作為集群的總管,并保證在任何時刻總有唯一一個 Master 在運行,這就避免了 Master 的 “單點失效” 問題
(3)Master
主服務器 Master 主要負責表和 Region 的管理工作:管理用戶對表的增加、刪除、修改、查詢等操作;實現不同 Region 服務器之間的負載均衡;在 Region 分裂或合并后,負責重新調整 Region 的分布;對發生故障失效的 Region 服務器上的 Region 進行遷移
(4)Region 服務器
Region 服務器是 HBase 中最核心的模塊,負責維護分配給自己的 Region,并響應用戶的讀寫請求;
13. 請闡述 Region 服務器向 HDFS 文件系統中讀寫數據的基本原理
Region 服務器內部管理了一系列 Region 對象和一個 HLog 文件,其中,HLog 是磁盤上面的記錄文件,它記錄著所有的更新操作。每個 Region 對象又是由多個 Store 組成的,每個 Store 對應了表中的一個列族的存儲。每個 Store 又包含了 MemStore 和若干個 StoreFile,其中,MemStore 是在內存中的緩存,保存最近更新的數據。StoreFile是磁盤中的文件,這些文件都是樹結構,方便讀取。
用戶讀寫數據的過程:當用戶寫入數據時,會被分配到相應的Region服務器去執行操作,用戶數據首先被寫入到MemStore和HLog中,當操作寫入HLog之后,commit()調用才會將其返回給客戶端。當用戶讀取數據時,Region服務器會首先訪問MemStore緩存,如果數據不在緩存中,才會到磁盤上面的StoreFile中去尋找。
14. 試述 HStore 的工作原理
每個 Store 對應了表中的一個列族的存儲。每個 Store 包括一個 MenStore 緩存和若干個 StoreFile 文件。MenStore 是排序的內存緩沖區,當用戶寫入數據時,系統首先把數據放入 MenStore 緩存,當 MemStore 緩存滿時,就會刷新到磁盤中的一個 StoreFile 文件中(文件合并),當單個 StoreFile 文件大小超過一定閾值時,就會觸發文件分裂操作。新分裂出的2個子Region會被Master分配到相應的Region服務器上。
15. 試述 HLog 的工作原理
HLog用來保證HBase系統發生故障時能夠恢復到正確的狀態。HBase 系統為每個 Region 服務器配置了一個 HLog 文件(所有Region對象共用一個HLog),它是一種預寫式日志(Write Ahead Log),用戶更新數據必須首先寫入日志后,才能寫入 MemStore 緩存,并且,直到 MemStore 緩存內容對應的日志已經寫入磁盤,該緩存內容才能被刷寫到磁盤。
當一個Region服務器發生故障時,通過將Region服務器上的HLog按照其所屬的Region對象進行拆分,然后分發到其他Region服務器上執行恢復操作。
16. 在 HBase 中,每個 Region 服務器維護一個 HLog,而不是為每個 Region 都單獨維護一個 HLog。請說明這種做法的優缺點。
優點: 多個 Region 對象的更新操作所發生的日志修改,只需要不斷把日志記錄追加到單個日志文件中,不需要同時打開、寫入到多個日志文件中,可以減少磁盤尋址次數。
缺點:如果一個 Region 服務器發生故障,為了恢復其上次的 Region 對象,需要將 Region 服務器上的對象,需要將 Region 服務器上的 HLog 按照其所屬的 Region 對象進行拆分,然后分發到其他 Region 服務器上執行恢復操作。
17. 當一臺 Region 服務器意外終止時,Master 如何發現這種意外終止情況?為了恢復這臺發生意外的 Region 服務器上的 Region,Master 應該做出哪些處理 (包括如何使用 HLog 進行恢復)?
①Zookeeper 會實時監測每個 Region 服務器的狀態,當某個 Region 服務器發生故障時,Zookeeper 會通知 Master。
② Master 首先會處理該故障 Region 服務器上面遺留的 HLog 文件,這個遺留的 HLog 文件中包含了來自多個 Region 對象的日志記錄。
③ 系統會根據每條日志記錄所屬的 Region 對象對 HLog 數據進行拆分,分別放到相應 Region 對象的目錄下,然后,再將失效的 Region 重新分配到可用的 Region 服務器中,并把與該 Region 對象相關的 HLog 日志記錄也發送給相應的 Region 服務器。
④ Region 服務器領取到分配給自己的 Region 對象以及與之相關的 HLog 日志記錄以后,會重新做一遍日志記錄中的各種操作,把日志記錄中的數據寫入到 MemStore 緩存中,然后,刷新到磁盤的 StoreFile 文件中,完成數據恢復;
18. 行式存儲和列式存儲的區別是什么?
① 行式存儲使用NSM存儲模型,一個元組(或行)會被連續的存儲在磁盤頁中。**(存)數據是一行行存的,當第一行寫入磁盤頁后,再繼續寫入第二行。(讀取)**從磁盤中讀取數據時,需要從磁盤中順序掃描每個元組的完整內容,然后從每個元組中篩選出查詢所需要的屬性;
② 列式存儲使用DSM存儲模型,DSM會對關系進行垂直分解,并為每個屬性分配一個子關系。因此,一個具有n個屬性的關系會被分解成n個子關系,每個子關系單獨存儲,每個子關系只有當其相應的屬性被請求時才會被訪問。故列式存儲以關系數據庫的屬性為單位進行存儲,關系中多個元組的同一屬性值會被存儲再一起,而一個元組中不同屬性值則通常會被分別存放于不同的磁盤頁中;
③ (兩者區別) 行式存儲適合小批量的數據處理,但是適合于復雜的表連接的操作。列式存儲適合大量的數據處理和查詢。
19. HBase是列式存儲數據庫嗎?
HBase嚴格意義上來說并不是列式存儲的數據庫,因為HBase是以列族為單位進行分解(列族中可以包含多個列),而不是每個列都單獨存儲,但是HBase借鑒和利用了磁盤上的這種列存儲格式,故而可以被稱為列式存儲數據庫。
NoSQL數據庫
1. NoSQL 數據庫的四大類型,并解釋其含義。
鍵值數據庫、列族數據庫、文檔數據庫和圖數據庫。
① 鍵值數據庫會使用一個哈希表來存儲,只能通過key進行查詢,從而找到對應的value,缺點是不容易進行條件查詢;
② 列族數據庫采用列族數據模型,同一列的數據會存放在一起;
③ 文檔數據庫以文檔作為數據庫的最小單位;
④ 圖數據庫使用圖作為數據模型來存儲數據;
2. 試述 CAP 理論的具體含義。
C(Consistency):一致性,所有節點在同一時間具有相同的數據。
A:(Availability):可用性,是指快速獲取數據,可以在確定的時間內返回操作結果,保證每個請求不管成功或者失敗都有響應;
P(Tolerance of Network Partition):分區容忍性,是指當出現網絡分區的情況時(即系統中的一部分節點無法和其他節點進行通信),分離的系統也能夠正常運行,也就是說,系統中任意信息的丟失或失敗不會影響系統的繼續運作。
3. 試述數據庫的 ACID 四性的含義
① 原子性(Atomicity)
指事務必須是原子工作單元,對于其數據修改,要么全都執行,要么全都不執行。
② 一致性(consistency)
指事務在完成時,必須使所有的數據都保持一致狀態。
③ 隔離性(Isolation)
指并發事務所做的修改必須與其他并發事務所做的修改隔離。
④ 持久性(Durability)
指事務完成之后,它對于系統的影響是永久性的,該修改即使出現致命的系統故障也將一直保持。
4. 請解釋軟狀態、無狀態、硬狀態的具體含義。
“軟狀態(soft-state)”是與 “硬狀態(hard-state)” 相對應的一種提法。數據庫保存的數據是 “硬狀態” 時,可以保證數據一致性,即保證數據一直是正確的。“軟狀態”是指狀態可以有一段時間不同步,具有一定的滯后性。
5. 試述不一致性窗口的含義。
所有后續的訪問都可以讀取到操作 OP 寫入的最新值。從 OP 操作完成到后續訪問可以最終讀取到 OP 寫入的最新值,這之間的時間間隔稱為 “不一致性窗口”。
第三章 大數據處理與分析
MapReduce
1. MapReduce 模型采用 Master(JobTracker)-Slave(TaskTracker) 結構,試描述 JobTracker 和 TasKTracker 的功能。
MapReduce 框架采用了 Master/Slave 架構,包括一個 Master 和若干個 Slave。Master 上運行 JobTracker,Slave 上運行 TaskTrackero 用戶提交的每個計算作業,會被劃分成若千個任務。JobTracker 負責作業和任務的調度,監控它們的執行,并重新調度已經失敗的任務。TaskTracker 負責執行由 JobTracker 指派的任務。
2. TaskTracker出現故障會有什么影響?該故障是如何處理的?
3. MapReduce計算模型的核心是Map函數和Reduce函數,試述這兩個函數各自的輸入,輸出以及處理過程。
① Map函數的輸入來自于分布式文件系統的文件塊,map函數將輸入的元素轉換成<key,value>形式的鍵值對;
② Reduce函數的任務就是將輸入的一系列具有相同鍵的鍵值對以某種方式組合起來,輸出處理后的鍵值對,輸出結果會合并成一個文件。
4. 試述 MapReduce 的工作流程 (需包括提交任務、Map、Shuffle、Reduce 的過程)。
① 邏輯切分:首先MapReduce框架會使用InputFormat模塊做Map前的預處理,比如驗證輸入的格式是否符合輸入的定義;然后,將輸入文件切分為邏輯上的多個InputSplit,InputSplit是MapReduce對文件進行處理和運算的輸入單位;(每個InputSplit并沒有對文件進行實際切割,只是記錄了要處理的數據的位置和長度);
② 轉化為Key-value:通過RecordReader(RR)根據InputSplit中的信息來處理InputSplit中的具體記錄,加載數據并轉換為適合Map任務讀取的鍵值對,輸入給Map任務;
③ Map處理:Map任務會根據用戶自定義的映射規則,輸出一系列的<key,value>作為中間結果;
④ Shuffle:為了讓Reduce可以并行處理Map的結果,需要對Map的輸出進行一定的分區、排序、合并、歸并等操作,得到<key,value-list>形式的中間結果,再交給對應的Reduce進行處理。Shuffle將無序的<key,value>轉化為有序的<key,value-list>;
⑤ Reduce:Reduce 以一系列<key,value-list>中間結果作為輸入,執行用戶定義的邏輯,輸出結果給OutputFormat模塊;
⑥ 輸出模塊:OutputFormat模塊驗證輸出目錄是否已經存在且輸出結果類型是否符合配置文件中的配置類型,如果都滿足,就輸出Reduce的結果到分布式文件系統。
6. Shuffle過程是MapReduce工作流程的核心,試分析Shuffle過程的作用。
將無序的<key,value>轉成有序的<key,value-list>,目的是為了讓Reduce可以并行處理Map的結果。
7. 分別描述Map端和Reduce端的Shuffle過程(需包括spill、Sort、Merge、Fetch的過程)
Shuffle就是對Map輸出結果進行分區、排序、合并等處理一并交給Reduce的過程。Shuffle過程分為Map端的操作和Reduce端的操作:
在Map端的Shuffle過程:Map端的Shuffle過程分為四個步驟,① 輸入數據和執行Map任務;② 寫入緩存(分區,排序和合并);③ 溢寫;④ 文件歸并;
① Map任務的輸入數據一般保存在分布式文件系統的文件塊中,接受<key,value>作為輸入,按一定映射規則轉換為一批<key,value>作為輸出;
② Map的輸出結果首先寫入緩存,在緩存中積累一定數量的Map輸出結果后,再一次性批量寫入磁盤,這樣可以大大減少對磁盤的IO消耗。因為尋址會開銷很大,所以通過一次尋址、連續寫入,就可以大大降低開銷;(寫入緩存之前,key和value值都會被序列化成字節數組);
③ 因為緩存中map結果的數量不斷增加,因此需要啟動溢寫操作,把緩存中的內容一次性寫入磁盤,并清空緩存。通常采用的方法是到達0.8的閾值后,就啟動溢寫過程。在溢寫到磁盤之前,緩存中的數據首先會被分區,默認分區方式是采用Hash函數對key進行哈希后再用Reduce任務的數量進行取模,表示為:hash(key) mod reduce任務數量,這樣就可以把map輸出結果均勻的分配給這R個reduce任務去并行處理了。分完區后,再根據key對它們進行內存排序,排序完后,可以通過用戶自定義的Combiner函數來執行合并操作,從而減少需要溢寫到磁盤的數據量。經過分區、排序以及可能發生的合并操作后,這些緩存中的鍵值對就可以被寫入磁盤,并清空緩存。每次溢寫操作都會在磁盤中生成一個新的溢寫文件,寫入溢寫文件中的所有鍵值對都是經過分區和排序的。
④ 每次溢寫操作都會在磁盤中生成一個新的溢寫文件,隨著MapReduce任務的進行,磁盤中的溢寫文件數量越來越多,最后在Map任務全部結束之前,系統對所有溢寫文件中的數據進行歸并,從而生成一個大的溢寫文件;
⑤ 經過上述四個步驟后,Shffle過程完成,最終生成的一個大文件會被存放在本地磁盤上,這個大文件中的數據是被分區的,不同的分區會被發送到不同的Reduce任務進行并行處理。同時JobTracker會一直檢測Map任務的執行,當檢測到一個Map任務完成后,就會立即通知相關的Reduce任務來“領取”數據,然后開始Reduce端的Shuffle過程。
在Reduce端的Shuffle過程:Reduce端的Shuffle只需要從Map端讀取Map結果,然后執行歸并操作,最后輸送給Reduce任務進行處理。過程分為三個步驟,① 領取數據;② 歸并數據;③ 把數據輸入給Reduce任務;
① 領取數據
Map端的Shuffle過程結束后,所有map輸出結果都保存在Map機器的本地磁盤上,Reduce需要把磁盤上的數據fetch回來存放在自己所在機器的本地磁盤上。故每個Reduce任務會不斷的向JobTracker詢問Map任務是否完成,當檢測到一個完成后,就會通知相關的Reduece任務來領取數據,一旦一個Reduce任務收到了通知,就會到該Map任務所在機器上把屬于自己處理的分區數據fetch到本地磁盤;
② 歸并數據
因為緩存中的數據是來自不同的Map機器,一般會存在很多可以合并的鍵值對。當溢寫過程啟動時,具有相同key的鍵值會被歸并,歸并時會對鍵值對進行排序,以保證最終大文件的鍵值對都是有序的。最終通過多輪歸并將磁盤上多個溢寫文件歸并為多個大文件。
③ 把數據輸入給Reduce
磁盤經過多輪歸并后得到的若干個大文件,會直接輸入個Reduce任務(不會歸并成一個新的大文件)。
8. MapReduce 中有這樣一個原則: 移動計算比移動數據更經濟。試述什么是本地計算,并分析為何要采用本地計算。
MapReduce 設計的一個理念就是 “計算向數據靠攏”,而不是 “數據向計算靠攏”,因為移動數據需要大量的網絡傳輸開銷,尤其是在大規模數據環境下,這種開銷尤為驚人,所以,移動計算要比移動數據更加經濟。
本地計算:在一個集群中,只要有可能,MapReduce 框架就會將 Map 程序就近地在 HDFS 數據所在的節點運行,即將計算節點和存儲節點放在一起運行,從而減少了節點間的數據移動開銷。
9. 試說明一個 MapReduce 程序在運行期間,所啟動的 Map 任務數量和 Reduce 任務數量各是由什么因素決定的。
10. 是否所有的 MapReduce 程序都需要經過 Map 和 Reduce 這兩個過程? 如果不是,請舉例說明。
不是。對于關系的選擇運算,只需要 Map 過程就能實現,對于關系 R 中的每個元組 t, 檢測是否是滿足條件的所需元組,如果滿足條件,則輸出鍵值對 <,>, 也就是說,鍵和值都是 t。這時的 Reduce 函數就只是一個恒等式,對輸入不做任何變換就直接輸出。
11. 分析為何采用 Combiner 可以減少數據傳輸量? 是否所有的 MapReduce 程序都可以采用 Combiner? 為什么?
對于每個分區內的所有鍵值對,后臺線程會根據 key 對它們進行內存排序 (Sort), 排序是 MapReduce 的默認操作。排序結束后,還包含一個可選的合并(Combine ) 操作。如果用戶事先沒有定義 Combiner 函數,就不用進行合并操作。如果用戶事先定義了 Combiner 函數,則這個時候會執行合并操作,從而減少需要溢寫到磁盤的數據量。所謂 “合并”,是指將那些具有相同 key 的 < key,value > 的 value 加起來,比如,有兩個鍵值對 <*xmu",1 > 和 <*xmu",1>, 經過合并操作以后就可以得到一個鍵值對 <*xmu",2>, 減少了鍵值對的數量。不過,并非所有場合都可以使用 Combiner, 因為,Combiner 的輸出是 Reduce 任務的輸人,Combiner 絕不能改變 Reduce 任務最終的計算結果,一般而言,累加、最大值等場景可以使用合并操作。
12. MapReduce 程序的輸入文件、輸出文件都存儲在 HDFS 中,而在 Map 任務完成時的中間結果則存儲在本地磁盤中。試分析中間結果存儲在本地磁盤而不是 HDFS 上有何優缺點?
13. 早期版本的HDFS,其默認塊大小為64MB,而較新版本默認為128MB,采用較大的塊具有什么影響和優缺點?
14. 試著畫出使用MapReduce來對英語句子“Whatever is worth doing is worth doing well”進行單詞統計的過程。
15. 在基于MapReduce的單詞統計中,MapReduce是如何保證相同的單詞數據會劃分到同一個Reducer上進行處理以保證結果的正確性?
Hadoop再探討
1. HDFS1.0 中只包含一個名稱節點會帶來哪些問題(單點故障問題)。
單點故障問題:雖然HDFS1.0中存在第二名稱節點,但是在1.0版本中第二名稱節點的作用是周期性的從名稱節點獲取命名空間鏡像文件(FsImage)和修改日志(EditLog),從而來對FsImage的恢復。因此當名稱節點發生故障時,系統無法實時切換到第二名稱節點以對外提供服務,仍需要停機恢復。(可以通過HA來解決)
在可擴展性方面,名稱節點把整個 HDFS 文件系統中的元數據信息都保存在自己的內存中,HDFS1.0 中只有一個名稱節點,不可以水平擴展,而單個名稱節點的內存空間是由上限的,這限制了系統中數據塊、文件和目錄的數目。在系統整體性能方面,整個 HDFS 文件系統的性能會受限于單個名稱節點的吞吐量。在隔離性方面,單個名稱節點難以提供不同程序之間的隔離性,一個程序可能會影響會影響其他運行的程序。(通過HDFS聯邦來進行解決)
2. 請描述 HDFS HA 架構組成組建及其具體功能。
設置兩個名稱節點,其中一個名稱節點處于 “活躍” 狀態,另一個處于 “待命” 狀態。處于活躍狀態的名稱節點負責對外處理所有客戶端的請求,而處于待命狀態的名稱節點則作為備用節點。處于待命狀態的名稱節點提供了“熱備份”,一旦活躍名稱節點出現故障,就可以立即切換到待命名稱節點,不會影響到系統的正常對外服務。
3. 請分析 HDFS HA 架構中數據節點如何和名稱節點保持通信。
在 HDFS HA中,所有名稱節點會共享底層的數據節點存儲資源。每個數據節點要向集群中所有的名稱節點注冊,并周期性地向名稱節點發送 “心跳” 和塊信息,報告自己的狀態,同時也會處理來自名稱節點的指令。
4. 為什么需要HDFS聯邦,它能解決什么問題?
因為原來的HDFS存在可擴展性,系統性能及隔離性三個方面的問題。
聯邦設計了多個相互獨立的名稱節點,使得HDFS的命名服務能夠水平擴展。
5. 描述HDFS 聯邦中 “塊池” 的概念,分析為什么 HDFS 聯邦中的一個名稱節點失效,也不會影響到與它相關的數據節點繼續為其他名稱節點提供服務。
HDFS 聯邦擁有多個獨立的命名空間,其中,每一個命名空間管理屬于自己的一組塊,這些屬于同一個命名空間的塊構成一個 “塊池”。
每個數據節點會為多個塊池提供塊的存儲。可以看出,數據節點是一個物理邏輯,而塊池則屬于邏輯概念,一個塊池是一組塊的邏輯集合,塊池中的各個塊實際上是存儲在各個不同的數據節點中的。因此 HDFS 聯邦中的一個名稱節點失效,也不會影響到與它相關的數據節點繼續為其他名稱節點提供服務。
6. 請闡述 MapReduce1.0 體系結構中存在的問題。
(1)存在單點故障:系統中只有一個JobTracker來負責所有MapReduce作業的調度;
(2)JobTracker負責的任務過重:JobTracker不僅要負責作業的調度和失敗恢復,同時要負責資源管理與分配;
(3)容易出現內存溢出:TaskTracker資源分配時不考慮內存的實際情況;
(4)資源劃分不合理:資源槽之間彼此不能共通使用;
7. 請描述 YARN 架構中各組件的功能。
YARN體系中包含了三個組件:ResourceManager、ApplicationMaster和NodeManager。
8. YARN 框架中執行一個 MapReduce 程序時,從提交到完成需要經歷的具體步驟。
①用戶編寫客戶端應用程序,向 YARN 提交應用程序,提交的內容包括 ApplicationMaster 程序、啟動 ApplicationMaster 的命令、用戶程序等;
②YARN 中的 ResourceManager 負責接收和處理來自客戶端的請求。接到客戶端應用程序請求后,ResourceManager 里面的調度器會為應用程序分配一個容器。同時,ResourceManager 的應用程序管理器會與該容器所在的 NodeManager 通信,為該應用程序在該容器中啟動一個 ApplicationMaster;
③ApplicationMaster 被創建后會首先向 ResourceManager 注冊,從而使得用戶可以通過 ResourceManager 來直接查看應用程序的運行狀態;
④ApplicationMaster 采用輪詢的方式通過 RPC 協議向 ResourceManager 申請資源;
⑤ResourceManager 以 “容器” 的形式向提出申請的 ApplicationMaster 分配資源,一旦 ApplicationMaster 申請到資源后,就會與該容器所在的 NodeManager 進行通信,要求它啟動任務;
⑥當 ApplicationMaster 要求容器啟動任務時,它會為任務設置好運行環境(包括環境變量、JAR 包、二進制程序等),然后將任務啟動命令寫到一個腳本中,最后通過在容器中運行該腳本來啟動任務;
⑦各個任務通過某個 RPC 協議向 ApplicationMaster 匯報自己的狀態和進度,讓 ApplicationMaster 可以隨時掌握各個任務的運行狀態,從而可以在任務失敗時重啟任務;
⑧應用程序運行完成后,ApplicationMaster 向 ResourceManager 的應用程序管理器注銷并關閉自己。若 ApplicationMaster 因故失敗,ResourceManager 中的應用程序管理器會監測到失敗的情形,然后將其重新啟動,直到所有任務執行完畢;
9. 請對 YARN 和 MapReduce1.0 框架進行優劣勢對比分析。
(1)大大減少了承擔中心服務功能的 ResourceManager 的資源消耗。MapReduce1.0 中的 JobTracker 需要同時承擔資源管理、任務調度和任務監控等三大功能,而 YARN 中的 ResourceManager 只需要負責資源管理,需要消耗大量資源的任務調度和監控重啟工作則交由 ApplicationMaster 來完成。由于每個作業都有與之關聯的獨立的 ApplicationMaster,所以,系統中存在多個作業時,就會同時存在多個 ApplicationMaster,這就實現了監控任務的分布化,不再像 MapReduce1.0 那樣監控任務只集中在一個 JobTracker 上。
(2)MapReduce1.0 既是一個計算框架,又是一個資源管理調度框架,但是只能支持 MapReduce 編程模型。而 YARN 則是一個純粹的資源調度管理框架,在它上面可以運行包括 MapReduce 在內的不同類型的計算框架,默認類型是 MapReduce。因為,YARN 中的 ApplicationMaster 是可變更的,針對不同的計算框架,用戶可以采用任何編程語言自己編寫服務于該計算框架的 ApplicationMaster。比如,可以編寫一個面向 MapReduce 計算框架的 ApplicationMaster,從而使得 MapReduce 計算框架可以運行在 YARN 框架之上。同理,還可以編寫面向 Spark、Storm 等計算框架的ApplicationMaster,從而使得 Spark、Storm 等計算框架也可以運行在 YARN 框架之上。
(3)YARN 中的資源管理比 MapReduce1.0 更加高效。YARN 采用容器為單位進行資源管理和分配,而不是以槽為單位,避免了 MapReduce1.0 中槽的閑置浪費情況,大大提高了資源的利用率。
10. 請分別描述 Pig、Tez 和 Kafka 的功能。
① Pig 是 Hadoop 生態系統的一個組件,允許用戶通過編寫簡單的腳本來實現復雜的數據分析,而不需要編寫復雜的 MapReduce 應用程序,Pig 會自動把用戶編寫的腳本轉換成 MapReduce 作業在 Hadoop 集群上運行,而且具備對生成的 MapReduce 程序進行自動優化的功能;
② Tez 直接源于 MapReduce 框架,核心思想是將 Map 和 Reduce 兩個操作進一步進行拆分,即 Map 被拆分成 Input、Processor、Sort、Merge 和 Output,Reduce 被拆分成 Input、Shuffle、Sort、Merge、Processor 和 Output 等,經過分解后的這些元操作可以進行自由任意組合產生新的操作,經過一些控制程序組裝后就可形成一個大的 DAG 作業。通過 DAG 作業的方式運行 MapReduce 作業,提供了程序運行的整體處理邏輯,就可以去除工作流當中多余的 Map 階段,減少不必要的操作,提升數據處理的性能;
③ Kafka 是由 LinkedIn 公司開發的一種高吞吐量的分布式發布訂閱消息系統,用戶通過 Kafka 系統可以發布大量的消息,同時也能實時訂閱消費消息。Kafka 設計的初衷是構建一個可以處理海量日志、用戶行為和網站運營統計等的數據處理框架。
Spark
1. 闡述如下 Spark 的幾個主要概念:RDD、DAG、階段、分區、窄依賴、寬依賴。
①RDD:是彈性分布式數據集(Resilient Distributed Dataset)的英文縮寫,是分布式內存的一個抽象概念,提供了一種高度受限的共享內存模型。
②DAG:是 Directed Acyclic Graph(有向無環圖)的英文縮寫,反映 RDD 之間的依賴關系。
③階段:是作業的基本調度單位,一個作業會分為多組任務,每組任務被稱為 “階段”,或者也被稱為 “任務集”。
④分區:一個 RDD 就是一個分布式對象集合,本質上是一個只讀的分區記錄集合,每個 RDD 可以分成多個分區,每個分區就是一個數據集片段。
⑤窄依賴:父 RDD 的一個分區只被一個子 RDD 的一個分區所使用就是窄依賴。
⑥寬依賴:父 RDD 的一個分區被一個子 RDD 的多個分區所使用就是寬依賴
作者計算機碩士,從事大數據方向,公眾號致力于技術專欄,主要內容包括:算法,大數據,個人思考總結等
總結
以上是生活随笔為你收集整理的《大数据技术原理与应用》林子雨(第二版)--总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于for循环中的变量int i 如果
- 下一篇: WX: picker 滚动选择器