大數據練習題


1.NIO與BIO相比,具有哪方面的優勢?

(1)非阻塞:提高傳輸效率

(2)一對多連接:可以用一個或者少量的服務器中的線程來處理大量對的請求從而節省服務器的內存資源

(3)即使是已經建立連接,只要沒有對應的讀寫事件,那么依然不能夠使用服務器來進行處理

(4)利用通道來實現雙向傳輸

(5)因為利用緩沖區來存儲數據,所以可以對緩沖區中的數據實現定點操作

2.紅黑樹的特征及其修復過程

 

3.NIO的基本組件有哪些,並介紹其作用

(1)Buffer 緩沖區:容器 - 存儲數據 - 底層用數組來存儲數據

(2)Channel 通道:傳輸數據 - 是面向緩沖區的。在Java中,Channel默認也是阻塞的,需要手動設置其為非阻塞。FileChannel - 文件通道可以利用通道技術實現相同平台之間的零拷貝技術。

(3)Selector 多路復用選擇器:進行選擇 - 是面向通道進行操作,要求通道是使用的時候必須設置為非阻塞模式。通過Selector可以使用同一服務器同時處理多個客戶端發來的數據,可以以少量線程處理大量請求 —— 在底層處理的時候實際上依然是同步的。

4.跳躍表的概念,時間復雜度,適用場景

 快速查詢數據的結構

O(logN)

適用於讀取多,增刪改少的場景

5.線程池的定義,特點

定義:儲存線程的隊列

特點:

(1)線程池在創建的時候是沒有線程的

(2)當過來請求的時候,就會線程池中創建一個線程來處理這個請求。當請求請求處理完畢的時候,線程會歸還給線程池,等待下一個請求。

(3)核心線程在線程池中需要限定數量

(4)如果所有的核心線程都被占用,那么新來的請求就會被放入工作隊列中。工作隊列是一個阻塞隊列。

(5)如果核心線程都被占用,並且工作隊列已滿,那么會創建臨時線程來處理新的請求

(6)臨時線程處理完請求后並不是立即銷毀,而是會存貨一段時間,如果這段事件之內依舊沒有新的請求,那么臨時線程就被銷毀。

6.hadoop的讀過程

1.客戶端發起RPC請求訪問NameNode

2.namenode會查詢元數據,找到這個文件的存儲位置對應的數據塊的信息

3.namenode將文件對應的數據塊的節點地址的全部或者部分放入一個隊列中然后返回

4.client收到這個數據塊對應的節點地址

5.client會從隊列中取出第一個數據塊對應的節點地址,會從這些節點地址中選擇一個最近的節點進行讀取

6.將Block讀取之后,對Block進行checksum的驗證,如果驗證失敗,說明數據塊產生損壞,那么client會向namenode發送信息說明該節點上的數據塊損壞,然后從其它節點中再次讀取這個數據塊

7.驗證成功,則從隊列中取出下一個Block的地址,然后繼續讀取

8.當把這一次的文件塊全部讀取完之后,client會向namenode要下一批block的地址

9.當把文件全部讀取完成之后,從client會向namenode發送一個讀取完畢的信號,namenode就會關閉對應的文件

7.hadoop的shuffle過程

 MapTask

1.獲取到切片(FileSplit)信息

2.每一個切片對應一個MapTask

3.讀取具體的數據塊

4.按行讀取數據

5.每一行數據會調用一次map方法,進行處理

6.map方法在執行完成之后會產生k-v結構,這個數據會存在緩沖區中

7.在緩沖區中會進行partition/sort/combine

8.緩沖區默認大小是100M,緩沖區中還會有一個閥值 —— 80% ——就意味着如果緩沖區使用達到了80%的時候,認為緩沖區滿了

9.如果緩沖區滿了,就會將緩沖區中的數據寫到磁盤的文件中,過程稱為Spill(溢寫),寫出的文件稱之為溢寫文件。

10.每一個溢寫文件中的數據是分好區且排好序的

11.每一次spill過程都會產生一個新的溢寫文件,所以所有的溢寫文件從整體上不是分區而是排序的

12.在交給ReduceTask之前,會對所有的溢寫文件進行一次合並 —— merge

13.合並之后的文件是對所有的數據進行了整體的分區並且排序

注意:

  1. Spill過程不一定發生
  2. 如果產生了Spill過程,且最后一次的數據不足閾值,將最后一次的緩沖區中的數據flush到最后一個溢寫文件中
  3. 切片的大小和溢寫文件的個數不是對等的
  4. 達到緩沖區的80%的時候會Spill到溢寫文件中,理論上Spill文件應該是80M,實際上溢寫文件一定是80M么?--- 不一定 ①要考慮最后一次的flush;②要考慮序列化的因素
  5. 如果溢寫文件的個數>=3個,在merge的時候會再進行一次combine過程
  6. 每一個MapTask對應一個緩沖區
  7. 緩沖區本質上是一個字節數組
  8. 緩沖區是一個環形緩沖區,為了重復利用緩沖區
  9. 閾值的作用:①防止數據覆蓋②防止寫入過程的阻塞

ReduceTask

  1. ReduceTask通過http請求來訪問對應的MapTask獲取到分區的數據 --- fetch - fetch線程數量默認是5
  2. 獲取到不同的MapTask的數據之后,會對數據進行merge,將數據合並(將相同的鍵所對應的值放入一個迭代器中)且排序(根據鍵進行排序)
  3. 每一個鍵調用一次reduce方法來進行處理
  4. 將處理之后的數據寫到HDFS中

 

注意:

  1. merge因子:確定每次將幾個文件合並一次。默認是10。如果文件個數<merge因子,直接合並
  2. ReduceTask的閾值:ReduceTask不是等所有的MapTask都結束之后才啟動執行,而是在一定數量的MapTask結束之后就開始啟動抓取數據。--- 5% --- 當5%的數量的MapTask結束之后,ReduceTask就開始啟動抓取數據

調優

  1. 可以調大緩沖區,一般建議是250~400M之間
  2. 可以適當的增加combine過程
  3. 在map過程中會產生一個最后merge好的文件,通過網絡發送給ReduceTask --- 可以將文件進行壓縮,壓縮之后再發送 --- 如果網絡帶寬比較稀缺,這個時候可以考慮壓縮

8.flume的基本組件機制

flume運行的核心就是agent,agent本身是一個Java進程,

agent里面包含3個核心的組件:source—->channel—–>sink,類似生產者、倉庫、消費者的架構。

source:source組件是專門用來收集數據的,可以處理各種類型、各種格式的日志數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義。

channel:source組件把數據收集來以后,臨時存放在channel中,即channel組件在agent中是專門用來存放臨時數據的——對采集到的數據進行簡單的緩存,可以存放在memory、jdbc、file等等。

sink:sink組件是用於把數據發送到目的地的組件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義。

一個完整的工作流程:source不斷的接收數據,將數據封裝成一個一個的event,然后將event發送給channel,chanel作為一個緩沖區會臨時存放這些event數據,隨后sink會將channel中的event數據發送到指定的地方—-例如HDFS等。

注:只有在sink將channel中的數據成功發送出去之后,channel才會將臨時event數據進行刪除,這種機制保證了數據傳輸的可靠性與安全性。 

 

9.Zookeeper的特點

  1. 本身是一個樹狀結構 --- Znode樹
  2. 每一個節點稱之為znode節點
  3. 根節點是 /
  4. Zookeeper的所有操作都必須以根節點為基准進行計算  /
  5. 每一個znode節點都必須存儲數據
  6. 任意一個持久節點都可以有子節點
  7. 任意一個節點的路徑都是唯一的
  8. Znode樹是維系在內存中 --- 目的是為了快速查詢
  9. Zookeeper不適合存儲海量數據。原因:1)維系在內存中,如果存儲大量數據會耗費內存 2) 不是一個存儲框架而是一個服務協調框架
  10. Zookeeper會為每一次事務(除了讀取以外的所有操作都是事務)分配一個全局的事務id ---Zxid

10.讀寫鎖機制

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM