大資料面試題整理-好程式設計師

好程式設計師發表於2020-09-29

   今天給大家分享一篇關於大資料面試題整理的詳細介紹,下面我們一起來看一下吧。

   一、.hdfs 寫檔案的步驟

   答案:

   (1)client NameNode 申請上傳… /xxx.txt 檔案

   (2)NN client 響應可以上傳檔案

   (3)Client NameNode 申請 DataNode

   (4)NN Client 返回 DN1,DN2,DN3

   (5)Client DN1,DN2,DN3 申請建立檔案傳輸通道

   (6)DN3,DN2,DN1 依次響應連線

   (7)Client DN1 上傳一個 block DN1 DN2,DN3 冗餘檔案

   大資料面試題整理

   二、hdfs 讀取檔案步驟

   答案:

   (1)client NN 請求下載… /xxx.txt 檔案

   (2)NN client 返回檔案的後設資料

   (3)Client DN1 請求訪問讀資料 blk_1

   (4)DN1 Client 傳輸資料

   (5)Client DN2 請求訪問讀資料 blk_2

   (6)DN2 Client 傳輸資料

   大資料面試題整理

   大資料面試題整理

   三、hadoop shuffle 過程

   1.Map 端的 shuffle

   Map 端會處理輸入資料併產生中間結果,這個中間結果會寫到本地磁碟,而不是 HDFS 。每個 Map 的輸出會先寫到記憶體緩衝區中,當寫入的資料達到設定的閾值時,系統將會啟動一個執行緒將緩衝區的資料寫到磁碟,這個過程叫做 spill

   spill 寫入之前,會先進行二次排序,首先根據資料所屬的 partition 進行排序,然後每個 partition 中的資料再按 key 來排序。 partition 的目是將記錄劃分到不同的 Reducer 上去,以期望能夠達到負載均衡,以後的 Reducer 就會根據 partition 來讀取自己對應的資料。接著執行 combiner( 如果設定了的話 ) combiner 的本質也是一個 Reducer ,其目的是對將要寫入到磁碟上的檔案先進行一次處理,這樣,寫入到磁碟的資料量就會減少。 後將資料寫到本地磁碟產生spill 檔案 (spill 檔案儲存在 {mapred.local.dir} 指定的目錄中, Map 任務結束後就會被刪除 )

  最 後,每個Map 任務可能產生多個 spill 檔案,在每個 Map 任務完成前,會透過多路歸併演算法將這些 spill 檔案歸併成一個檔案。至此, Map shuffle 過程就結束了。

   2.Reduce 端的 shuffle

   Reduce 端的 shuffle 主要包括三個階段, copy sort(merge) reduce

   首先要將Map 端產生的輸出檔案複製到 Reduce 端,但每個 Reducer 如何知道自己應該處理哪些資料呢?因為 Map 端進行 partition 的時候,實際上就相當於指定了每個 Reducer 要處理的資料 (partition 就對應了 Reducer) ,所以 Reducer 在複製資料的時候只需複製與自己對應的 partition 中的資料即可。每個 Reducer 會處理一個或者多個 partition ,但需要先將自己對應的 partition 中的資料從每個 Map 的輸出結果中複製過來。

   接下來就是sort 階段,也成為 merge 階段,因為這個階段的主要工作是執行了歸併排序。從 Map 端複製到 Reduce 端的資料都是有序的,所以很適合歸併排序。 終在Reduce 端生成一個較大的檔案作為 Reduce 的輸入。

  最 後就是Reduce 過程了,在這個過程中產生了 終的輸出結果,並將其寫到HDFS 上。

   四、fsimage edit 的區別?

   NN,SN 要進行資料同步時叫做 checkpoint 時就用到了 fsimage edit fsimage 是儲存 新的後設資料的資訊,當fsimage 資料到一定的大小事會去生成一個新的檔案來儲存後設資料的資訊,這個新的檔案就是 edit edit 會回滾 新的資料。

   五、簡單說一下hadoop map-reduce 模型

   首先maptask 會從本地檔案系統讀取資料,轉換成 key-value 形式的鍵值對集合,使用的是 hadoop 內建的資料型別,如 Text Longwritable 等。

   將鍵值對集合輸入mapper 進行業務處理過程,將其轉化成需要的 key-value 再輸出。

   之後會進行一個partition 分割槽操作,預設使用的是 hashpartitioner ,可以透過重寫 hashpartitioner getPartition 方法來自定義分割槽規則。

   之後會對key 進行 sort 排序, grouping 分組操作將相同 key value 合併分組輸出,在這裡可以使用自定義的資料型別,重寫 WritableComparator Comparator 方法來自定義排序規則,重寫 RawComparator compara 方法來自定義分組規則。

   之後進行一個combiner 歸約操作,就是一個本地的 reduce 預處理,以減小 shuffle reducer 的工作量。

   Reducetask 會用過網路將各個資料收集進行 reduce 處理, 後將資料儲存或者顯示,結束整個job

   六、執行hadoop 叢集需要哪些守護程式?

   DataNode,NameNode,TaskTracker JobTracker 都是執行 Hadoop 叢集需要的守護程式。

   七、hadoop TextInputFormat 作用是什麼,如何自定義實現?

   InputFormat 會在 map 操作之前對資料進行兩方面的預處理。

   1. getSplits ,返回的是 InputSplit 陣列,對資料進行 Split 分片,每片交給 map 操作一次。

   2. getRecordReader ,返回的是 RecordReader 物件,對每個 Split 分片進行轉換為 key-value 鍵值對格式傳遞給 map 常用的 InputFormat TextInputFormat ,使用的是 LineRecordReader 對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值。

   自定義類繼承InputFormat 介面,重寫 createRecordReader isSplitable 方法在 createRecordReader 中可以自定義分隔符。

   八、hadoop spark 都是平行計算,那麼他們有什麼相同和區別?

   兩者都使用mr 模型來進行平行計算, hadoop 的一個作業稱為 job job 裡面分為 maptask reducetask ,每個 task 都是在自己的程式中執行的,當 task 結束時,程式也會結束。

   Spark 使用者提交的任務稱為 application ,一個 application 對應一個 SparkContext app 中存在多個 job ,沒觸發一個 action 操作就會產生一個 job

   這些job 可以並行或者序列執行,每個 job 有多個 stage stage shuffle 過程中 DAGSchaduler 透過 RDD 之間的依賴關係劃分 job 而來的,每個 stage 裡面有多個 task ,組成 taskset TaskSchaduler 分發到各個 executor 中執行, executor 的生命週期是和 application 一樣的,即使沒有 job 執行也是存在的,所以 task 可以快速啟動讀取記憶體進行計算的。

   Hadoop job 只有 map reduce 操作,表達能力比較欠缺而且在 mr 過程中會重複的讀寫 hdfs ,造成大量的 io 操作,多個 job 需要自己管理關係。

   Spark 的迭代計算都是在記憶體中進行的, API 中提供了大量的 RDD 操作 join groupby 等,而且透過 DAG 圖可以實現良好的容錯。

   九、為什麼要用flume 匯入 hdfs hdfs 的架構是怎樣的?

   Flume 可以實時的匯入資料到 hdfs 中,當 hdfs 上的檔案達到一個指定大小的時候會形成一個檔案,或者超時所指定時間的話也形成一個檔案。

   檔案都是儲存在datanode 上的, namenode 儲存著 datanode 的後設資料資訊,而 namenode 的後設資料資訊是存在記憶體中的,所以當檔案切片很小或者很多的時候會卡死。

   十、MR 程式執行的時候會有什麼比較常見的問題?

   比如說作業中大部分都完成了,但是總有幾個reduce 一直在執行。

   這是因為這幾個reduce 中的處理的資料要遠遠大於其他的 reduce ,可能是對鍵值對任務劃分的不均勻造成的資料傾斜。

   解決的方法可以在分割槽的時候重新定義分割槽規則對於value 資料很多的 key 可以進行拆分、均勻打散等處理,或者是在 map 端的 combiner 中進行資料預處理的操作。

   十一、簡單說一下hadoop spark shuffle 過程

   Hadoop map 端儲存分片資料,透過網路收集到 reduce 端。

   Spark spark shuffle 實在 DAGSchedular 劃分 Stage 的時候產生的, TaskSchedular 要分發 Stage 到各個 worker executor 。減少 shuffle 可以提高效能。

   十二、hive 中存放的是什麼?

   表。

   存的是和hdfs 的對映關係, hive 是邏輯上的資料倉儲,實際操作的都是 hdfs 上的檔案, HQL 就是用 SQL 語法來寫的 MR 程式。

   十三、Hive 與關係型資料庫的關係?

   沒有關係,hive 是資料倉儲,不能和資料庫一樣進行實時的 CRUD 操作。

   是一次寫入多次讀取的操作,可以看成是ETL 的工具。

   十四、Flume 的工作及時是什麼?

   核心概念是agent ,裡面包括 source channel sink 三個元件。

   Source 執行在日誌收集節點進行日誌採集,之後臨時儲存在 channel 中, sink 負責將 channel 中的資料傳送到目的地。

   只有傳送成功channel 中的資料才會被刪除。

   首先書寫flume 配置檔案,定義 agent source channel sink 然後將其組裝,執行 flume-ng 命令。

   十五、Hbase 行鍵列族的概念,物理模型,表的設計原則?

   行鍵:是hbase 表自帶的,每個行鍵對應一條資料。

   列族:是建立表時指定的,為列的集合,每個列族作為一個檔案單獨儲存,儲存的資料都是位元組陣列,其中資料可以有很多,透過時間戳來區分。

   物理模型:整個hbase 表會拆分成多個 region ,每個 region 記錄著行鍵的起始點儲存在不同的節點上,查詢時就是對各個節點的並行查詢,當 region 很大時使用 .META 表儲存各個 region 的起始點, -ROOT 又可以儲存 .META 的起始點。

   Rowkey 的設計原則:各個列族資料平衡,長度原則、相鄰原則,建立表的時候設定表放入 regionserver 快取中,避免自動增長和時間,使用位元組陣列代替 string 大長度64kb 16 位元組以內,按天分表,兩個位元組雜湊,四個位元組儲存時分毫秒。

   列族的設計原則:儘可能少( 按照列族進行儲存,按照 region 進行讀取,不必要的 io 操作 ) ,經常和不經常使用的兩類資料放入不同列族中,列族名字儘可能短。

   十六、請列出正常的hadoop 叢集中 hadoop 都分別需要啟動哪些程式,他們的作用分別都是什麼,請儘量列的詳細一些。

   namenode :負責管理 hdfs 中檔案塊的後設資料,響應客戶端請求,管理 datanode 上檔案 block 的均衡,維持副本數量

   Secondname: 主要負責做 checkpoint 操作;也可以做冷備,對一定範圍內資料做快照性備份。

   Datanode: 儲存資料塊,負責客戶端對資料塊的 io 請求

   Jobtracker: 管理任務,並將任務分配給 tasktracker

   Tasktracker: 執行 JobTracker 分配的任務。

   Resourcemanager Nodemanager Journalnode Zookeeper Zkfc

   十七、請說明hive SortBy OrderBy ClusterBy DistributeBy 各代表什麼意思?

   orderby :會對輸入做全域性排序,因此只有一個 reducer (多個 reducer 無法保證全域性有序)。只有一個 reducer ,會導致當輸入規模較大時,需要較長的計算時間。

   sortby :不是全域性排序,其在資料進入 reducer 前完成排序。

   distributeby :按照指定的欄位對資料進行劃分輸出到不同的 reduce 中。

   clusterby :除了具有 distributeby 的功能外還兼具 sortby 的功能。

   十八、HBase 簡單讀寫流程?

   讀:

   找到要讀資料的region 所在的 RegionServer ,然後按照以下順序進行讀取:先去 BlockCache 讀取,若 BlockCache 沒有,則到 Memstore 讀取,若 Memstore 中沒有,則到 HFile 中去讀。

   寫:

   找到要寫資料的region 所在的 RegionServer ,然後先將資料寫到 WAL(Write-AheadLogging ,預寫日誌系統 ) 中,然後再將資料寫到 Memstore 等待重新整理,回覆客戶端寫入完成。

   十九、HBase 的特點是什麼?

   (1)hbase 是一個分散式的基於列式儲存的資料庫,基於 hadoop HDFS 儲存, zookeeper 進行管理。

   (2)hbase 適合儲存半結構化或非結構化資料,對於資料結構欄位不夠確定或者雜亂無章很難按一個概念去抽取的資料。

   (3)hbase null 的記錄不會被儲存。

   (4) 基於的表包括 rowkey ,時間戳和列族。新寫入資料時,時間戳更新,同時可以查詢到以前的版本。

   (5)hbase 是主從結構。 Hmaster 作為主節點, hregionserver 作為從節點。

   二十、請描述如何解決Hbase region 太小和 region 太大帶來的結果。

   Region 過大會發生多次 compaction ,將資料讀一遍並寫一遍到 hdfs 上,佔用 io region 過小會造成多次 split region 會下線,影響訪問服務,調整 hbase.heregion.max.filesize 256m


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2725038/,如需轉載,請註明出處,否則將追究法律責任。

相關文章