1. 程式人生 > >大資料面試題01

大資料面試題01

Spark Application 使用者自己寫的程式,批處理作業的集合,Application的main方法時程式的入口,定義了RDD以及對RDD的操作 SparkContext spark的重要api,使用者邏輯與spark的互動介面。會和Cluster manager進行互動,包括向它申請計算資源 Driver 主控程序,執行main方法,提交job,並將job轉化為task,在各個Executor程序間協調Task的排程 Executor 執行在worker上,負責執行task,結果返回Diver,提供RDD的儲存功能 兩種部署模式,clean和cluster,clean diver在cliean節點上,cluster diver在worker節點上,又Cluster Manager負責啟動 RDD:彈性分散式資料集,只讀分割槽記錄的集合,spark對所處理物件的基本抽象 spark的計算可以抽象為對RDD的建立,轉換,和返回操作結果的過程 建立:外部儲存,HDFS,或者內部建立的List,一但建立,不能修改 轉換:對已有的RDD執行計算轉換,產生新的RDD,在這個過程中可能會產生中間RDD,spark對轉換採取的是惰性計算機制,遇到需要轉換時,並不會立即執行,而是等到遇到Action時在執行 返回資料(Action):在對已有的RDD中的資料執行計算結果,將結果返回到Driver中,在Action的過程中同樣會產生中間的RDD partition(分割槽):每個RDD在物理上分為多個partition,每個partition作為spark的基本處理單位,決定了並行處理的粒度,而partition中的每條資料則為基本的處理單位,例如,在對某個RDD進行mao對映操作時,在具體執行時是由多個並行的task對每個partition的每一條資料進行map對映 Dependency(依賴):對RDD的轉換和Action操作,是RDD之間產生父子依賴關係(和中間RDD也存在依賴關係),這種依賴關係分為寬依賴和窄依賴兩種: 窄依賴:NarrowDependency parent RDD中的每個partition最多被一個child RDD的partition使用,讓RDD產生窄依賴的操作可以稱為窄依賴操作,例如:map 寬依賴:wideDependency parent RDD中的每個partition可以被多個child RDD的partition使用 這時根據每條資料的key進行重組,這個過程叫做shuffle(洗牌 例如:reduceByKey,groupByKey spark根據application提供的RDD的轉換和提交,來生成RDD之間的親屬關係,這種關係組成了RDD之間的血統,也叫做DAG(有向無環連),spark可以根據這種關係追溯RDD的計算過程,這就是saprk實現容錯的一種手段 JOB 在一個Application中,以Actio為邊界的spark的批處理作業。spark採用的惰性機制,對RDD的建立和轉換不會立即執行,只有在遇到第一個Action時才會生成一個JOB,統一排程執行,一個JOB含有N個轉換和1個Action Shuffle 在轉換和Action的過程中會有一部分讓RDD產生寬依賴,這樣的過程就是將所有的parent RDD中的記錄進行洗牌,資料被打散重組,如轉換操作的join,Action錯做的reduce等,都會產生Shuffle Stage 一個JOB中,以shuffle進行劃分邊界,每個階段包含可以被序列執行的窄依賴或寬依賴操作 在對JOB的所有階段進行shuffle時,一般會按照順序進行,從Action開始,遇到寬依賴操作和或者窄依賴操作劃分到不同的執行階段,新的階段為之前階段的parent,然後以此類推遞迴執行,child stage需要在parent stage執行完成之後才能執行,因此Stage之間的以來關係構成了一個大的DAG,在一個stage內,所有的操作以序列的管道進行計算,由一組Task進行執行 Task 對一個Stage的RDD進行序列操作的計算任務。 每個Stage有一組併發執行的Task組成(即TaskSet),這些Task執行的計算完全相同,只是位於的分割槽不同,一個Stage的Task的數量由stage中最後一個RDD 的partition決定 spark deiver根據資料所在位置的不同分配任務,即把Task根據所在Partition的位置不同分配給不同的Executor,一個Executor所可以併發執行的Task的數量由總的cpu數/每個Task佔用的cpu數 Task分為Shuffle Task和Result Task,位於最後一個Stage的task為ResultTask 其它的為ShuffleMAp Task Persits RDD利用persits使RDD的分割槽資料持久化到記憶體或者儲存中去,RDD也可以利用cache將資料快取到記憶體中,cache利用的是MEMORY—ONLY進行的持久化,所以說快取也是一種持久化 spark提交job是在遇到第一個Action之後才開始計算的,當計算完成之後進行持久化,在job間進行共享,這樣如果兩個JOB用到相同的RDD時,可以不用計算了,提高了Application的運算速度,所以說持久化也是提高spark的運算速度的一種方法 CheckPoint 呼叫RDD的checkPoint方法,可以使RDD儲存到硬碟或者HDFS中,spark引入checkpoint機制,是因為持久化的資料可能會丟失或者替換,checkpoint可以在這個時候發生作用,避免重新計算,建立checkpoint實在當前job完成後,有另外一個job進行完成 一個Job在開始處理RDD的partition時,或者說是,在Execture中執行任務的時獲取到RDD的partition資料時,會先進行判斷是不是持久化,如果沒有命中,則去檢查是不是checkpoint,如果沒有的話,則重新獲取資料進行計算 DAG是在Driver上生成的,具體點說,有個DAGScheduler負責將使用者提交的計算任務按照DAG劃分為不同的階段,每個階段包含一組Task。然後通過TaskScheduler將Task提交給叢集 ==================================================================================== saprk streaming spark Streaming是就saprk的實時計算框架,提供了豐富的API,和基於記憶體的高速執行引擎,使用者可以結合流式,批處理和互動式查詢應用 spark是一個類似於mapReduces的分散式計算框架,其核心是分散式資料集,提供了比mapReduces更加豐富的模型,更好的支援資料探勘演算法和圖形計算演算法,Spark Streaming就是基於spark的實時計算框架,它豐富了spark對大規模實時資料的處理 spark streaming 的優點: 可以部署在100+的節點上,達到秒級的延遲 以spark作為執行引擎,具有高效和容錯的機制 具有apark的互動式和批處理機制 為實現複雜的計算提供了和批處理類似的簡單介面 spark的所有的子框架,都是基於spark的核心api的,Spark ============================================================================ Streaming就是從指定的資料儲存介質中讀取資料,然後按照一定的時間間隔將資料拆分為一批一批的資料,然後通過spark engine處理這些資料,然後得到一批一批的處理結果 對應的批資料,在spark中對應-個個RDD例項,因此,對應的資料流DStream可以看作-組RDDS,即RDD的一個序列,簡單說就是,在資料流分成一批一批後,通過一個先進先出原則的佇列,然後spark engine從該佇列中依次去獲取一個個的批資料,把資料封裝成一個個RDD,然後進行處理,典型的生產者消費者模型,模型的調優就是生產者和消費者之間的速率 術語定義: 離散流(DStream):這是spark streaming對內部持續資料流的描述,即我們處理的一個實時資料流.在spark streaming中對應一個DStream例項 批資料:這是人為對資料進行定量的標準, 以時間片作為拆分資料的依據,一個時間片對應一個RDD例項 視窗長度:一個視窗覆蓋的流處理時間的長度,必須是處理時間間隔的倍數 滑動時間間隔:前一個視窗到後一個視窗的時間間隔,必須是,處理時間間隔的倍數 input Dsream:一個特殊的DStream,連線spark Streaming和外部資料來源 ================================================================== Storm 被稱為實時版Hadoop storm核心元件: nimbus:即storm的master,一個叢集只有一個nimbus Supervisor:即storm的slave,接收nimbus分配的任務.一個supervisor可以包含多個worker程序 worker:工作程序,每個工程中含有多個Task Task:任務,叢集中的每個spout和bolt都由若干個task來執行,每個任務都與一個執行執行緒相對應 topology:計算拓撲,storm的計算拓撲是對實時計算邏輯的封裝,它的作用和mapreduces的job差不多,只不過mapreduces的job在執行完成之後自動關閉,但是topology只能進行手動關閉,拓撲[可以理解為一系列的通過的資料流相互關聯的spout和bolt組成的拓撲結構 Stream:資料流是Storm中最核心的抽象概念。 一個數據流是指在分散式環境中建立,處理的一組元組的無界序列 spout: 資料來源是拓撲資料流的來源。一般來說,spout會從資料來源中讀取元組傳送到拓撲中,根據需求的不同,spout可以分為可靠和不可靠spout,可靠的spout在傳送元組失敗後會重新發送,不可靠的不會重新發送,一個spout可以傳送多個數據流 bolt:拓撲中所有的資料流都在bolt中完成,通過資料過濾,函式處理,聚合,聯結,資料庫互動等功能,bolt幾乎可以完成任何一種資料處理需求,一個bolt可以實現簡單的資料流轉換,但是複雜的資料流轉換就需要多個bolt來完成 Stream grouping:確定bolt的輸入流是拓撲中的一個重要的環節,系統分組定義了在bolt的不同任務中劃分資料流的方式,storm中定義了8中方式 reliability:可靠性,storm通過拓撲來判斷髮送的元組是不是處理完成,通過跟蹤spout發出的每個元組構成的元組樹可以確定元組是不是處理完成,每個拓撲都有一個延時引數,如果storm在延時引數內沒有檢測到元組處理成功,就會將該元組標記為處理失敗,並會在稍後重新發送元組 zookeeper是storm重要的外部依賴資源,nimbus和supervisor甚至是執行的worker都是把心跳儲存在zookeeper上的,nimbus是根據zookeeper上的心跳和任務執行狀態及逆行排程和任務分配的 storm叢集的執行方式: client---》topology--->Nimbus---->supervisor---->worker 為什麼topolog比較重要: 開發程式的主要用的元件 Topology和mapreduce相似 mapreduce是mao獲取資料,reduce進行處理資料 topology是spout進行獲取資料,bolt進行處理資料 一個topology由多個spout和bolt組成 分散式實時計算系統的特點: 低延遲,高效能,分散式,可擴充套件,容錯,提供豐富的介面和訊息不易丟失(創新的ack訊息追蹤框架) hadoop的缺點: 延遲大,響應緩慢,運維複雜 storm topology的結構: 1.hadoop有master與slave,Storm與之對應的節點是什麼? 2.Storm控制節點上面執行一個後臺程式被稱之為什麼? 3.Supervisor的作用是什麼?監聽分配給他的那臺機器的工作 4.Topology與Worker之間的關係是什麼?一個執行的Topology由執行在很多機器上的很多工作程序 Worker(類似 Child)組成。 5.Nimbus和Supervisor之間的所有協調工作有master來完成,還是Zookeeper叢集完成? nimbus----主控節點,用於提交任務,分配叢集任務,叢集監控等-----> zookeeper叢集------叢集中協調,共有書據的存放(如心跳資訊,叢集狀態和配置資訊),nimbus將分配給supervisor的任務寫入zookeeper---------> supervisor組------負責接收numbus分配的任務,管理屬於自己的worker程序----->每個supercisor對應多個worker----執行具體處理組建邏輯的程序 6.storm穩定的原因是什麼? nimbus和supervisor之間所有的協調工作都是由zookeeper叢集負責的,所有的狀態要不在zookeeper叢集中,要不在本地磁碟中,這也意味著,可是使用kill -9 來殺死numbus和supervisor程序,然後重啟他們,他們可以繼續工作,這個實際是的storm具有超強的穩定性 7.如何執行Topology?   strom jar all-your-code.jar backtype.storm.MyTopology arg1 arg2 8.spout是什麼? 9.bolt是什麼? 10.Topology由兩部分組成? 11.stream grouping有幾種? shuffle grouping 隨機發送任何一個task fields grouping 保證相同field值得tuple會進入同一個task,對於wordCount非常關鍵