1. 程式人生 > >最近面試經歷的一些面試題

最近面試經歷的一些面試題

集合裡面的一些安全執行緒和不安全執行緒?
安全的:
Vector
HashTable
StringBuffer
非執行緒安全:
ArrayList :
LinkedList:
HashMap:
HashSet:
TreeMap:
TreeSet:
StringBulider:

mybaits與hibernate的區別
hibernate:是一個標準的ORM框架(物件關係對映)。入門門檻較高,不需要寫sql,sql語句自動生成,對sql語句進行優化、修改比較困難。

應用場景:適用需求變化不多的中小型專案,比如:後臺管理系統,erp,orm,oa等
mybatis:專注sql本身,需要程式設計師自己編寫sql語句,sql修改、優化比較方便。mybatis是一個不完全的ORM框架,雖然程式設計師自己寫sql,mybatis也可以實現對映(輸入對映,輸出對映)

Hibernate優勢
Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果對映。

Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。

Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。

Hibernate有更好的二級快取機制,可以使用第三方快取。MyBatis本身提供的快取機制不佳。

Mybatis優勢
MyBatis可以進行更為細緻的SQL優化,可以減少查詢欄位。

MyBatis容易掌握,而Hibernate門檻較高。

攔截器和過濾器的區別?
①攔截器是基於java的反射機制的,而過濾器是基於函式回撥。
②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。
⑤在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以呼叫業務邏輯。

session和cookie的區別
session是儲存伺服器端,cookie是儲存在客戶端,所以session的安全性比cookie高。

獲取的session裡的資訊是通過存放在會話cookie裡的sessionId獲取的

因為session是存放在伺服器裡的,所以session裡的東西不斷增加會增加伺服器的負擔,我們會把一些重要的東西放在session裡,不太重要的放在客戶端cookie裡
cookie分為兩大類,一個是會話cookie和持久化cookie,他們的生命週期和瀏覽器是一致的,瀏覽器關了會話cooki也就消失了,而持久化會儲存在客戶端硬碟中。

瀏覽器關閉的時候回話cookie也就消失所以我們的session也就消失了,session在什麼情況下丟失,就是在伺服器關閉的時候,或者是session過期(30分鐘預設)。

Scala?
Scala 是一門多正規化(multi-paradigm)的程式語言,設計初衷是要整合面向物件程式設計和函數語言程式設計的各種特性。
Scala 執行在Java虛擬機器上,併兼容現有的Java程式。
Scala 原始碼被編譯成Java位元組碼,所以它可以運行於JVM之上,並可以呼叫現有的Java類庫。

Kafka常識
容錯、良好的擴充套件性及優勢效能,kafka的使用主要還是用來處理日誌

說下MapReduce
整個MapReduce的過程大致分為 Map–>Shuffle(排序)–>Combine(組合)–>Reduce
MapReduce的過程首先是由客戶端提交一個任務開始的,提交任務主要通過JobClient.runJob(JobConf)靜態函式實現的
讀取資料檔案內容,對內容解析成鍵值對,每個鍵值對呼叫一次map函式,編寫對映函式處理邏輯,建輸入的鍵值對輸出新的鍵值對
將新的鍵值對進行分割槽,排序,分組
對多個Map的輸出,按不同分割槽通過網路將copy到不同的reduce節點
對多個map的輸出進行排序,合併,編寫reduce函式處理邏輯,將接收到的資料轉化成新的鍵值對
最後將reduce節點輸出的資料儲存到HDFS上

說下Yarn
Hadoop三大核心元件之一;
負責海量資料運算時的資源排程,叢集中的角色主要有 ResourceManager /NodeManager
◆MapReduce 在 YARN 上的執行流程:
客戶端提執行JobClient —> 請求任務id到ResourceManager—> 建立任務ID—>返回任務ID到客戶端 —> 客戶端開始上傳任務Jar包,獲取到HDFS的資料原資訊—->在向Yarn請求執行任務 —> ResourceManager開始初始化任務—>ResourceManager開始分配任務 –>HDFS從NodeManager獲取任務和資料

YARN可以將多種計算框架(如離線處理MapReduce、線上處理的Storm、迭代式計算框架Spark、流式處理框架S4等) 部署到一個公共叢集中,共享叢集的資源

ResourceManager(RM) :
負責對各NM上的資源進行統一管理和排程。將AM分配空閒的Container執行並監控其執行狀態。對AM申請的資源請求分配相應的空閒Container。主要由兩個元件構成:排程器和應用程式管理器

NodeManager (NM) :
NM是每個節點上的資源和工作管理員。它會定時地向RM彙報本節點上的資源使用情況和各個Container的執行狀態;同時會接收並處理來自AM的Container 啟動/停止等請求。

ApplicationMaster (AM):
使用者提交的應用程式均包含一個AM,負責應用的監控,跟蹤應用執行狀態,重啟失敗任務等。

Container:
Container是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等,當AM向RM申請資源時,RM為AM返回的資源便是用Container 表示的。 YARN會為每個任務分配一個Container且該任務只能使用該Container中描述的資源。

Zookeeper的應用場景
統一命名服務、統一配置管理、統一叢集管理、伺服器節點動態上下
線、軟負載均衡

HBase的儲存原理
上文提到,hbase使用MemStore和StoreFile儲存對錶的更新。
寫操作:
步驟1:Client通過Zookeeper的排程,向HRegionServer發出寫資料請求,在HRegion中寫資料。

步驟2:資料被寫入HRegion的MemStore,直到MemStore達到預設閾值。

步驟3:MemStore中的資料被Flush成一個StoreFile。

步驟4:隨著StoreFile檔案的不斷增多,當其數量增長到一定閾值後,觸發Compact合併操作,將多個StoreFile合併成一個StoreFile,同時進行版本合併和資料刪除。

步驟5:StoreFiles通過不斷的Compact合併操作,逐步形成越來越大的StoreFile。

步驟6:最後的檔案StoreFile會刷盤就會相應生成一個儲存檔案HFile,資料量的持續寫入,造成memstore的頻繁flush,每次flush都會產生一個HFile,這樣底層儲存裝置上的HFile檔案數量將會越 來越多。(磁碟)最好通過HDFS介面寫到HDFS中

Kafka寫入流程
1)producer先從zookeeper的 “/brokers/…/state”節點找到該partition的leader
2)producer將訊息傳送給該leader
3)leader將訊息寫入本地log
4)followers從leader pull訊息,寫入本地log後向leader傳送ACK
5)leader收到所有ISR中的replication的ACK後,增加HW(high watermark,最後commit 的offset)並向producer傳送ACK