教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

面試題之hadoop相關(guān)

更新時間:2018年10月24日15時59分 來源:傳智播客 瀏覽次數(shù):

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

  首先map task會從本地文件系統(tǒng)讀取數(shù)據(jù),轉(zhuǎn)換成key-value形式的鍵值對集合

  使用的是hadoop內(nèi)置的數(shù)據(jù)類型,比如longwritable、text等

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

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

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

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

  reduce task會通過網(wǎng)絡將各個數(shù)據(jù)收集進行reduce處理,最后將數(shù)據(jù)保存或者顯示,結(jié)束整個job

  2、hadoop的TextInputFormat作用是什么,如何自定義實現(xiàn)

  InputFormat會在map操作之前對數(shù)據(jù)進行兩方面的預處理

  1是getSplits,返回的是InputSplit數(shù)組,對數(shù)據(jù)進行split分片,每片交給map操作一次

  2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉(zhuǎn)換為key-value鍵值對格式傳遞給map

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

  自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法

  在createRecordReader中可以自定義分隔符

  3、hadoop和spark的都是并行計算,那么他們有什么相同和區(qū)別

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

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

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

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

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

  4、為什么要用flume導入hdfs,hdfs的構(gòu)架是怎樣的

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

  文件都是存儲在datanode上面的,namenode記錄著datanode的元數(shù)據(jù)信息,而namenode的元數(shù)據(jù)信息是存在內(nèi)存中的,所以當文件切片很小或者很多的時候會卡死

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

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

  這是因為這幾個reduce中的處理的數(shù)據(jù)要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數(shù)據(jù)傾斜

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

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

  hadoop:map端保存分片數(shù)據(jù),通過網(wǎng)絡收集到reduce端

  spark:spark的shuffle是在DAGSchedular劃分Stage的時候產(chǎn)生的,TaskSchedule要分發(fā)Stage到各個worker的executor,減少shuffle可以提高性能

  7、Hive中存放是什么?

  表(數(shù)據(jù)+元數(shù)據(jù))。 存的是和hdfs的映射關(guān)系,hive是邏輯上的數(shù)據(jù)倉庫,實際操作的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序。

  8、Hive與關(guān)系型數(shù)據(jù)庫的關(guān)系?

  沒有關(guān)系,hive是數(shù)據(jù)倉庫,不能和數(shù)據(jù)庫一樣進行實時的CURD操作。

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

  9、Flume工作機制是什么?

  核心概念是agent,里面包括source、chanel和sink三個組件。

  source運行在日志收集節(jié)點進行日志采集,之后臨時存儲在chanel中,sink負責將chanel中的數(shù)據(jù)發(fā)送到目的地。

  只有成功發(fā)送之后chanel中的數(shù)據(jù)才會被刪除。

  首先書寫flume配置文件,定義agent、source、chanel和sink然后將其組裝,執(zhí)行flume-ng命令。

  10、Sqoop工作原理是什么?

  hadoop生態(tài)圈上的數(shù)據(jù)傳輸工具。

  可以將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)導入非結(jié)構(gòu)化的hdfs、hive或者bbase中,也可以將hdfs中的數(shù)據(jù)導出到關(guān)系型數(shù)據(jù)庫或者文本文件中。

  使用的是mr程序來執(zhí)行任務,使用jdbc和關(guān)系型數(shù)據(jù)庫進行交互。

  import原理:通過指定的分隔符進行數(shù)據(jù)切分,將分片傳入各個map中,在map任務中在每行數(shù)據(jù)進行寫入處理沒有reduce。

  export原理:根據(jù)要操作的表名生成一個java類,并讀取其元數(shù)據(jù)信息和分隔符對非結(jié)構(gòu)化的數(shù)據(jù)進行匹配,多個map作業(yè)同時執(zhí)行寫入關(guān)系型數(shù)據(jù)庫

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

  行?。菏莌base表自帶的,每個行健對應一條數(shù)據(jù)。

  列族:是創(chuàng)建表時指定的,為列的集合,每個列族作為一個文件單獨存儲,存儲的數(shù)據(jù)都是字節(jié)數(shù)組,其中的數(shù)據(jù)可以有很多,通過時間戳來區(qū)分。

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

  rowkey的設計原則:各個列簇數(shù)據(jù)平衡,長度原則、相鄰原則,創(chuàng)建表的時候設置表放入regionserver緩存中,避免自動增長和時間,使用字節(jié)數(shù)組代替string,最大長度64kb,最好16字節(jié)以內(nèi),按天分表,兩個字節(jié)散列,四個字節(jié)存儲時分毫秒。

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

  12、combiner和partition的作用

  combiner是reduce的實現(xiàn),在map端運行計算任務,減少map端的輸出數(shù)據(jù)。

  作用就是優(yōu)化。

  但是combiner的使用場景是mapreduce的map輸出結(jié)果和reduce輸入輸出一樣。

  partition的默認實現(xiàn)是hashpartition,是map端將數(shù)據(jù)按照reduce個數(shù)取余,進行分區(qū),不同的reduce來copy自己的數(shù)據(jù)。

  partition的作用是將數(shù)據(jù)分到不同的reduce進行計算,加快計算效果

  13、mllib支持的算法?

  大體分為四大類,分類、聚類、回歸、協(xié)同過濾。

  15、Hadoop平臺集群配置、環(huán)境變量設置?

  zookeeper:修改zoo.cfg文件,配置dataDir,和各個zk節(jié)點的server地址端口,tickTime心跳時間默認是2000ms,其他超時的時間都是以這個為基礎的整數(shù)倍,之后再dataDir對應目錄下寫入myid文件和zoo.cfg中的server相對應。

  hadoop:修改

  hadoop-env.sh配置java環(huán)境變量

  core-site.xml配置zk地址,臨時目錄等

  hdfs-site.xml配置nn信息,rpc和http通信地址,nn自動切換、zk連接超時時間等

  yarn-site.xml配置resourcemanager地址

  mapred-site.xml配置使用yarn

  slaves配置節(jié)點信息

  格式化nn和zk。

  hbase:修改

  hbase-env.sh配置java環(huán)境變量和是否使用自帶的zk

  hbase-site.xml配置hdfs上數(shù)據(jù)存放路徑,zk地址和通訊超時時間、master節(jié)點

  regionservers配置各個region節(jié)點

  zoo.cfg拷貝到conf目錄下

  spark:

  安裝Scala

  修改spark-env.sh配置環(huán)境變量和master和worker節(jié)點配置信息

  環(huán)境變量的設置:直接在/etc/profile中配置安裝的路徑即可,或者在當前用戶的宿主目錄下,配置在.bashrc文件中,該文件不用source重新打開shell窗口即可,配置在.bash_profile的話只對當前用戶有效。

  16、Hadoop性能調(diào)優(yōu)?

  調(diào)優(yōu)可以通過系統(tǒng)配置、程序編寫和作業(yè)調(diào)度算法來進行。

  hdfs的block.size可以調(diào)到128/256(網(wǎng)絡很好的情況下,默認為64)

  調(diào)優(yōu)的大頭:mapred.map.tasks、mapred.reduce.tasks設置mr任務數(shù)(默認都是1)

  mapred.tasktracker.map.tasks.maximum每臺機器上的最大map任務數(shù)

  mapred.tasktracker.reduce.tasks.maximum每臺機器上的最大reduce任務數(shù)

  mapred.reduce.slowstart.completed.maps配置reduce任務在map任務完成到百分之幾的時候開始進入

  這個幾個參數(shù)要看實際節(jié)點的情況進行配置,reduce任務是在33%的時候完成copy,要在這之前完成map任務,(map可以提前完成)

  mapred.compress.map.output,mapred.output.compress配置壓縮項,消耗cpu提升網(wǎng)絡和磁盤io

  合理利用combiner

  注意重用writable對象

  17、Hadoop高并發(fā)?

  首先肯定要保證集群的高可靠性,在高并發(fā)的情況下不會掛掉,支撐不住可以通過橫向擴展。

  datanode掛掉了使用hadoop腳本重新啟動。

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

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

  這是因為這幾個reduce中的處理的數(shù)據(jù)要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數(shù)據(jù)傾斜。

  解決的方法可以在分區(qū)的時候重新定義分區(qū)規(guī)則對于value數(shù)據(jù)很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數(shù)據(jù)預處理的操作。



作者:傳智播客大數(shù)據(jù)培訓學院
首發(fā):http://cloud.itcast.cn

0 分享到:
和我們在線交談!