①hbase的寫入速度下降造成的原因是什么,怎么解決?
②zookeeper的結構,在Hadoop集群中的作用
zookeeper在hadoop集群中可以實現高可用,使active namenode和standby nanemode通過jrounalnode通信,保持同步信息,避免單點故障
此篇關於zookeeper在hadoop和hbase中的應用:https://blog.csdn.net/zhang123456456/article/details/78008626
③hbase以可否以時間戳作為row key,會存在什么問題,怎么解決?
https://www.cnblogs.com/duanxz/p/4660784.html
④數據傾斜?提供一種解決方案;什么是負載均衡?
MapReduce是分布式計算框架,將任務程序分別分配到多個節點來來執行,如果某個節點處理數據過大則影響整個集群的效果,所以需要將數據均勻的分配到每個reduce,保證個節點處理速度相差不大。
解決數據傾斜:
①自定義分區類:通常是按照map的hashcode來進行分區,所以map相同的會分到同一個區然后在一個reduce中處理
②重新設計key:在map階段給key追加個隨機數,再reduce階段之后再把reduce去掉,這樣大量相同key的幾率比較小
③添加reducetask數量來處理啊reduce任務
負載均衡:
⑤sql應用的窗口函數
⑥block大小是128M,怎么存儲一個142M的文件
分成兩個數據塊:一個block1(128M),一個block2(14M);
然后namenode返回可用的datanode用於存儲數據塊,默認副本數是3,所以根據機架感知分別存儲到三個節點上,保證數據安全可靠
block1:host1,host2,host5
block2:host3、host4、host6
機架感知:副本1存在和client同一個節點,副本2存在不同機架的一個節點,副本3放在和副本2同一個機架的不同節點上
⑦hbase表:用戶ID,登錄時間戳login_time,統計每個用戶在0-6、6-12、12-18、18-24的登錄次數?
⑧配置免密登錄
⑨hadoop集群中各角色的作用?
分布式文件系統:hdfs
namenode主節點,存儲元數據(數據塊的存儲位置信息,大小)
secondarynamenode輔助節點,用於合並fsimage和edits文件,減少namenode的啟動時間
datanode數據節點:用於存儲數據
分布式計算框架:mapreduce
map
reduce
資源管理器:yarn
resourcemanager:分配資源
nodemanager:響應resourcemanager的安排。為程序提供資源
各角色的作用:
namenode:接受客戶端的請求;管理元數據的信息;為數據塊的副本存儲分配節點
secondarynamenode:幫助namenode合並元數據,減少namenode的壓力
datanode:處理客戶端的讀寫請求;存儲數據塊,進行副本的復制
補充:mapreduce各階段詳解
①combinner階段:(可選)是一個本地的reduce,在map計算出中間結果之前將相同的key進行一個簡單的合並,減輕了map到reduce階段的數據傳輸量,也減輕了map端到reduce端shuffle階段的數據拉取量(本地化磁盤IO)combinner必須保證不影響reduce的輸出結果,如求取最大值、最小值、求和可以使用,求平均值則不行。
②partitioner階段:mapper輸出將不同的key分區發送到不同的reduce,reduce運行之后按分區存儲計算結果,默認的分區方式:key的hashcode/numreducetask
③shuffle階段:將map的輸出結果作為reduce的輸入的過程,包括:輸出、排序、溢寫、合並等步驟。
map的輸出結果通常是一個非常大的文件不可能將所有中間結果都保存到磁盤,map寫入磁盤是一個十分復雜的過程,map在輸出時會在內存中開啟一個環形內存緩沖區,默認大小100M,閾值為0.8,達到閾值就把數據寫到磁盤,寫入磁盤前還會有排序操作,這個過程叫做spill,如果有combinner函數,還會執行combiner,每次spill的時候都會有一個溢出文件,等map輸出完成之后再合並這些溢出文件。這個階段還有partitioner,partition與map階段的輸入分片相似,一個partition對應一個reduce
Map-Shuffle:
寫入之前先進行分區Partition,用戶可以自定義分區(就是繼承Partitioner類),然后定制到job上,如果沒有進行分區,框架會使用 默認的分區(HashPartitioner)對key去hash值之后,然后在對reduceTaskNum進行取模(目的是為了平衡reduce的處理能力),然后決定由那個reduceTask來處理。
將分完區的結果<key,value,partition>開始序列化成字節數組,開始寫入緩沖區。
隨着map端的結果不端的輸入緩沖區,緩沖區里的數據越來越多,緩沖區的默認大小是100M,當緩沖區大小達到閥值時 默認是0.8【spill.percent】(也就是80M),開始啟動溢寫線程,鎖定這80M的內存執行溢寫過程,內存—>磁盤,此時map輸出的結果繼續由另一個線程往剩余的20M里寫,兩個線程相互獨立,彼此互不干擾。
溢寫spill線程啟動后,開始對key進行排序(Sort)默認的是自然排序,也是對序列化的字節數組進行排序(先對分區號排序,然后在對key進行排序)。
如果客戶端自定義了Combiner之后(相當於map階段的reduce),將相同的key的value相加,這樣的好處就是減少溢寫到磁盤的數據量(Combiner使用一定得慎重,適用於輸入key/value和輸出key/value類型完全一致,而且不影響最終的結果)
每次溢寫都會在磁盤上生成一個一個的小文件,因為最終的結果文件只有一個,所以需要將這些溢寫文件歸並到一起,這個過程叫做Merge,最終結果就是一個group({“aaa”,[5,8,3]})
集合里面的值是從不同的溢寫文件中讀取來的。這時候Map-Shuffle就算是完成了。
一個MapTask端生成一個結果文件。
shuffle階段的詳細講解:https://www.cnblogs.com/edisonchou/p/4298423.html
自定義輸入函數、分區函數
二次排序:先按第一列排序再按第二列排序
讀取二進制文件
mapreduce性能調優
小文件合並
大數據面試題:https://www.cnblogs.com/gala1021/p/8552850.html
------------------------------------------------------------------------------------------------------------------
珍愛網深大大數據開發現場筆試
hbase的二級索引實現方式
mysql聯合索引,以下不正確的是
分解質因數,手寫代碼
多用戶訪問服務器,怎么讓同一用戶訪問某一固定服務器
創建對象的方式,哪些不調用構造函數
常用的設計模式及使用場景,手寫代碼
mysql三張表的各種查詢
hdfs工作原理
mapreduce執行過程
堆區及棧區的區別
thread中run()和main的執行順序:
main(){
thread.run()
print(za);
}
Thread(){
print(“ZA”)
exit(0)}
spark能完全脫離Hadoop?
hadoop利用hive能實現增刪改查功能?
hdfs以流的方式上傳文件?