hadoop自我檢測(面試題)
1、hadoop是個什麼東西?
: 回答時,精髓:清晰,明確,不含糊, – 但不求多深多全,不能有明確的錯
2、hdfs的用途是什麼?
<–描述開放式問題的套路:先勾勒出事物的輪廓、骨架、再逐層填充細節–>
儲海量檔案、為分散式資料處理做支撐
是一個分散式的檔案系統
系統中有多重角色,核心角色是namenode 和datanode
namenode負責管理元資料
datanode負責儲存檔案塊
hdfs的執行機制:寫檔案、讀檔案的流程
3、檔案在hdfs中是通過什麼機制來存放的
分散式存放的
檔案不是存在一臺機器上,而是存在很多的datanode伺服器上
一個檔案也會被切成多塊,分佈在多臺datanode上
檔案的分塊存放位置資訊,記錄在namenode的元資料中
每一個檔案的檔案塊都可以儲存多個副本,副本的數量由上傳該檔案的客戶端決定
每一個檔案的切塊大小也是由客戶端決定
讀、寫資料流程
4、hdfs的客戶端api中上傳、下載檔案,開啟檔案的輸入輸出流的方法?
fs.copyFromLocalFile(src,dest)
fs.copyToLocalFile(src,dest)
int = fs.open()
out = fs.create();
5、hdfs的讀寫資料流程能描述嗎?
寫檔案流程:
客戶端向NN請求上傳檔案
NN告知是否可以上傳
客戶端向NN請求上傳第一個block
NN告知n臺DN機器主機名埠號
客戶端挑選最近的一臺DN,發出請求
目標DN向後續的n個DN發請求,建立pipeline,並在完成後應答客戶端
客戶端向目標DN傳送檔案塊的位元組資料
目標DN接收位元組流,並往後續dn進行傳送,後續dn接收並往後續傳送
該block的資料傳送完成後,客戶端繼續向NN請求上傳第二個block,然後重複上述過程
讀檔案流程:
客戶端向NN請求讀檔案
NN返回該檔案的元資料給客戶端
客戶端找到第一個block的位置資訊(dn)
然後挑選最近的一臺dn請求讀取一個block塊
然後dn傳送該block塊的位元組流給客戶端,客戶端收取
第一個block收取完成後,挑選第二個block的儲存dn中最近的一臺,重複上述過程
6、hdfs中動態擴容增加10臺datanode的步驟有哪些?
準備10臺伺服器,安裝系統、配置環境、安裝jdk
安裝hadoop軟體包
從原叢集中同步hadoop配置檔案到這新的10臺機器
在這10臺機器上,用 hadoop-daemon.sh start datanode 分別啟動datanode程序
此時,新的10臺機器已加入原叢集了
後續:為了方便以後用 start-dfs.sh 自動啟動叢集時,也把這新家的10臺自動啟動,則可以修改一下slaves檔案,加入這10臺
6、namenode是怎麼管理元資料的?
首先,namenode會將元資料儲存在記憶體中,同時,也會將元資料序列化在磁碟檔案fsimage中
然後,這其中涉及的一個核心問題是:記憶體中元資料如何與磁碟中fsimage序列化檔案保持儘可能一致
namenode會將最新的元資料變動以操作日誌的形式寫在磁碟日誌檔案edits中
再然後,secondary namenode會定期將新生成的edits檔案下載到本地,跟前一個版本的fsimage進行合併生成新的fsimage,並上傳到nameonde替換上一個版本的fsimage
7、寫一個mapredcue程式,需要寫一些什麼類?
自定義mapper
自定義reducer
jobsubmitter 提交job的客戶端程式
根據需要:還可以有combiner、partitioner、GroupingComparator、自定義Inputformat、自定義outputformat、自定義bean實現writableComparable介面
8、能否不看模板程式碼,寫出一個wordcount
map(){
String line =value.toString();
String[] words = line.split(" ");
for(String word:words){
context.write(new Text(word),new IntWritable(1))
}
}
reduce(Text key,Iterable<IntWritable> values,Context context){
int count = 0;
for(IntWritable value:values){
count += value.get();
}
context.write(key,new IntWritable(count));
}
main(){
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
....
boolean res = job.waitForCompletion(true);
System.exit(res?0:1);
}
9、能否不看模板程式碼,寫一個求分組topn的mapreduce程式
基本實現:
map(){
context.write("分組條件",資料)
}
reduce(){
// 將這一組資料通過迭代器拿出來,放到一個list中或者treemap中
// 對資料排序 Collections.sort(list,new Comparator());
// 然後輸出前N條
}
高階實現:
利用GroupingComparator
map(){
context.write(資料bean,nullWritable)
}
保證分割槽正確:自定一個partitioner
getPartition(){
// 根據資料bean中的分組條件欄位進行分割槽
}
保證reduce端分組正確;自定義一個GroupingComparator
// 資料bean中uid相同則看成一組
reduce(){
//按順序輸出前n個
}
10、能否不看模板程式碼,寫一個數據去重的mr程式
11、能否描述mr程式的執行流程、mr程式提交到yarn的流程?
12、hive是個什麼東西?它大體是怎麼工作的
hive是一個基於hadoop的資料倉庫工具
hive中可以建表,建庫,
表、庫的定義資料存放在hive的元資料庫(mysql)中
hive中的表資料存放在hdfs中
hive對使用者提交的查詢sql,會翻譯成mapreduce程式在yarn上執行
13、hive中的元資料是指什麼、存在哪?hive中的表資料又是存放在哪?
14、不看模板,能在hive中建庫、建表、建分割槽表、匯入資料
create database db_xx;
create table t_yy(id int,name string,birthday date,age int,price double)
row format delimited fields terminated by '\001';
create table t_zz(id int,name string,birthday date,age int,price double)
partitioned by (dt string)
row format delimited fields terminated by '\001';
load data [local] inpath '/path/data' into table t_zz partition(dt='2017-08-08');
15、不看模板,能在hive中做簡單查詢、條件查詢、join查詢、group by查詢
16、不看模板,能在hive中應用cast函式、substr函式、from_unixtime函式
17、能通過看百度,在hive中使用to_date(“2017-08-30 17:30:20”,“yyyy-MM-dd HH:mm:ss”)函式
18、不看模板,能在hive中應用row_number() over()函式來求分組topn
select ...
from
(
select x,y,row_number() over(partition by sex order by age desc) as rank from t_yy
) tmp
where tmp.rank < 4;
19、不看模板,能在hive中應用json_tuple()解析json資料
select json_tuple(json,‘movie’,‘rate’,‘timeStamp’,‘uid’) as(movie,rate,ts,uid) from t_json;
20、知道textfile和sequencefile的區別嗎?
textfile中存放的是文字資料(文字就是一些字元,有行的概念)
sequencefile是hadoop中開發的一種檔案格式,裡面存放的是大量key-value的物件序列化資料,檔案頭部會存key-value的型別許可權定名