亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 60198 | 回復(fù): 24
打印 上一主題 下一主題

[Spark] 你不知道的Spark,將來會(huì)替代Hadoop? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-10-28 21:26 |只看該作者 |倒序?yàn)g覽
獲獎(jiǎng)詳情:
http://72891.cn/thread-4203439-1-1.html

隨著大數(shù)據(jù)概念的普及以及大數(shù)據(jù)技術(shù)的逐漸成熟,越來越多來自不同領(lǐng)域的大小企業(yè)開始擁抱大數(shù)據(jù)。大數(shù)據(jù)時(shí)代真正即將到來。而選擇大數(shù)據(jù)將遭遇的第一個(gè)問題就是技術(shù)選型。面對(duì)由Hadoop、Spark、Hive、HBase、Storm、Kafka、Flume等等眾多開源工具構(gòu)成的生態(tài)系統(tǒng),技術(shù)人員往往感到迷茫。
Spark作為數(shù)據(jù)處理技術(shù)中的新貴,因其性能高、開發(fā)效率高、高容錯(cuò)等優(yōu)點(diǎn)越來越受到技術(shù)人員的關(guān)注,而且Spark為批處理(Spark Core)、交互式(Spark SQL)、流式處理(Spark Streaming)、機(jī)器學(xué)習(xí)(MLlib)、圖計(jì)算(GraphX)提供了一個(gè)統(tǒng)一的數(shù)據(jù)處理平臺(tái)。但是Spark也存在一些缺點(diǎn),例如還不夠穩(wěn)定、任務(wù)調(diào)度還不夠完善、scala語言學(xué)習(xí)成本較高等等。關(guān)于Spark,你有什么看法呢?


討論話題:(歡迎大家貼圖討論,能用代碼講話的就別用漢字了
1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?

討論時(shí)間:2015年10月29日——11月29日


獎(jiǎng)品設(shè)置:
活動(dòng)結(jié)束后,我們將會(huì)選取4位討論精彩的兄弟,送《Spark快速大數(shù)據(jù)分析》圖書一本。


作者:[美] Holden Karau Andy Konwinski
      Patrick Wendell
   [加] Matei Zaharia   
譯者:王道遠(yuǎn)
出版時(shí)間:2015年 9 月第 1 版


內(nèi) 容 提 要:
  本書由Spark開發(fā)者及核心成員共同打造,講解了網(wǎng)絡(luò)大數(shù)據(jù)時(shí)代應(yīng)運(yùn)而生的、能高效迅捷地分析處理數(shù)據(jù)的工具——Spark,它帶領(lǐng)讀者快速掌握用Spark收集、計(jì)算、簡(jiǎn)化和保存海量數(shù)據(jù)的方法,學(xué)會(huì)交互、迭代和增量式分析,解決分區(qū)、數(shù)據(jù)本地化和自定義序列化等問題。

試讀樣章: 第1章 Spark數(shù)據(jù)分析導(dǎo)論.pdf (2.61 MB, 下載次數(shù): 291)




論壇徽章:
78
雙子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06獅子座
日期:2013-10-18 13:40:31雙子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56處女座
日期:2013-10-24 17:15:30雙子座
日期:2013-10-25 13:49:39午馬
日期:2013-10-28 15:02:15
2 [報(bào)告]
發(fā)表于 2015-10-29 18:58 |只看該作者
本帖最后由 yybmsrs 于 2015-10-29 18:59 編輯

1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
差不多,shuffle的時(shí)候中間數(shù)據(jù)放到內(nèi)存,放不下才寫文件。同時(shí)spark的抽象程度更高,不僅僅只有map和reduce。

2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?
spark是個(gè)生態(tài)系統(tǒng),hadoop也是一個(gè)生態(tài)系統(tǒng),不存在誰取代誰,只能說spark會(huì)取代mr。其他如hdfs,yarn都是
通用的。


另外,這兩個(gè)問題實(shí)在是沒什么可以多說的,雖然我很想要這本書

論壇徽章:
16
IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-02 06:20:00IT運(yùn)維版塊每月發(fā)帖之星
日期:2015-09-11 19:30:52IT運(yùn)維版塊每周發(fā)帖之星
日期:2015-09-11 19:20:31IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-26 06:20:00每日論壇發(fā)貼之星
日期:2015-08-20 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-20 06:20:002015年辭舊歲徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09雙子座
日期:2013-12-17 16:44:37辰龍
日期:2013-11-22 15:20:59獅子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
3 [報(bào)告]
發(fā)表于 2015-10-29 19:14 |只看該作者
1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
這個(gè)我贊同,因?yàn)閟park屬于那種內(nèi)存計(jì)算型的架構(gòu),是對(duì)mapreduce不足的改進(jìn)。
2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?
我覺得不會(huì),Spark框架的底層存儲(chǔ)可以選用HDFS,也可以用其他的。但是Spark 運(yùn)行的模式里有Standalone,Yarn,Mesos。 其中Yarn也是Hadoop的組件。
而且Hadoop組件很多。不是那么隨便可以替代的。。

論壇徽章:
7
IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-29 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技術(shù)圖書徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34fulanqi
日期:2016-06-17 17:54:25C
日期:2016-10-25 16:08:32
4 [報(bào)告]
發(fā)表于 2015-10-30 09:05 |只看該作者
1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
- 基本同意
- Hadoop,主要用于離線大數(shù)據(jù)分析;那么Spark主要用于準(zhǔn)實(shí)時(shí)性的大數(shù)據(jù)分析;而Storm用于實(shí)時(shí)大數(shù)據(jù)分析

2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?
- 目前看起來不會(huì),Hadoop是一個(gè)體系,一個(gè)生態(tài)系統(tǒng),里面包含了很多子系統(tǒng)。而且兩者的基礎(chǔ)也不完全一樣,想完全替代,目前看不出這個(gè)趨勢(shì) ..

論壇徽章:
15
2015七夕節(jié)徽章
日期:2015-08-21 11:06:172017金雞報(bào)曉
日期:2017-01-10 15:19:56極客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16賽季CBA聯(lián)賽之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-28 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-01-25 14:01:34IT運(yùn)維版塊每周發(fā)帖之星
日期:2016-01-07 23:04:26數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-12-01 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-10 06:20:00
5 [報(bào)告]
發(fā)表于 2015-10-30 10:04 |只看該作者
本帖最后由 heguangwu 于 2015-10-30 15:44 編輯

1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
    Spark技術(shù)來自超算,主要的核心思想是RDD,通過記錄每一個(gè)步驟之間的計(jì)算關(guān)系而不是像MapReduce那樣保存實(shí)際的數(shù)據(jù)來實(shí)現(xiàn)故障恢復(fù),所以Spark的故障恢復(fù)其實(shí)是要重算的,其計(jì)算過程確實(shí)有點(diǎn)像MapReduce,MapReduce在經(jīng)過一個(gè)階段的MapReduce后會(huì)將數(shù)據(jù)保存到HDFS,相當(dāng)于做了一次checkpoint,這其實(shí)是一個(gè)很大的消耗,也是性能的一大瓶頸,但好處是恢復(fù)起來非常快,Spark也借鑒了這種思想,中間其實(shí)也可以做持久化的RDD,等同于checkpoint,但多數(shù)情況下不需要這個(gè)步驟,后面可以直接繼續(xù)跟計(jì)算操作,這樣看Spark無論從容災(zāi)還是計(jì)算模型都不是MapReduce,只是借鑒了MapReduce很多思想,所以不能說Spark僅僅是內(nèi)存版的MapReduce。在改進(jìn)MapReduce模型上,而Hadoop的其它計(jì)算框架如Tez/impala是改進(jìn)mapreduce的階段劃分的單一性(只有map和reduce),將計(jì)算拓?fù)鋱D做成DAG的方式(這個(gè)本質(zhì)是是借鑒了并行數(shù)據(jù)庫的思想),雖然故障恢復(fù)很麻煩,但速度快了不少。我們看一下spark的協(xié)議棧,從下圖可以看出,spark其實(shí)不僅僅是一種簡(jiǎn)單的計(jì)算模型,而是一個(gè)通用計(jì)算平臺(tái),上面開發(fā)各種庫可以實(shí)現(xiàn)不同的技術(shù)模型,如流計(jì)算、機(jī)器學(xué)習(xí)

     而很久之前MapReduce也想做一個(gè)通用的計(jì)算平臺(tái)(事實(shí)上也有很多人在上面做了一些如機(jī)器學(xué)習(xí)等),但其計(jì)算模型的簡(jiǎn)單低效不適合做成通用平臺(tái)。從另外一個(gè)方面來說,spark也是mapreduce的一種重要補(bǔ)充,而不是簡(jiǎn)單的替代,畢竟現(xiàn)在內(nèi)存資源還是比較寶貴的,MapReduce消耗的磁盤資源相對(duì)而言廉價(jià)多了,而且有些計(jì)算并不那么著急,5個(gè)小時(shí)計(jì)算出來和10個(gè)小時(shí)計(jì)算出來結(jié)果影響不大這種就適合MR


2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?
     其實(shí)我上面也講述了部分我的觀點(diǎn),現(xiàn)在不是誰替換誰,而是spark是mapreduce的一種重要補(bǔ)充,最后的情況不是one size fit all,而是不同場(chǎng)景會(huì)采用不同的計(jì)算模型,如要求低時(shí)延的會(huì)采用storm,對(duì)吞吐量要求高的會(huì)采用spark stream,重要的實(shí)時(shí)計(jì)算采用spark,而中小數(shù)據(jù)交互式計(jì)算可能會(huì)采用Tez,超大規(guī)模的非實(shí)時(shí)的計(jì)算還是會(huì)采用MapReduce,正如下面這個(gè)圖一樣

      最后貼一個(gè)hadoop ecosystem的介紹的ppt,雖然是有點(diǎn)老,但思路非常清晰,個(gè)人也比較認(rèn)同這個(gè)觀點(diǎn):
Introduction to the Hadoop Ecosystem.pdf (9.73 MB, 下載次數(shù): 160)

論壇徽章:
4
IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-10 06:20:002015亞冠之阿爾艾因
日期:2015-11-08 10:27:01CU十四周年紀(jì)念徽章
日期:2020-11-05 14:10:23
6 [報(bào)告]
發(fā)表于 2015-10-30 10:27 |只看該作者
1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
    這樣說有點(diǎn)簡(jiǎn)單,spark提供了集群的分布式內(nèi)存抽象,也就是所說的RDD,spark提供了RDD的兩類操作,轉(zhuǎn)換和動(dòng)作,轉(zhuǎn)換包括map,flatMap,filter,union,sample,join,groupByKey,reduceByKey,sortByKey等等,動(dòng)作是返回結(jié)果,包括collect,reduce,count等,抽象層次更高,功能更多,調(diào)用更靈活。所處理的數(shù)據(jù)都是放在內(nèi)存中,速度更快。
    mapreduce則抽象層次比較低,只有map,reduce兩個(gè)基本功能。

2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?
    hadoop是一個(gè)生態(tài)系統(tǒng),主要包括HDFS,mapredeuce,適合處理海量離線數(shù)據(jù),他的分布是基于磁盤和IO的。
    spark的分布處理是基于內(nèi)存的,速度更快。
    spark的出現(xiàn),解決方案又多了一種選擇,spark是可以架在hadoop和yarn上的,hadoop的生態(tài)中有很多部分,spark可以替代hadoop的一些功能,二者是可并存的。

論壇徽章:
32
CU大牛徽章
日期:2013-05-20 10:45:13每日論壇發(fā)貼之星
日期:2015-09-07 06:20:00每日論壇發(fā)貼之星
日期:2015-09-07 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-12-13 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-03-03 11:56:13IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-23 06:20:0015-16賽季CBA聯(lián)賽之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金雞報(bào)曉
日期:2017-01-10 15:13:292017金雞報(bào)曉
日期:2017-02-08 10:33:21
7 [報(bào)告]
發(fā)表于 2015-10-30 12:58 |只看該作者
不錯(cuò),支持

論壇徽章:
59
2015七夕節(jié)徽章
日期:2015-08-24 11:17:25ChinaUnix專家徽章
日期:2015-07-20 09:19:30每周論壇發(fā)貼之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38榮譽(yù)版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年紀(jì)念徽章
日期:2015-07-20 11:05:27IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-07-20 11:05:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:40數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:432015年辭舊歲徽章
日期:2015-07-20 11:05:44
8 [報(bào)告]
發(fā)表于 2015-10-30 16:09 |只看該作者
新東西太多了。

論壇徽章:
10
數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-06-14 22:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-03-10 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-12-01 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-09 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-02 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-07-13 22:59:28IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-06-23 22:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-06-21 22:20:00每日論壇發(fā)貼之星
日期:2015-06-14 22:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-08-02 06:20:00
9 [報(bào)告]
發(fā)表于 2015-10-30 20:52 |只看該作者
1. 有人說Spark就是內(nèi)存版的MapReduce,對(duì)此你怎么看?
    (1)spark與以MapReduce為出發(fā)點(diǎn)的hadoop有幾乎同樣的效果,絕不是同樣的處理方式。以下簡(jiǎn)單介紹不同之處。   
    Spark 是一種與 Hadoop 相似的開源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越,換句話說,Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。
Spark 是在 Scala 語言中實(shí)現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對(duì)象一樣輕松地操作分布式數(shù)據(jù)集。
盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實(shí)際上它是對(duì) Hadoop 的補(bǔ)充,可以在 Hadoop 文件系統(tǒng)中并行運(yùn)行。通過名為 Mesos 的第三方集群框架可以支持此行為。Spark 由加州大學(xué)伯克利分校 AMP 實(shí)驗(yàn)室 (Algorithms, Machines, and People Lab) 開發(fā),可用來構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
   

   (2) 對(duì)于spark的部署,請(qǐng)參見我的博文:http://blog.chinaunix.net/uid-7374279-id-5200921.html
  以下是部分介紹:
先從比較簡(jiǎn)單的說起,所謂的沒有ha是指master節(jié)點(diǎn)沒有ha。

組成cluster的兩大元素即Master和Worker。slave worker可以有1到多個(gè),這些worker都處于active狀態(tài)。

Driver Application可以運(yùn)行在Cluster之內(nèi),也可以在cluster之外運(yùn)行,先從簡(jiǎn)單的講起即Driver Application獨(dú)立于Cluster。那么這樣的整體框架如下圖所示,由driver,master和多個(gè)slave worker來共同組成整個(gè)的運(yùn)行環(huán)境。

執(zhí)行順序
步驟1 運(yùn)行master

$SPARK_HOME/sbin/start_master.sh

在 start_master.sh 中最關(guān)鍵的一句就是

"$sbin"/spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --ip $SPARK_MASTER_IP --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT

檢測(cè)Master的jvm進(jìn)程

root 23438 1 67 22:57 pts/0 00:00:05 /opt/java/bin/java -cp :/root/working/spark-0.9.1-bin-hadoop2/conf:/root/working/spark-0.9.1-bin-hadoop2/assembly/target/scala-2.10/spark-assembly_2.10-0.9.1-hadoop2.2.0.jar -Dspark.akka.logLifecycleEvents=true -Djava.library.path= -Xms512m -Xmx512m org.apache.spark.deploy.master.Master --ip localhost --port 7077 --webui-port 8080

Master的日志在$SPARK_HOME/logs目錄下
步驟2 運(yùn)行worker,可以啟動(dòng)多個(gè)

./bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077

worker運(yùn)行時(shí),需要注冊(cè)到指定的master url,這里就是spark://localhost:7077.

Master側(cè)收到RegisterWorker通知,其處理代碼如下

case RegisterWorker(id, workerHost, workerPort, cores, memory, workerUiPort, publicAddress) =>
    {
      logInfo("Registering worker %s:%d with %d cores, %s RAM".format(
        workerHost, workerPort, cores, Utils.megabytesToString(memory))) if (state == RecoveryState.STANDBY) { // ignore, don't send response } else if (idToWorker.contains(id)) {
        sender ! RegisterWorkerFailed("Duplicate worker ID"
      } else {
        val worker = new WorkerInfo(id, workerHost, workerPort, cores, memory,
          sender, workerUiPort, publicAddress) if (registerWorker(worker)) {
          persistenceEngine.addWorker(worker)
          sender ! RegisteredWorker(masterUrl, masterWebUiUrl)
          schedule()
        } else {
          val workerAddress = worker.actor.path.address
          logWarning("Worker registration failed. Attempted to re-register worker at same " + "address: " + workerAddress)
          sender ! RegisterWorkerFailed("Attempted to re-register worker at same address: " + workerAddress)
        }
      }
    }

步驟3 運(yùn)行Spark-shell

MASTER=spark://localhost:7077 $SPARK_HOME/bin/spark-shell

spark-shell屬于application,有關(guān)appliation的運(yùn)行日志存儲(chǔ)在 $SPARK_HOME/works 目錄下

spark-shell作為application,在Master側(cè)其處理的分支是RegisterApplication,具體處理代碼如下。

case RegisterApplication(description) => { if (state == RecoveryState.STANDBY) { // ignore, don't send response } else {
        logInfo("Registering app " + description.name)
        val app = createApplication(description, sender)
        registerApplication(app)
        logInfo("Registered app " + description.name + " with ID " + app.id)
        persistenceEngine.addApplication(app)
        sender ! RegisteredApplication(app.id, masterUrl)
        schedule()
      }
    }

每當(dāng)有新的application注冊(cè)到master,master都要調(diào)度schedule函數(shù)將application發(fā)送到相應(yīng)的 worker,在對(duì)應(yīng)的worker啟動(dòng)相應(yīng)的ExecutorBackend. 具體代碼請(qǐng)參考Master.scala中的schedule函數(shù),代碼就不再列出。
步驟4 結(jié)果檢測(cè)

/opt/java/bin/java -cp :/root/working/spark-0.9.1-bin-hadoop2/conf:/root/working/spark-0.9.1-bin-hadoop2/assembly/target/scala-2.10/spark-assembly_2.10-0.9.1-hadoop2.2.0.jar -Dspark.akka.logLifecycleEvents=true -Djava.library.path= -Xms512m -Xmx512m org.apache.spark.deploy.master.Master --ip localhost --port 7077 --webui-port 8080 root 23752 23745 21 23:00 pts/0 00:00:25 /opt/java/bin/java -cp :/root/working/spark-0.9.1-bin-hadoop2/conf:/root/working/spark-0.9.1-bin-hadoop2/assembly/target/scala-2.10/spark-assembly_2.10-0.9.1-hadoop2.2.0.jar -Djava.library.path= -Xms512m -Xmx512m org.apache.spark.repl.Main
root 23986 23938 25 23:02 pts/2 00:00:03 /opt/java/bin/java -cp :/root/working/spark-0.9.1-bin-hadoop2/conf:/root/working/spark-0.9.1-bin-hadoop2/assembly/target/scala-2.10/spark-assembly_2.10-0.9.1-hadoop2.2.0.jar -Dspark.akka.logLifecycleEvents=true -Djava.library.path= -Xms512m -Xmx512m org.apache.spark.deploy.worker.Worker spark://localhost:7077 root 24047 23986 34 23:02 pts/2 00:00:04 /opt/java/bin/java -cp :/root/working/spark-0.9.1-bin-hadoop2/conf:/root/working/spark-0.9.1-bin-hadoop2/assembly/target/scala-2.10/spark-assembly_2.10-0.9.1-hadoop2.2.0.jar -Xms512M -Xmx512M org.apache.spark.executor.CoarseGrainedExecutorBackend akka.tcp://spark@localhost:40053/user/CoarseGrainedScheduler 0 localhost 4 akka.tcp://sparkWorker@localhost:53568/user/Worker app-20140511230059-0000

從運(yùn)行的進(jìn)程之間的關(guān)系可以看出,worker和master之間的連接建立完畢之后,如果有新的driver application連接上master,master會(huì)要求worker啟動(dòng)相應(yīng)的ExecutorBackend進(jìn)程。此后若有什么Task需要運(yùn) 行,則會(huì)運(yùn)行在這些Executor之上?梢詮囊韵碌娜罩拘畔⒌贸龃私Y(jié)論,當(dāng)然看源碼亦可。

14/05/11 23:02:36 INFO Worker: Asked to launch executor app-20140511230059-0000/0 for Spark shell 14/05/11 23:02:36 INFO ExecutorRunner: Launch command: "/opt/java/bin/java" "-cp" ":/root/working/spark-0.9.1-bin-hadoop2/conf:/root/working/spark-0.9.1-bin-hadoop2/assembly/target/scala-2.10/spark-assembly_2.10-0.9.1-hadoop2.2.0.jar" "-Xms512M" "-Xmx512M" "org.apache.spark.executor.CoarseGrainedExecutorBackend" "akka.tcp://spark@localhost:40053/user/CoarseGrainedScheduler" "0" "localhost" "4" "akka.tcp://sparkWorker@localhost:53568/user/Worker" "app-20140511230059-0000"

worker中啟動(dòng)exectuor的相關(guān)源碼見worker中的receive函數(shù),相關(guān)代碼如下

case LaunchExecutor(masterUrl, appId, execId, appDesc, cores_, memory_) => if (masterUrl != activeMasterUrl) {
        logWarning("Invalid Master (" + masterUrl + " attempted to launch executor."
      } else { try {
          logInfo("Asked to launch executor %s/%d for %s".format(appId, execId, appDesc.name))
          val manager = new ExecutorRunner(appId, execId, appDesc, cores_, memory_, self, workerId, host,
            appDesc.sparkHome.map(userSparkHome => new File(userSparkHome)).getOrElse(sparkHome),
            workDir, akkaUrl, ExecutorState.RUNNING)
          executors(appId + "/" + execId) = manager
          manager.start()
          coresUsed += cores_
          memoryUsed += memory_
          masterLock.synchronized {
            master ! ExecutorStateChanged(appId, execId, manager.state, None, None)
          }
        } catch { case e: Exception => {
            logError("Failed to launch exector %s/%d for %s".format(appId, execId, appDesc.name)) if (executors.contains(appId + "/" + execId)) {
              executors(appId + "/" + execId).kill()
              executors -= appId + "/" + execId
            }
            masterLock.synchronized {
              master ! ExecutorStateChanged(appId, execId, ExecutorState.FAILED, None, None)
            }
          }
        }
      }

關(guān)于standalone的部署,需要詳細(xì)研究的源碼文件如下所列。

    deploy/master/Master.scala
    deploy/worker/worker.scala
    executor/CoarseGrainedExecutorBackend.scala

查看進(jìn)程之間的父子關(guān)系,請(qǐng)用 "pstree"

使用下圖來小結(jié)單Master的部署情況。

類的動(dòng)態(tài)加載和反射

在談部署Driver到Cluster上之前,我們先回顧一下java的一大特性“類的動(dòng)態(tài)加載和反射機(jī)制”。本人不是一直寫java代碼出身,所以好多東西都是邊用邊學(xué),難免掛一漏萬。

所謂的反射,其實(shí)就是要解決在運(yùn)行期實(shí)現(xiàn)類的動(dòng)態(tài)加載。

來個(gè)簡(jiǎn)單的例子

package test; public class Demo {  public Demo() {   System.out.println("Hi!";  }  @SuppressWarnings("unchecked"  public static void main(String[] args) throws Exception {   Class clazz = Class.forName("test.Demo";   Demo demo = (Demo) clazz.newInstance();  }
}

談到這里,就自然想到了一個(gè)面試題,“談一談Class.forName和ClassLoader.loadClass的區(qū)別"。說到面試,我總是很沒有信心,面試官都很屌的, 。
在cluster中運(yùn)行Driver Application

上一節(jié)之所以寫到類的動(dòng)態(tài)加載與反射都是為了談這一節(jié)的內(nèi)容奠定基礎(chǔ)。

將Driver application部署到Cluster中,啟動(dòng)的時(shí)序大體如下圖所示。

     首先啟動(dòng)Master,然后啟動(dòng)Worker
    使用”deploy.Client"將Driver Application提交到Cluster中

./bin/spark-class org.apache.spark.deploy.Client launch [client-options] \
      \
   [application-options]

    Master在收到RegisterDriver的請(qǐng)求之后,會(huì)發(fā)送LaunchDriver給worker,要求worker啟動(dòng)一個(gè)Driver的jvm process
    Driver Application在新生成的JVM進(jìn)程中運(yùn)行開始時(shí)會(huì)注冊(cè)到master中,發(fā)送RegisterApplication給Master
    Master發(fā)送LaunchExecutor給Worker,要求Worker啟動(dòng)執(zhí)行ExecutorBackend的JVM Process
    一當(dāng)ExecutorBackend啟動(dòng)完畢,Driver Application就可以將任務(wù)提交到ExecutorBackend上面執(zhí)行,即LaunchTask指令

提交側(cè)的代碼,詳見deploy/Client.scala

driverArgs.cmd match { case "launch" => // TODO: We could add an env variable here and intercept it in `sc.addJar` that would //       truncate filesystem paths similar to what YARN does. For now, we just require //       people call `addJar` assuming the jar is in the same directory. val env = Map[String, String]()
        System.getenv().foreach{case (k, v) => env(k) = v}

        val mainClass = "org.apache.spark.deploy.worker.DriverWrapper" val classPathConf = "spark.driver.extraClassPath" val classPathEntries = sys.props.get(classPathConf).toSeq.flatMap { cp =>
          cp.split(java.io.File.pathSeparator)
        }

        val libraryPathConf = "spark.driver.extraLibraryPath" val libraryPathEntries = sys.props.get(libraryPathConf).toSeq.flatMap { cp =>
          cp.split(java.io.File.pathSeparator)
        }

        val javaOptionsConf = "spark.driver.extraJavaOptions" val javaOpts = sys.props.get(javaOptionsConf)
        val command = new Command(mainClass, Seq("{{WORKER_URL}}", driverArgs.mainClass) ++
          driverArgs.driverOptions, env, classPathEntries, libraryPathEntries, javaOpts)

        val driverDescription = new DriverDescription(
          driverArgs.jarUrl,
          driverArgs.memory,
          driverArgs.cores,
          driverArgs.supervise,
          command)

        masterActor ! RequestSubmitDriver(driverDescription)

接收側(cè)

從Deploy.client發(fā)送出來的消息被誰接收呢?答案比較明顯,那就是Master。 Master.scala中的receive函數(shù)有專門針對(duì)RequestSubmitDriver的處理,具體代碼如下

case RequestSubmitDriver(description) => { if (state != RecoveryState.ALIVE) {
        val msg = s"Can only accept driver submissions in ALIVE state. Current state: $state." sender ! SubmitDriverResponse(false, None, msg)
      } else {
        logInfo("Driver submitted " + description.command.mainClass)
        val driver = createDriver(description)
        persistenceEngine.addDriver(driver)
        waitingDrivers += driver
        drivers.add(driver)
        schedule() // TODO: It might be good to instead have the submission client poll the master to determine //       the current status of the driver. For now it's simply "fire and forget". sender ! SubmitDriverResponse(true, Some(driver.id),
          s"Driver successfully submitted as ${driver.id}"
      }
    }

SparkEnv

SparkEnv對(duì)于整個(gè)Spark的任務(wù)來說非常關(guān)鍵,不同的role在創(chuàng)建SparkEnv時(shí)傳入的參數(shù)是不相同的,如Driver和Executor則存在重要區(qū)別。

在Executor.scala中,創(chuàng)建SparkEnv的代碼如下所示

private val env = { if (!isLocal) {
      val _env = SparkEnv.create(conf, executorId, slaveHostname, 0,
        isDriver = false, isLocal = false)
      SparkEnv.set(_env)
      _env.metricsSystem.registerSource(executorSource)
      _env
    } else {
      SparkEnv.get }
  }

Driver Application則會(huì)創(chuàng)建SparkContext,在SparkContext創(chuàng)建過程中,比較重要的一步就是生成SparkEnv,其代碼如下

private[spark] val env = SparkEnv.create(  conf,  "",  conf.get("spark.driver.host",  conf.get("spark.driver.port".toInt,  isDriver = true,  isLocal = isLocal,  listenerBus = listenerBus)
  SparkEnv.set(env)

Standalone模式下HA的實(shí)現(xiàn)

Spark在standalone模式下利用zookeeper來實(shí)現(xiàn)了HA機(jī)制,這里所說的HA是專門針對(duì)Master節(jié)點(diǎn)的,因?yàn)樯厦嫠械姆治隹梢钥闯鯩aster是整個(gè)cluster中唯一可能出現(xiàn)單點(diǎn)失效的節(jié)點(diǎn)。

采用zookeeper之后,整個(gè)cluster的組成如下圖所示。

為了使用zookeeper,Master在啟動(dòng)的時(shí)候需要指定如下的參數(shù),修改conf/spark-env.sh, SPARK_DAEMON_JAVA_OPTS中添加如下選項(xiàng)。
System property         Meaning
spark.deploy.recoveryMode         Set to ZOOKEEPER to enable standby Master recovery mode (default: NONE).
spark.deploy.zookeeper.url         The ZooKeeper cluster url (e.g., 192.168.1.100:2181,192.168.1.101:2181).
spark.deploy.zookeeper.dir         The directory in ZooKeeper to store recovery state (default: /spark).
實(shí)現(xiàn)HA的原理
zookeeper提供了一個(gè)Leader Election機(jī)制,利用這個(gè)機(jī)制,可以實(shí)現(xiàn)HA功能,具體請(qǐng)參考 zookeeper recipes
在Spark中沒有直接使用zookeeper的api,而是使用了 curator ,curator對(duì)zookeeper做了相應(yīng)的封裝,在使用上更為友好。
小結(jié)
步步演進(jìn)講到在standalone模式下,如何利用zookeeper來實(shí)現(xiàn)ha。從中可以看出standalone master一個(gè)最主要的任務(wù)就是resource management和job scheduling,看到這兩個(gè)主要功能的時(shí)候,您也許會(huì)想到這不就是YARN要解決的問題。對(duì)了,從本質(zhì)上來說standalone是yarn的一個(gè) 簡(jiǎn)化版本。
      

2. 有人說Spark將來會(huì)替代Hadoop,你又怎么看?
    未來會(huì)的,但現(xiàn)在還早。hadoop有些笨重,但歷史悠久。許多企業(yè)投入精力不會(huì)輕易放棄的。
   

論壇徽章:
10
數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-06-14 22:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-03-10 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-12-01 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-09 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-02 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-07-13 22:59:28IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-06-23 22:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-06-21 22:20:00每日論壇發(fā)貼之星
日期:2015-06-14 22:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-08-02 06:20:00
10 [報(bào)告]
發(fā)表于 2015-10-30 20:58 |只看該作者
接上篇:

Spark是基于內(nèi)存的迭代計(jì)算框架,適用于需要多次操作特定數(shù)據(jù)集的應(yīng)用場(chǎng)合,如pageRank、K-Means等算法就非常適合內(nèi)存迭代計(jì)算。Spark整個(gè)生態(tài)體系正逐漸完善中,GraphX 、 SparkSQL、 SparkStreaming 、 MLlib,等到Spark有了自己的數(shù)據(jù)倉庫后,那就完全能與Hadoop生態(tài)體系相媲美。
Spark框架采用函數(shù)式編程語言Scala,Scala語言的面向?qū)ο蟆⒑瘮?shù)式、高并發(fā)模型等特點(diǎn),使得Spark擁有了更高的靈活性及性能。如果你學(xué)過java,可能會(huì)對(duì)scala中的一些新概念表示陌生,如隱式轉(zhuǎn)換、模式匹配、伴生類等,但一旦入門,你會(huì)感覺scala語言的簡(jiǎn)潔與強(qiáng)大。
Spark暫時(shí)不會(huì)取代Hadoop替代者有以下原因:
兩者的側(cè)重點(diǎn)不同,使用場(chǎng)景不同。Spark更適合于迭代運(yùn)算比較多的ML和DM運(yùn)算。因?yàn)樵赟park里面,有RDD的概念。RDD可以cache到內(nèi)存中,那么每次對(duì)RDD數(shù)據(jù)集的操作之后的結(jié)果,都可以存放到內(nèi)存中,下一個(gè)操作可以直接從內(nèi)存中輸入,省去了MapReduce大量的磁盤IO操作。但是,我們也要看到spark的限制:內(nèi)存。我認(rèn)為Hadoop雖然費(fèi)時(shí),但是在OLAP等大規(guī)模數(shù)據(jù)的應(yīng)用場(chǎng)景,還是受歡迎的。目前Hadoop涵蓋了從數(shù)據(jù)收集、到分布式存儲(chǔ),再到分布式計(jì)算的各個(gè)領(lǐng)域,在各領(lǐng)域都有自己獨(dú)特優(yōu)勢(shì)。
作為一種內(nèi)存的迭代計(jì)算框架,Spark適用以下場(chǎng)景:
適用于迭代次數(shù)比較多的場(chǎng)景。迭代次數(shù)多的機(jī)器學(xué)習(xí)算法等。如pageRank、K-Means等。
Spark On Mesos環(huán)境
目前在Spark On Mesos環(huán)境中,用戶可選擇兩種調(diào)度模式之一運(yùn)行自己的應(yīng)用程序
粗粒度模式(Coarse-grained Mode):每個(gè)應(yīng)用程序的運(yùn)行環(huán)境由一個(gè)Dirver和若干個(gè)Executor組成,其中,每個(gè)Executor占用若干資源,內(nèi)部可運(yùn)行多個(gè)Task(對(duì)應(yīng)多少個(gè)“slot”)。應(yīng)用程序的各個(gè)任務(wù)正式運(yùn)行之前,需要將運(yùn)行環(huán)境中的資源全部申請(qǐng)好,且運(yùn)行過程中要一直占用這些資源,即使不用,最后程序運(yùn)行結(jié)束后,回收這些資源。舉個(gè)例子,比如你提交應(yīng)用程序時(shí),指定使用5個(gè)executor運(yùn)行你的應(yīng)用程序,每個(gè)executor占用5GB內(nèi)存和5個(gè)CPU,每個(gè)executor內(nèi)部設(shè)置了5個(gè)slot,則Mesos需要先為executor分配資源并啟動(dòng)它們,之后開始調(diào)度任務(wù)。另外,在程序運(yùn)行過程中,mesos的master和slave并不知道executor內(nèi)部各個(gè)task的運(yùn)行情況,executor直接將任務(wù)狀態(tài)通過內(nèi)部的通信機(jī)制匯報(bào)給Driver,從一定程度上可以認(rèn)為,每個(gè)應(yīng)用程序利用mesos搭建了一個(gè)虛擬集群自己使用。
細(xì)粒度模式(Fine-grained Mode):鑒于粗粒度模式會(huì)造成大量資源浪費(fèi),Spark On Mesos還提供了另外一種調(diào)度模式:細(xì)粒度模式,這種模式類似于現(xiàn)在的云計(jì)算,思想是按需分配。與粗粒度模式一樣,應(yīng)用程序啟動(dòng)時(shí),先會(huì)啟動(dòng)executor,但每個(gè)executor占用資源僅僅是自己運(yùn)行所需的資源,不需要考慮將來要運(yùn)行的任務(wù),之后,mesos會(huì)為每個(gè)executor動(dòng)態(tài)分配資源,每分配一些,便可以運(yùn)行一個(gè)新任務(wù),單個(gè)Task運(yùn)行完之后可以馬上釋放對(duì)應(yīng)的資源。每個(gè)Task會(huì)匯報(bào)狀態(tài)給Mesos slave和Mesos Master,便于更加細(xì)粒度管理和容錯(cuò),這種調(diào)度模式類似于MapReduce調(diào)度模式,每個(gè)Task完全獨(dú)立,優(yōu)點(diǎn)是便于資源控制和隔離,但缺點(diǎn)也很明顯,短作業(yè)運(yùn)行延遲大。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP