面試備考

一。網易大數據開發面經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.介紹sparkclient提交application後,接下來的流程,driveryarn怎麼通信,開始執行?

 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從提交到運行的全流程,下面再詳細分析。

 

  • 一、用戶經過spark-submit腳本提交應用。
  • 二、spark-submit根據用戶代碼及配置肯定使用哪一個資源管理器,以及在合適的位置啓動driver。
  • 三、driver與集羣管理器(如YARN)通訊,申請資源以啓動executor。
  • 四、集羣管理器啓動executor。
  • 五、driver進程執行用戶的代碼,根據程序中定義的transformation和action,進行stage的劃分,而後以task的形式發送到executor。(經過DAGScheduler劃分stage,經過TaskScheduler和TaskSchedulerBackend來真正申請資源運行task)
  • 六、task在executor中進行計算並保存結果。
  • 七、若是driver中的main()方法執行完成退出,或者調用了SparkContext#stop(),driver會終止executor進程,而且經過集羣管理器釋放資源。

 

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瞭解嗎?

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.把一個數組中的空格移到最後,不改變相對次序?

相關文章
相關標籤/搜索