對於正在找大數據相關工作的同學們來說,面試時遇到什麼問題纔是他們最關心的。在下文中,本文專門蒐集了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
相關閱讀: