Spark學(xué)習(xí)(1)-架構(gòu)原理

Spark是什么

Spark是基于HDFS等分布式存儲(chǔ)之上的數(shù)據(jù)處理分析框架,它擅長(zhǎng)批量數(shù)據(jù)處理肢簿,處理流工作負(fù)載靶剑,交互式查詢,機(jī)器學(xué)習(xí)等池充;它可以通過standalone模式桩引,yarn-client或者yarn-cluster等模式在hadoop集群中運(yùn)行;而依托在spark數(shù)據(jù)處理之上的有Spark Sql,Spark Stream,MLlib,Graphx等組件收夸;
其具體架構(gòu)示意圖如下:


Spark示意圖.png

上圖中最上層最組件說明如下:

  • Spark Sql:通過提供Apache Hive的sql查詢語句變體HiveQL來與Spark進(jìn)行交互的API庫坑匠,每個(gè)數(shù)據(jù)庫表都是一個(gè)RDD對(duì)象,Spark sql查詢都將轉(zhuǎn)化為Spark的操作卧惜;
  • Spark Streaming:能夠提供實(shí)時(shí)數(shù)據(jù)流的處理和控制厘灼,Spark Streaming允許程序像處理普通RDD對(duì)象那樣處理實(shí)時(shí)數(shù)據(jù)流;
  • MLlib(Machine Learning):機(jī)器學(xué)習(xí)的一些算法庫咽瓷,算法通過Spark 對(duì)RDD的操作處理來實(shí)現(xiàn)设凹,該庫包括可擴(kuò)展的學(xué)習(xí)算法,如回歸茅姜,分類等需要對(duì)大數(shù)據(jù)集進(jìn)行迭代的算法闪朱;
  • GraphX:控制圖和并行圖操作和計(jì)算的算法和工具的集合;

接下來說下Spark架構(gòu),Spark架構(gòu)組成圖如下:


Spark組成.png

如上圖奋姿,在Spark架構(gòu)中有以下幾個(gè)組成:

  • Driver Pragram:Application的driver程序锄开,用來運(yùn)行Application的main函數(shù)以及創(chuàng)建SparkContext進(jìn)程來準(zhǔn)備Application的運(yùn)行環(huán)境;
  • SparkContext:SparkContext在Spark中用來和ClusterManager進(jìn)行通信胀蛮,申請(qǐng)資源院刁,分配和監(jiān)控任務(wù)糯钙;
  • ClusterManager:負(fù)責(zé)集群資源的管理和分配的節(jié)點(diǎn)粪狼,它會(huì)通過心跳的方式來監(jiān)控workerNode,在Standalone模式中,它就是Master任岸,在Yarn模式中再榄,它就是Resource Manager;
  • WorkNode:集群中的從節(jié)點(diǎn),用來負(fù)責(zé)計(jì)算和控制的節(jié)點(diǎn)享潜,可以啟動(dòng)Exector或者Driver困鸥;
  • Executor:Application的Executor程序,ClusterManager會(huì)為Application的每個(gè)Executor分配一個(gè)進(jìn)程剑按,采用線程池分配的方式來執(zhí)行TaskSet;
  • Task:Executor上執(zhí)行任務(wù)的基本單位疾就;多個(gè)Task可以構(gòu)成一個(gè)Stage;

Spark怎么運(yùn)行

Spark運(yùn)行流程圖如下:


Spark運(yùn)行.png

流程講解如下:

    1. Application程序啟動(dòng)Driver程序艺蝴,創(chuàng)建SparkContext;
  • 2.SparkContext向資源管理器申請(qǐng)運(yùn)行Executor節(jié)點(diǎn)資源猬腰,Executor節(jié)點(diǎn)啟動(dòng)SatandaloneExectuorBackend,Exectuor會(huì)定期向資源管理器上報(bào)資源使用情況;
    1. Executor節(jié)點(diǎn)向SparkContext申請(qǐng)Task,然后SparkContext將Application中的Executor程序發(fā)送給Executor猜敢;
  • 4.SparkContext會(huì)將RDD objects構(gòu)建成DAG(有向無環(huán)圖)姑荷,然后發(fā)送給DAG Scheduler;
    1. DAG Scheduler會(huì)將DAT拆分為多個(gè)Stage缩擂,每個(gè)Stage都是由多個(gè)Task組成鼠冕;然后將TaskSet發(fā)送給TaskScheduler;
    1. TaskScheduler會(huì)將TaskSet中的Task提交給Exectutor運(yùn)行胯盯,Executor將采用線程池的方式運(yùn)行這些Tasks;Executor會(huì)在Tasks運(yùn)行完成后會(huì)釋放所有資源懈费;

流程術(shù)語如下:

  • Application:用戶編寫的Spark應(yīng)用程序,包括一個(gè)Driver程序和多個(gè)Executor程序;

  • Driver:Driver是運(yùn)行Driver程序的一個(gè)節(jié)點(diǎn)博脑,它會(huì)運(yùn)行Application的main函數(shù)憎乙,創(chuàng)建SparkContext,SparkContext用來準(zhǔn)備Application的運(yùn)行環(huán)境趋厉,它可以和ResourceManager通信寨闹,申請(qǐng)資源,分配和監(jiān)控任務(wù)君账;當(dāng)Executor執(zhí)行完最后的任務(wù)時(shí)繁堡,Driver同時(shí)負(fù)責(zé)將SparkContext關(guān)閉,一般情況下Diver可以理解為SparkContext;

  • Executor: Executor是運(yùn)行Application中Executor程序的一個(gè)進(jìn)程,該進(jìn)程會(huì)和SparkContext保持通信椭蹄,并負(fù)責(zé)某些Task的處理闻牡,然后將數(shù)據(jù)保存到內(nèi)存或者磁盤只盹;在Spark on Yarn模式中宰啦,該進(jìn)程名為CoarseGrainedExecutor Backend,CoarseGrainedExecutorBackend只有一個(gè)Executor對(duì)象棉磨,通過將task包裝秤TaskRunner,然后交給線程池中某個(gè)線程來執(zhí)行艘刚,這樣Executor能并行執(zhí)行的task數(shù)就與分配給它的cpu數(shù)有關(guān)园细;

  • Worker:在Spark集群中能夠運(yùn)行Application程序的節(jié)點(diǎn)奈搜,Standalone模式下是通過slave文件配置的節(jié)點(diǎn)接癌;而在Yarn模式下則指的是NodeManager;

  • ClusterManager: 集群資源管理本讥,負(fù)責(zé)集群資源的管理和監(jiān)控应媚,在不同運(yùn)行模式下有不同的類型:

    • Standalone模式:Spark原生的資源管理器严沥,由Master來負(fù)責(zé)資源的管理和分配;
    • Apache Mesos模式下:Apache Mesos是一種與Hadoop結(jié)合很好的資源調(diào)度框架;
    • Yarn模式:指的是ResourceManager;
  • job:是包含多個(gè)task的并行計(jì)算中姜,由Spark Action觸發(fā)消玄,一個(gè)Application會(huì)產(chǎn)生多個(gè)job;

  • task: 是由Executor負(fù)責(zé)執(zhí)行的工作單元丢胚,和HadoopMR中的MapTask和ReduceTask概念一致翩瓜,由TaskScheduler負(fù)責(zé)調(diào)度和分配,多個(gè)task可以組成一個(gè)stage;

  • stage:每個(gè)job都可以劃分成多組Task携龟,作為一個(gè)taskSet兔跌,叫做stage;stage由DAGScheduler進(jìn)行拆分和調(diào)度,拆分的依據(jù)是根據(jù)RDD Object之間的依賴關(guān)系找出開銷最小的方法骨宠;stage分為非最終stage(shuffle Map stage)和最終stage(Result stage),這兩種stage的邊界就是發(fā)生shuffle的地方浮定;

  • DAGScheduler:DAGScheduler是Driver中根據(jù)job構(gòu)建成stage的調(diào)度器,然后將構(gòu)建后的stage交給TaskScheduler层亿;

  • TaskScheduler:TaskScheduler是Driver中用來向Executor分配Task和維護(hù)所有taskset的調(diào)度器桦卒,當(dāng)Executor向Driver發(fā)送心跳時(shí),TaskScheduler會(huì)根據(jù)資源剩余情況向Executor分配的任務(wù)匿又;同時(shí)TaskScheduler還維護(hù)每個(gè)TaskSet的運(yùn)行標(biāo)簽方灾,包括失敗和重試的次數(shù);在不同模式下TaskScheduler名稱不一樣:

    • Spark on Standalone:名稱為TaskScheduler;
    • yarn-client模式下為: YarnClientClusterScheduler;
    • yarn-cluster模式下為:YarnClusterScheduler;

將流程術(shù)語串起來就得到了Spark 運(yùn)行層次圖如下:


Spark運(yùn)行.png

一個(gè)spark可以有多個(gè)stage碌更,每個(gè)stage由同種task構(gòu)成裕偿,task可以分為shuffleMapTask和ResultTask,其中
Dependency也分為ShuffleDependency和NarrowDependency;

Spark運(yùn)行模式有哪些

Spark運(yùn)行模式比較豐富,運(yùn)行在單機(jī)上可以有:本地模式和偽分布式模式痛单;運(yùn)行在分布式環(huán)境下嘿棘,根據(jù)結(jié)合的資源調(diào)度框架又有不同的劃分,本文就介紹:Spark內(nèi)建的Standalone模式和Yarn-client模式和Yarn-cluster模式

Standalone模式(獨(dú)立模式)

Standalone模式是Spark內(nèi)建的一種資源調(diào)度框架旭绒,它采用Master/Slave模式鸟妙,通過zookeeper來保證Master的高可用焦人,其框架圖如下:(參考https://www.cnblogs.com/cxxjohnson/p/8909578.html)

Standalone模式架構(gòu).png

該模式中有Master節(jié)點(diǎn),slave節(jié)點(diǎn)重父,worker節(jié)點(diǎn)花椭,其中Driver既可以運(yùn)行在Master節(jié)點(diǎn)上也可以運(yùn)行在本地客戶端,如果通過spark-shell提交job房午,則Diver運(yùn)行在master節(jié)點(diǎn)上矿辽,如果通過spark-submit提交job或者在Eclips、IDEA等開發(fā)平臺(tái)上使用”new SparkConf.setManager(“spark://master:7077”)”方式運(yùn)行Spark任務(wù)時(shí)郭厌,Driver是運(yùn)行在本地Client端上的袋倔;
具體運(yùn)行過程如下:

Standalone.png

運(yùn)行說明如下:

    1. Client運(yùn)行Application的Driver,創(chuàng)建SparkContext沪曙,SparkContext會(huì)注冊(cè)到Master上奕污,并向Master申請(qǐng)cpu萎羔,memory資源液走;
    1. Master根據(jù)SparkContext申請(qǐng)的資源信息和通過心跳獲取的Worker節(jié)點(diǎn)信息,選擇一個(gè)Worker節(jié)點(diǎn)獲取相應(yīng)的資源贾陷,同時(shí)在該節(jié)點(diǎn)上啟動(dòng)StandaloneExecutorBackend進(jìn)程缘眶;
    1. StandaloneExecutorBackend向SparkContext注冊(cè);
    1. SparkContext會(huì)將Application程序發(fā)送給StandaloneExecutorBackend髓废,同時(shí)解析Application代碼巷懈,獲取DAG有向無環(huán)圖,然后將DAG交給DAGScheduler構(gòu)建成Stages(每當(dāng)Action動(dòng)作時(shí)慌洪,就會(huì)催生Job顶燕,每個(gè)Job可以包含多個(gè)Stage,每個(gè)Stage會(huì)有多個(gè)Task冈爹,Stage會(huì)在獲取外部數(shù)據(jù)和shuffle之前產(chǎn)生)涌攻,之后DAGScheduler會(huì)將Stage交給TaskScheduler,TaskScheduler會(huì)根據(jù)Worker節(jié)點(diǎn)資源剩余情況向Worker分配相應(yīng)的任務(wù),最后提交給StandaloneExecutorBackend進(jìn)行執(zhí)行频伤;
  • 5.StandaloneExecutorBackend進(jìn)程會(huì)根據(jù)Application程序創(chuàng)建一個(gè)Executor線程池恳谎,來執(zhí)行每個(gè)任務(wù),同時(shí)會(huì)將任務(wù)執(zhí)行情況發(fā)送給SparkContext;
  • 6.SparkContext監(jiān)聽到最后一個(gè)Task完成時(shí)憋肖,向Master注銷因痛,并釋放所有資源;

yarn-client模式

Spark on yarn運(yùn)行模式根據(jù)Driver運(yùn)行位置可以分為:yarn-client模式和yarn-cluster模式(也就是Yarn-standalone模式)
其yarn-client模式是因?yàn)镈river運(yùn)行在本地岸更,所以client可以和Spark Application進(jìn)行交互鸵膏,通過WebUI進(jìn)行訪問;
yarn-client運(yùn)行過程圖如下:


Yarn-client.png

過程說明如下:

    1. Spark Yarn Client運(yùn)行Application的Driver程序創(chuàng)建SparkContext怎炊,SparkContext會(huì)向Yarn ResourceManager申請(qǐng)運(yùn)行AppMaster節(jié)點(diǎn)谭企,同時(shí)會(huì)初始化DAGScheduler和TaskScheduler用僧,由于是yarn-client模式,所以會(huì)選擇YarnClientClusterScheduler和YarnClientClusterBackend;
    1. ResourceManager在收到請(qǐng)求后赞咙,會(huì)找到一個(gè)NodeManager责循,為該Application運(yùn)行一個(gè)Container作為ApplicationMaster,該ApplicationMaster不運(yùn)行SparkContext,但會(huì)和client保持聯(lián)系進(jìn)行資源分配攀操;
    1. SparkContext在初始化完成后院仿,會(huì)和ApplicationMaster通信,ApplicationMaster會(huì)根據(jù)任務(wù)信息向ResourceManager申請(qǐng)資源速和;
    1. ApplicationMaster申請(qǐng)到資源后歹垫,會(huì)聯(lián)系指定的NodeManager,要求在分配的container中啟動(dòng)CoarseGrainedExecutorBackend進(jìn)程颠放,該進(jìn)程啟動(dòng)后會(huì)向Client注冊(cè)并申請(qǐng)task排惨;
    1. Client中的SparkContext會(huì)根據(jù)CoarseGrainedExecutorBackend的資源信息然后分配相應(yīng)的task,CoarseGrainedExecutorBackend在執(zhí)行task時(shí)會(huì)向Driver匯報(bào)任務(wù)執(zhí)行情況碰凶,這樣Client可以根據(jù)任務(wù)執(zhí)行情況決定是否重啟任務(wù)暮芭;
  • 6.SparkContext在執(zhí)行完最后一個(gè)任務(wù)后,會(huì)向ResourceManager注銷并釋放掉所有資源欲低;

Yarn-cluster模式

客戶端通過向Yarn cluster提交應(yīng)用程序的方式來執(zhí)行數(shù)據(jù)處理辕宏,那么Yarn會(huì)將該Application作為兩個(gè)步驟來完成:

  • 1.第一個(gè)步驟是把Application的Driver程序當(dāng)做ApplicationMaster來在集群中運(yùn)行;
  • 2.第二個(gè)步驟是ApplicationMaster創(chuàng)建SparkContext,并向ResourceManager申請(qǐng)Executor資源砾莱,然后在申請(qǐng)到的資源上執(zhí)行任務(wù)瑞筐,并監(jiān)控任務(wù)執(zhí)行情況直到任務(wù)結(jié)束;

其具體執(zhí)行流程如下圖:


Yarn-cluster.png

流程說明如下:

  • 1.Client會(huì)向ResourceManager提交Application申請(qǐng);
  • 2.ResourceManager在收到Application申請(qǐng)后腊瑟,會(huì)找到一個(gè)NodeManager聚假,該NodeManager會(huì)分配一個(gè)Container作為ApplicationMaster,用來執(zhí)行Driver程序,創(chuàng)建SparkContext,并初始化DAGScheduler和TaskScheduler闰非,因?yàn)檫\(yùn)行模式是Yarn-cluster膘格,所以程序會(huì)選擇YarnClusterScheduler來包裝TaskScheduler;
    1. ApplicationMaster在SparkContext初始化后,會(huì)向ResourceManager申請(qǐng)資源來執(zhí)行任務(wù)河胎;
  • 4.ResourceManager會(huì)根據(jù)任務(wù)信息分配一個(gè)或者多個(gè)NodeManager闯袒,ApplicationMaster在得到分配資源后,會(huì)和NodeManager建立聯(lián)系游岳,要求其啟動(dòng)CoarseGrainedExecutorBackend進(jìn)程政敢; CoarseGrainedExecutorBackend進(jìn)程啟動(dòng)后會(huì)向ApplicationMaster中的SparkContext注冊(cè)并申請(qǐng)Task,這一點(diǎn)和standalone模式很像胚迫,只是SparkContext會(huì)在SparkApplication初始化時(shí)使用CoarseGrainedExecutorBackend配合YarnClusterScheduler來進(jìn)行任務(wù)調(diào)度喷户;
  • 5.SparkContext會(huì)根據(jù)CoarseGrainedExecutionBackend資源信息分配相應(yīng)的任務(wù),同時(shí)會(huì)監(jiān)控CoarseGrainedExecutionBackend任務(wù)執(zhí)行情況知道結(jié)束访锻;
  • 6.ApplicationMaster會(huì)在所有任務(wù)都完成的情況下褪尝,向ResourceManager注銷掉自己并釋放所有資源闹获;

Yarn-client和Yarn-cluster模式區(qū)別:
Yarn-client和Yarn-cluster模式最大區(qū)別在于是否有ApplicationMaster運(yùn)行Driver,在Yarn-client中由Client運(yùn)行Driver河哑,而ApplicationMaster主要用來向ResourceManager申請(qǐng)Containers來作Executor避诽,之后由Client和相應(yīng)的Executor所在Container進(jìn)行通信,這樣用戶可以直接查看程序進(jìn)行情況璃谨,比較適合交互式任務(wù)執(zhí)行沙庐;
而在Yarn-cluster中,Driver是運(yùn)行在ApplicationMaster中佳吞,ApplicationMaster不僅要和ResourceManager保持聯(lián)系拱雏,并申請(qǐng)資源,同時(shí)還需要和containers保持聯(lián)系底扳,并下發(fā)任務(wù)和監(jiān)視任務(wù)執(zhí)行情況铸抑;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衷模,隨后出現(xiàn)的幾起案子鹊汛,更是在濱河造成了極大的恐慌,老刑警劉巖算芯,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柒昏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡熙揍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門氏涩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來届囚,“玉大人,你說我怎么就攤上這事是尖∫庀担” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵饺汹,是天一觀的道長(zhǎng)蛔添。 經(jīng)常有香客問我,道長(zhǎng)兜辞,這世上最難降的妖魔是什么迎瞧? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮逸吵,結(jié)果婚禮上凶硅,老公的妹妹穿的比我還像新娘。我一直安慰自己扫皱,他們只是感情好足绅,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布捷绑。 她就那樣靜靜地躺著,像睡著了一般氢妈。 火紅的嫁衣襯著肌膚如雪粹污。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天首量,我揣著相機(jī)與錄音厕怜,去河邊找鬼。 笑死蕾总,一個(gè)胖子當(dāng)著我的面吹牛粥航,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播生百,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼递雀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蚀浆?” 一聲冷哼從身側(cè)響起缀程,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎市俊,沒想到半個(gè)月后杨凑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摆昧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年撩满,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绅你。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伺帘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忌锯,到底是詐尸還是另有隱情伪嫁,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布偶垮,位于F島的核電站张咳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏似舵。R本人自食惡果不足惜脚猾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啄枕。 院中可真熱鬧婚陪,春花似錦、人聲如沸频祝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沽一,卻和暖如春盖溺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铣缠。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工烘嘱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝗蛙。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓蝇庭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捡硅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哮内,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Apache Spark是一個(gè)圍繞速度、易用性和復(fù)雜分析構(gòu)建的大數(shù)據(jù)處理框架壮韭,最初在2009年由加州大學(xué)伯克利分校...
    三萬_chenbing閱讀 638評(píng)論 0 5
  • Apache Spark是一個(gè)圍繞速度北发、易用性和復(fù)雜分析構(gòu)建的大數(shù)據(jù)處理框架,最初在2009年由加州大學(xué)伯克利分校...
    達(dá)微閱讀 609評(píng)論 0 0
  • 本文主要分以下章節(jié): 一喷屋、Spark專業(yè)術(shù)語定義 二琳拨、 Spark的任務(wù)提交機(jī)制 一、Spark專業(yè)術(shù)語定義 1屯曹、...
    數(shù)據(jù)萌新閱讀 444評(píng)論 0 0
  • 本文主要分以下章節(jié): 一狱庇、Spark專業(yè)術(shù)語定義 二、 Spark的任務(wù)提交機(jī)制 一是牢、Spark專業(yè)術(shù)語定義 1僵井、...
    小豬Harry閱讀 325評(píng)論 0 1
  • 我很理解朋友們對(duì)于邁出獨(dú)自背包旅行這一步的各種焦慮和擔(dān)心,我已經(jīng)歷過一次驳棱。在我開始獨(dú)自長(zhǎng)途背包旅行之前,隔三岔五就...
    相聞道閱讀 6,993評(píng)論 18 86