關於面試--【基礎大數據面試題】

目錄

hdfs的體系結構:

請列出hadoop正常工作時要啓動那些進程,並寫出各自的作用。

一個datanode 宕機,怎麼一個流程恢復?

MapTask並行機度是由什麼決定的?

MapTask工作機制:

MR是幹什麼的?

MR的實例進程:

combiner和partition的作用:

什麼是shuffle:

secondarynamenode的主要職責是什麼:

用mapreduce怎麼處理數據傾斜問題:

一些傳統的hadoop 問題,mapreduce 他就問shuffle 階段,你怎麼理解的

hive內部表和外部表的區別

分桶的作用

UDF:

hbase的rowkey怎麼創建好?列族怎麼創建比較好?(重點)

Redis,傳統數據庫,hbase,hive 每個之間的區別?

hdfs 和 hbase 各自使用場景

你覺得spark 可以完全替代hadoop 麼?


  1. hdfs的體系結構:

    hdfs有namenode、secondraynamenode、datanode組成。
    namenode負責管理datanode和記錄元數據
    secondraynamenode負責合併日誌
    datanode負責存儲數據
  2. 請列出hadoop正常工作時要啓動那些進程,並寫出各自的作用。

    namenode:管理集羣並記錄datanode的元數據,相應客戶端的請求。
    seconder namenode:對namenode一定範圍內的數據做一份快照性備份。
    datanode:存儲數據。
    jobTracker:管理客戶端提交的任務,並將任務分配給TaskTracker。
    TaskTracker:執行各個Task。
    
    JobTracker和TaskTracker的功能
    JobTracker是一個master服務,軟件啓動之後JobTracker接收Job,負責調度Job的每一個子任務task運行於TaskTracker上,
    並監控它們,如果發現有失敗的task就重新運行它。一般情況應該把JobTracker部署在單獨的機器上。
    TaskTracker是運行在多個節點上的slaver服務。TaskTracker主動與JobTracker通信,接收作業,並負責直接執行每一個任務。

     

  3. 一個datanode 宕機,怎麼一個流程恢復?

    Datanode宕機了後,如果是短暫的宕機,可以實現寫好腳本監控,將它啓動起來。如果是長時間宕機了(大概12小時以上這臺機器上的塊就會複製到別的機器上),那麼datanode上的數據應該已經被備份到其他機器了,
    那這臺datanode就是一臺新的datanode了,刪除他的所有數據文件和狀態文件,重新啓動
    hadoop 的 namenode 宕機,怎麼解決?
    先分析宕機後的損失,宕機後直接導致client無法訪問,內存中的元數據丟失,但是硬盤中的元數據應該還存在,如果只是節點掛了,
    重啓即可,如果是機器掛了,重啓機器後看節點是否能重啓,不能重啓就要找到原因修復了。
    但是最終的解決方案應該是在設計集羣的初期就考慮到這個問題,做namenode的HA。
    
    

     

  4. MapTask並行機度是由什麼決定的?

    一個job的map階段並行度由客戶端在提交job時決定
    每一個split切片分配一個mapTask
    默認 切片大小=blocksize
    切片時不考慮數據集整體,而是逐個對每一個文件單獨切片

     

  5. MapTask工作機制:

    Read階段;
    讀文件
    
    輸入文件對文件切片的規劃
    Map階段:
    業務邏輯
    Collect階段:
    分區 排序
    溢寫階段:
    寫磁盤
    Combine階段:
    歸併
    
    (1)Read 階段:Map Task 通過用戶編寫的 RecordReader,從輸入 InputSplit 中解析出
    一個個 key/value。
    (2)Map 階段:該節點主要是將解析出的 key/value 交給用戶編寫 map()函數處理,並
    產生一系列新的 key/value。
    (3)Collect 收集階段:在用戶編寫 map()函數中,當數據處理完成後,一般會調用
    OutputCollector.collect()輸出結果。在該函數內部,它會將生成的 key/value 分區(調用
    Partitioner),並寫入一個環形內存緩衝區中。
    (4)Spill 階段:即“溢寫”,當環形緩衝區滿後,MapReduce 會將數據寫到本地磁盤上,
    生成一個臨時文件。需要注意的是,將數據寫入本地磁盤之前,先要對數據進行一次本地排
    序,並在必要時對數據進行合併、壓縮等操作。
    溢寫階段詳情:
    步驟 1:利用快速排序算法對緩存區內的數據進行排序,排序方式是,先按照分區編號
    partition 進行排序,然後按照 key 進行排序。這樣,經過排序後,數據以分區爲單位聚集在
    一起,且同一分區內所有數據按照 key 有序。
    步驟 2:按照分區編號由小到大依次將每個分區中的數據寫入任務工作目錄下的臨時文
    件 output/spillN.out(N 表示當前溢寫次數)中。如果用戶設置了 Combiner,則寫入文件之
    前,對每個分區中的數據進行一次聚集操作。
    信息包括在臨時文件中的偏移量、壓縮前數據大小和壓縮後數據大小。如果當前內存索引大
    小超過 1MB,則將內存索引寫到文件 output/spillN.out.index 中。
    (5)Combine 階段:當所有數據處理完成後,MapTask 對所有臨時文件進行一次合併,
    以確保最終只會生成一個數據文件。
    當所有數據處理完後,MapTask 會將所有臨時文件合併成一個大文件,並保存到文件
    output/file.out 中,同時生成相應的索引文件 output/file.out.index。
    在進行文件合併過程中,MapTask 以分區爲單位進行合併。對於某個分區,它將採用多
    輪遞歸合併的方式。每輪合併 io.sort.factor(默認 100)個文件,並將產生的文件重新加入
    待合併列表中,對文件排序後,重複以上過程,直到最終得到一個大文件。
    讓每個 MapTask 最終只生成一個數據文件,可避免同時打開大量文件和同時讀取大量
    小文件產生的隨機讀取帶來的開銷。
    

     

  6. MR是幹什麼的?

    MR將用戶編寫的業務邏輯代碼和自帶的默認組件結合起來組成一個完整的分佈式應用程序放到hadoop集羣上運行。

     

  7. MR的實例進程:

    driver(mr的job提交客戶端)
    MRAppMaster
    MapTask
    ReduceTask

     

  8. combiner和partition的作用:

    combiner的意義就是對每一個maptask的輸出進行局部彙總,以減小網絡傳輸量
    partition的默認實現是hashpartition,是map端將數據按照reduce個數取餘,進行分區,不同的reduce來copy自己的數據。
    partition的作用是將數據分到不同的reduce進行計算,加快計算效果。

     

  9. 什麼是shuffle:

    map階段處理的數據如何傳遞給reduce階段,是mapreduce框架中最關鍵的一個流程,這個流程就叫shuffle;
    shuffle: 洗牌、發牌——(核心機制:數據分區,排序,緩存);
    具體來說:就是將maptask輸出的處理結果數據,分發給reducetask,並在分發的過程中,對數據按key進行了分區和排序;

     

  10. secondarynamenode的主要職責是什麼:

    n的主要職責是執行checkpoint操作
    每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,並加載到內存進行merge(這個過程稱爲checkpoint)
    

     

  11. 用mapreduce怎麼處理數據傾斜問題:

    數據傾斜:map /reduce程序執行時,reduce節點大部分執行完畢,但是有一個或者幾個reduce節點運行很慢,導致整個程序的處理時間很長,
    這是因爲某一個key的條數比其他key多很多(有時是百倍或者千倍之多),這條key所在的reduce節點所處理的數據量比其他節點就大很多,
    從而導致某幾個節點遲遲運行不完,此稱之爲數據傾斜。
    解決:自己實現partition類,用key和value相加取hash值。

     

  12. 一些傳統的hadoop 問題,mapreduce 他就問shuffle 階段,你怎麼理解的

    Shuffle意義在於將不同map處理後的數據進行合理分配,讓reduce處理,從而產生了排序、分區。

     

  13. hive內部表和外部表的區別

    內部表:加載數據到hive所在的hdfs目錄,刪除時,元數據和數據文件都刪除
    外部表:不加載數據到hive所在的hdfs目錄,刪除時,只刪除表結構。
    

     

  14. 分桶的作用

    最大的作用是提高join的效率。(1)獲得更高的查詢處理效率。(2)使取樣(sampling)更高效。
    

     

  15. UDF:

    1、寫對應的java代碼自定義函數的邏輯
    2、將代碼打成jar包上傳到hive
    3、在hive創建臨時函數與對應的class類相關聯
    4、在hive中調用臨時函數。

     

  16. hbase的rowkey怎麼創建好?列族怎麼創建比較好?(重點)

    hbase存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分利用排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)
    一個列族在數據底層是一個文件,所以將經常一起查詢的列放到一個列族中,列族儘量少,減少文件的尋址時間。

     

  17. Redis,傳統數據庫,hbase,hive 每個之間的區別?

    redis:分佈式緩存,強調緩存,內存中數據
    傳統數據庫:注重關係
    hbase:列式數據庫,無法做關係數據庫的主外鍵,用於存儲海量數據,底層基於hdfs
    hive:數據倉庫工具,底層是mapreduce。不是數據庫,不能用來做用戶的交互存儲

     

  18. hdfs 和 hbase 各自使用場景

    HDFS:
    1、一次性寫入,多次讀取。
    2、保證數據的一致性。
    3、主要是可以部署在許多廉價機器中,通過多副本提高可靠性,提供了容錯和恢復機制。
    Hbase:
    1、瞬間寫入量很大,數據庫不好支撐或需要很高成本支撐的場景。
    2、數據需要長久保存,且量會持久增長到比較大的場景
    3、hbase 不適用與有 join,多級索引,表關係複雜的數據模型
    4、大數據量 (100s TB 級數據) 且有快速隨機訪問的需求。
    如:淘寶的交易歷史記錄。數據量巨大無容置疑,面向普通用戶的請求必然要即時響應。
    5、容量的優雅擴展
    大數據的驅使,動態擴展系統容量的必須的。例如:webPage DB。
    6、業務場景簡單,不需要關係數據庫中很多特性(例如交叉列、交叉表,事務,連接等等)
    7、優化方面:合理設計 rowkey。因爲 hbase 的查詢速度和rowkey有直接關係

     

  19. 你覺得spark 可以完全替代hadoop 麼?

    spark會替代mr,不會代替yarn和hdfs.
    公司之後傾向用spark 開發,你會麼(就用java代碼去寫)
    會,spark使用scala開發的,在scala中可以隨意使用jdk的類庫,可以用java開發,但是最好用原生的scala開發,兼容性好,scala更靈活。

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章