1. 程式人生 > >hadoop自我檢測(面試題)

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的型別許可權定名