Hadoop/Spark相關面試問題總結

擊水三千里發表於2019-02-15

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可以提高效能

部分答案不是十分準確歡迎補充:-)

——-補充更新———

1、Hive中存放是什麼? 
表。 
存的是和hdfs的對映關係,hive是邏輯上的資料倉儲,實際操作的都是hdfs上的檔案,HQL就是用sql語法來寫的mr程式。

2、Hive與關係型資料庫的關係? 
沒有關係,hive是資料倉儲,不能和資料庫一樣進行實時的CURD操作。 
是一次寫入多次讀取的操作,可以看成是ETL工具。

3、Flume工作機制是什麼? 
核心概念是agent,裡面包括source、chanel和sink三個元件。 
source執行在日誌收集節點進行日誌採集,之後臨時儲存在chanel中,sink負責將chanel中的資料傳送到目的地。 
只有成功傳送之後chanel中的資料才會被刪除。 
首先書寫flume配置檔案,定義agent、source、chanel和sink然後將其組裝,執行flume-ng命令。

4、Sqoop工作原理是什麼? 
hadoop生態圈上的資料傳輸工具。 
可以將關係型資料庫的資料匯入非結構化的hdfs、hive或者bbase中,也可以將hdfs中的資料匯出到關係型資料庫或者文字檔案中。 
使用的是mr程式來執行任務,使用jdbc和關係型資料庫進行互動。 
import原理:通過指定的分隔符進行資料切分,將分片傳入各個map中,在map任務中在每行資料進行寫入處理沒有reduce。 
export原理:根據要操作的表名生成一個java類,並讀取其後設資料資訊和分隔符對非結構化的資料進行匹配,多個map作業同時執行寫入關係型資料庫

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

6、Spark Streaming和Storm有何區別? 
一個實時毫秒一個準實時亞秒,不過storm的吞吐率比較低。

 

7、Hadoop平臺叢集配置、環境變數設定? 
zookeeper:修改zoo.cfg檔案,配置dataDir,和各個zk節點的server地址埠,tickTime心跳時間預設是2000ms,其他超時的時間都是以這個為基礎的整數倍,之後再dataDir對應目錄下寫入myid檔案和zoo.cfg中的server相對應。

hadoop:修改 
hadoop-env.sh配置java環境變數 
core-site.xml配置zk地址,臨時目錄等 
hdfs-site.xml配置nn資訊,rpc和http通訊地址,nn自動切換、zk連線超時時間等 
yarn-site.xml配置resourcemanager地址 
mapred-site.xml配置使用yarn 
slaves配置節點資訊 
格式化nn和zk。

hbase:修改 
hbase-env.sh配置java環境變數和是否使用自帶的zk 
hbase-site.xml配置hdfs上資料存放路徑,zk地址和通訊超時時間、master節點 
regionservers配置各個region節點 
zoo.cfg拷貝到conf目錄下

spark: 
安裝Scala 
修改spark-env.sh配置環境變數和master和worker節點配置資訊

環境變數的設定:直接在/etc/profile中配置安裝的路徑即可,或者在當前使用者的宿主目錄下,配置在.bashrc檔案中,該檔案不用source重新開啟shell視窗即可,配置在.bash_profile的話只對當前使用者有效。

8、Hadoop效能調優?

調優可以通過系統配置、程式編寫和作業排程演算法來進行。 
hdfs的block.size可以調到128/256(網路很好的情況下,預設為64) 
調優的大頭:mapred.map.tasks、mapred.reduce.tasks設定mr任務數(預設都是1) 
mapred.tasktracker.map.tasks.maximum每臺機器上的最大map任務數 
mapred.tasktracker.reduce.tasks.maximum每臺機器上的最大reduce任務數 
mapred.reduce.slowstart.completed.maps配置reduce任務在map任務完成到百分之幾的時候開始進入 
這個幾個引數要看實際節點的情況進行配置,reduce任務是在33%的時候完成copy,要在這之前完成map任務,(map可以提前完成) 
mapred.compress.map.output,mapred.output.compress配置壓縮項,消耗cpu提升網路和磁碟io 
合理利用combiner 
注意重用writable物件

9、Hadoop高併發? 
首先肯定要保證叢集的高可靠性,在高併發的情況下不會掛掉,支撐不住可以通過橫向擴充套件。 
datanode掛掉了使用hadoop指令碼重新啟動。

 

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

11、spark有哪些元件? 
(1)master:管理叢集和節點,不參與計算。 
(2)worker:計算節點,程式本身不參與計算,和master彙報。 
(3)Driver:執行程式的main方法,建立spark context物件。 
(4)spark context:控制整個application的生命週期,包括dagsheduler和task scheduler等元件。 
(5)client:使用者提交程式的入口。

12、spark工作機制? 
使用者在client端提交作業後,會由Driver執行main方法並建立spark context上下文。 
執行rdd運算元,形成dag圖輸入dagscheduler,按照rdd之間的依賴關係劃分stage輸入task scheduler。 
task scheduler會將stage劃分為task set分發到各個節點的executor中執行。

13、spark的優化怎麼做? 
通過spark-env檔案、程式中sparkconf和set property設定。 
(1)計算量大,形成的lineage過大應該給已經快取了的rdd新增checkpoint,以減少容錯帶來的開銷。 
(2)小分割槽合併,過小的分割槽造成過多的切換任務開銷,使用repartition。

14、kafka工作原理? 
producer向broker傳送事件,consumer從broker消費事件。 
事件由topic區分開,每個consumer都會屬於一個group。 
相同group中的consumer不能重複消費事件,而同一事件將會傳送給每個不同group的consumer。

 

 

相關文章