hadoop/spark面試題


總結於網絡

轉自:https://www.cnblogs.com/jchubby/p/5449379.html

1、簡答說一下hadoop的map-reduce編程模型

首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合

使用的是hadoop內置的數據類型,比如longwritable、text等

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

之后會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則

之后會對key進行進行sort排序,grouping分組操作將相同key的value合並分組輸出,在這里可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則

之后進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小后面shufle和reducer的工作量

reduce task會通過網絡將各個數據收集進行reduce處理,最后將數據保存或者顯示,結束整個job

 

2、hadoop的TextInputFormat作用是什么,如何自定義實現

InputFormat會在map操作之前對數據進行兩方面的預處理 
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次 
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 
在createRecordReader中可以自定義分隔符

 

3、hadoop和spark的都是並行計算,那么他們有什么相同和區別

兩者都是用mr模型來進行並行計算,hadoop的一個作業稱為job,job里面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束

spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job

這些job可以並行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關系划分job而來的,每個stage里面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存進行計算

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

spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯

 

4、為什么要用flume導入hdfs,hdfs的構架是怎樣的

flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件

文件都是存儲在datanode上面的,namenode記錄着datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片很小或者很多的時候會卡死

 

5、map-reduce程序運行的時候會有什么比較常見的問題

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

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

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

 

6、簡單說一下hadoop和spark的shuffle過程 

hadoop:map端保存分片數據,通過網絡收集到reduce端 
spark:spark的shuffle是在DAGSchedular划分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor

減少shuffle可以提高性能

 

7、Hive中存放是什么? 

   存的是和hdfs的映射關系,hive是邏輯上的數據倉庫,實際操作的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序。

 

8、Hive與關系型數據庫的關系? 

   沒有關系,hive是數據倉庫,不能和數據庫一樣進行實時的CURD操作。 
   是一次寫入多次讀取的操作,可以看成是ETL工具。

 

9、Flume工作機制是什么? 

核心概念是agent,里面包括source、chanel和sink三個組件。 
source運行在日志收集節點進行日志采集,之后臨時存儲在chanel中,sink負責將chanel中的數據發送到目的地。 
只有成功發送之后chanel中的數據才會被刪除。 
首先書寫flume配置文件,定義agent、source、chanel和sink然后將其組裝,執行flume-ng命令。

 

10、Hbase行健列族的概念,物理模型,表的設計原則? 

行健:是hbase表自帶的,每個行健對應一條數據。 
列族:是創建表時指定的,為列的集合,每個列族作為一個文件單獨存儲,存儲的數據都是字節數組,其中的數據可以有很多,通過時間戳來區分。 
物理模型:整個hbase表會拆分為多個region,每個region記錄着行健的起始點保存在不同的節點上,查詢時就是對各個節點的並行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又可以存儲.META的起始點。 
rowkey的設計原則:各個列簇數據平衡,長度原則、相鄰原則,創建表的時候設置表放入regionserver緩存中,避免自動增長和時間,使用字節數組代替string,最大長度64kb,最好16字節以內,按天分表,兩個字節散列,四個字節存儲時分毫秒。 
列族的設計原則:盡可能少(按照列族進行存儲,按照region進行讀取,不必要的io操作),經常和不經常使用的兩類數據放入不同列族中,列族名字盡可能短。

 

11、Spark Streaming和Storm有何區別? 

    一個實時毫秒一個准實時亞秒,不過storm的吞吐率比較低。

 

12、mllib支持的算法? 
    大體分為四大類,分類、聚類、回歸、協同過濾。

 

13、Hadoop高並發? 

    首先肯定要保證集群的高可靠性,在高並發的情況下不會掛掉,支撐不住可以通過橫向擴展。 
    datanode掛掉了使用hadoop腳本重新啟動。

 

14、RDD機制? 
    rdd分布式彈性數據集,簡單的理解成一種數據結構,是spark框架上的通用貨幣。 
    所有算子都是基於rdd來執行的,不同的場景會有不同的rdd實現類,但是都可以進行互相轉換。 
    rdd執行過程中會形成dag圖,然后形成lineage保證容錯性等。 
    從物理的角度來看rdd存儲的是block和node之間的映射。

 

15、spark有哪些組件? 
   (1)master:管理集群和節點,不參與計算。 
   (2)worker:計算節點,進程本身不參與計算,和master匯報。 
   (3)Driver:運行程序的main方法,創建spark context對象。 
   (4)spark context:控制整個application的生命周期,包括dagsheduler和task scheduler等組件。 
   (5)client:用戶提交程序的入口。

 

16、spark的優化怎么做? 
    通過spark-env文件、程序中sparkconf和set property設置。 
      (1)計算量大,形成的lineage過大應該給已經緩存了的rdd添加checkpoint,以減少容錯帶來的開銷。 
      (2)小分區合並,過小的分區造成過多的切換任務開銷,使用repartition。

 

17、kafka工作原理? 

producer向broker發送事件,consumer從broker消費事件。 
事件由topic區分開,每個consumer都會屬於一個group。 
相同group中的consumer不能重復消費事件,而同一事件將會發送給每個不同group的consumer。

 


免責聲明!

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



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