Hadoop的回顧以及面試試題
以下是試題及總結
1. Hadoop集群SafeMode模式
SafeMode又稱Hadoop安全模式是hadoop的一種保護機制,用於保證集群中的數據塊的安全性。
在安全模式下不允許客戶端進行任何修改文件的操作,包括上傳文件,刪除文件,重命名,創建文件夾等操作 雖然不能進行修改文件的操作,但是可以瀏覽目錄結構、查看文件內容的。
在命令行下是可以控制安全模式的進入、退出和查看的。
命令 hadoop fs -safemode get — 查看安全模式狀態
命令 hadoop fs -safemode enter — 進入安全模式狀態
命令 hadoop fs -safemode leave — 離開安全模式
2.hive的理解
hive是建立在hadoop上的數據倉庫基礎架構(framework)。這是一種可以儲存、查詢和分析儲存在hadoop中的大規模數據的機制。hive定義了簡單的類sql查詢語言,也稱hql,它允許熟悉sql的用戶查詢數據。
hive是sql解析引擎,它將sql語句轉譯成M/R job在hadoop執行
語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
hive是sql解析引擎,它將sql語句轉譯成M/R job在hadoop執行
語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
3.是否可以在Windows上運行Hadoop?
答案是肯定的,可以在Windows上運行Hadoop,因為Hadoop底層實現語言是Java,所以我們在運行Hadoop時是需要Java運行環境的。
在此附上安裝教程 https://blog.csdn.net/u010993514/article/details/82914827
在此附上安裝教程 https://blog.csdn.net/u010993514/article/details/82914827
4.MapReduce的執行流程
1)MapTask收集我們的map()方法輸出的kv對,放到內存緩沖區中
2)從內存緩沖區不斷溢出本地磁盤文件,可能會溢出多個文件
3)多個溢出文件會被合並成大的溢出文件
4)在溢出過程及合並的過程中,都要調用Partitioner進行分區和針對key進行排序
5)ReduceTask根據自己的分區號,去各個MapTask機器上取相應的結果分區數據
6)ReduceTask會取到同一個分區的來自不同MapTask的結果文件,ReduceTask會將這些文件再進行合並(歸並排序)
7)合並成大文件后,Shuffle的過程也就結束了,后面進入ReduceTask的邏輯運算過程(從文件中取出一個一個的鍵值對Group,調用用戶自定義的reduce()方法)
5.TextInputFormat怎么進行文件切分的
分片大小是由block塊大小決定的,和它的大小一樣。比如把一個258MB的文件上傳到HDFS上,block塊大小是128MB,那么它就會被分成三個block塊,與之對應產生三個split,所以最終會產生三個map task。第三個block塊里存的文件大小只有2MB,而它的block塊大小是128MB,它實際占用Linux file system的空間根據文件大小來決定,而非一個塊的大小
6.假如Namenode中沒有數據會怎么樣?
如果Namenode 中沒有數據那么你的datanode中就算有文件,也會找不到數據
因為namenode元數據丟失,導致name不知道文件位置,也不知道有文件
7.如何實現服務器之間的免密登錄(便捷版),SSH采用的是什么加密?
1)實現服務器之間的免密登錄
1)MapTask收集我們的map()方法輸出的kv對,放到內存緩沖區中
2)從內存緩沖區不斷溢出本地磁盤文件,可能會溢出多個文件
3)多個溢出文件會被合並成大的溢出文件
4)在溢出過程及合並的過程中,都要調用Partitioner進行分區和針對key進行排序
5)ReduceTask根據自己的分區號,去各個MapTask機器上取相應的結果分區數據
6)ReduceTask會取到同一個分區的來自不同MapTask的結果文件,ReduceTask會將這些文件再進行合並(歸並排序)
7)合並成大文件后,Shuffle的過程也就結束了,后面進入ReduceTask的邏輯運算過程(從文件中取出一個一個的鍵值對Group,調用用戶自定義的reduce()方法)
5.TextInputFormat怎么進行文件切分的
分片大小是由block塊大小決定的,和它的大小一樣。比如把一個258MB的文件上傳到HDFS上,block塊大小是128MB,那么它就會被分成三個block塊,與之對應產生三個split,所以最終會產生三個map task。第三個block塊里存的文件大小只有2MB,而它的block塊大小是128MB,它實際占用Linux file system的空間根據文件大小來決定,而非一個塊的大小
6.假如Namenode中沒有數據會怎么樣?
如果Namenode 中沒有數據那么你的datanode中就算有文件,也會找不到數據
因為namenode元數據丟失,導致name不知道文件位置,也不知道有文件
7.如何實現服務器之間的免密登錄(便捷版),SSH采用的是什么加密?
1)實現服務器之間的免密登錄
我們使用ssh-keygen在ServerA上生成private和public密鑰,將生成的public密鑰拷貝到遠程機器ServerB上后,就可以使用ssh命令無需密碼登錄到另外一台機器ServerB上。
在linux系統中,ssh是遠程登錄的默認工具,因為該工具的協議使用了RSA/DSA的加密算法【默認是DSR算法】,該工具做linux系統的遠程管理是非常安全的。
2)ssh采用兩種加密方式
第一種級別(基於口令的安全驗證),只要你知道自己帳號和口令,就可以登錄到遠程主機。
第二種級別(基於密匙的安全驗證)需要依靠密匙
Ssh采用非對稱式加密
生成公鑰和私鑰:
[jinghang@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免密登錄的目標機器上
將公鑰拷貝到要免密登錄的目標機器上
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop102
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop103
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop104
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop103
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop104
8.簡單描述MapReduce不合適對哪些場景的使用?
數據規模在TB/PB以下的應用不適合
對實時計算的支持不是很好
主要數據結構是圖或網絡的應用不適合。圖這樣的數據結構中包含着各種隱性的關系, 如圖的邊、子樹 、節點之間的父子關系、權重等,而且這些關系並非都能在圖中一個結點上表示。這樣的特性就要求處理圖的算法要在每一次的迭代計算中加入當前圖的完整或部分的信息。 這樣的算法基本上用MapReduce的框架是不可能實現的,即便能夠實現也會是一種很迂回的解決方案。)
純數學計算的應用不適合. 一個數學上的例子就是斐波那契數列的計算。 某些機器學習的算法,如梯度和較大期望等,也不是很適合使用MapReduce的模式。
對實時計算的支持不是很好
主要數據結構是圖或網絡的應用不適合。圖這樣的數據結構中包含着各種隱性的關系, 如圖的邊、子樹 、節點之間的父子關系、權重等,而且這些關系並非都能在圖中一個結點上表示。這樣的特性就要求處理圖的算法要在每一次的迭代計算中加入當前圖的完整或部分的信息。 這樣的算法基本上用MapReduce的框架是不可能實現的,即便能夠實現也會是一種很迂回的解決方案。)
純數學計算的應用不適合. 一個數學上的例子就是斐波那契數列的計算。 某些機器學習的算法,如梯度和較大期望等,也不是很適合使用MapReduce的模式。
9.MapReduce的基本數據類型包括哪些?
BooleanWriable:標准布爾型數
ByteWriable:單字節數
DoubleWriable:雙字節數值
FloatWriable:浮點數
IntWriable:整型數
LongWriable:長整型數
Text:使用UTF8格式存儲的文本
NullWriable:當<key,value>中的key或value為空時使用
10.Hive內部表和外部表的區別?
內部表 : 當我們在hive中使用命令刪除hive表時 hive所對應的hdfs的目錄
也會被刪除 元數據庫中的數據 也被刪除
外部表 : 在hive中刪除了外部表 而外部表所對應的hdfs目錄不會被刪除 元數據庫被刪除。
也會被刪除 元數據庫中的數據 也被刪除
外部表 : 在hive中刪除了外部表 而外部表所對應的hdfs目錄不會被刪除 元數據庫被刪除。
11.yarn有哪幾部分組成,作用分別是什么?調度器主要有哪三種,hadoop默認的是哪一種?
a)Yarn主要由ResourceManager、NodeManager、ApplicationMaster、和Container組成。
1)ResourceManager的作用如下:
1.處理客戶端的請求
2.監控NodeManager
3.啟動或監控ApplicationMaster
4.資源分配與調度
1234
2)NodeManager的作用如下:
1.管理單個節點上的資源
2.處理來自ResourceManager的命令
3.處理來自ApplicationMaster的命令
123
3)ApplicationMaster的作用如下:
1.負責數據的切分
2.為應用程序申請資源並分配給內部的任務
3.任務的監控與容錯
123
b)調度器主要有 Fair Scheduler,Capacity Scheduler,FIFO Scheduler 默認使用的是Capacity Scheduler容量調度器。
12.如果需要在namenode節點群起集群,你需要如何配置?
1)准備3台客戶機(關閉防火牆、靜態ip、主機名稱)
2)安裝JDK
3)配置普通用戶具有root權限
4)安裝Hadoop
5)配置環境變量
6)配置集群
7)單點啟動
8)配置ssh
9)群起並測試集群
13.簡單描述Shuffle過程環形緩沖區的作用?
環形緩沖區(字節數組實現),用於存儲任務的輸出。默認是100M,這其中80%的容量用來緩存,當這部分容量滿了的時候會啟動一個溢出線程進行溢出操作,寫入磁盤形成溢寫文件;在溢出的過程中剩余的20%對新生產的數據繼續緩存。【簡單來說就是別讀邊寫】但如果再次期間緩沖區被填滿,map會阻塞直到寫磁盤過程完成。
14.Mapreduce執行過程中,在執行Reduce Task之前主要做哪些工作?
reduce task在執行之前的工作是不斷地拉取當前job里每個map task的最終的輸出文件,然后將不同maptask中某一分區的數據不斷地做merge,也最終形成一個文件作為reduce task的輸入文件交給reduce
15.簡答描述一下hive中的分區表
分區表實際上就是對應一個HDFS文件系統上的獨立的文件夾,該文件夾下是該分區所有的數據文件。Hive中的分區就是分目錄,把一個大的數據集根據業務需要分割成小的數據集。在查詢時通過WHERE子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。
16.hdfs-site.xml的3個主要屬性?
dfs.name.dir決定的是元數據存儲的路徑以及DFS的存儲方式(磁盤或是遠端)
dfs.data.dir決定的是數據存儲的路徑
fs.checkpoint.dir用於第二Namenode
17.完全分布模式有什么注意點?
密鑰同步,etc下的profile文件,同步配置文件
18.Hadoop集群可以運行的3個模式?
a)Yarn主要由ResourceManager、NodeManager、ApplicationMaster、和Container組成。
1)ResourceManager的作用如下:
1.處理客戶端的請求
2.監控NodeManager
3.啟動或監控ApplicationMaster
4.資源分配與調度
1234
2)NodeManager的作用如下:
1.管理單個節點上的資源
2.處理來自ResourceManager的命令
3.處理來自ApplicationMaster的命令
123
3)ApplicationMaster的作用如下:
1.負責數據的切分
2.為應用程序申請資源並分配給內部的任務
3.任務的監控與容錯
123
b)調度器主要有 Fair Scheduler,Capacity Scheduler,FIFO Scheduler 默認使用的是Capacity Scheduler容量調度器。
12.如果需要在namenode節點群起集群,你需要如何配置?
1)准備3台客戶機(關閉防火牆、靜態ip、主機名稱)
2)安裝JDK
3)配置普通用戶具有root權限
4)安裝Hadoop
5)配置環境變量
6)配置集群
7)單點啟動
8)配置ssh
9)群起並測試集群
13.簡單描述Shuffle過程環形緩沖區的作用?
環形緩沖區(字節數組實現),用於存儲任務的輸出。默認是100M,這其中80%的容量用來緩存,當這部分容量滿了的時候會啟動一個溢出線程進行溢出操作,寫入磁盤形成溢寫文件;在溢出的過程中剩余的20%對新生產的數據繼續緩存。【簡單來說就是別讀邊寫】但如果再次期間緩沖區被填滿,map會阻塞直到寫磁盤過程完成。
14.Mapreduce執行過程中,在執行Reduce Task之前主要做哪些工作?
reduce task在執行之前的工作是不斷地拉取當前job里每個map task的最終的輸出文件,然后將不同maptask中某一分區的數據不斷地做merge,也最終形成一個文件作為reduce task的輸入文件交給reduce
15.簡答描述一下hive中的分區表
分區表實際上就是對應一個HDFS文件系統上的獨立的文件夾,該文件夾下是該分區所有的數據文件。Hive中的分區就是分目錄,把一個大的數據集根據業務需要分割成小的數據集。在查詢時通過WHERE子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。
16.hdfs-site.xml的3個主要屬性?
dfs.name.dir決定的是元數據存儲的路徑以及DFS的存儲方式(磁盤或是遠端)
dfs.data.dir決定的是數據存儲的路徑
fs.checkpoint.dir用於第二Namenode
17.完全分布模式有什么注意點?
密鑰同步,etc下的profile文件,同步配置文件
18.Hadoop集群可以運行的3個模式?
1、單機(本地)模式:這種模式在一台單機上運行,沒有分布式文件系統,而是直接讀寫本地操作系統的文件系統。在單機模式(standalone)中不會存在守護進程,所有東西都運行在一個JVM上。這里同樣沒有DFS,使用的是本地文件系統。單機模式適用於開發過程中運行MapReduce程序,這也是最少使用的一個模式。
2、偽分布式模式:也是在一台單機上運行,但用不同的Java進程模仿分布式運行中的各類結(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode),偽分布式(Pseudo)適用於開發和測試環境,在這個模式中,所有守護進程都在
一台機器上運行。
全分布式模式:全分布模式通常被用於生產環境,使用N台主機組成一個Hadoop集群,Hadoop守護進程運行在每台主機之上。這里會存在Namenode運行的主機,Datanode運行的主機,以及tasktracker運行的主機。在分布式環境下,主節點和從節點會分開。
19.用一句話總結Combiner的作用和意義?
為了減少傳輸到Reduce中的數據量。它主要是為了削減Mapper的輸出從而減少網絡帶寬和Reducer之上的負載。
20.是否可以自行搭建Hadoop集群,請簡述基本搭建流程?
1)安裝JDK並配置環境變量(/etc/profile)
2)關閉防火牆
3)配置hosts文件,方便hadoop通過主機名訪問(/etc
/hosts)
4)設置ssh免密碼登錄
5)解壓縮hadoop安裝包,並配置環境變量
6)修改配置文件、設置java jdk路徑和相關的節點配置
(HADOOPHOME/etc/hadoop)7)第一−次啟動需要格式化hdfs文件系統(hadoopnamenode−format)8)啟動hadoop集群,可單點啟動,可群起(HADOOPHOME/etc/hadoop)7)第一−次啟動需要格式化hdfs文件系統(hadoopnamenode−format)8)啟動hadoop集群,可單點啟動,可群起( HADOOP_ HOME/etc/hadoop)7)第一-次啟動需要格式化hdfs文件系統(hadoop namenode-format)8)啟動hadoop集群,可單點啟動,可群起(HADOOPHOME/etc/hadoop)7)第一−次啟動需要格式化hdfs文件系統(hadoopnamenode−format)8)啟動hadoop集群,可單點啟動,可群起(HADOOP_ HOME/sbin/start-dfs.sh
$HADOOP_ HOME/sbin/start-yarn.sh)
9)使用jps查看節點進程
20.用shell腳本完成如下功能,求極值,根據輸入數據,輸出最大,最小值(達到手寫的程度)
#!/bin/bash
max=$1
min=$1
for x in $@
do
if [ $max -lt $x ]
then
max=$x
fi
if [ $min -gt $x ]
then
min=$x
fi
done
echo $max
echo $min
12345678910111213141516
21…編寫一個最基本的wordcount單詞統計的mapreduce
map端
Public class WDmapper extends Mapper<LongWritable,Text,Text,IntWritable> {
private Text text=new Text();
private IntWritable one =new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line=value.toString();
String [] fields=line.split(" ");
for(String field:fields){
this.text.set(field);
context.write(this.text,one);
}
為了減少傳輸到Reduce中的數據量。它主要是為了削減Mapper的輸出從而減少網絡帶寬和Reducer之上的負載。
20.是否可以自行搭建Hadoop集群,請簡述基本搭建流程?
1)安裝JDK並配置環境變量(/etc/profile)
2)關閉防火牆
3)配置hosts文件,方便hadoop通過主機名訪問(/etc
/hosts)
4)設置ssh免密碼登錄
5)解壓縮hadoop安裝包,並配置環境變量
6)修改配置文件、設置java jdk路徑和相關的節點配置
(HADOOPHOME/etc/hadoop)7)第一−次啟動需要格式化hdfs文件系統(hadoopnamenode−format)8)啟動hadoop集群,可單點啟動,可群起(HADOOPHOME/etc/hadoop)7)第一−次啟動需要格式化hdfs文件系統(hadoopnamenode−format)8)啟動hadoop集群,可單點啟動,可群起( HADOOP_ HOME/etc/hadoop)7)第一-次啟動需要格式化hdfs文件系統(hadoop namenode-format)8)啟動hadoop集群,可單點啟動,可群起(HADOOPHOME/etc/hadoop)7)第一−次啟動需要格式化hdfs文件系統(hadoopnamenode−format)8)啟動hadoop集群,可單點啟動,可群起(HADOOP_ HOME/sbin/start-dfs.sh
$HADOOP_ HOME/sbin/start-yarn.sh)
9)使用jps查看節點進程
20.用shell腳本完成如下功能,求極值,根據輸入數據,輸出最大,最小值(達到手寫的程度)
#!/bin/bash
max=$1
min=$1
for x in $@
do
if [ $max -lt $x ]
then
max=$x
fi
if [ $min -gt $x ]
then
min=$x
fi
done
echo $max
echo $min
12345678910111213141516
21…編寫一個最基本的wordcount單詞統計的mapreduce
map端
Public class WDmapper extends Mapper<LongWritable,Text,Text,IntWritable> {
private Text text=new Text();
private IntWritable one =new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line=value.toString();
String [] fields=line.split(" ");
for(String field:fields){
this.text.set(field);
context.write(this.text,one);
}
}
}
}