Spark與MapReduce的區別
MapReduce的缺陷
操作複雜
開發起來:因爲MapReduce只有map、reduce兩種算子。
1. low-level 低級別的。
2. constrained 有很多限制 (雖然可以使用一些類似Hive之類的框架來彌補)
並且單元測試也很麻煩
計算效率低
-
MapReduce是屬於進程級別:MapTask ReduceTask
雖然有JVM複用,但還是效率不高 -
頻繁的IO: 因爲MapReduce的作業一般都是串起來的作業,chain,一個作業的輸出作爲下一個作業的輸入…並且作業的數據一般都會存儲在HDFS上,這樣會有頻繁的磁盤和網絡的IO。數據落地的話,是需要三個副本的。
-
MapReduce的所有任務都需要序列化
排序:MapReduce每個場景都需要排序的,但是很多時候都是沒有必要的
面試題:key類型是實現什麼接口?
writable 要執行序列化的 read方法和wirte方法
writablecomparable 排序比較的 -
Memory:MapReduce基於內存做處理,但是是有限的
所以說MapReduce性能是很低的,迭代次數比較多的話,性能會不好
不適合迭代處理
數據挖掘,機器學習,圖計算之類的,都需要很多迭代操作,所以不適合用 MapReduce 去做
不適合實時流式處理,只能離線處理
很多框架都各自爲戰,浪費了很多資源,開發也慢,運維也不方便
Spark的特點
綜述:Spark is a fast and general engine for large-scale data processing(數據處理)
fast + general engine
fast體現在:
write code fast :Java/Scala/Python/R並支持interactive shell;
run fast : memory / DAG / Thread Model /sort可以設置成無。
計算速度快
- memory RDD cash
- thread 基於線程
- sort 可以設置的
- pipeline(流水線) rdd.map.fliter…collect
如果是MapReduce,maptask reducetask 遇到就執行,是立刻執行的
而 spark 是將很多操作串起來,就是一張DAG圖(有向無環圖)
rdd.map.fliter…這些操作再多是不會執行的,需要觸發action操作纔可以來執行。
例如:rdd.map.fliter…collect
遇見就執行,先執行map,讀取寫入操作完了,執行fliter,讀取寫入…
而對於Spark來說,是基於rdd來計算的
rdd裏有分區,每一個操作都是載依賴,有action了,直接在這個分區(partition)中kaka就執行,就減少很多中間數據落地的操作(寫入讀取)
易於使用
使用Java,Scala,Python,R開發代碼塊+測試塊
80+ high-level operator:80多種高級別的算子
nteractively 交互式命令行(測試快)
通用性
一站式處理(但是也不是萬能的,只能解決一定場景的)
Combine SQL,streaming,and complex analytics
spark powers a stack of libraries including SQL and DataFrams,MLlib for machine learning,GraphX,and Spark Streaming.
Runs Everywhere
on Hadoop(Yarn),Mesos,standalone,or in the cloud
can access diverse data sources(訪問各種數據源)
including HDFS,Cassdandra,HBase,S3(Amazon)
這些都是外部數據源,如果只是跑一個SQL在Spark之上,就太low了,主要就是外部數據源