上篇《高可用Hadoop平臺-啓航》博客已經讓咱們初步瞭解了Hadoop平臺;接下來,咱們對Hadoop作進一步的探索,一步一步的揭開Hadoop的神祕面紗。下面,咱們開始贅述今天的探索之路。html
在探索以前,咱們來看一下Hadoop解決了什麼問題,Hadoop就是解決了大數據(大到單臺服務器沒法進行存儲,單臺服務器沒法在限定的時間內進行處理)的可靠存儲和處理。編程
在Hadoop的源碼中,提供了一個很經典的例子:WordCount,具體源碼能夠參見上篇文章,若是對MapReduce不熟悉,經過該示例對MapReduce進行一些瞭解對理解下文會由幫助。在MapReduce中,Shuffle是一個很是重要的過程,正是有了看不見的Shuffle過程,纔可使在MapReduce之上寫數據處理的開發者徹底感受不到分佈式和併發的存在。緩存
注:廣義的Shuffle是指圖中在Map和Reduce之間的一系列過程。服務器
MapReduce存在如下侷限,使用起來比較困難。併發
舉個例子,用MapReduce實現表與表之間的join,都是一個很須要技巧來處理的過程,以下圖:app
所以,在Hadoop以後,出現來不少相關技術對其中的侷限進行改進,如:Hive,Oozie,Tez,Spark,Storm等等。框架
Hive是Facebook的產品,目前已託管到Apache基金。關於Hive的安裝搭建和使用請參考《那些年使用Hive踩過的坑》和《Hive的安裝部署》,這裏就很少贅述了。Hive是一種底層封裝了Hadoop的數據倉庫處理工具,使用類SQL的HiveSQL語言實現數據查詢,全部Hive的數據都存儲在HDFS中。Hive在加載數據過程當中不會對數據進行任何的修改,只是將數據移動到HDFS中Hive的指定目錄下,所以,Hive不支持對數據的改寫和添加,全部的數據都是在加載的時候肯定的。機器學習
Hive解決類MapReduce存在的大量手寫代碼,語義隱藏,提供操做種類少的問題。相似的項目還有Pig,JAQL等。分佈式
Tez是HortonWorks的Stinger Initiative的的一部分。做爲執行引擎,Tez也提供了有向無環圖(DAG),DAG由頂點(Vertex)和邊(Edge)組成,Edge是對數據的移動的抽象,提供了One-To-One,BroadCast,和Scatter-Gather三種類型,只有Scatter-Gather才須要進行Shuffle。函數
示例:
SELECT a.state, COUNT(*), AVERAGE(c.price) FROM a JOIN b ON (a.id = b.id) JOIN c ON (a.itemId = c.itemId) GROUP BY a.state
Tez的優化主要體如今:
經過提供DAG語義和操做,提供了總體的邏輯,經過減小沒必要要的操做,Tez提高了數據處理的執行性能。
Spark也是一個大數據處理的引擎,主要特色是提供了一個集羣的分佈式內存抽象,以支持須要工做集的應用。
這個抽象就是RDD(Resilient Distributed Dataset),RDD就是一個不可變的帶分區的記錄集合,RDD也是Spark中的編程模型。Spark提供了RDD上的兩類操做,轉換和動做。轉換是用來定義一個新的RDD,包括map, flatMap, filter, union, sample, join, groupByKey, cogroup, ReduceByKey, cros, sortByKey, mapValues等,動做是返回一個結果,包括collect, reduce, count, save, lookupKey。
Spark支持故障恢復的方式也不一樣,提供兩種方式,Linage,經過數據的血緣關係,再執行一遍前面的處理,Checkpoint,將數據集存儲到持久存儲中。
Spark的API很是簡單易用,使用Spark,WordCount的示例以下所示:
val spark = new SparkContext(master, appName, [sparkHome], [jars]) val file = spark.textFile("hdfs://nna:9000/hdfs/in/a.txt") val counts = file.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("hdfs://nna:9000/hdfs/out")
其中的file是根據HDFS上的文件建立的RDD,後面的flatMap,map,reduceByKe都建立出一個新的RDD,一個簡短的程序就可以執行不少個轉換和動做。在Spark中,全部RDD的轉換都是是惰性求值的。Spark的任務是由相互依賴的多個RDD組成的有向無環圖(DAG),每一個RDD又包含多個分區,當在RDD上執行動做時,Spark纔對任務進行調度。
Spark對於有向無環圖對任務進行調度,肯定階段,分區,流水線,任務和緩存,進行優化,並在Spark集羣上運行任務。RDD之間的依賴分爲寬依賴(依賴多個分區)和窄依賴(只依賴一個分區),在肯定階段時,須要根據寬依賴劃分階段。根據分區劃分任務。
Spark爲迭代式數據處理提供更好的支持。每次迭代的數據能夠保存在內存中,而不是寫入文件。
Spark的性能相比Hadoop有很大提高,2014年10月,Spark完成了一個Daytona Gray類別的Sort Benchmark測試,排序徹底是在磁盤上進行的,與Hadoop以前的測試的對比結果如表格所示:
原圖連接地址:http://databricks.com/blog/2014/11/05/spark-officially-sets-a-new-record-in-large-scale-sorting.html
從表格中能夠看出排序100TB的數據(1萬億條數據),Spark只用了Hadoop所用1/10的計算資源,耗時只有Hadoop的1/3。
Spark的優點不只體如今性能提高上的,Spark框架爲批處理(Spark Core),交互式(Spark SQL),流式(Spark Streaming),機器學習(MLlib),圖計算(GraphX)提供一個統一的平臺,這相對於使用Hadoop有很大優點。
那麼Spark解決了Hadoop的哪些問題?
這篇文章就分享到這裏,若在研究的過程當中有什麼疑問,能夠加羣討論或發送郵件給我,我會盡我所能爲您解答,與君共勉!