1. Spark master使用zookeeper進(jìn)行HA的阵翎,有哪些元數(shù)據(jù)保存在Zookeeper寥粹?
spark通過(guò)這個(gè)參數(shù) spark.deploy.zookeeper.dir 指定master元數(shù)據(jù)在zookeeper中保存的位置惜纸,包括Worker贸弥,Driver 和 Application以及Executors。standby節(jié)點(diǎn)要從zk中獲得元數(shù)據(jù)信息丁逝,恢復(fù)集群運(yùn)行狀態(tài)羽资,才能對(duì)外繼續(xù)提供服務(wù)淘菩,作業(yè)提交資源申請(qǐng)等,在恢復(fù)前是不能接受請(qǐng)求的屠升。另外潮改,Master切換需要注意2點(diǎn):
在Master切換的過(guò)程中,所有的已經(jīng)在運(yùn)行的程序皆正常運(yùn)行腹暖!因?yàn)镾park Application在運(yùn)行前就已經(jīng)通過(guò) Cluster Manager 獲得了計(jì)算資源进陡,所以在運(yùn)行時(shí)Job本身的調(diào)度和處理和Master是沒(méi)有任何關(guān)系的!
在Master的切換過(guò)程中唯一的影響是不能提交新的Job:一方面不能夠提交新的應(yīng)用程序給集群微服,因?yàn)橹挥蠥ctive Master才能接受新的程序的提交請(qǐng)求;另外一方面缨历,已經(jīng)運(yùn)行的程序中也不能夠因?yàn)锳ction操作觸發(fā)新的Job的提交請(qǐng)求以蕴;
2. Spark on Mesos中,什么是粗粒度分配辛孵,什么是細(xì)粒度分配丛肮,各自的優(yōu)點(diǎn)和缺點(diǎn)是什么?
答:1)粗粒度:?jiǎn)?dòng)時(shí)就分配好資源魄缚, 程序啟動(dòng)宝与,后續(xù)具體使用就使用分配好的資源焚廊,不需要再分配資源;好處:作業(yè)特別多時(shí)习劫,資源復(fù)用率高咆瘟,適合粗粒度;不好:容易資源浪費(fèi)诽里,假如一個(gè)job有1000個(gè)task袒餐,完成了999個(gè),還有一個(gè)沒(méi)完成谤狡,那么使用粗粒度灸眼,999個(gè)資源就會(huì)閑置在那里,資源浪費(fèi)墓懂。2)細(xì)粒度分配:用資源的時(shí)候分配焰宣,用完了就立即回收資源,啟動(dòng)會(huì)麻煩一點(diǎn)捕仔,啟動(dòng)一次分配一次匕积,會(huì)比較麻煩。
3. 如何配置spark master的HA逻澳?
- 修改spark_env.sh文件,spark的master參數(shù)不在指定闸天,添加如下代碼到各個(gè)master節(jié)點(diǎn)
spark.deploy.recoveryMode=ZOOKEEPER //恢復(fù)模式為 zookeeper
spark.deploy.zookeeper.url=zk01:2181,zk02:2181,zk03:2181 //指定 zookeeper 的運(yùn)行地址
spark.deploy.zookeeper.dir=/spark //指定元數(shù)據(jù)保存位置
或者:
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER /
-Dspark.deploy.zookeeper.url=zk01:2181,zk02:2181,zk03:2181 /
-Dspark.deploy.zookeeper.dir=/spark"
將spark_env.sh分發(fā)到各個(gè)節(jié)點(diǎn)
找到一個(gè)master節(jié)點(diǎn),執(zhí)行./start-all.sh斜做,./sbin/start-master.sh
提交程序指定master的時(shí)候要指定三臺(tái)master苞氮,例如
./spark-shell --master spark://master01:7077, master02:7077, master03:7077
6.driver的功能是什么?
答: 1)一個(gè)Spark作業(yè)運(yùn)行時(shí)包括一個(gè)Driver進(jìn)程瓤逼,也是作業(yè)的主進(jìn)程笼吟,具有main函數(shù),并且有SparkContext的實(shí)例霸旗,是程序的人口點(diǎn)贷帮;2)功能:負(fù)責(zé)向集群申請(qǐng)資源,向master注冊(cè)信息诱告,負(fù)責(zé)了作業(yè)的調(diào)度撵枢,,負(fù)責(zé)作業(yè)的解析精居、生成Stage并調(diào)度Task到Executor上锄禽。包括DAGScheduler,TaskScheduler靴姿。
7.spark的有幾種部署模式沃但,每種模式特點(diǎn)?
- 本地模式
Spark不一定非要跑在hadoop集群佛吓,可以在本地宵晚,起多個(gè)線程的方式來(lái)指定垂攘。將Spark應(yīng)用以多線程的方式直接運(yùn)行在本地,一般都是為了方便調(diào)試淤刃,本地模式分三類
- local:只啟動(dòng)一個(gè)executor
- local[k]:啟動(dòng)k個(gè)executor
- local[*]:?jiǎn)?dòng)跟cpu數(shù)目相同的 executor
- standalone模式
分布式部署集群晒他, 自帶完整的服務(wù),資源管理和任務(wù)監(jiān)控是Spark自己監(jiān)控钝凶,這個(gè)模式也是其他模式的基礎(chǔ)仪芒,
Spark on yarn模式
分布式部署集群,資源和任務(wù)監(jiān)控交給yarn管理耕陷,但是目前僅支持粗粒度資源分配方式掂名,包含cluster和client運(yùn)行模式,cluster適合生產(chǎn)哟沫,driver運(yùn)行在集群子節(jié)點(diǎn)饺蔑,具有容錯(cuò)功能,client適合調(diào)試嗜诀,dirver運(yùn)行在客戶端-
Spark On Mesos模式猾警。官方推薦這種模式(當(dāng)然,原因之一是血緣關(guān)系)隆敢。正是由于Spark開(kāi)發(fā)之初就考慮到支持Mesos发皿,因此,目前而言拂蝎,Spark運(yùn)行在Mesos上會(huì)比運(yùn)行在YARN上更加靈活穴墅,更加自然。用戶可選擇兩種調(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。應(yīng)用程序的各個(gè)任務(wù)正式運(yùn)行之前,需要將運(yùn)行環(huán)境中的資源全部申請(qǐng)好啸箫,且運(yùn)行過(guò)程中要一直占用這些資源,即使不用隘世,最后程序運(yùn)行結(jié)束后,回收這些資源鸠踪。
細(xì)粒度模式(Fine-grained Mode):鑒于粗粒度模式會(huì)造成大量資源浪費(fèi)丙者,Spark On Mesos還提供了另外一種調(diào)度模式:細(xì)粒度模式,這種模式類似于現(xiàn)在的云計(jì)算慢哈,思想是按需分配。
8.Spark技術(shù)棧有哪些組件永票,每個(gè)組件都有什么功能卵贱,適合什么應(yīng)用場(chǎng)景滥沫?
1)Spark core:是其它組件的基礎(chǔ),spark的內(nèi)核键俱,主要包含:DAG兰绣、RDD、Lingage编振、Cache缀辩、broadcast等,并封裝了底層通訊框架踪央,是Spark的基礎(chǔ)臀玄。
2)SparkStreaming 是一個(gè)對(duì)實(shí)時(shí)數(shù)據(jù)流進(jìn)行高通量、容錯(cuò)處理的流式處理系統(tǒng)畅蹂,可以對(duì)多種數(shù)據(jù)源(如Kafka健无、Flume、Twitter液斜、Zero和TCP 套接字)進(jìn)行類似Map累贤、Reduce和Join等復(fù)雜操作,將流式計(jì)算分解成一系列短小的批處理作業(yè)少漆。
3)Spark sql:Shark是SparkSQL的前身臼膏,Spark SQL的一個(gè)重要特點(diǎn)是其能夠統(tǒng)一處理關(guān)系表和RDD,使得開(kāi)發(fā)人員可以輕松地使用SQL命令進(jìn)行外部查詢示损,同時(shí)進(jìn)行更復(fù)雜的數(shù)據(jù)分析
5)MLBase是Spark生態(tài)圈的一部分專注于機(jī)器學(xué)習(xí)渗磅,讓機(jī)器學(xué)習(xí)的門(mén)檻更低,讓一些可能并不了解機(jī)器學(xué)習(xí)的用戶也能方便地使用MLbase屎媳。MLBase分為四部分:MLlib夺溢、MLI、ML Optimizer和MLRuntime烛谊。
6)GraphX是Spark中用于圖和圖并行計(jì)算
9.Spark中Work的主要工作是什么风响?
答:主要功能:
- Worker 管理當(dāng)前節(jié)點(diǎn)的內(nèi)存、CUP 使用狀況丹禀。
- 接收 Master 發(fā)送的指令状勤,給 Executor 、Driver 的運(yùn)行分配資源
- Worker 每 15秒 向 Master 發(fā)送心跳双泪,證明自己是存活狀態(tài)持搜,Master 每60秒 遍歷自己維護(hù)的Worker列表。
10.Spark為什么比 mapreduce 快焙矛?
答:1)基于內(nèi)存計(jì)算葫盼,減少低效的磁盤(pán)交互;2)高效的調(diào)度算法村斟,基于DAG贫导;3)容錯(cuò)機(jī)制Lineage抛猫,精華部分就是DAG和Lingae
11.簡(jiǎn)單說(shuō)一下 hadoop 和 spark 的shuffle相同和差異?
答:1)從 high-level 的角度來(lái)看孩灯,兩者并沒(méi)有大的差別闺金。 都是將 mapper(Spark 里是 ShuffleMapTask)的輸出進(jìn)行 partition,不同的 partition 送到不同的 reducer(Spark 里 reducer 可能是下一個(gè) stage 里的 ShuffleMapTask峰档,也可能是 ResultTask)败匹。Reducer 以內(nèi)存作緩沖區(qū),邊 shuffle 邊 aggregate 數(shù)據(jù)讥巡,等到數(shù)據(jù) aggregate 好以后進(jìn)行 reduce() (Spark 里可能是后續(xù)的一系列操作)掀亩。
2)從 low-level 的角度來(lái)看,兩者差別不小尚卫。 Hadoop MapReduce 是 sort-based归榕,進(jìn)入 combine() 和 reduce() 的 records 必須先 sort。這樣的好處在于 combine/reduce() 可以處理大規(guī)模的數(shù)據(jù)吱涉,因?yàn)槠漭斎霐?shù)據(jù)可以通過(guò)外排得到(mapper 對(duì)每段數(shù)據(jù)先做排序刹泄,reducer 的 shuffle 對(duì)排好序的每段數(shù)據(jù)做歸并)。目前的 Spark 默認(rèn)選擇的是 hash-based怎爵,通常使用 HashMap 來(lái)對(duì) shuffle 來(lái)的數(shù)據(jù)進(jìn)行 aggregate特石,不會(huì)對(duì)數(shù)據(jù)進(jìn)行提前排序。如果用戶需要經(jīng)過(guò)排序的數(shù)據(jù)鳖链,那么需要自己調(diào)用類似 sortByKey() 的操作姆蘸;如果你是Spark 1.1的用戶,可以將spark.shuffle.manager設(shè)置為sort芙委,則會(huì)對(duì)數(shù)據(jù)進(jìn)行排序逞敷。在Spark 1.2中,sort將作為默認(rèn)的Shuffle實(shí)現(xiàn)灌侣。
3)從實(shí)現(xiàn)角度來(lái)看推捐,兩者也有不少差別。 Hadoop MapReduce 將處理流程劃分出明顯的幾個(gè)階段:map(), spill, merge, shuffle, sort, reduce() 等侧啼。每個(gè)階段各司其職牛柒,可以按照過(guò)程式的編程思想來(lái)逐一實(shí)現(xiàn)每個(gè)階段的功能。在 Spark 中痊乾,沒(méi)有這樣功能明確的階段皮壁,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蘊(yùn)含在 transformation() 中哪审。
如果我們將 map 端劃分?jǐn)?shù)據(jù)蛾魄、持久化數(shù)據(jù)的過(guò)程稱為 shuffle write,而將 reducer 讀入數(shù)據(jù)、aggregate 數(shù)據(jù)的過(guò)程稱為 shuffle read滴须。那么在 Spark 中缴川,問(wèn)題就變?yōu)樵趺丛?job 的邏輯或者物理執(zhí)行圖中加入 shuffle write 和 shuffle read 的處理邏輯?以及兩個(gè)處理邏輯應(yīng)該怎么高效實(shí)現(xiàn)描馅?
Shuffle write由于不要求數(shù)據(jù)有序,shuffle write 的任務(wù)很簡(jiǎn)單:將數(shù)據(jù) partition 好而线,并持久化铭污。之所以要持久化,一方面是要減少內(nèi)存存儲(chǔ)空間壓力膀篮,另一方面也是為了 fault-tolerance嘹狞。
12.Mapreduce和Spark的都是并行計(jì)算,那么他們有什么相同和區(qū)別
答:兩者都是用mr模型來(lái)進(jìn)行并行計(jì)算:
1)hadoop的一個(gè)作業(yè)稱為job誓竿,job里面分為map task和reduce task磅网,每個(gè)task都是在自己的進(jìn)程中運(yùn)行的,當(dāng)task結(jié)束時(shí)筷屡,進(jìn)程也會(huì)結(jié)束涧偷。
2)spark用戶提交的任務(wù)成為application,一個(gè)application對(duì)應(yīng)一個(gè)sparkcontext毙死,app中存在多個(gè)job燎潮,每觸發(fā)一次action操作就會(huì)產(chǎn)生一個(gè)job。這些job可以并行或串行執(zhí)行扼倘,每個(gè)job中有多個(gè)stage确封,stage是shuffle過(guò)程中DAGSchaduler通過(guò)RDD之間的依賴關(guān)系劃分job而來(lái)的,每個(gè)stage里面有多個(gè)task再菊,組成taskset有TaskSchaduler分發(fā)到各個(gè)executor中執(zhí)行爪喘,executor的生命周期是和app一樣的,即使沒(méi)有job運(yùn)行也是存在的纠拔,所以task可以快速啟動(dòng)讀取內(nèi)存進(jìn)行計(jì)算秉剑。
3)hadoop的job只有map和reduce操作,表達(dá)能力比較欠缺而且在mr過(guò)程中會(huì)重復(fù)的讀寫(xiě)hdfs绿语,造成大量的io操作秃症,多個(gè)job需要自己管理關(guān)系。
spark的迭代計(jì)算都是在內(nèi)存中進(jìn)行的吕粹,API中提供了大量的RDD操作如join种柑,groupby等,而且通過(guò)DAG圖可以實(shí)現(xiàn)良好的容錯(cuò)匹耕。
13.RDD機(jī)制聚请?
答:rdd分布式彈性數(shù)據(jù)集,簡(jiǎn)單的理解成一種數(shù)據(jù)結(jié)構(gòu),是spark框架上的通用貨幣驶赏。
所有算子都是基于rdd來(lái)執(zhí)行的炸卑,不同的場(chǎng)景會(huì)有不同的rdd實(shí)現(xiàn)類,但是都可以進(jìn)行互相轉(zhuǎn)換煤傍。
rdd執(zhí)行過(guò)程中會(huì)形成dag圖盖文,然后形成lineage保證容錯(cuò)性等。 從物理的角度來(lái)看rdd存儲(chǔ)的是block和node之間的映射蚯姆。
14五续、spark有哪些組件?
答:主要有如下組件:
1)master:管理集群和節(jié)點(diǎn)龄恋,不參與計(jì)算疙驾。
2)worker:計(jì)算節(jié)點(diǎn),進(jìn)程本身不參與計(jì)算郭毕,和master匯報(bào)它碎。
3)Driver:運(yùn)行程序的main方法,創(chuàng)建spark context對(duì)象显押。
4)spark context:控制整個(gè)application的生命周期扳肛,包括dagsheduler和task scheduler等組件。
5)client:用戶提交程序的入口乘碑。
15敞峭、spark工作機(jī)制?
答:用戶在client端提交作業(yè)后蝉仇,會(huì)由Driver運(yùn)行main方法并創(chuàng)建spark context上下文旋讹。
執(zhí)行add算子,形成dag圖輸入dagscheduler轿衔,按照add之間的依賴關(guān)系劃分stage輸入task scheduler沉迹。 task scheduler會(huì)將stage劃分為task set分發(fā)到各個(gè)節(jié)點(diǎn)的executor中執(zhí)行。
16害驹、spark的優(yōu)化怎么做鞭呕?
答: spark調(diào)優(yōu)比較復(fù)雜,但是大體可以分為三個(gè)方面來(lái)進(jìn)行宛官,1)平臺(tái)層面的調(diào)優(yōu):防止不必要的jar包分發(fā)葫松,提高數(shù)據(jù)的本地性,選擇高效的存儲(chǔ)格式如parquet底洗,2)應(yīng)用程序?qū)用娴恼{(diào)優(yōu):過(guò)濾操作符的優(yōu)化降低過(guò)多小任務(wù)腋么,降低單條記錄的資源開(kāi)銷,處理數(shù)據(jù)傾斜亥揖,復(fù)用RDD進(jìn)行緩存珊擂,作業(yè)并行化執(zhí)行等等圣勒,3)JVM層面的調(diào)優(yōu):設(shè)置合適的資源量,設(shè)置合理的JVM摧扇,啟用高效的序列化方法如kyro圣贸,增大off head內(nèi)存等等
17.簡(jiǎn)要描述Spark分布式集群搭建的步驟
1)準(zhǔn)備linux環(huán)境,設(shè)置集群搭建賬號(hào)和用戶組扛稽,設(shè)置ssh吁峻,關(guān)閉防火墻,關(guān)閉seLinux在张,配置host锡搜,hostname
2)配置jdk到環(huán)境變量
3)搭建hadoop集群,如果要做master ha瞧掺,需要搭建zookeeper集群
修改hdfs-site.xml,hadoop_env.sh,yarn-site.xml,slaves等配置文件
4)啟動(dòng)hadoop集群,啟動(dòng)前要格式化namenode
5)配置spark集群凡傅,修改spark-env.xml辟狈,slaves等配置文件,拷貝hadoop相關(guān)配置到spark conf目錄下
6)啟動(dòng)spark集群夏跷。
18. 什么是RDD寬依賴和窄依賴哼转?
RDD和它依賴的parent RDD(s)的關(guān)系有兩種不同的類型,即窄依賴(narrow dependency)和寬依賴(wide dependency)槽华。
1)窄依賴指的是每一個(gè)parent RDD的Partition最多被子RDD的一個(gè)Partition使用
2)寬依賴指的是多個(gè)子RDD的Partition會(huì)依賴同一個(gè)parent RDD的Partition
19.spark-submit的時(shí)候如何引入外部jar包
方法一:spark-submit –jars
根據(jù)spark官網(wǎng)壹蔓,在提交任務(wù)的時(shí)候指定–jars,用逗號(hào)分開(kāi)猫态。這樣做的缺點(diǎn)是每次都要指定jar包佣蓉,如果jar包少的話可以這么做,但是如果多的話會(huì)很麻煩亲雪。
命令:spark-submit --master yarn-client --jars .jar,.jar
方法二:extraClassPath
提交時(shí)在spark-default中設(shè)定參數(shù)勇凭,將所有需要的jar包考到一個(gè)文件里,然后在參數(shù)中指定該目錄就可以了义辕,較上一個(gè)方便很多:
spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/* spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/*
需要注意的是,你要在所有可能運(yùn)行spark任務(wù)的機(jī)器上保證該目錄存在虾标,并且將jar包考到所有機(jī)器上。這樣做的好處是提交代碼的時(shí)候不用再寫(xiě)一長(zhǎng)串jar了灌砖,缺點(diǎn)是要把所有的jar包都拷一遍璧函。
20.cache和pesist的區(qū)別
答:1)cache和persist都是用于將一個(gè)RDD進(jìn)行緩存的,這樣在之后使用的過(guò)程中就不需要重新計(jì)算了基显,可以大大節(jié)省程序運(yùn)行時(shí)間蘸吓;2) cache只有一個(gè)默認(rèn)的緩存級(jí)別MEMORY_ONLY ,cache調(diào)用了persist撩幽,而persist可以根據(jù)情況設(shè)置其它的緩存級(jí)別美澳;3)executor執(zhí)行的時(shí)候,默認(rèn)60%做cache,40%做task操作制跟,persist最根本的函數(shù)舅桩,最底層的函數(shù)