備戰春招

文章目錄

1 大數據流處理技術各個的區別和聯繫

  1. 流式處理
    流處理講究的是對數據流的實時計算,對數據的實時性要求比較高,一般用於處理線上數據。比較典型的流處理框架有Apache Storm 和 Spark Stream,Apache Flink。
  2. 各個組件的特點
    Apache Storm 響應迅速,延遲低,但是Apache Storm不能保證消息處理的順序性,有可能導致消息重複處理,但至少每條數據都會被處理。
    Spark Streaming主要講究的是微批處理,會先將數據進行緩存,然後對緩存數據進行小規模處理。這種方式的實際效果非常好,但相比真正的流處理框架在性能方面依然存在不足。
    Apache Flink 是一個比較年幼的項目,可將批處理數據視作具備有限邊界的數據流,藉此將批處理任務作爲流處理的子集加以處理。實際上上一種面向數據字符流的處理方式。

2. 大數據批處理技術各個的區別和聯繫

  1. 批處理技術
    講究的是大批量離線數據的處理,對實時性的要求沒那麼高。對數據集的要求是:有界,持久,大量。比較典型的批處理技術有map reduce框架和spark core.
  2. 組件特點
    map reduce框架相對於其他批處理框架來說速度比較慢,原因是每次計算的中間結果都要落盤。但是由於磁盤想對而言比較廉價,所以以map reduce作爲計算框架的話成本比較低。所以適合處理對計算速度要求不高的且數據量非常大的批處理選擇
    spark core 相對於map reduce而言會把數據加載到內存,每次計算不會落盤,所以想對而言速度會比較高,但是部署成本比較高。但是由於spark採用的scala編寫,充分利用了函數式編程的特點,也會極大的節省內存空間。

12.大數據流處理技術之間的實現原理以及區別.

連續數據處理
微批處理
以流式處理思維處理批數據

3.Hive和HBase的存儲區別

Hive是一個建立在Hadoop上的數據倉庫,會將將分析查詢語句轉化爲MapReduce任務。不支持更新操作,亦不支持事務操作,適合離線數據分析。
HBase是存儲的key/value值的Nosql數據庫,支持增加數據的增刪改查。適合海量數據的實時查詢,但是分析能力比較薄弱。

4.倒排索引

正向索引以文件作爲索引,然後每個文件索引後面記錄各個關鍵詞的出現的次數,以及每次出現後記錄出現的位置。但是在按關鍵詞查詢時就得遍歷所有文件的所有關鍵字。
倒排索引就是將文件到關鍵詞的映射轉換爲關鍵詞到文件ID的映射,每個關鍵詞都對應着一系列的文件,這些文件中都出現這個關鍵詞。

5.hdfs各個節點的作用

NameNode

  • (管理已經用了哪些空間)Namenode 管理者文件系統的Namespace。它維護着文件系統樹以及文件樹中所有的文件和文件夾的元數據(metadata)。主要通過Namespace 鏡像文件(Namespace image)和操作日誌文件(edit log)管理這些信息,這些信息被Cache在RAM中,且會被持久化存儲在本地硬盤。

  • (管理還有哪些空間可以用)Namenode記錄着每個文件中各個塊所在的數據節點的位置信息,但是他並不持久化存儲這些信息,因爲這些信息會在系統啓動時從數據節點重建。

DateNode

  • 數據讀寫
  • 數據存儲

SecondaryNameNode

  • 是NameNode的冷備份;合併fsimage和fsedits然後再發給namenode。不能完全作爲namenode的備份,只能儘量減小主節點崩潰帶來的損失

5.HDFS讀寫特性

HDFS的讀取過程:
在這裏插入圖片描述

  1. 客戶端先通過FileSystem和NameNode通信獲取文件元數據節點,得到文件每個數據塊的存放位置
  2. 由於在HDFS上每個數據快會存儲多份,DFSInputStream連接保存此文件第一個數據塊的最近的數據節點並讀取數據塊
  3. 當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然後連接此文件下一個數據塊的最近的數據節點。直到數據讀取完畢。
  4. 在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。
  5. 失敗的數據節點將被記錄,以後不再連接。

HDFS的寫入過程:
在這裏插入圖片描述

  1. 首先用戶即客戶端想要上傳文件,就先要給namenode發個請求,告訴它說我要上傳文件了
  2. 然後namenode會返回一個響應,告訴客戶端哪些節點可以用來寫入數據
  3. 文件會分爲多個塊(block),寫的過程是以流的方式寫入的,一個塊存入一個DataNode
  4. 存完後DataNode和其他DataNode節點交互來備份數據,默認的備份數是3
  5. 存完後,會告訴namenode說我存完了結束了hdfs文件上傳的流程。

6.HDFS HA集羣搭建過嗎?是個什麼架構?NN只有一個嗎?SNN幹嘛的?能接替NN嗎?

HA指的是hdfs的高可用機制,指的是是一個集羣設置兩個namenode,一個處於active狀態,一個處於standby狀態。standby狀態的節點不提供對外服務,但是會同步active節點的信息,保證當active狀態出現問題的時候可以無縫對接。
這種機制主要解決單點故障問題,主要有兩方面的用途:
節點宕機
設備升級

hdfs的nameNode和SecondNameNode共同管理兩個文件:鏡像文件和編輯日誌
鏡像文件包含某個檢查點之前的全量元數據,包含文件樹結構和每個文件的存儲位置信息
編輯日誌保存最新的操作記錄。

SNN 會定期發送checkpoint請求,把NameNode的編輯日誌和鏡像文件請求過來,然後在本地進行合併,合併後的鏡像文件會替換nameName裏舊的鏡像文件。nameNode接到請求後並不會立刻響應,而是先創建一個新的編輯日誌,然後纔將舊的編輯日誌和舊的鏡像文件發給secondNamenode.

17.HA HDFS Zookeeper什麼作用,爲什麼要Zookeeper?

進行節點選擇,防止腦裂的產生。Zookeeper可以創建臨時節點,連接失敗即刪除,還而其他節點可以對臨時節點進行監視,一旦節點變更其他節點就可以收到通知。NameNode會在zookeeper上建立一個節點,然後standby節點對其進行監視,一旦NameNode宕機,standby節點就會替代主節點稱爲新的NameNode.

在hadoop2.0 中,如果standBy節點如果想稱爲新的NameNode就必須擁有舊NameNode 的全套數據。所以引入一個類似Zookeeper的JournalNode 集羣來保存共享數據,nameNode每次除了向本地的編輯日誌裏寫入數據,還要想集羣中寫入。雖然 Active NameNode 向 JournalNode 集羣提交 EditLog 是同步的,但 Standby NameNode 採用的是定時從 JournalNode 集羣上同步 EditLog 的方式,那麼 Standby NameNode 內存中文件系統鏡像有很大的可能是落後於 Active NameNode 的,所以 Standby NameNode 在轉換爲 Active NameNode 的時候需要把落後的 EditLog 補上來。

22.HDFS EditLog寫入了,但是NameNode元信息沒保存在內存中,數據不一致怎麼辦?

7.快排時間複雜度?最好什麼情況,最壞什麼情況?有什麼改進方案?

最好是nlog(n),最壞是n*n,發生在數據逆序的情況下。主要有basic_sort,二路快排和三路快排。

8. spark不同的部署模式

spark的執行主要有兩種角色 driver 和 excutor。driver負責運行DAGScheduler進行job調度、運行TaskScheduler進行task調度,有時候還要進行資源管理。而excutor就是執行作業的作用。不同的部署模式下可以理解爲這兩類節點的運行位置不一樣。更細一點來說,其實spark的作業調度和具體的部署模式無關,不同的部署模式下任務調度機制是不同的。
local模式:在本機啓動多個線程模仿spark執行過程的不同節點。所以這種模式下,任務調度模塊自然也是運行在本機的。
Standalone模式:是spark自帶的部署模式,要提前在集羣上啓動master節點和worker節點。在這種模式下,客戶端向master申請資源,然後由master在其所管理的節點上啓動Excutor,然後由客戶端和Excutor直接交互。任務調度模塊是運行在我們的客戶端的。
yarn Client 和 yarn cluster模式
yarn-cluster模式下,client將用戶程序提交給yarn,由yarn來選擇一個Excutor來執行driver.yarn-client模式下,Driver運行在客戶端上.如果客戶端上進程中斷,整個任務其實也就中斷了。所以yarn-client模式適合調試,yarn-cluster適合生產。

8.spark執行機制,RDD、DAG等

spark程序以SparkContext爲程序的入口,以Executor爲程序的執行線程。SparkContext由用戶啓動,在初始化的過程中會創建,包括DAGScheduler作業調度和TaskScheduler任務調度的兩級作業調度系統。DAGScheduler先根據action操作將作業劃分成不同的job,然後在每個job里根據是否出現寬依賴將作業劃分成不同的stage.每一個stage裏面有一個taskSet.taskSet的劃分以及是parttition.同一個stage裏的任務是並行執行的,不同的stage是串行執行的。最終DAGScheduler會將作業的執行過程劃分成一個有向無環圖。DAGScheduler按有向無環圖將每個stage提交給TaskScheduler,然後由TaskScheduler進行任務調度和資源管理,並把執行的結果反饋給DAGScheduler,當所有的stage執行完畢後DAGScheduler將整個作業的執行結果反饋給sparkContext.
在這裏插入圖片描述

9.大數據問題,很大的表和小表join怎麼優化?

第一種:將小表分發到不同的集羣節點,然後在每個集羣節點拿到小表單獨和本集羣的數據進行join操作
第二種:spark有個Union操作,將不同的表打上標籤,然後按要join的字段進行分區,這樣同一個分區就包含了字段,然後在每個分區裏單獨join然後將數據彙總。

9.大數據問題,很大的表和很大的表join怎麼優化?

參照上一個問題的第二問。

10.spark內存模型,如何解決OOM問題?如何解決SOF問題?

spark的內存大體上分爲三塊,一塊是execution內存,一塊是storage內存,一塊是other內存。

  1. execution內存是執行內存,文檔中說join,aggregate都在這部分內存中執行,shuffle的數據也會先緩存在這個內存中,滿了再寫入磁盤,能夠減少IO。其實map過程也是在這個內存中執行的。
  2. storage內存是存儲broadcast,cache,persist數據的地方。
  3. other內存是程序執行時預留給自己的內存。

spark的內存發生OOM的情況有很多種:
driver端的內存溢出結局思路一個是增大內存,第二個是不要把計算結果拉倒driver端。
同一個stage裏的數據採用的是迭代器的方法進行計算,所以常規操作不會內存溢出,但是如果用flatMap生成將一個對象擴大到很多倍,同一個Excutor的多個core同時擴張,就可能內存溢出。
shuffle的read階段要從其他節點上讀拉去數據,如果拉取數據過多也會發生內存溢出,這個解決思路是增大分區數
但是分區數過多會佔用大量的文件句柄,也會發生內存溢出,所以分區數也不能過多。
在進行整個partition級別的操作,如果在parttion內部生成大批量對象也會發送內存溢出。

SOF指的是數據傾斜。
合理設置分區函數
增大分區數
建立黑名單,把可能導致分區太大的數據過濾掉

11.HDFS DataNode死了怎麼辦,NameNode發生了什麼變化?

如果DataNode死了,必然會發生某些數據塊的副本數不達標的情況。NameNode會檢查哪些文件塊副本缺失,然後讓其他DataNode找到相應的副本塊進行復制。

12 .JVM GC回收算法,各自優缺點,什麼場景使用?

複製算法:一般用於年輕代的垃圾回收算法,當然G1垃圾收集器也用了這種,複製算法效率高,但是會有大量的內存空間被浪費。
標記清除:這個很少用,只有CMS垃圾回收器會用這種垃圾回收機制,優點是相對標記整理速度快,但是會產生大量內存碎片。導致full GC出現。
標記整理:大部分的垃圾回收器的老年代會使用這種垃圾回收算法,缺點是速度慢,優點是不會產生磁盤碎片,不會有內存浪費

13.HashMap get和put源碼,爲什麼紅黑而非平衡樹?

紅黑樹的查找性能比較差,但是插入性能高。但從CHM的角度來講就好理解了,因爲讀取數據是不用加鎖的,但是插入數據要加鎖,這樣來看,寫入效率更高的數據結構會更好

14.CHM結構,1.7/1.8區別?

1.7 使用的是數據加鏈表 1.8引入紅黑樹
jdk1.7中採用Segment + HashEntry,Segment 繼承ReentrantLock,使用的cas機制加鎖
jdk1.8使用的node節點+cas鎖+ Synchronized鎖,cas鎖主要用於修改voliate的計數變量,而Synchronized鎖用於鎖定樹節點。

16.排序時間複雜度/空間複雜度,插入,歸併等,很大的絕大部分有序的數組已經在內存,選擇什麼排序算法,時間複雜度?

插入:空間複雜度爲1,時間複雜度爲最好n,最差n2
折半插入:空間爲1,時間最好爲n,最差爲n2,主要考慮移動次數
快排:空間爲logn,時間最好nlogn,最差n2

18.數據庫隔離級別,哪些導致髒讀,哪些導致幻行?

讀未提交:可以導致髒讀,丟失修改,不可重複讀,幻讀
讀已提交:可以防止髒讀和丟失修改,但是不可以防止不可重複讀,和幻讀
可重複讀:已經讀的數據不許其他事物動,但是未讀的可以。可以阻止髒讀,丟失修改,不可重複讀
可串行化:滿足ACID特性

四種問題
髒讀
丟失修改
不可重複讀

19.分代收集算法

1.老年底和年輕帶的收集算法
2.數據什麼時候會進入老年代
大對象直接進入老年代
年輕帶回收的分配擔保機制:當Edon區的剩餘文件放入survivor放不下,可以使用分配擔保機制放入老年代
動態年齡判斷:Hotspot遍歷所有對象時,按照年齡從小到大對其所佔用的大小進行累積,當累積的某個年齡大小超過了survivor區的一半時,取這個年齡和MaxTenuringThreshold中更小的一個值,作爲新的晉升年齡閾值

10.G1垃圾回收器

11.線程池的核心參數

核心參數主要有三個:
corePoolSize : 當等待隊列不滿的情況下,允許線程池允許的並行數。
maximumPoolSize : 當隊列中存放的任務達到隊列容量的時候,當前可以同時運行的線程數量變爲最大線程數。
workQueue: 當新任務來的時候會先判斷當前運行的線程數量是否達到核心線程數,如果達到的話,新任務就會被存放在隊列中。
飽和策略:如果當前同時運行的線程數量達到最大線程數量並且隊列也已經被放滿了任時。包括拋棄新任務,拋棄舊任務,拋出異常,自啓線程

12 併發容器,幾種隊列,分別幹啥的

兩種map:hashMap和SkipMap
三種阻塞隊列:ArrayBlockingQueue,LinkedBlockingQueue,優先隊列
一個非阻塞LinkedQueue,一個讀寫數組

13.Hadoop1.x和2.x之間的區別

  1. hadoop 1.x系列只有兩個組件,hdfs和map reduce,hadoop 2.x系列除了hdfs和map reduce還有yarn
  2. hadoop 1.x系列的hdfs不支持HA,會有單點故障,而2.x系列支持HA機制
  3. hadoop 1.x系列的mapreduce 使用的是自帶的資源調度系統,而2.x使用yarn作爲資源調度系統
  4. 解決內存受限問題,使用HDFS Federation機制,內存水平擴展,支持多NameNode。每個NameNode分管一部分目錄,所有NameNode共享所有DataNode存儲資源。

14.HBase架構,爲什麼其隨機查詢很快?

  1. 緩存機制
  2. region索引
  3. 內存的速度遠超磁盤,1000倍以上。而讀取的性能提升,主要還是依靠內存命中率而非磁盤讀的次數
  4. 寫入不佔用磁盤的io,讀取就能獲取更長時間的磁盤io使用權,從而也可以提升讀取效率。
  5. 使用布隆過濾器可以快速判斷一個數據是否在一個文件裏

15.一個分佈式系統,爲什麼測試的時候響應很快,而到實際線上部署時響應就會變慢?分析可能原因並給出理由

網絡延遲
數據量過大
數據傾斜

16.大數據的特性

數據量大
數據複雜
處理速度快
價值密度低

17.對虛擬內存的理解

一方面:如果一個32位的計算機,其尋址空間是4g,但是如果是一個64位的操作系統,其地址空間是4G * 2^32次方。實際上操作系統的空間是不可能達到這麼大的這樣就會造成尋址空間的浪費。
另一方面:有時候一些程序軟件,要使用的內存量也會遠遠超過計算機用友的內存量。
有鑑於此,引入了虛擬內存,以磁盤空間作爲內存的擴展。根據局部性原理,只需要保存少量的數據在真正的內存中,其他的放在虛擬內存,當在真正內存中找不到想要的數據,就可以從吧需要的數據和其周圍的數據都調用到內存。

19.mysql 行鎖實現方式

InnoDB 行鎖是通過給索引上的索引項加鎖來實現的。
這句話有幾個側重點:
對於索引而言要注意以下幾點:

  1. 只有通過索引條件檢索數據(不是用到索引字段就加鎖)
  2. 索引包括主鍵索引、唯一索引或普通索引
  3. 有些情況看似用的高索引,但是實際上沒有。只有執行計劃真正使用了索引,才能使用行鎖:即便在條件中使用了索引字段,但是否使用索引來檢索數據是由 MySQL 通過判斷不同執行計劃的代價來決定的,如果 MySQL 認爲全表掃描效率更高,比如對一些很小的表,它就不會使用索引,這種情況下 InnoDB 將使用表鎖,而不是行鎖。
  4. 由於 MySQL 的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然多個session是訪問不同行的記錄, 但是如果是使用相同的索引鍵, 是會出現鎖衝突的(後使用這些索引的session需要等待先使用索引的session釋放鎖後,才能獲取鎖)。 應用設計的時候要注意這一點。

19.mysql 間隙鎖實現方式

間隙鎖有兩種:
l 間隙鎖(Gap Lock):鎖定索引記錄間隙,確保索引記錄的間隙不變。間隙鎖是針對事務隔離級別爲可重複讀或以上級別而已的。

l Next-Key Lock :行鎖和間隙鎖組合起來就叫Next-Key Lock。

20.mysql的默認級別使用的是可重複讀,實現方式是加行鎖,加行鎖分爲快照行鎖和非快照讀,非快照讀用的是mvcc機制實現行鎖,非快照讀使用的是通常意義上的鎖

21 MySQL可重複讀的隔離級別中並不是完全解決了幻讀的問題,而是解決了讀數據情況下的幻讀問題。

22 mysql爲了實現可重複就要其中一個事務讀的時候就要對其加鎖,不許其他事務修改。加鎖就有兩種選擇,加表鎖和加行鎖,但是加表鎖就會降低併發性,所以只有行鎖就能滿足單條數據的額不可重複讀。但是進一步看如果我們解決幻讀問題怎麼辦,就要考慮用Gap鎖

意向鎖

鎖分爲共享鎖和排他鎖

  • 意向鎖是爲了解決多粒度鎖共存問題
    innodb的意向鎖主要用戶多粒度的鎖並存的情況。比如事務A要在一個表上加S鎖,如果表中的一行已被事務B加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的數據很多,逐行檢查鎖標誌的開銷將很大,系統的性能將會受到影響。爲了解決這個問題,可以在表級上引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。舉個例子,如果表中記錄1億,事務A把其中有幾條記錄上了行鎖了,這時事務B需要給這個表加表級鎖,如果沒有意向鎖的話,那就要去表中查找這一億條記錄是否上鎖了。如果存在意向鎖,那麼假如事務A在更新一條記錄之前,先加意向鎖,再加X鎖,事務B先檢查該表上是否存在意向鎖,存在的意向鎖是否與自己準備加的鎖衝突,如果有衝突,則等待直到事務A釋放,而無須逐條記錄去檢測。事務B更新表時,其實無須知道到底哪一行被鎖了,它只要知道反正有一行被鎖了就行了。

20.socket含義?實現方式?

25.如果你用MapReduce程序實現數據遷移,Map任務怎麼設計,比如給你一張表要遷移

26.數據庫索引,B+樹細節

27.java單例模式的實現,DCL如何保證線程安全

29.二分查找,變形

標準二分查找
左右編輯二分查找

30.Select epoll實現原理和區別?

lunix有三種IO多路複用技術:分別是select,poll 和 epoll

select 採用的是集合監聽一定數量的端口,每次有消息需要讀取,需要輪訓每個端口讀取消息。時間複雜度是n。此外,我們的集合定義在用戶態,每次輪訓要先把消息傳入內核態,然後從內核態拿到數據,消耗比較大

poll和select類似,不同的是select使用的是鏈表,不限制連接數量

而epoll的事件fd(文件描述符)放在系統內核,每次只把就緒事件傳回用戶空間。

epoll的兩種工作方式:1.水平觸發(LT)2.邊緣觸發(ET)
LT(level triggered) 是缺省的工作方式,並且同時支持block和no-block socket.在這種做法中,內核告訴你一個文件描述符是否就緒了,然後你可以對這個就緒的fd進行IO操作。如果你不作任何操作,內核還是會繼續通知你的
優點: 當進行socket通信的時候,保證了數據的完整輸出,進行IO操作的時候,如果還有數據,就會一直的通知你。
缺點: 由於只要還有數據,內核就會不停的從內核空間轉到用戶空間,所有佔用了大量內核資源,試想一下當有大量數據到來的時候,每次讀取一個字節,這樣就會不停的進行切換。內核資源的浪費嚴重。效率來講也是很低的。
ET(edge-triggered) 是高速工作方式,只支持no-block socket。在這種模式下,當描述符從未就緒變爲就緒時,內核只通知你一次,如果沒處理完,或者不處理都不會再通知。

優點: 每次內核只會通知一次,大大減少了內核資源的浪費,提高效率。
缺點:不能保證數據的完整。不能及時的取出所有的數據。
應用場景: 處理大數據。使用non-block模式的socket。

33.mysql如何調優?

33.HashMap底層、CHM底層

34、強引用、弱引用、虛引用等,ThreadLocal可能導致的內存泄漏問題

強引用,使用new方式創建的引用
軟引用
ThreadLocal 內部的map使用的是弱應用作爲key,但是ThreadLocal 的弱引用,如果在外部沒有強引用執行ThreadLocal ,則弱引用被回收,那隊列裏的value就會一直存在導致內存泄漏

35、JVM中的鎖

無鎖狀態:如果只有一個線程,不存在競爭狀態,即便使用了關鍵字也不會加鎖
偏向鎖:一個鎖會偏向於第一個獲得它的線程,如果在接下來的執行過程中,該鎖沒有被其他的線程獲取,則持有偏向鎖的線程將永遠不需要在進行同步。
輕量級鎖:使用cas方法加鎖
重量級鎖:傳統意義的鎖

鎖自旋 :拿到鎖之前,如果鎖被佔用,就空循環一會
鎖粗話:如果一個連續的空間反覆加鎖解鎖,可以考慮對整段

36、Lock和synchronized的區別

  1. 兩者都是可重入鎖
  2. 前者靠cas技術實現,後者是jvm底層實現
  3. lock可以實現終止阻塞,公平鎖,選擇性通知

37、除了鎖,其他保障線程安全的方式

不可變變量
cas
變量副本

38、同步塊外部執行wait和notify能達到效果嗎?

不能

41、間隙鎖

https://blog.csdn.net/weixin_34344403/article/details/85996731

42、HBase整體架構

數據存儲是HDFS
數據的讀寫是REgionServer
然後表的增刪改查是HMaster
最後是zookeeper管理元數據的存儲位置和客戶端交互

43、HBase和MySQL區別,取代的可能性,場景等

MySQL是傳統的關係型數據庫,數據在底層是按行存儲
而Hbase是一種noSql類型的半結構化數據庫,數據的是以鍵值對的方式按列存儲。

mysql適合數據量小,擴展需求少,讀寫均衡
hbase適合大量數據,隨機檢索,寫比讀快

爲什麼Hbases使用日誌結構樹而不用B+樹.

B+樹對數據讀取比較有優勢,但是對頻繁的隨機寫效率比較差,因爲需要尋址會浪費很長時間.但是HBase的日誌結構樹,數據線保存在內存,然後定期刷寫到磁盤,但是內存中數據是有序的,節省了大量的尋址時間,把隨機寫變成順序寫。

44、HBase架構,ZooKeeper作用

管理元數據的的存儲位置
和客戶端交互
節點選舉

45、HBase Region分裂,怎麼分裂的,父Region是直接刪掉了嗎?

默認得分分裂方式是 min(n^2 * 128M,10G)

46、Spark RDD的理解

彈性分佈式數據集
屬於partition的抽象集合
由於spark的RDD要麼由原始數據生成,要麼從別的RDD轉換,所以RDD內部有一種稱爲有向無環圖圖的血統機制用於容錯和job調度。

47、Spark map和flatMap區別

map Functors的實現,確保把一個類型的數據作用於一個函數,返回的類型和原值相同
flatMap monad 的實現
reduce monoid的實現,滿足結合率和單位元

48、Spark在集羣中怎麼執行程序的?如果有聚合操作呢?

49、Java Concurrent包裏面用過什麼?列舉一些

線程池
併發容器
非阻塞鎖
原子類

50、Java讀寫鎖,爲什麼併發讀要加鎖?

併發讀加鎖是爲了給寫鎖看的,不然寫鎖是沒法判斷有沒有線程正在讀鎖的。

50、Java讀寫鎖,公平和非公平的區別

非公平模式(默認)
當以非公平初始化時,讀鎖和寫鎖的獲取的順序是不確定的。非公平鎖主張競爭獲取,可能會延緩一個或多個讀或寫線程,但是會比公平鎖有更高的吞吐量。
公平模式
當以公平模式初始化時,線程將會以隊列的順序獲取鎖。噹噹前線程釋放鎖後,等待時間最長的鎖會被分配,不同的是讀鎖成批分配,而寫鎖只能一個個分配。
可重入
允許讀鎖可寫鎖可重入。寫鎖可以獲得讀鎖,讀鎖不能獲得寫鎖。
鎖降級
允許寫鎖降低爲讀鎖

50、Java讀寫鎖的鎖降級問題

指把持住(當前擁有的)寫鎖,再獲取到讀鎖,隨後釋放(先前擁有的)寫鎖的過程。
刻另一個線程(記作線程T)獲取了寫鎖並修改了數據,那麼當前線程無法感知線程T的數據更新
提高讀寫性能

52、Java 使用synchronized關鍵字有什麼隱患?

  1. 低競爭情況下效果不如CAS類型的鎖,例如Retreenlock.
  2. 死鎖

53、如何終止一個正在運行的線程?

  1. 共享變量,原子布爾值
  2. stop
  3. interupt()配合以異常捕捉

54、JVM CMS垃圾回收器和G1之間的區別?G1詳細是怎麼回收垃圾的?

清除算法:
清除區域:cms是老年代,G1是年輕代和老年代
清除目標:cms會回收所有老年代的對象,而G1是所有年輕帶和部分老年代
卡表的指向:cms是有年輕帶指向老年代,而G1是相反
內存佈局:年輕代,老年代

55、JVM如何判斷對象是否可回收?

一般有引用計數法和可達性分析兩種:
有四種類型的對象會被記爲gc root:
虛擬機棧中引用所指向的對象
本地方法棧中引用的對象

類中的靜態變量,保存在方法區
常量池裏的引用的對象 static final關鍵字

56、什麼時候、什麼情況下會發生GC回收?新生代和老年代分別介紹

miniGC Eden區空間滿了會發生
fullGC 有5種:
大對象不夠放
元數據空間已滿
system.gc()
分配擔保機制失敗
歷次從S區晉升到老年代的平均值大於老年代剩餘空間

57、Java調試命令。看線程運行狀態用什麼?看堆棧信息用什麼?

在這裏插入圖片描述
StringBuffer和StringBuilder區別:

MVCC只在COMMITTED READ(讀提交)和REPEATABLE READ(可重複讀)兩種隔離級別下工作。
而未提交讀隔離級別總是讀取最新的數據行,無需使用 MVCC。可串行化隔離級別需要對所有讀取的行都加鎖,單純使用 MVCC 無法實現。

進程同步有哪些方式
在這裏插入圖片描述

java的線程同步方式

  1. 同步代碼塊
  2. 同步方法
  3. 可重入鎖
  4. 抽象隊列同步器

垃圾回收機制

常量池:
在這裏插入圖片描述

判定一個常量是否是“廢棄常量”比較簡單,而要判定一個類是否是“無用的類”的條件則相對苛刻許多。類需要同時滿足下面 3 個條件才能算是 “無用的類” :

該類所有的實例都已經被回收,也就是 Java 堆中不存在該類的任何實例。
加載該類的 ClassLoader 已經被回收。
該類對應的 java.lang.Class 對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。
集合

AQS簡介

  1. 對於互斥共享資源的訪問。如果有線程請求資源的時候,且資源空閒,那線程可以直接訪問,。但是如果資源不空閒,就需要一套進程阻塞和喚醒機制。抽象隊列同步器,假設存在一個虛擬的雙向隊列,把不能獲得資源的線程當做一個節點加入到隊列等待喚醒。
  2. AQS使用共享變量作爲資源使用標誌,使用protected組作爲共享變量的訪問和修改,保證了只有子類能對共享變量進行操作。
  3. AQS對共享資源的訪問有兩種,獨佔訪問和共享訪問。
  4. AQS的底層使用模板方法,只要基礎指定的類,實現指定的方法即可實現自己的的抽象隊列同步器。

Semaphore(信號量)-允許多個線程同時訪問

公平和非公平

倒計時器

概念:
初始設置一個固定容量的倒計時器,使用await的進程會被阻塞,知道其內部的計數器被調用count.Down方法消耗完畢
用法:
1.單線程await,一個線程等待其他線程運行完畢
2. 多線程await,多個線程一個並行行動

CyclicBarrier(循環柵欄)

概念:
設置一個初始容量的循環刪欄。每一個調用await的方法都會被阻塞,同時把循環刪欄容量減一。直到循環刪欄容量消耗完畢,所有調用await的方法一起執行,
用法:
CyclicBarrier 可以用於多線程計算數據,最後合併計算結果的應用場景。

什麼是內存泄漏,出現的場景

內存泄露是指無用對象(不再使用的對象)持續佔有內存或無用對象的內存得不到及時釋放,從而造成的內存空間的浪費稱爲內存泄露。

  1. 容器使用後不設爲null,那容器裏的數據都不會被回收
  2. 對象被放入容器後,然後被修改,使對象無法從集合裏remove,導致內存泄漏
  3. 各種連接和流不曾顯示關閉
  4. 單例對象內部持有外部對象的引用
  5. 使用弱應用作爲hashMap的key值

RDD 的理解

spark RDD是關於partition集合的管理工具。spark的所有操作雖然都是以RDD爲入庫,但是都是以partition爲單位進行的

彈性:

  1. 自動在內存和磁盤裏切換
  2. 基於lineage的的多級容錯機制。如果單個partition出錯,可以重試單個partition,如果單個stage出錯,可以重試單個stage
  3. spark不會對中間結果進行緩存,但是可以通過checkpoint和persisit機制對計算結果再利用

spark的RDD分類

shuffleMapTask RDD和resultRDD

模板模式和策略模式

意圖是一樣的,都是強調把可變和不可變的部分拆開,可變部分留給子類實現,不可變部分提前實現。
但是模板模式強調父類或者抽象類完成對方法的組合,而子類完成對方法的實現,強調的是類的多樣性。

而策略模式是強調把一些輸出輸出相同但是內部邏輯不同的算法封裝成一個個策略類作爲屬性裝配到類裏面,強調的類的替換性。
優點:

  1. 解決大量if else分支問題
  2. 便於算法切換,擴展性好
    缺點:
    策略類增多
    策略暴露

進程調度的方式有非剝奪方式和剝奪方式。

非剝奪方式:  
分派程序一旦把處理機分配給某進程後便讓它一直運行下去,直到進程完成或發生某事件而阻塞時,才把處理機分配給另一個進程。
剝奪方式:  
當一個進程正在運行時,系統可以基於某種原則,剝奪已分配給它的處理機,將之分配給其它進程。剝奪原則有:優先權原則、短進程優先原則、時間片原則。

進程調度算法:

1、先進先出算法(FIFO):
算法總是把處理機分配給最先進入就緒隊列的進程,一個進程一旦分得處理機,便一直執行下去,直到該進程完成或阻塞時,才釋放處理機。  
2、最短CPU運行期優先調度算法(SCBF–Shortest CPU Burst First):
該算法從就緒隊列中選出下一個“CPU執行期最短”的進程,爲之分配處理機。
3、時間片輪轉法:
前幾種算法主要用於批處理系統中,不能作爲分時系統中的主調度算法,在分時系統中,都採用時間片輪轉法。  簡單輪轉法:系統將所有就緒進程按FIFO規則排隊,按一定的時間間隔把處理機分配給隊列中的進程。這樣,就緒隊列中所有進程均可獲得一個時間片的處理機而運行。
4、多級反饋隊列:
多級隊列方法:將系統中所有進程分成若干類,每類爲一級。 多級反饋隊列方式是在系統中設置多個就緒隊列,並賦予各隊列以不同的優先權。

多線程優點

響應速度快
cpu利用率高
同一個進程內同時做多件事
創建,銷燬,切換代價都比較低

java類的生命週期

  1. 加載
    將靜態的類字節碼加載到方法區,並創建一個calss類
    加載的時機:
    加載子類先加載父類
    使用反射調用
    使用new
    還有程序的執行入口含有main函數的類
  2. 連接
    驗證字節碼的正確性和合法性
    爲靜態變量分配內存並賦初值
    將符號引用換成直接引用

3.初始化
變量的賦值語句和static語句塊

6.卸載
類的class對象不再被使用,包括以下三項:
不再有類的實例
不再有對靜態變量和靜態方法的引用
類加載器也已經被卸載

31.Java類的生命週期,變量賦值在什麼階段?

hashMap,put

  1. 判斷數組是否爲空或者長度爲0,如果是就先擴容。如果不是就繼續
  2. 然後計算數組下標(hash & (n-1)),如果對應的下標爲空,直接插入
  3. 如果不爲空就判斷是否是樹節點,如果是就直接插入,如果不是就判斷key是否相等,判斷方法是先判斷hashcode是否相等,再判斷equal或者"=="是否相等。是鏈表,通過遍歷插入,插入後判斷長度是否大於8,如果是將鏈表轉爲紅黑樹
  4. 最後判斷hashMap的元素是否超過閾值。如果是就擴容。

hashMap,get

  1. 先判斷對應下標下的元素是否爲空,如果爲空就直接返回
  2. 然後判斷對應下標下的元素如果是hashcode相等且==或者equal相等,那就返回
  3. 如果不是,且對應下的元素不是唯一元素,有可能是樹的根節點或者是鏈表的首節點。所以先判斷第一個節點是否是樹節點,如果是就在樹裏面找,找到即返回,找不到返回空。如果不是樹節點,那就是鏈表,通過循環遍歷來找到元素,找到即返回,找不到返回空。

mysql的explain用來分析語句

https://www.cnblogs.com/deverz/p/11066043.html@[TOC]@[TOC]@TOC

mysql用到臨時表

內存臨時表:
1.ORDER BY子句和GROUP BY子句不同, 例如:ORDERY BY price GROUP BY name;
2.ORDER BY中使用了DISTINCT關鍵字 ORDERY BY DISTINCT(price)

3.當group by 索引的時候,當數據量較小的時候不會使用臨時表,當數據量大的時候會使用臨時表
4.當group by 不是索引的時候會使用臨時表

磁盤臨時表:
表有text和blog類型數據
GROUP BY 或者 DISTINCT 子句中包含長度大於512字節的列
使用UNION或者UNION ALL時,SELECT子句中包含大於512字節的列

spark和map reduce的區別

通常大家說的觀點是:
spark是基於內存的計算框架,

  1. 節點直接的通信機制
  2. shuffle操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章