1. Hadoop 簡介
2. MapReduce
3. HDFS
4. 數據采集、存儲、計算
5. RPC
6. 序列化
7. Spark
1. Hadoop 簡介
目前主流的大數據框架
大數據框架能處理傳統計算技術所無法處理的大型數據集。它不是單一的技術或工具,而是涉及的業務和技術的許多領域。
目前主流的三大分布式計算系統分別為 Hadoop、Spark 和 Strom:
- Hadoop 是當前大數據管理標准之一,運用在當前很多商業應用系統。可以輕松地集成結構化、半結構化甚至非結構化數據集。
- Spark 采用了內存計算。從多迭代批處理出發,允許將數據載入內存作反復查詢,此外還融合數據倉庫,流處理和圖形計算等多種計算范式。Spark 構建在 HDFS 上,能與 Hadoop 很好地結合。
- Storm 用於處理高速、大型數據流的分布式實時計算系統。為 Hadoop 添加了可靠的實時數據處理功能。
什么是 Hadoop?
The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing.
Hadoop 被公認是一套行業大數據標准開源軟件,在分布式環境下提供了海量數據的處理能力。
Hadoop 使用 Java 編寫,允許分布在集群,是專為從單一服務器到上千台機器的擴展,每個機器都可以提供本地計算和存儲,即 Hadoop 就是一個分布式計算的解決方案。
Hadoop 可以編寫和運行分布式應用來處理大規模數據,是專為離線和大規模數據分析而設計的,並不適合那種對幾個記錄隨機讀寫的在線事務處理模式。
Hadoop = HDFS(文件系統,數據存儲技術相關)+ Mapreduce(數據處理)。Hadoop 的數據來源可以是任何形式,在處理半結構化和非結構化數據上與關系型數據庫相比有更好的性能,具有更靈活的處理能力,不管任何數據形式最終會轉化為 key/value(key/value 是基本數據單元)。用函數式編程(Mapreduce)代替 SQL。SQL 是查詢語句,而 Mapreduce 則是使用腳本和代碼。不過對於習慣使用 SQL 的,Hadoop 也有開源工具 Hive 代替。
解決的核心問題
- 海量數據的存儲(HDFS —— Hadoop Distributed File System)
- 海量數據的分析(MapReduce —— 並行計算模型/框架)
- 資源管理調度系統(YARN —— Yet Another Resource Negotiator)
Hadoop 特點
- 擴容能力(Scalable):能可靠地存儲和處理千兆字節(PB)數據。
- 成本低(Economical):可以通過普通機器組成的服務器群來分發以及處理數據。這些服務器群總計可達數千個節點。
- 高效率(Efficient):通過分發數據,Hadoop 可以在數據所在的節點上並行地處理它們,這使得處理非常的快速。
- 可靠性(Reliable):Hadoop 能自動地維護數據的多份副本,並且在任務失敗后能自動地重新部署(redeploy)計算任務。
使用場景
- 大數據量存儲:分布式存儲(如各種雲盤)。
- 日志處理:Hadoop 擅長這個。
- 海量計算:並行計算。
- ETL:數據抽取到 Oracle、Mysql、DB2、Mongdb 及其他主流數據庫。
- 使用 HBase 做數據分析:用擴展性應對大量讀寫操作(如 Facebook 構建了基於 HBase 的實時數據分析系統)。
- 機器學習:比如 Apache Mahout 項目(常見領域:協作篩選、集群、歸類)。
- 搜索引擎:Hadoop + Lucene 實現。
- 數據挖掘:目前比較流行的廣告推薦。
- 大量地從文件中順序讀。HDFS 對順序讀進行了優化,代價是對於隨機的訪問負載較高。
- 用戶行為特征建模。
- 個性化廣告推薦。
案例:
假如我有一個 100M 的數據庫備份的 sql 文件,我現在想在不導入到數據庫的情況下直接用 grep 操作通過正則過濾出我想要的內容。例如:某個表中含有相同關鍵字的記錄。有幾種方式,一種是直接用 linux 的命令 grep;還有一種就是通過編程來讀取文件,然后對每行數據進行正則匹配得到結果好了現在是 100M 的數據庫備份。
上述兩種方法都可以輕松應對。那么如果是 1G,1T 甚至 1PB 的數據呢,上面 2 種方法還能行得通嗎?答案是不能。畢竟單台服務器的性能總有其上限。那么對於這種超大數據文件怎么得到我們想要的結果呢?
解決方案就是分布式計算,分布式計算的核心就在於利用分布式算法把運行在單台機器上的程序擴展到多台機器上並行運行,從而使數據處理能力成倍增加。但是這種分布式計算一般對編程人員要求很高,而且對服務器也有要求。導致了成本變得非常高。
Hadoop 就是為了解決這個問題誕生的。Hadoop 可以很輕易的把很多 linux 的廉價 PC 組成分布式結點,然后編程人員也不需要知道分布式算法之類,只需要根據 mapreduce 的規則定義好接口方法,剩下的就交給 Haddop。它會自動把相關的計算分布到各個結點上去,然后得出結果。
例如上述的例子, Hadoop 要做的事:
- 首先把 1PB 的數據文件導入到 HDFS 中;
- 然后編程人員定義好 map 和 reduce,也就是把文件的行定義為 key,每行的內容定義為 value,然后進行正則匹配,匹配成功則把結果通過 reduce 聚合起來返回;
- Hadoop 會把這個程序分布到 N 個結點去並行的操作。
那么原本可能需要計算好幾天,在有了足夠多的結點之后就可以把時間縮小到幾小時之內。
Hadoop 架構
Hadoop(2.x)架構:
- 底層:存儲層。文件系統 HDFS,NoSQL Hbase 等。
- 中間層:資源及數據管理層。YARN 以及 Sentry 等。
- 上層:MapReduce、Impala、Spark 等計算引擎。
- 頂層:基於 MapReduce、Spark 等計算引擎的高級封裝及工具,如 Hive、Pig、Mahout。
Hadoop 生態
2. Mapreduce
MapReduce是一種編程模型,用於支持能夠並行處理的大型數據集,且其封裝了並行計算、容錯、數據分布、負載均衡等細節問題。
MapReduce 是 Hadoop 生態系統和 Spark 中的一個重要組件,其原理是分治算法(Divide-and-Conquer):通過把工作拆分成較小的數據集,完成一些獨立任務,來支持大量數據的並行處理。
- MapReduce 從用戶那里獲取整個數據集,把它分割為更小的任務(MAP),然后把它們分配到各個工作節點。
- 一旦所有工作節點成功地完成了它們各自的獨立任務,就會聚合(REDUCE)各獨立任務的結果,然后返回整個數據集的結果。
通常,Map 和 Reduce 函數是用戶定義的函數,它們解決了以往需要用代碼解決的業務用例。
3. HDFS
HDFS(Hadoop File System)是 Hadoop 的分布式文件存儲系統。
當數據量越來越多,在一個操作系統管轄的范圍存不下了,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,因此迫切需要一種系統來管理多台機器上的文件,這就是分布式文件管理系統,是一種允許文件通過網絡在多台主機上分享的文件系統,可讓多機器上的多用戶分享文件和存儲空間。分布式文件管理系統有很多,HDFS 只是其中一種。
- HDFS 將大文件分解為多個 Block(最基本的存儲單位),每個 Block 保存多個副本(默認 3 個),HDFS 默認 Block 大小是 128MB,以一個 256MB 文件來說,則共有 256/128 = 2 個 Block。
- 不同於普通文件系統的是,HDFS中,如果一個文件小於一個數據塊的大小,並不占用整個數據塊存儲空間 。
- HDFS 提供容錯機制,副本丟失或者宕機時自動恢復。
HDFS 特點
- 通透性:讓實際上是通過網絡來訪問文件的動作,由程序與用戶看來,就像是訪問本地的磁盤一般。
- 容錯性:即使系統中有某些節點脫機,整體來說系統仍然可以持續運作而不會有數據損失。
- 適用於一次寫入多次查詢的情況(不可在線修改,只能下載修改后再上傳)。
- 不支持並發寫情況(比如一份數據分 8 塊,那么得按順序來寫,而不能同時)。
- 不適用於小文件。
HDFS 的架構:主從結構
-
主節點只有一個:NameNode
-
從節點有很多個:DataNode
- 保存元數據信息:如文件屬性,服務器,文件怎么存。
- 接收用戶操作請求。
- 維護文件系統的目錄結構。
- 管理文件與 block 之間關系、block 與 datanode 之間關系。
- 存儲文件。
- 文件被分成 block 存儲在磁盤上。
- 為保證數據安全,文件會有多個副本。
- 心跳檢測。
HDFS 的 Shell
hadoop fs:該命令可以用於其他文件系統,不止是hdfs文件系統內,也就是說該命令的使用范圍更廣。
hadoop dfs:專門針對 hdfs 分布式文件系統。
hdfs dfs:和上面的命令作用相同,相比於上面的命令更為推薦。當使用 hadoop dfs 時實質內部會被轉為 hdfs dfs 命令。
參數說明:
-help [cmd] //顯示命令的幫助信息 -ls <path> //顯示當前目錄下所有文件 -ls -R(遞歸) -h(大小單位) -du(s) <path> //顯示目錄中所有文件大小 -count[-q] <path> //顯示目錄中目錄和文件的數量 -mv <src> <dst> //移動多個文件到目標目錄 -cp <src> <dst> //復制多個文件到目標目錄 -rm(r) //刪除文件(夾) -put <localsrc> <dst> //本地文件復制到hdfs -copyFromLocal //同put -moveFromLocal //從本地文件移動到hdfs -get [-ignoreCrc] <src> <localdst> //復制文件到本地,可以忽略crc校驗 -getmerge <src> <localdst> //將源目錄中的所有文件排序合並到一個文件中 -cat <src> //在終端顯示文件內容 -text <src> //在終端顯示文件內容 -copyToLocal [-ignoreCrc] <src> <localdst> //復制到本地 -moveToLocal <src> <localdst> -mkdir <path> //創建文件夾 -touchz <path> //創建一個空文件
4. 數據采集、存儲、計算
數據采集和 DataFlow
對於數據采集主要分為三類,即結構化數據庫采集、日志和文件采集、網頁采集。
對於結構化數據庫,采用 Sqoop 是合適的,可以實現結構化數據庫中數據並行批量入庫到 HDFS 存儲。
對於網頁采集,前端可以采用 Nutch,全文檢索采用 Lucense,而實際數據存儲最好是入庫到 Hbase 數據庫。
對於日志文件的采集,現在最常用的仍然是 Flume 或 Chukwa,但是如果對於日志文件數據需要進行各種計算處理再入庫的時候,往往 Flume 並不容易處理,這也是為何可以采用 Pig 來做進一步復雜的 DataFlow 和 Process 的原因。
數據采集類似於傳統的 ETL 等工作,因此傳統 ETL 工具中的數據清洗、轉換、調度等都是相當重要的內容。這一方面是要基於已有的工具,進行各種接口的擴展以實現對數據的處理和清洗,一方面是加強數據采集過程的調度和任務監控。
數據存儲庫
在這里先談三種場景下的三種存儲和應用方式,即 Hive,Impala、Hbase,其中三者都是基於底層的 HDFS 分布式文件系統。
- Hive 重點是 Sql-Batch(批處理)查詢,適用於海量數據的統計類查詢分析。
- Impala 重點是 Ad-Hoc(點對點)模式和交互式查詢。Hive 和 Impala 都可以看作是基於 OLAP(Online analytical processing,聯機分析處理)模式的。
- Hbase 重點是支撐業務的 CRUD(增刪改查)操作,如各種業務操作下的處理和查詢。
Hive
- Hive 是基於 Hadoop 的一個數據倉庫工具,用來進行數據提取、轉化、加載,這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 重點是 Sql-Batch(批處理)查詢,適用於海量數據的統計類查詢分析。
- Hive 數據倉庫工具能將結構化的數據文件映射為一張數據庫表,並提供 SQL 查詢功能,能將 SQL 語句轉變成 MapReduce 任務來執行。
- Hive 的優點是學習成本低,可以通過類似 SQL 語句實現快速 MapReduce 統計,使 MapReduce 變得更加簡單,而不必開發專門的 MapReduce 應用程序。
Impala
- Impala 是 Cloudera 公司主導開發的新型查詢系統,它提供 SQL 語義,能查詢存儲在 Hadoop 的 HDFS 和 HBase 中的 PB 級大數據。已有的 Hive 系統雖然也提供了 SQL 語義,但由於 Hive 底層執行使用的是 MapReduce 引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速,Impala 本身是基於內存的 MPP(Massively Parallel Processing,大規模並行處理)機制。
- Impala 重點是 Ad-Hoc(點對點)模式和交互式查詢。Hive 和 Impala 都可以看作是基於 OLAP(Online analytical processing,聯機分析處理)模式的。
HBase
- HBase 是一個分布式的、面向列的開源數據庫,是 Apache 的 Hadoop 項目的子項目,該技術來源於 Fay Chang 所撰寫的 Google 論文“Bigtable:一個結構化數據的分布式存儲系統”。
- 就像 Bigtable 利用了 Google 文件系統(File System)所提供的分布式數據存儲一樣,HBase 在 Hadoop 之上提供了類似於 Bigtable 的能力。
- HBase 不同於一般的關系數據庫,它是一個適合於非結構化數據存儲的數據庫。另一個不同的是 HBase 基於列的而不是基於行的模式。
如何對上面三種模式提供共享一致的數據存儲和管理服務,HCatalog 是基於 Apache Hadoop 之上的數據表和存儲管理服務,提供統一的元數據管理。不需要知道具體的存儲細節當然是最好的,但是 Hcatalog 本身也還處於完善階段,包括和 Hive、Pig 的集成。
對於 MapReduce 和 Zookeeper 本身就已經在 Hbase 和 Hive 中使用到了。如 Hive 的 HQL 需要通過 MapReduce 解析和合並等。
實時流計算
數據的價值越來越被企業重視,被稱為是 21 世紀的石油。
當存儲了大規模的數據,我們要干什么呢,當然是分析數據中的價值,Hadoop 的 MapReduce 主要用於離線大數據的分析挖掘,比如電商數據的分析挖掘、社交數據的分析挖掘、企業客戶關系的分析挖掘等,最終的目標就是 BI(商業智能)了,以提高企業運作效率,實現精准營銷及各個垂直領域的推薦系統、發現潛在客戶等等。在這個數據化時代,每件事都會留下電子檔案,分析挖掘日積月累的數據檔案,我們就能理解這個世界和我們自己更多。
但 MR 編寫代碼復雜度高,且由於磁盤 I/O,分析結果周期長,現實世界中我們對數據分析的實時性要求越來越高,基於內存計算的 Spark 來了。Hadoop+Spark 正在替代 Hadoop+MR 成為大數據領域的明星,Cloudera 正在積極推動 Spark 成為 Hadoop 的默認數據處理引擎。
同時 Twitter 也推出了 Storm 用來解決實時熱點查詢和排序的問題。
5. RPC
由遠程過程調用中直接基於 TCP 進行遠程調用,數據傳輸在傳輸層 TCP 層完成,更適合對效率要求比較高的場景。RPC 采用 C/S 模式,主要依賴於客戶端和服務端之間建立 Socket 連接進行。
- 首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。
- 在服務器端,進程保持睡眠狀態直到調用的信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息。
- 最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
Hadoop 的整個體系結構就是構建在 RPC 之上(見 org.apache.hadoop.ipc),Server 和 Client 都由 Hadoop 完成。
6. 序列化
Hadoop 序列化的作用
- 序列化在分布式環境的兩大作用:進程間通信,持久化存儲。
- Hadoop 節點間通信。

Hadoop 序列化的特點
- 緊湊:高效使用存儲空間。
- 快速:讀寫數據的額外開銷小。
- 可擴展:可透明地讀取老格式的數據。
- 互操作:支持多語言的交互。
7. Spark
什么是 Spark?
Apache Spark 是一個通用的集群計算系統。和 MapReduce 一樣,它是與一組計算機(節點)一起工作、並行處理,來提高響應的時間。
MapReduce 采用拆分-應用-合並的策略進行數據分析,把拆分后的數據存儲到集群的磁盤上。
相比之下,Spark 在其數據存儲之上使用內存,可以在整個集群中並行地加載、處理數據。不過,跟 MapReduce 不同的是,Spark 集群有內存特性。它的內存特性能讓 Spark Clusters 把數據緩存到節點上,而不是每次都從磁盤中獲取數據(因為數據量巨大,所以通常需要很長時間的讀寫操作),變成了每個節點的一次性操作。比起 MapReduce,Spark 更有速度優勢,因為它的數據分布和並行處理是在內存中完成的。
Spark 的流行,是因為它在內存中處理數據集,所以可以提供快速的結果和 MapReduce 所缺少的實時處理能力。
Spark 功能特點
- 高速(Speed)→因為它是內存處理的。
- 緩存(Caching)→Spark 有一個緩存層來緩存數據,加速處理進程。
- 部署(Deployment)→可以部署在 Hadoop 集群或自己的 Spark 集群中。
- 多語言(Polyglot)→代碼可以用 Python、Java、Scala 和 R 編寫。
- 實時(Real-time)→開發它的目的就是為了支持“實時”用例。
Spark vs Hadoop
有個常見問題是:當 MapReduce 已經成為 Hadoop 中的一部分時,為什么還要使用 Spark?或者,當 Spark 構建在 Hadoop 生態系統之上時,它有什么優勢?
接下來,我們就一起來看一下 Spark 和 Hadoop 之間幾個關鍵的區別:
Hadoop | Spark | |
性能 | 由於磁盤操作, 與 Spark 相比,MapReduce 相對較慢。 |
由於內存計算,與 MapReduce 相比,速度更快。 (Spark 在內存中運行要快 100 倍,在磁盤上快了 10 倍。 但當有其他需要資源的服務正在運行時,執行速度可能會降低。) |
數據處理 | 可用於批量處理(即連續步進式處理,sequential step-wise processing)。 |
可用於批量、實時和圖形的方式處理。 |
機器學習 | Hadoop 使用 Mahout 進行代數運算,但缺乏 ML 庫支持。 | Spark 有一個大型的 ML 庫來構建管道、執行超參數調優(hyperparameter tuning)。 |
易於學習 | MapReduce 沒有交互模式,內置 API 的數量相對較少。 需要大量編程。 |
Spark 有很多高級 API,所以編程和交互較少。 |
成本 | Hadoop 更便宜,因為它只需要更多的磁盤存儲空間。 | Spark 需要更高的 RAM 才能在內存中運行,所以成本更高。 |
容錯 | Hadoop 跨多個節點復制數據,所以具有容錯性。 | Spark RDD 因為它的內存特性,所以也具有一定的容錯性 |
總結:
- 當系統需要更便宜、更獨立的時間以及更大的容錯能力時,要選擇 Hadoop。
- 當算法是迭代的,並且需要交互式數據處理或機器學習時,就要選擇 Spark。在需要實時分析/預測結果的時候,選擇 Spark 也有一定優勢。
RDD(Resilient Distributed Dataset)
Spark 數據的內存處理是使用彈性分布式數據集(Resilient Distributed Datasets----RDD)完成的,用戶必須指定操作。
RDD 是提供 Spark 特性的支柱,負責數據的分發以及所有節點內存中操作。
- Spark 提供的主要概念是一個彈性的分布式數據集(RDD),它是跨集群節點划分的元素集合,可以進行並行的操作。RDD是通過從 Hadoop 文件系統(或任何其他 Hadoop 支持的文件系統)中的文件或驅動程序中現有的 Scala 集合開始,然后對其進行轉換來創建的。用戶還可以要求 Spark 將 RDD 持久化在內存中,或緩存 RDD 來提高性能,從而能讓它在並行操作中有效地重用。最后,RDD 會自動從節點故障中恢復。
- RDD 是不可變的,這在自我恢復中起了很大的作用。不可變意味着需要存儲用於生成 RDD 的轉換序列。這是一個有向無環圖(DAG),可以把數據集復制到多個節點上。所以,如果處理數據集分區的特定節點發生故障,集群管理器就可以把這個節點分配給沿襲的其他節點,並恢復正在處理的數據。
- RDD 是一種無模式的數據結構,可以處理結構化和非結構化數據。所有的操作都是在 RDD 上完成的,從一個 RDD 轉換到另一個 RDD,最終把它們存儲在持久存儲中。它是一個不可變的分布式對象的集合,這些對象甚至可以是用戶自定義的類別。RDD 支持延遲評估,直到執行了某一個操作,結果才被評估。轉換產生新的 RDD,操作產生結果。
Spark 生態
Spark 生態系統的設計分為兩層——第一層是 Spark Core,第二層是含有 libraries 和 API 的包。
第一層 Spark Core 層:Spark Core 是 Spark 生態系統的基礎核心組件,整個生態系統都建立在它之上。
- 引擎(Spark Engine)— SPARK ENGINE 的計算引擎負責執行調度(將任務分解成更小的任務、調度任務、並行處理)、監控(報告故障)、和基本的 IO 功能(向集群提供數據)。它也是與集群管理器和數據管理器交互的管理中樞。
- 管理(Management)— Spark 集群可以通過 Hadoop YARN、Mesos 或 Spark 集群管理器進行管理。
- 庫(Library)— Spark 生態系統包括 Spark SQL(用於 RDD 或外部數據源的類似 SQL 查詢的運行)、Spark Mlib(用於機器學習)、Spark Graph X(用於構建更好的數據可視化圖)、Spark 流(用於同一應用程序中的批量處理和流水式處理)。
- 存儲(Storage)—數據可以存儲在 Hadoop 文件系統(HDFS)、AWS 的 S3 系統、本地存儲中,同時支持 SQL 和 NoSQL 數據庫。
第二層 Saprk Core API 層:含有 libraries 和 API 的包。
Apache Spark Core API(在 R、SQL、Python、Scala 和 Java 中可用)最初是用來編寫數據處理邏輯的。這些基於 RDD 的 API ,缺少了一些性能優化器。但是,因為沒有額外的開銷,所以它們還為用戶提供了最大程度的個人定制和靈活性,可以根據公司的要求進行編程。
為了克服核心 API 的不足,提供更有針對性的支持,Apache Spark 在核心 API 的基礎上引入了第二層。第二層通常分為 4 組邏輯 API/庫:
- SparkSQL 和 Dataframes:這允許用戶在 Spark 數據幀上執行 SQL 命令。它們主要用於結構化和半結構化數據。
- Streaming:這些 API 用於處理連續傳入的無界數據流。
- Mllib:這個庫支持所有可以部署在 Spark 框架上的機器學習活動。
- GraphX:是一個能讓圖形處理算法實施到可用數據集的庫。
Spark 工作模式
Spark 主要有以下三種工作模式:
- 批處理模式——調度作業,並且有一個隊列用於運行該作業的批處理,此過程無需人工干預。
- 流水式(Stream)處理模式——當數據流到來時,程序進行運行和處理
- 交互(Interactive)模式——用戶在 shell 上執行命令,主要用於開發目的。
Spark 架構
SparkSpark 是由一個驅動節點(Driver Node)、集群管理器(Cluster Manager)和多個輔助節點(Secondary Node)組成的。
- 驅動節點包含具有 Spark 環境的驅動程序,驅動程序把用戶提交的程序轉換為 DAG。
- Spark 環境在集群管理器的幫助下,把任務(作業的可執行部分)分配給次要節點。
- 集群管理器負責分配驅動程序(執行作業所需的資源)。
- 次要節點負責執行任務,並將結果返回到環境的地方 。