一。網易大數據開發面經java
一面:node
1.自我介紹web
尊敬的面試官您好,我是來自河北省的袁志良。本科就讀於燕山大學裏仁學院。正如你們所見,個人內在和外表同樣敦厚和實在,成長的經歷已經使我不驕不躁,不浮不飄。我本人,雖然不善於花言巧語,可是真誠和厚道總能使我很好的融入集體,收穫朋友。我知識和技能紮實,可以決心鑽研,並解決各類疑難問題,並從中獲取自信和快樂。公司的口號是********,我感受也很是適合我,也相信,我可以快速的融入集體,並不斷爲公司創造新的價值。面試
2.項目介紹算法
----------------------sql
3.瞭解hashmap和 hashtable嗎,介紹一下他們的區別?數據庫
①hm出現的比ht晚一些,但都是基於哈希表來實現鍵值映射的工具,能夠增刪改查鍵值對,能夠對其提供遍歷視圖。
編程
雖然都實現了Map、Cloneable、Serializable三個接口。可是HashMap繼承自抽象類AbstractMap,而HashTable繼承自抽象類Dictionary。設計模式
②對空值的表現數組
hm支持空的鍵、值,而ht遇到空時會拋出異常,緣由是hm對null賦值爲0。
③數據結構上基本相同。
④算法
在建立之初,給定初始化大小,ht會直接使用,hm則會擴充爲2的冪次方大小。
⑤線程安全
ht是同步的,hm不是,因此要作同步代碼塊synchronized,或者用ConcurrentHashMap。
最後:ht已經淘汰了。
4.java裏set,Array和map等容器瞭解嗎?他們的繼承關係寫一下。最頂層好像是java.util.Collection和java.util.Map?
①容器是用來存儲數據的。set:一種包含已排序對象的關聯容器,只是單純的鍵的集合。
array:有序元素序列,可存儲多個相同類型數據,並且是連續的。
map:鍵值對容器,數據成對出現,key值不能重複。
collecttion
list set map
ArrayList / Linklist /Vector HashSet/TreeSet HashMap/HashTable/TreeMap
5.線程安全有了解嗎?介紹一下
線程安全:即多線程訪問數據保持一致性。(保證其讀寫一致性);線程安全則是多線程操做同一個對象不會有問題。
線程安全必需要使用不少synchronized關鍵字來同步控制,因此必然會致使性能的下降。
PHP兩種執行方式:線程安全用ISAPI;非線程安全用FastCGI。
ArrayList是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。
6.介紹GC
GC就是電腦的垃圾回收機制,當使用new關鍵字時,就會在堆中建立對象,而並沒手動釋放內存,java的自動垃圾回收機制起做用,當對象不被佔用的時候,機制就會在莫一時刻將內存釋放,不會致使堆內存溢出。
7.介紹spark,client提交application後,接下來的流程,driver,yarn怎麼通信,開始執行?
①spark是大數據計算引擎,用Scala語言進行實現的,他是一種面向對象(把數據和對數據處理的方法寫到一塊兒,做爲互相依賴的總體--對象。抽象出共性,造成類,經過接口實現與外部通訊。)、函數式編程語言(指數學上的函數:給定輸入固定的輸出,沒有反作用)、可以像操做本地集合對象同樣,輕鬆的操做分佈式數據集。 特色:運行速度快,易用性好,通用性強,隨處可運行。
②client提交application後:client向RM發出請求--》RM返回一個applicationID--》client向RM迴應application的相關信息ASC--》
RM接收到ASC相關信息後,他會調度一個合適的container(容器)來啓動AM(放置服務方法的地方)--》當AM啓動後,RM給AM集羣最大和最小的資源信息--》AM得到資源後,會請求一些必定數目的container--》RM根據AM的申請,儘量的知足AM請求的container。
③driver,yarn通訊:Driver才負責SQL的解析和元數據獲取;
spark從提交到運行的全流程,下面再詳細分析。
8.用隊列實現棧的功能,手寫代碼?
棧:先進後出 隊列:先進新出 略
二面:
1.自我介紹
2.參與的項目,代碼量,實驗環境等
3.MapReduce的過程,map,shuffle,reduce這些?
簡單流程:讀取到HDFS上的數據後,會有一個拆分split的過程,造成map鍵值對,隨後要對獲得的數據進行洗牌shuffle,經過內部hash機制,分到不一樣的位置上,最後通過reduce計算,獲得數據的結果。
4.HDFS寫數據的過程?
①client發起文件請求,Namenode檢查目標文件是否已存在,父目錄是否存在,返回是否能夠上傳;②對文件切分,並請求第一個block應該傳輸到哪些datenode上;③namenode返回datenode;④client請求一臺datenode上傳數據,1收到後繼續調用2,2去調用3,創建pipeline,返回客戶端;⑤client開始上傳第一個block,1收到後傳給2,2再傳給3;每臺都會造成應答隊列;⑥一個block上傳成功後,client再次請求namenode上傳第二個。
5.spark工做機制,哪些角色,做用?
???????
內部流程:主要由sparkcontext(spark上下文)、cluster manager(資源管理器)、executor(單個節點的執行進程)組成。
job 、stage、task是基本單位。spark催生job,job拆分爲stage,stage劃分爲多個task。
數據塊RDD:代碼執行,driver根據action算子生成DAG圖,圖經過shuffle拆分爲stage和task,傳給Task Scheduler調用;經過調度算法,將task分給work node中的executor執行。
DAG scheduler爲每個job劃分stage,並將單個stage分紅多個task,而後他會將stage做爲taskSet提交給底層的Task Scheduler執行。
Task Scheduler負責將DAGS cheduer產生的task調度到executor中執行。
6.spark yarn模式下的cluster模式和client模式有什麼區別?
一般,cluster適用於生產環境,client更適用於交互、調試模式。
深層次:就是進程的區別。cluster向yarn申請資源,並監督執行情況,做業提交後能夠關閉客戶端client;
client僅僅想yarn請求executor,client會和請求的容器(container)通訊來調度工做,不能離開。
網易雲大數據面試
一面:
1.項目介紹
2.數據密度分佈不均勻的解決方案?
算法問題 svm算法。採樣--》合成--》加權--》分類
3.手寫歸併排序?
算法:分---》治
4.java:hashmap與hashset的區別;threadlocal原理;垃圾收集算法?
HashMap | HashSet |
實現了Map接口 | 實現Set接口 |
存儲鍵值對 | 僅存儲對象 |
調用put()向map中添加元素 | 調用add()方法向Set中添加元素 |
HashMap使用鍵(Key)計算Hashcode | HashSet使用成員對象來計算hashcode值, 對於兩個對象來講hashcode可能相同, 因此equals()方法用來判斷對象的相等性, 若是兩個對象不一樣的話,那麼返回false |
HashMap相對於HashSet較快,由於它是使用惟一的鍵獲取對象 | HashSet較HashMap來講比較慢 |
ThreadLocal提供了set和get訪問器用來訪問與當前線程相關聯的線程局部變量。
get函數就是從當前線程的threadlocalmap中取出當前線程對應的變量的副本;
在每一個線程中,都維護了一個threadlocals對象,在沒有ThreadLocal變量的時候是null的。一旦在ThreadLocal的createMap函數中初始化以後,這個threadlocals就初始化了。
5Linux:從日誌文件中搜索帶有abcde關鍵字的行;grep /awk /sed?
grep -r lisi 文件名|awk -F ='{print $1}'
二面:
1.自我介紹
2.HDFS create一個文件的流程?
HDFS:具備的高容錯、高可靠性、高可擴展性、高得到性、高吞吐率等特徵。
客戶端(HDFSClient)向NN發送請求,獲取文件信息,NN會在緩存中查找是否存在請求建立的文件項,若是沒有,就在NameSystem中建立一個新的文件項,添加到系統文件的目錄樹中。
3.HDFS寫入流程?
寫入:客戶端client向NN發送RPC請求,NN檢查文件是否存在和權限問題,client會切分文件,並向NN申請塊和DN,此時造成管道pipeline,開始寫入,調用的DN依次調用,最後寫入完成,返回給客戶端一個確認隊列。
讀取:客戶端client向NN發送RPC請求,NN返回DN地址和文件部分或者所有,client選取最近的DN讀取文件,讀取完畢,關閉DN鏈接。
4.MapReduce第一代架構及其通訊?
客戶端client會向JobTracker發送一個做業,JobTracker會把做業拆分爲多分,分給TaskTracker(任務執行者),(每一個TT內部會有Map和Reduce的task),TT會隔一段時間性JT發送心跳信息,若是在一段時間內沒有收到,JT人文TT已死 ,會更換TT。
5.yarn結構及其流程?
結構:客戶端client提交做業請求後,有ResourceManager進行調度,(由scheduler和Application Manager組成),並要求NodeManager啓動能夠寄存和佔用的資源任務,而後分佈到不一樣的節點上。(AM被分配到不一樣節點上,不會互相影響)
流程:用戶向yarn提交應用程序,RM爲該應用程序分配第一個容器(container),並與NM通訊,ApplicationMaster首先向RM註冊,並經過輪詢方式向RM申請資源,隨後與NM通訊,要求啓動任務,NM配置好環境啓動任務,各個任務經過RPC協議向AM彙報狀況,以便任務失敗後重啓,應用程序完成,AM向RM 註銷關閉本身。
面經:
1。鏈表反轉?
分爲迭代和遞歸,相似冒泡排序,先斷開(存儲後),在依次挪動指針。
2.大文件排序?
算法排序:https://blog.csdn.net/zhushuai1221/article/details/51781002
7.如何中止一個線程?
使用退出標誌exit;或者用Boolean變量寫一個方法,都會在while執行時中止。
8.虛擬機新生代怎麼執行?
對象被存儲在堆中,首先進入新生代,(分爲一個Eden和兩個Survivor),分佈在Eden和其中一個survivor上,通過依次GC(複製算法)後,複製到另一個survivor上,原來的兩塊被清除,此時年齡爲1,每通過一次GC,年齡加一,默認到15後,進入老年代。
9,。cap原理?
c--一致性 a--可用性 p--分區容忍
總結:只可能知足其二。nosql主要是A P ;關係型數據庫主要是 C A(即ACID);hbase是C P。
10.namenode宕機怎麼處理?regionserver宕機怎麼處理?
NN宕機:①利用secondNN來恢復,但容易形成數據丟失;②利用及時備份NFS(網絡文件系統),設置多個data目錄,數據不易丟失。
③利用Avatar NameNode,也是利用客戶端訪問時放在NFS中。
RS宕機:Master檢測宕機的RS,而後HLog進行切分,Region從新分配並打開,HLog回放補救數據,恢復完成。
11.hbase如何保證數據一致性?
分爲強一致性和弱一致性(容許某一時間偶爾不一致)
發消息給中間件--》中間件入庫消息,返回結果--》業務操做--》操做結果返回中間件--》更改存儲狀態
強一致性: 每一個region同時只有一臺RegionServer來管理,region全部的請求也都是有RS來管理的,天然是強一致性的。
12.宕機回滾時若是有寫數據怎麼辦?
宕機回滾的時候是沒法寫入數據的啊,有寫若是HLog失敗,也會從新發起的。若是有寫入以前的操做,經過日誌,會在回滾後從新獲得原來的狀態。
13.讀blockcache時,若是有刪除數據進memstore,怎麼保證一致性?
HBase上Regionserver的內存分爲兩個部分,一部分做爲Memstore,主要用來寫;另一部分做爲BlockCache,主要用於讀數據。
blockcache主要是讀,先到memstore中找,若是沒有或者進入刪除數據,就會到blockcache中找,若是尚未,那就到磁盤中讀。
14.memsotore多大刷盤?
memstore通常佔40%,blockcache通常佔20%,因此超過40%默認值就要刷盤,也能夠自定義值。
15.小文件怎麼合併?
①若是是本地文件:使用腳本,循環全部文件路徑,經過globStatus()方法得到全部路徑,經過IOUtils.CopBytes(in,out,4096,false)方法合併上傳。也能夠用MapReduce方法進行打包。
②hadoop提供了CombinFilesInputFormat類來實現合併。
網易雲大數據面經
1.ArrayList和linkedlist的區別,他們是否是安全的?
都是list接口的實現類,區別:
ArrayList:是線性表;隨機訪問比較快,如get和set;線程不安全,都是單線程的,須要實現同步代碼塊。
LinkedList:是鏈表數據結構;有指針,因此插入和刪除較快;線程不安全。
2.如何解決不安全問題?
ArrayList和LinkedList:使用synchronize關鍵字,可直接使用Collections.synchronize()方法。
3.多線程有幾種同步方式?
多線程的兩種實現方法:繼承Thread類;實現Runnable接口。
同步實現:①synchronize關鍵字修飾或者代碼塊;②使用特殊變量volatile修飾實現,免鎖機制;
③使用重入鎖實現,相似synchronized;④使用ThreadLocal管理變量,變爲局部變量。
4.volatile的用法,和他的做用?
volatile關鍵字爲域變量提供了免鎖機制,每次使用該域都會從新計算。
就是在命名變量時,用volatile進行修飾,後面再也不用synchronize。
5.線程池機制,若是有高併發的請求出現如何處理?
機制: 預先建立線程,放入空閒隊列,而後對這些資源重複利用,可執行多個任務。避免過分消耗資源。
高併發時:請求入庫,由線程池執行後續任務。
6.hm底層原理,如何擴容的,和ht的區別?
原理:首先經過hash算法計算key在數組中的位置,而後放入Entry中,若是位置上已經有元素了,就會放在鏈表的頭上。
擴容:即數組擴大機制,每次翻倍,而後從新計算位置。
區別看第一題。
7.悲觀鎖和樂觀鎖講一下,lock和synchronize是悲觀鎖仍是樂觀鎖?樂觀鎖裏的cas瞭解嗎?
樂觀鎖:總認爲不會產生併發問題,每次去取數據的時候老是認爲不會有其餘線程對數據進行修改,所以不會上鎖,可是在更新時會判斷其餘線程有沒有對數據進行了修改,通常會使用版本號version和CSA(存、預期、新)判斷。
悲觀鎖:老是假設最壞的狀況,每次取數據時,都會認爲被其餘線程修改了,因此都會加鎖(讀鎖,寫鎖,行鎖),當其餘線程訪問數據的時候,都要阻塞掛起。lock和synchronize就是悲觀鎖。
CAS:即compare and set,涉及到數據的內存值,預期值,新值。但須要更新的時候,判斷當前內存值和以前取到的值是否相等,若相等,用新值更新,若失敗則重試,一直循環。
8.面向對象的三大特性和六大原則.?
三大特性:封裝,繼承,多態,抽象
六大原則:單一功能、可開放和封閉、子可替換父、上下依賴、接口分離、最小依賴。
9.數據庫的四大特性?
關係型數據庫:ACID A:原子性(不可分割) C:一致性(事務一致) I:隔離性(各表互不影響) D:持久性(執行後不可恢復)
10.MySQL數據庫有幾種索引方式?索引的底層數據結構是什麼?還知道哪些索引?
索引方式:普通索引(index),惟一索引(unique),主鍵索引(primary key),組合索引,全文索引(fulltext)。
結構:B -Tree(二叉樹)、B+Tree(紅黑樹)
11,假設t表有abcdef字段,有如下需求:select a,b,c from t where a=1and c>1
select a,b,c from t where a>1 and c<1時,
如何創建索引?
12.Redis數據庫講一下應用案例?
它使用內存提供主存儲支持,而僅使用硬盤作持久性的存儲;它的數據模型很是獨特,用的是單線程。另外一個大區別在於,你能夠在開發環境中使用Redis的功能,但卻不須要轉到Redis。
13.中間件裏的kafka瞭解嗎?
經過O(1)的磁盤數據結構提供消息的持久化;支持Hadoop並行數據加載。
14.大數據裏的MapReduce講一下?
數據輸入--拆分---map鍵值--輸出鍵值--打散重分--map鍵值--輸出鍵值。
15.Linux裏用過哪些命令?用怎麼搭建一個簡單服務器?
搭建服務器步驟:利用Tomcat和eclipse--》新建工程項目--》編寫servlet,繼承httpservlet-->web.xml中配置servlet和servlet.mapping映射--》運行,獲取網頁。
簡單搭建:啓動IIS(Internet information service)--》準備一個HTML文件,命名.htm,放在本地路徑--》瀏覽器打開ip或者localhost。
java大數據開發面試
一。java基礎
1.java接口和抽象類的區別?
抽象類:不能被實例化,是對共同屬性和方法的抽取,做爲子類繼承的對象。只能繼承一個,實現多個接口。
接口:是抽象方法的集合,子類實現接口。只能用public修飾,能夠繼承多個接口。
2.java實現多線程的方法?
繼承Thread類實現、實現Runnable接口、實現Collable接口 經過FutureTask包裝器來建立Thread線程、使用ExecutorService、collable、Future實現有返回結果的線程。
3.n個線程訪問N個資源同步的方法?
首先:多線程死鎖的四個必須因素:互斥性、保持和請求、不可剝奪性、造成閉環。
破壞其中之一便可不發生死鎖。最簡單方法:指定鎖的順序,並強制線程按照指定順序獲取鎖,所以全部線程都是以一樣的加鎖和釋放鎖,就不會出現死鎖。
二。Linux
1.Linux內存管理機制(表示範圍太大)?
Linux內存分爲物理內存和虛擬內存,是分頁存儲機制,Linux會時不時進行頁面交互操做,根據自身算法,將物理內存不常使用的清除,以便物理內存有更多的空閒;
2.Linux的內核空間講一下?
Linux的操做系統和驅動程序運行在內核空間,應用程序運行在用戶空間,二者不能簡單的使用指針傳遞,由於Linux使用時虛擬內存機制,用戶空間數據可能被換出,當內核空間使用用戶空間指針的時候,對應數據可能不在內存中。
3.共享內存如何實現?
4.什麼是函數調用?系統調用?
網易大數據面經
1.def三個線程在abc三個線程後運行如何實現?
思路:建立只有一個線程的線程池,來操做不限數量的線程隊列,隊列是按照先進先出的原則,因此這樣只會有一個線程在執行,當一個線程完成以後,下一個線程繼續,知道全部線程結束,但線程池不會關閉,會處於等待狀態,直到shutdown纔會關閉。
代碼以下:
public class onlyPoll(){
public static void main(string[] args){
//建立三個線程 ,分別打印abc
Thread a=new Thread(new Runnable(){
public void run(){
System.out.println(Thread.currentThread.getName+"A")
}
});
//依次複製上面爲B C 線程
//建立線程池 ,將線程分別放入,造成一個隊列
ExcutorService excutor=Excutors.newSingleThreadExcutor();
excutor.submit(a);
excutor.submit(b);
excutor.submit(c);
//結束線程池
excutor.shutdown();
}
}
2.消息隊列?
是消息傳輸過程當中保存消息的容器。經過異步請求,來緩解鏈接的壓力。
3.設計模式,手寫你認爲最安全的單例模式?
4.數據庫索引?
5.B+樹 畫出來。說說優勢?
6.數據庫引擎?
7,彙集索引和非彙集索引?
8.查詢條件or能不能走索引,緣由?
9。柵欄和閉鎖的區別和原理?
10.synchronize的原理?
11.aqs原理?
12.鎖的優化(偏向鎖怎麼實現)?
13.如何查看索引狀態?
1四、java異常的繼承模式?
15.java線程池?
16,用戶連續登錄三天或五天,會給用戶送積分,問數據庫怎麼設計以及程序怎麼實現?
360,阿里面經
1.tcp和udp區別?
2.http和https 區別?
3.HTTPS的具體工做原理?
4.什時候應該創建索引?注意事項?
5.海量數據分頁顯示的實現?
6.單例模式?
7.進程和線程?
8.線程狀態,具體怎麼運行的?
9.Redis的數據結構?
10.Redis是基於內存嗎?
11.Redis的list zset的底層實現?
12.跳錶?
13.數組和鏈表的區別?
14,異步隊列的實現?
15.怎麼設置緩存的失效時間?
16.怎麼更新失效緩存?
17.nio原理?
18,靜態方法內部能不能調用非靜態方法?
19.jdk1.8的新特性?
20.繼承和組合?
21.判斷數是否是2的冪次方?
22.判斷兩個單鏈表是否相交?
23.topk要求時間複雜度?
24.把一個數組中的空格移到最後,不改變相對次序?