天天看點

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

集合裡面的一些安全線程和不安全線程?

安全的:

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