我面試的職位是數據研發工程師。
前幾天投了螞蟻金服的簡歷,之后打電話通知我第二天進行電話面試。由於只剩一晚上的時間了准備不夠充分,回答的不是很好,在此再次重溫一下面試過程。
剛開始面試官就讓我自我介紹嘛,就是說了說自己的情況以及做過的項目。(這點包括簡歷上寫的很重要,因為面試官會根據你的回答來進行下一步的提問,沒有做過的千萬不要去說)。
因為投的是大數據方向的,所以面試官問的全是大數據方向的。
1.阿里雲和騰訊雲的區別。(由於我是有阿里雲和騰訊雲服務器搭建大數據平台的,所以面試官問了這個)
操作系統
阿里雲:CentOS、openSUSE、Ubuntu、Windows Server 2008 R2、Aliyun Linux、Debian(所Aliyun Linux外,所有系統均提供32位和64位版本、Win2008提供中/英文)
騰訊雲:CentOS、SUSE、Ubuntu、Windows Server 2008 R2(所有系統僅支持64位)
特色系統
阿里雲:北京、杭州、青島機房支持“鏡像市場”,可選擇已集成建站系統、開發環境的系統,如集成wordpress、LAMP、LNMP、ASP/.NET、JDK、WEB管理面板等等。
數據盤
阿里雲:購買時最多可添加4塊,每塊最高2000GB,購買后不支持卸載。
騰訊雲:購買時可購一塊,最高500G
獨立磁盤
阿里雲:可添加“獨立的磁盤”,不限數量與容量,“獨立雲磁盤可以單獨購買,按需付費,獨立存在。獨立雲磁盤可以在同一可用區內的不同ECS實例間自由掛載和卸載。”
騰訊雲:暫無
2.HDFS上傳文件的過程(工作機制)
1)客戶端向namenode發送上傳文件請求,namenode對要上傳目錄和文件進行檢查,判斷是否可以上傳,並向客戶端返回檢查結果。
2)客戶端得到上傳文件的允許后讀取客戶端配置,如果沒有指定配置則會讀取默認配置(例如副本數和塊大小默認為3和128M,副本是由客戶端決定的)。向namenode請求上傳一個數據塊。
3)namenode會根據客戶端的配置來查詢datanode信息,如果使用默認配置,那么最終結果會返回同一個機架的兩個datanode和另一個機架的datanode。這稱為“機架感知”策略。
4)客戶端在開始傳輸數據塊之前會把數據緩存在本地,當緩存大小超過了一個數據塊的大小,客戶端就會從namenode獲取要上傳的datanode列表。之后會在客戶端和第一個datanode建立連接開始流式的傳輸數據,這個datanode會一小部分一小部分(4K)的接收數據然后寫入本地倉庫,同時會把這些數據傳輸到第二個datanode,第二個datanode也同樣一小部分一小部分的接收數據並寫入本地倉庫,同時傳輸給第三個datanode,依次類推。這樣逐級調用和返回之后,待這個數據塊傳輸完成客戶端后告訴namenode數據塊傳輸完成,這時候namenode才會更新元數據信息記錄操作日志。
5)第一個數據塊傳輸完成后會使用同樣的方式傳輸下面的數據塊直到整個文件上傳完成。
3.yarn的工作原理
·當用戶向YARN中提交一個應用程序后,YARN將分兩個階段運行該應用程序:
第一個階段是啟動ApplicationMaster;
第二個階段是由ApplicationMaster創建應用程序,為它申請資源,並監控它的整個運行過程,直到運行完成。
步驟1 用戶向YARN中提交應用程序,其中包括ApplicationMaster程序、啟動ApplicationMaster的命令、用戶程序等。
步驟2 ResourceManager為該應用程序分配第一個Container,並與對應的Node-Manager通信,要求它在這個Container中啟動應用程序的ApplicationMaster。
步驟3 ApplicationMaster首先向ResourceManager注冊,這樣用戶可以直接通過ResourceManager查看應用程序的運行狀態,然后它將為各個任務申請資源,並監控它的運行狀態,直到運行結束,即重復步驟4~7。
步驟4 ApplicationMaster采用輪詢的方式通過RPC協議向ResourceManager申請和領取資源。
步驟5 一旦ApplicationMaster申請到資源后,便與對應的NodeManager通信,要求它啟動任務。
步驟6 NodeManager為任務設置好運行環境(包括環境變量、JAR包、二進制程序等)后,將任務啟動命令寫到一個腳本中,並通過運行該腳本啟動任務。
步驟7 各個任務通過某個RPC協議向ApplicationMaster匯報自己的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。
在應用程序運行過程中,用戶可隨時通過RPC向ApplicationMaster查詢應用程序的當前運行狀態。
步驟8 應用程序運行完成后,ApplicationMaster向ResourceManager注銷並關閉自己。
參考博客:https://blog.csdn.net/zmx729618/article/details/73321316
4.Hadoop的偽分布式運行模式
偽分布式只有一個節點
請注意分布式運行中的這幾個結點的區別:
- 從分布式存儲的角度來說,集群中的結點由一個NameNode和若干個DataNode組成,另有一個SecondaryNameNode作為NameNode的備份。
- 從分布式應用的角度來說,集群中的結點由一個JobTracker和若干個TaskTracker組成,JobTracker負責任務的調度,TaskTracker負責並行執行任務。TaskTracker必須運行在DataNode上,這樣便於數據的本地計算。JobTracker和NameNode則無須在同一台機器上。一個機器上,既當namenode,又當datanode,或者說 既 是jobtracker,又是tasktracker。沒有所謂的在多台機器上進行真正的分布式計算,故稱為"偽分布式"。開啟多個進程模擬完全分布式,但是並沒有真正提高程序執行的效率。
5.HDFS和Spark的對比
參考博客:https://blog.csdn.net/yanjiangdi/article/details/78260186
6.除了spark你還了解過其他大數據框架么,有什么區別
Hadoop框架
提起大數據,第一個想起的肯定是Hadoop,因為Hadoop是目前世界上應用最廣泛的大數據工具,他憑借極高的容錯率和極低的硬件價格,在大數據市場上風生水起。Hadoop還是第一個在開源社區上引發高度關注的批處理框架,他提出的Map和Reduce的計算模式簡潔而優雅。迄今為止,Hadoop已經成為了一個廣闊的生態圈,實現了大量算法和組件。由於Hadoop的計算任務需要在集群的多個節點上多次讀寫,因此在速度上會稍顯劣勢,但是其吞吐量也同樣是其他框架所不能匹敵的。
Storm框架
與Hadoop的批處理模式不同,Storm采用的是流計算框架,由Twitter開源並且托管在GitHub上。與Hadoop類似的是,Storm也提出了兩個計算角色,分別為Spout和Bolt。
如果說Hadoop是水桶,只能一桶一桶的去井里扛,那么Storm就是水龍頭,只要打開就可以源源不斷的出水。Storm支持的語言也比較多,Java、Ruby、Python等語言都能很好的支持。由於Storm是流計算框架,因此使用的是內存,延遲上有極大的優勢,但是Storm不會持久化數據。
Samza框架
Smaza也是一種流計算框架,但他目前只支持JVM語言,靈活度上略顯不足,並且Samza必須和Kafka共同使用。但是響應的,其也繼承了Kafka的低延時、分區、避免回壓等優勢。對於已經有Hadoop+Kafka工作環境的團隊來說,Samza是一個不錯的選擇,並且Samza在多個團隊使用的時候能體現良好的性能。
Spark框架
Spark屬於前兩種框架形式的集合體,是一種混合式的計算框架。它既有自帶的實時流處理工具,也可以和Hadoop集成,代替其中的MapReduce,甚至Spark還可以單獨拿出來部署集群,但是還得借助HDFS等分布式存儲系統。Spark的強大之處在於其運算速度,與Storm類似,Spark也是基於內存的,並且在內存滿負載的時候,硬盤也能運算,運算結果表示,Spark的速度大約為Hadoop的一百倍,並且其成本可能比Hadoop更低。但是Spark目前還沒有像Hadoop哪有擁有上萬級別的集群,因此現階段的Spark和Hadoop搭配起來使用更加合適。
Flink框架
Flink也是一種混合式的計算框架,但是在設計初始,Fink的側重點在於處理流式數據,這與Spark的設計初衷恰恰相反,而在市場需求的驅使下,兩者都在朝着更多的兼容性發展。Flink目前不是很成熟,更多情況下Flink還是起到一個借鑒的作用。
6.Java的內容泄漏
內存泄露是指無用對象(不再使用的對象)持續占有內存或無用對象的內存得不到及時釋放,從而造成的內存空間的浪費稱為內存泄露。內存泄露有時不嚴重且不易察覺,這樣開發者就不知道存在內存泄露,但有時也會很嚴重,會提示你Out of memory。
參考博客:https://www.cnblogs.com/panxuejun/p/5883044.html