本文目錄一覽:
spark和hadoop的區別
spark和hadoop的區別:誕生的先後順序、計算不同、平台不同。
誕生的先後順序,hadoop屬於第一代開源大數據處理平台,而spark屬於第二代。屬於下一代的spark肯定在綜合評價上要優於第一代的hadoop。
計算不同spark和hadoop在分布式計算的底層思路上,其實是極為相似的,即mapreduce分布式運算模型:將運算分成兩個階段,階段1-map,負責從上游拉取數據後各自運算,然後將運算結果shuffle給下游的reduce,reduce再各自對通過shuffle讀取來的數據進行聚合運算spark和hadoop在分布式計算的具體實現上,又有區別;hadoop中的mapreduce運算框架,一個運算job,進行一次map-reduce的過程;而spark的一個job中,可以將多個map-reduce過程級聯進行。
平台不同spark和hadoop區別是,spark是一個運算平台,而hadoop是一個複合平台(包含運算引擎,還包含分布式文件存儲系統,還包含分布式運算的資源調度系統),所以,spark跟hadoop來比較的話,主要是比運算這一塊大數據技術發展到目前這個階段,hadoop主要是它的運算部分日漸式微,而spark目前如日中天,相關技術需求量大,offer好拿。
spark java本地環境怎麼搭建
1. 環境準備
Eclipse 請不要使用最新的 Neon(4.6) ,太多Bug了。 還是使用最新的 Mars(4.5) 系列吧
JDK 版本8.x (Linux推薦Oracle, 沒有測試過OpenJDK)
因為只是用Java,因此無需安裝Scala及其相應的插件
2. 創建一個新的maven項目
3. pom.xml
org.apache.hadoop
hadoop-client
2.6.0
javax.servlet
*
org.apache.spark
spark-core_2.10
1.6.1
org.apache.spark
spark-streaming_2.10
1.6.1
org.apache.spark
spark-mllib_2.10
1.6.1
org.scala-lang
scala-library
2.10.5
這裡只列出了必要的幾個依賴。 其他的請根據你自己的項目需求添加
4. 使用maven打包
之後在Goal 之中填寫clean package 即可
如果在修改了與Spark相關的代碼之後,需要重新編譯打包才行。 否則會有異常提示。
5. 代碼編寫注意事項:
在創建JavaSparkContext的時候,需要把自己加進去。
public static JavaSparkContextgetContext(String taskName) {
JavaSparkContextsc = new JavaSparkContext(SparkConnUtils.getSparkConf(taskName));
sc.addJar(“target/sparkstat-0.0.1-SNAPSHOT.jar”);
return sc;
}
其中target/sparkstat-0.0.1-SNAPSHOT.jar是maven 運行之後生成的完整的jar包
spark和java的關係
通常大家只是說Spark是基於內存計算的,速度比MapReduce要快。或者說內存中迭代計算。其實我們要抓住問題的本質。總結有以下幾點:
1、Spark vs MapReduce ≠ 內存 vs 磁盤
其實Spark和MapReduce的計算都發生在內存中,區別在於:
MapReduce通常需要將計算的中間結果寫入磁盤,然後還要讀取磁盤,從而導致了頻繁的磁盤IO。
Spark則不需要將計算的中間結果寫入磁盤,這得益於Spark的RDD(彈性分布式數據集,很強大)和DAG(有向無環圖),其中DAG記錄了job的stage以及在job執行過程中父RDD和子RDD之間的依賴關係。中間結果能夠以RDD的形式存放在內存中,且能夠從DAG中恢復,大大減少了磁盤IO。
2、Spark vs MapReduce Shuffle的不同
Spark和MapReduce在計算過程中通常都不可避免的會進行Shuffle,兩者至少有一點不同:
MapReduce在Shuffle時需要花費大量時間進行排序,排序在MapReduce的Shuffle中似乎是不可避免的;
Spark在Shuffle時則只有部分場景才需要排序,支持基於Hash的分布式聚合,更加省時;
3、多進程模型 vs 多線程模型的區別
MapReduce採用了多進程模型,而Spark採用了多線程模型。多進程模型的好處是便於細粒度控制每個任務佔用的資源,但每次任務的啟動都會消耗一定的啟動時間。就是說MapReduce的Map Task和Reduce Task是進程級別的,而Spark Task則是基於線程模型的,就是說mapreduce 中的 map 和 reduce 都是 jvm 進程,每次啟動都需要重新申請資源,消耗了不必要的時間(假設容器啟動時間大概1s,如果有1200個block,那麼單獨啟動map進程事件就需要20分鐘)
Spark則是通過復用線程池中的線程來減少啟動、關閉task所需要的開銷。(多線程模型也有缺點,由於同節點上所有任務運行在一個進程中,因此,會出現嚴重的資源爭用,難以細粒度控制每個任務佔用資源)
總結:關於Spark為什麼比MapReduce快,或者Spark速度快於MapReduce的原因,總結至少有這幾點不同之處吧。
Spark 中用 Scala 和 java 開發有什麼區別
1,構建系統的選擇,sbt更合適用來構建Scala工程,maven更合適用來構建Java工程
2,對於spark中的API來說,Java和Scala有差別,但差別並不大
3,如果用Scala開發spark原型程序,可以用spark-shell“打草稿”,或者直接使用spark-shell做交互式實時查詢
4,用Scala代碼量將減少甚至一個數量級,不過Scala的使用門檻較高
建議:使用Scala構建spark作業,因為spark本身為sbt所構建,同時使用Scala開發spark作業將有助於理解spark的實現機制
Scala相對Java語法更豐富,更簡潔,寫起來更像腳本,能夠提高開發效率。
使用Java的話代碼會規範些,不過太臃腫,代碼量更大。
另外Spark基本使用函數式編程,使用Java的話可能需要寫一大堆匿名類,而Scala只需要一個lambda表達式。
Java不支持自動類型推導,RDD類基本都是范型,聲明時需要寫一串類類型,而Scala基本可以省略變量類型。
另外,如果喜歡,可以混合Java和Scala,因為二者最終都是編譯成class文件,使用Scala能夠隨意調用Java實現的類和方法。
從表面上看,無論採用哪種語言,都能完成一樣的功能,只是代碼量有多有少,開發人員根據自己的情況選擇使用Java還是Scala都可。
據說目前最新的Java 8已經支持函數式接口了,Java 9也將推出Java Shell功能,慢慢地會變得和Scala一樣簡潔
原創文章,作者:DLFW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/132983.html