蒐集的86道hadoop面試真題

對於正在找大數據相關工作的同學們來說,面試時遇到什麼問題纔是他們最關心的。在下文中,本文專門蒐集了86道hadoop面試時出現過的題目,希望助同學們面試一臂之力。

1.0   簡要描述如何安裝配置apache的一個開源hadoop,只描述即可,無需列出具體步驟,列出具體步驟更好。

答:

1使用root賬戶登錄

2 修改IP

3 修改host主機名

4 配置SSH免密碼登錄

5 關閉防火牆

6  安裝JDK

7 解壓hadoop安裝包

8 配置hadoop的核心文件 hadoop-env.sh,core-site.xml , mapred-site.xml , hdfs-site.xml

9 配置hadoop環境變量

10 格式化 hadoop namenode-format

11 啓動節點start-all.sh

 

2.0 請列出正常的hadoop集羣中hadoop都分別需要啓動 哪些進程,他們的作用分別都是什麼,請儘量列的詳細一些。

       答:namenode:負責管理hdfs中文件塊的元數據,響應客戶端請求,管理datanode上文件block的均衡,維持副本數量

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

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

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

Tasktracker: 執行JobTracker分配的任務。

Resourcemanager

Nodemanager

Journalnode

Zookeeper

Zkfc

 

3.0請寫出以下的shell命令 

1)殺死一個job

2)刪除hdfs上的 /tmp/aaa目錄

3)加入一個新的存儲節點和刪除一個節點需要執行的命令

答:(1)hadoop job –list   得到job的id,然後執      行 hadoop job  -kill  jobId就可以殺死一個指定jobId的job工作了。

2)hadoopfs  -rmr /tmp/aaa

(3)  增加一個新的節點在新的幾點上執行

            Hadoop  daemon.sh start  datanode

                     Hadooop daemon.sh  start  tasktracker/nodemanager

 

下線時,要在conf目錄下的excludes文件中列出要下線的datanode機器主機名

              然後在主節點中執行  hadoop  dfsadmin  -refreshnodes  à下線一個datanode

刪除一個節點的時候,只需要在主節點執行

 hadoop mradmin -refreshnodes  ---à下線一個tasktracker/nodemanager

 

4.0      請列出你所知道的hadoop調度器,並簡要說明其工作方法

答:Fifo schedular :默認,先進先出的原則

Capacity schedular :計算能力調度器,選擇佔用最小、優先級高的先執行,依此類推。

Fair schedular:公平調度,所有的 job 具有相同的資源。

 

5.0      請列出你在工作中使用過的開發mapreduce的語言

答:java,hive,(python,c++)hadoop streaming

 

6.0      當前日誌採樣格式爲

           a , b , c , d

           b , b , f , e

           a , a , c , f        

請你用最熟悉的語言編寫mapreduce,計算第四列每個元素出現的個數

 

答:

public classWordCount1 {

       public static final String INPUT_PATH ="hdfs://hadoop0:9000/in";

       public static final String OUT_PATH ="hdfs://hadoop0:9000/out";

       public static void main(String[] args)throws Exception {

              Configuration conf = newConfiguration();

              FileSystem fileSystem =FileSystem.get(conf);

              if(fileSystem.exists(newPath(OUT_PATH))){}

              fileSystem.delete(newPath(OUT_PATH),true);

              Job job = newJob(conf,WordCount1.class.getSimpleName());

              //1.0讀取文件,解析成key,value對

              FileInputFormat.setInputPaths(job,newPath(INPUT_PATH));

              //2.0寫上自己的邏輯,對輸入的可以,value進行處理,轉換成新的key,value對進行輸出

              job.setMapperClass(MyMapper.class);

              job.setMapOutputKeyClass(Text.class);

              job.setMapOutputValueClass(LongWritable.class);

              //3.0對輸出後的數據進行分區

              //4.0對分區後的數據進行排序,分組,相同key的value放到一個集合中

              //5.0對分組後的數據進行規約

              //6.0對通過網絡將map輸出的數據拷貝到reduce節點

              //7.0 寫上自己的reduce函數邏輯,對map輸出的數據進行處理

              job.setReducerClass(MyReducer.class);

              job.setOutputKeyClass(Text.class);

              job.setOutputValueClass(LongWritable.class);

              FileOutputFormat.setOutputPath(job,new Path(OUT_PATH));

              job.waitForCompletion(true);

       }

       static class MyMapper extendsMapper<LongWritable, Text, Text, LongWritable>{

              @Override

              protected void map(LongWritablek1, Text v1,

                            org.apache.hadoop.mapreduce.Mapper.Contextcontext)

                            throws IOException,InterruptedException {

                     String[] split =v1.toString().split("\t");

                     for(String words :split){

                            context.write(split[3],1);

                     }

              }

       }

       static class MyReducer extends Reducer<Text,LongWritable, Text, LongWritable>{

             

              protected void reduce(Text k2,Iterable<LongWritable> v2,

                            org.apache.hadoop.mapreduce.Reducer.Contextcontext)

                            throws IOException,InterruptedException {

                     Long count = 0L;

                     for(LongWritable time :v2){

                            count += time.get();

                     }

                     context.write(v2, newLongWritable(count));

              }

       }

}

 

7.0      你認爲用java , streaming , pipe方式開發map/reduce , 各有哪些優點

就用過 java 和 hiveQL。

Java 寫 mapreduce 可以實現複雜的邏輯,如果需求簡單,則顯得繁瑣。

HiveQL 基本都是針對 hive 中的表數據進行編寫,但對複雜的邏輯(雜)很難進行實現。寫起來簡單。

 

8.0 hive有哪些方式保存元數據,各有哪些優點

              三種:自帶內嵌數據庫derby,挺小,不常用,只能用於單節點

mysql常用

上網上找了下專業名稱:single user mode..multiuser mode...remote user mode

 

9.0 請簡述hadoop怎樣實現二級排序(就是對key和value雙排序)

    第一種方法是,Reducer將給定key的所有值都緩存起來,然後對它們再做一個Reducer內排序。但是,由於Reducer需要保存給定key的所有值,可能會導致出現內存耗盡的錯誤。

第二種方法是,將值的一部分或整個值加入原始key,生成一個組合key。這兩種方法各有優勢,第一種方法編寫簡單,但併發度小,數據量大的情況下速度慢(有內存耗盡的危險),

第二種方法則是將排序的任務交給MapReduce框架shuffle,更符合Hadoop/Reduce的設計思想。這篇文章裏選擇的是第二種。我們將編寫一個Partitioner,確保擁有相同key(原始key,不包括添加的部分)的所有數據被髮往同一個Reducer,還將編寫一個Comparator,以便數據到達Reducer後即按原始key分組。

 

10.簡述hadoop實現jion的幾種方法

Map side join----大小表join的場景,可以藉助distributed cache

Reduce side join

 

11.0 請用java實現非遞歸二分查詢

1.  public class BinarySearchClass  

2.  {  

3.    

4.      public static int binary_search(int[] array, int value)  

5.      {  

6.          int beginIndex = 0;// 低位下標  

7.          int endIndex = array.length - 1;// 高位下標  

8.          int midIndex = -1;  

9.          while (beginIndex <= endIndex) {  

10.              midIndex = beginIndex + (endIndex - beginIndex) / 2;//防止溢出  

11.              if (value == array[midIndex]) {  

12.                  return midIndex;  

13.              } else if (value < array[midIndex]) {  

14.                  endIndex = midIndex - 1;  

15.              } else {  

16.                  beginIndex = midIndex + 1;  

17.              }  

18.          }  

19.          return -1;  

20.          //找到了,返回找到的數值的下標,沒找到,返回-1         

21.      }  

22.    

23.    

24.      //start 提示:自動閱卷起始唯一標識,請勿刪除或增加。  

25.      public static void main(String[] args)  

26.      {  

27.          System.out.println("Start...");  

28.          int[] myArray = new int[] { 1, 2, 3, 5, 6, 7, 8, 9 };  

29.          System.out.println("查找數字8的下標:");  

30.          System.out.println(binary_search(myArray, 8));          

31.      }  

32.      //end //提示:自動閱卷結束唯一標識,請勿刪除或增加。  

33.  }     

 

12.0 請簡述mapreduce中的combine和partition的作用

答:combiner是發生在map的最後一個階段,其原理也是一個小型的reducer,主要作用是減少輸出到reduce的數據量,緩解網絡傳輸瓶頸,提高reducer的執行效率。

partition的主要作用將map階段產生的所有kv對分配給不同的reducer task處理,可以將reduce階段的處理負載進行分攤

 

13.0 hive內部表和外部表的區別

Hive 向內部表導入數據時,會將數據移動到數據倉庫指向的路徑;若是外部表,數據的具體存放目錄由用戶建表時指定

在刪除表的時候,內部表的元數據和數據會被一起刪除, 

而外部表只刪除元數據,不刪除數據。

這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。 

 

14. Hbase的rowKey怎麼創建比較好?列簇怎麼創建比較好?

答:

rowKey最好要創建有規則的rowKey,即最好是有序的。

經常需要批量讀取的數據應該讓他們的rowkey連續;

將經常需要作爲條件查詢的關鍵詞組織到rowkey中;

 

列族的創建:

按照業務特點,把數據歸類,不同類別的放在不同列族

 

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

本質:讓各分區的數據分佈均勻

可以根據業務特點,設置合適的partition策略

如果事先根本不知道數據的分佈規律,利用隨機抽樣器抽樣後生成partition策略再處理

  

16. hadoop框架怎麼來優化

答:

可以從很多方面來進行:比如hdfs怎麼優化,mapreduce程序怎麼優化,yarn的job調度怎麼優化,hbase優化,hive優化。。。。。。。

 

17. hbase內部機制是什麼

答:

Hbase是一個能適應聯機業務的數據庫系統

物理存儲:hbase的持久化數據是存放在hdfs上

存儲管理:一個表是劃分爲很多region的,這些region分佈式地存放在很多regionserver上

Region內部還可以劃分爲store,store內部有memstore和storefile

版本管理:hbase中的數據更新本質上是不斷追加新的版本,通過compact操作來做版本間的文件合併

Region的split

集羣管理:zookeeper  + hmaster(職責)  + hregionserver(職責)

 

18. 我們在開發分佈式計算job的時候,是否可以去掉reduce階段

答:可以,例如我們的集羣就是爲了存儲文件而設計的,不涉及到數據的計算,就可以將mapReduce都省掉。

比如,流量運營項目中的行爲軌跡增強功能部分

怎麼樣才能實現去掉reduce階段

去掉之後就不排序了,不進行shuffle操作了

 

19 hadoop中常用的數據壓縮算法

答:

Lzo

Gzip

Default

Snapyy

如果要對數據進行壓縮,最好是將原始數據轉爲SequenceFile  或者 Parquet File(spark)

 

20. mapreduce的調度模式(題意模糊,可以理解爲yarn的調度模式,也可以理解爲mr的內部工作流程)

答: appmaster作爲調度主管,管理maptask和reducetask

Appmaster負責啓動、監控maptask和reducetask

Maptask處理完成之後,appmaster會監控到,然後將其輸出結果通知給reducetask,然後reducetask從map端拉取文件,然後處理;

reduce階段全部完成之後,appmaster還要向resourcemanager註銷自己

 

21. hive底層與數據庫交互原理

答:

Hive的查詢功能是由hdfs + mapreduce結合起來實現的

Hive與mysql的關係:只是借用mysql來存儲hive中的表的元數據信息,稱爲metastore

  

22. hbase過濾器實現原則

答:可以說一下過濾器的父類(比較過濾器,專用過濾器)

過濾器有什麼用途:

增強hbase查詢數據的功能

減少服務端返回給客戶端的數據量

 

23. reduce之後數據的輸出量有多大(結合具體場景,比如pi)

Sca階段的增強日誌(1.5T---2T)

過濾性質的mr程序,輸出比輸入少

解析性質的mr程序,輸出比輸入多(找共同朋友)

 

24.datanode在什麼情況下不會備份數據

答:在客戶端上傳文件時指定文件副本數量爲1

 

25.combine出現在哪個過程

答:shuffle過程中

具體來說,是在maptask輸出的數據從內存溢出到磁盤,可能會調多次

Combiner使用時候要特別謹慎,不能影響最後的邏輯結果

 

26. hdfs的體系結構

答:

集羣架構: 

namenode  datanode  secondarynamenode

 (active namenode ,standby namenode)journalnode  zkfc


內部工作機制:

數據是分佈式存儲的

對外提供一個統一的目錄結構

對外提供一個具體的響應者(namenode)

數據的block機制,副本機制

Namenode和datanode的工作職責和機制

讀寫數據流程

 

27. flush的過程

答:flush是在內存的基礎上進行的,首先寫入文件的時候,會先將文件寫到內存中,當內存寫滿的時候,一次性的將文件全部都寫到硬盤中去保存,並清空緩存中的文件,

 

28. 什麼是隊列

答:是一種調度策略,機制是先進先出

 

29. List與set的區別

答:List和Set都是接口。他們各自有自己的實現類,有無順序的實現類,也有有順序的實現類。
最大的不同就是List是可以重複的。而Set是不能重複的。
List適合經常追加數據,插入,刪除數據。但隨即取數效率比較低。
Set適合經常地隨即儲存,插入,刪除。但是在遍歷時效率比較低。

 

30.數據的三範式

答:
第一範式()無重複的列

第二範式(2NF)屬性完全依賴於主鍵  [消除部分子函數依賴]
第三範式(3NF)屬性不依賴於其它非主屬性  [消除傳遞依賴]


限於篇幅,這裏只能放一小部分題目,想測試更多的題目請自行下載。(博客後臺沒找到附件選項。。。)

http://www.dajiangtai.com/community/18468.do


相關閱讀:

98道常見Hadoop面試題及答案解析

6道hadoop面試中常見問題

Hadoop學習常見問題及答案整理

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