大數據常見問題整理


  • 講述HDFS上傳文件和讀文件的流程

  • HDFS 上傳流程  
    過程解析:詳解
    這里描述的 是一個256M的文件上傳過程 
    ① 由客戶端 向 NameNode節點節點 發出請求
    ②NameNode 向Client返回可以可以存數據的 DataNode 這里遵循  機架感應  原則

    ③客戶端 首先 根據返回的信息 先將 文件分塊(Hadoop2.X版本 每一個block為 128M 而之前的版本為 64M)
    ④然后通過那么Node返回的DataNode信息 直接發送給DataNode 並且是 流式寫入  同時 會復制到其他兩台機器
    ⑤dataNode 向 Client通信 表示已經傳完 數據塊 同時向NameNode報告
    ⑥依照上面(④到⑤)的原理將 所有的數據塊都上傳結束 向 NameNode 報告 表明 已經傳完所有的數據塊 
  • HDFS在上傳文件的時候,如果其中一個塊突然損壞了怎么辦

    其中一個塊壞了,只要有其它塊存在,會自動檢測還原。
  • NameNode的作用

    namenode總體來說是管理和記錄恢復功能。
    比如管理datanode,保持心跳,如果超時則排除。
    對於上傳文件都有鏡像images和edits,這些可以用來恢復
  • NameNode在啟動的時候會做哪些操作

    NameNode啟動的時候,會加載fsimage,NameNode啟動過程fsimage加載過程

    Fsimage加載過程完成的操作主要是為了:
    1.         從fsimage中讀取該HDFS中保存的每一個目錄和每一個文件
    2.         初始化每個目錄和文件的元數據信息
    3.         根據目錄和文件的路徑,構造出整個namespace在內存中的鏡像
    4.         如果是文件,則讀取出該文件包含的所有blockid,並插入到BlocksMap中。
    整個加載流程如下圖所示:
     

    如上圖所示,namenode在加載fsimage過程其實非常簡單,就是從fsimage中不停的順序讀取文件和目錄的元數據信息,並在內存中構建整個namespace,同時將每個文件對應的blockid保存入BlocksMap中,此時BlocksMap中每個block對應的datanodes列表暫時為空。當fsimage加載完畢后,整個HDFS的目錄結構在內存中就已經初始化完畢,所缺的就是每個文件對應的block對應的datanode列表信息。這些信息需要從datanode的blockReport中獲取,所以加載fsimage完畢后,namenode進程進入rpc等待狀態,等待所有的datanodes發送blockReports。

 

 

spark

mr和spark區別,怎么理解spark-rdd

Mr是文件方式的分布式計算框架,是將中間結果和最終結果記錄在文件中,map和reduce的數據分發也是在文件中。

spark是內存迭代式的計算框架,計算的中間結果可以緩存內存,也可以緩存硬盤,但是不是每一步計算都需要緩存的。

 

Spark應用轉換流程

1、spark應用提交后,經歷了一系列的轉換,最后成為task在每個節點上執行

2、RDD的Action算子觸發Job的提交,生成RDD DAG

3、由DAGScheduler將RDD DAG轉化為Stage DAG,每個Stage中產生相應的Task集合

4、TaskScheduler將任務分發到Executor執行

5、每個任務對應相應的一個數據塊,只用用戶定義的函數處理數據塊

Spark-rdd是一個數據的分區記錄集合………………

 

Driver運行在Worker上

通過org.apache.spark.deploy.Client類執行作業,作業運行命令如下:

作業執行流程描述:

1、客戶端提交作業給Master

2、Master讓一個Worker啟動Driver,即SchedulerBackend。Worker創建一個DriverRunner線程,DriverRunner啟動SchedulerBackend進程。

3、另外Master還會讓其余Worker啟動Exeuctor,即ExecutorBackend。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。

4、ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。SchedulerBackend進程中包含DAGScheduler,它會根據用戶程序,生成執行計划,並調度執行。對於每個stage的task,都會被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend匯報的時候把TaskScheduler中的task調度到ExecutorBackend執行。

5、所有stage都完成后作業結束。

 

spark概念

術語總是難以理解的,因為它取決於所處的上下文。在很多情況下,你可能習慣於“將Job提交給一個cluster”,但是對於spark而言卻是提交了一個driver程序。

也就是說,對於Job,spark有它自己的定義,如下: 
A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.

在這個例子中,假設你需要做如下一些事情: 
1. 將一個包含人名和地址的文件加載到RDD1中 
2. 將一個包含人名和電話的文件加載到RDD2中 
3. 通過name來Join RDD1和RDD2,生成RDD3 
4. 在RDD3上做Map,給每個人生成一個HTML展示卡作為RDD4 
5. 將RDD4保存到文件 
6. 在RDD1上做Map,從每個地址中提取郵編,結果生成RDD5 
7. 在RDD5上做聚合,計算出每個郵編地區中生活的人數,結果生成RDD6 
8. Collect RDD6,並且將這些統計結果輸出到stdout

 

為了方便說明,我將這個例子整理成如下的一張示意圖: 
這里寫圖片描述

其中紅色虛線表示輸入和輸出,藍色實線是對RDD的操作,圓圈中的數字對應了以上的8個步驟。接下來解釋driver program, job和stage這幾個概念:

  1. Driver program是全部的代碼,運行所有的8個步驟。
  2. 第五步中的save和第八步中的collect都是Spark Job。Spark中每個action對應着一個Job,transformation不是Job。
  3. 其他的步驟(1、2、3、4、6、7)被Spark組織成stages,每個job則是一些stage序列的結果。對於一些簡單的場景,一個job可以只有一個stage。但是對於數據重分區的需求(比如第三步中的join),或者任何破壞數據局域性的事件,通常會導致更多的stage。可以將stage看作是能夠產生中間結果的計算。這種計算可以被持久化,比如可以把RDD1持久化來避免重復計算。
  4. 以上全部三個概念解釋了某個算法被拆分的邏輯。相比之下,task是一個特定的數據片段,在給定的executor上,它可以跨越某個特定的stage。

到了這里,很多概念就清楚了。驅動程序就是執行了一個Spark Application的main函數和創建Spark Context的進程,它包含了這個application的全部代碼。Spark Application中的每個action會被Spark作為Job進行調度。每個Job是一個計算序列的最終結果,而這個序列中能夠產生中間結果的計算就是一個stage。

再回過頭來看一下Spark Programming Guide,對於Transformations和Actions是有着明確區分的。通常Action對應了Job,而Transformation對應了Stage:

Action列表:

  • reduce
  • collect
  • count
  • first
  • take
  • takeSample
  • takeOrdered
  • saveAsTextFile
  • saveAsSequenceFile
  • saveAsObjectFile
  • countByKey
  • foreach

Transformation列表:

  • map
  • filter
  • flatMap
  • mapPartitions
  • mapPartitionsWithIndex
  • sample
  • union
  • intersection
  • distinct
  • groupByKey
  • reduceByKey
  • aggregateByKey
  • sortByKey
  • join
  • cogroup
  • cartesian
  • pipe
  • coalesce
  • repartition
  • repartitionAndSortWithinPartitions

至於task,官方文檔中是這么說的:Task is a unit of work that will be sent to one executor。再結合官方對Stage的解釋,可以這樣理解: 
一個Job被拆分成若干個Stage,每個Stage執行一些計算,產生一些中間結果。它們的目的是最終生成這個Job的計算結果。而每個Stage是一個task set,包含若干個task。Task是Spark中最小的工作單元,在一個executor上完成一個特定的事情。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM