1. 程式人生 > 其它 >大資料面試整理

大資料面試整理

  • ## **參考部落格:**
    https://www.csdn.net/tags/MtjaUgwsMzkwNTItYmxvZwO0O0OO0O0O.html#1_HDFS_35

    # 本部落格僅供自己大資料面試整理, 如果您不小心看到了這個部落格, 請帶著一種批判的角度閱讀,方便的話,歡迎指正其中的錯誤,小白謝謝你啦。
    ## 1.Hadoop
    Hadoop 三大核心: HDFS, MapReduce, YARN.
    HDFS: 分散式儲存系統, 主要構成有 HDFS client, Name node, Data Node, Secondary node.
    HDFS Client 主要是用來和Name node 還有 Data node 互動的
    Name node 是儲存 data node 元資料的, 比如data node 位置, 空間,是否可用之類的
    Data node 是真正儲存資料的東東
    Secondary node 沒太細看,應該和Name node 一起作用的,Name node 是把元資料資訊寫記憶體裡, 但是 Secondary node 是把資料寫到磁碟中。

    HDFS 讀寫過程
    讀:HDFS 向 Name node 傳送請求讀資料,然後Name node 檢查client 是不是有許可權, 如果有許可權,Name node 會返回給HDFS client允許讀檔案,然後HDFS client 提供給Name node 需要讀的資料,Name node 會返回這資料所在的block和相關的data node, HDFS client 會從最近的datanode 讀取資料,即***讀取資料的高效性***。如果讀取過程中發生錯誤,會從下一個相對較近的副本 data node 中讀取,讀完了,會關閉與data node 的連線。
    寫:HDFS client 向name node 申請寫資料,然後name node 會檢視是否檔案和目錄已經存在, 若, 存在則報出異常。HDFS client把檔案分解,告訴name node 需要幾個block,Name node 會根據資訊找到哪些data node 是可用的, 且空間夠用,然後將資訊傳遞給HDFS client。 HDFS 按照資訊找到對應的data node. 比如需要三個data node A,B,C. HDFS 先和A建立通訊,A-->B,B-->C, 通訊建立完成後, 需要返回給HDFS 返回data node 狀態。C-->B-->A-->HDFS Client, 鏈式的管道搭建完成後,HDFS 知道所有的data node 都是可用的,於是開始準備往A寫資料,A寫完了之後, A把資料寫入B , B 把資料寫入C,C告訴B寫入完成, B 告訴A 寫入完成,當所有節點資料完成後,即***資料再節點保持了一致性***,HDFS client才會開始寫入第二個block的內容,直到所有的節點寫入都完成。

    MapReduce: split -- map(map data by function) --shuffle (same key/hash in same partition) -- Reduce(聚合輸出最終結果)

    | age|ID|
    |13|1|
    |13|1|
    |12|1|
    |13|2|

    select count(distinct ID) , age from above_table group by age;


    Yarn: 主要負責任務管理排程
    Resource Manager, Application master, Node manager, container
    Resource Manager 負責資源監控,和Node Manager 配合監控資源並啟動監視應用程式
    Node manager 管理yarn 叢集所有工作節點,和RM 互動,提供節點的資源和任務情況,和AM 互動,啟動或停止任務。
    container 是物理封裝了CPU,記憶體, 磁碟,網路等的資源抽象, 每個application再向RM 請求資源時, 都被分配固定的container.
    Application master 傳送請求給resource manager ,Resource manager 為應用程式提供container ,並與對應的Node Manager 通訊,在container 中啟動application master, application master 向RM 註冊,這樣使用者可以通過 RM 檢視程式執行狀態。application mater 為程式的各個任務請求資源 , 申請到資源後, 與node manager 通訊, 要求啟動任務,任務向application master 報告狀態,結束後, AM 申請從RM 中登出掉自己。
    例子: 比如執行一個HIVE query。
    1. 特定使用者提交Tez query, 使用者本身在一個applicationID中
    2. 提交程式碼後,其實是Application 向 resource manager 申請資源, 然後不同的組已經預定了固定的container
    3. Resource Manager 和 Node Manager 互動,檢視當前container下,是否有可用的節點, 如果沒有,Application 的 Query 只是顯示accept,如果有的話,Node manager 會接受Application master 命令來對應的啟動任務。

    ## 2.Hive
    1.分割槽表和分桶表
    1)分割槽表字段是表外欄位, 通常是日期,方便按分割槽查詢,而不是全表掃描, 但不是所有表都適用分割槽表,有的資料可能再某個定義分割槽沒有內容
    2)分桶表的欄位是表內欄位,是按列的HASH 來分桶,因為可能即使分割槽後,資料還是很大,就需要更細力度來分桶,分桶通常用於抽樣,提高join效率,join時會直接找到列相同的桶join. 比如 男女資料, 男的一個桶, 女的一個桶。
    2.Hive 效能優化 - 參考B站老王
    ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/8e38862b8b5c49309bc0b209566fd67d.png)

    1)減少資料量,避免全表掃描
    比如 select * from a join b on a.col1=b.col2 where b.col3<>'aa'
    優化後應該是 select * from a join (select * from b where b.col3<>'aa')b on a.col1=b.col2
    2)join避免資料傾斜

    大表join小表用map join
    Null資料轉化成隨機數
    傾斜欄位打散

    3) 根據檔案大小,資源調整引數 - 合併小檔案
    輸入檔案是小量大檔案, 減少map數,如果大量小檔案, 增加map 數, 提高併發處理。
    Reduce 數太多,會產生大量小檔案, 增加HDFS壓力, reduce數太少,每個reduce需要處理大量檔案 容易發生記憶體溢位。
    大量小檔案應該合併處理。
    count distinct 相當於只有一個reduce, group by 打散
    減少job數,就是減少stage。job數少,申請資源的次數少, 效率會更高。Union all 應該都所有表union後再進行聚合。