大數據——複習篇

1.1 Linux&Shell相關總結
1.1.1 Linux常用命令
序號 命令 命令解釋
1 top 查看內存
2 df -h 查看磁盤存儲情況
3 iotop 查看磁盤IO讀寫(yum install iotop安裝)
4 iotop -o 直接查看比較高的磁盤讀寫程序
5 netstat -tunlp | grep 端口號 查看端口占用情況
6 uptime 查看報告系統運行時長及平均負載
7 ps aux 查看進程
8 :set number 顯示行號
9 yyp 複製光標所在行,並粘貼
10 kill 殺死進程
11 du -h 查看目錄大小

12

1.2 Hadoop相關總結
1.2.1 Hadoop常用端口號
dfs.namenode.http-address:50070
dfs.datanode.http-address:50075
SecondaryNameNode輔助名稱節點端口號:50090
dfs.datanode.address:50010
fs.defaultFS:8020 或者9000
yarn.resourcemanager.webapp.address:8088
歷史服務器web訪問端口:19888

1.2.2 Hadoop配置文件以及簡單的Hadoop集羣搭建
(1)配置文件:
core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
hadoop-env.sh、yarn-env.sh、mapred-env.sh、slaves
(2)簡單的集羣搭建過程:
JDK安裝
配置SSH免密登錄
配置hadoop核心文件:
格式化namenode

1.2.3 HDFS讀流程和寫流程
寫流程:
1、 client發起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
2、 client請求第一個block該傳輸到哪些DataNode服務器上;
3、 NameNode根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的DataNode的地址如:A,B,C;

4、 client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,將整個pipeline建立完成,後逐級返回client;
5、 client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位(默認64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
6、 數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipelineack發送給client;
7、關閉寫入流。
8、 當一個block傳輸完成之後,client再次請求NameNode上傳第二個block到服務器。
讀流程:
1、客戶端通過調用FileSystem對象的open()來讀取希望打開的文件。
2、 Client向NameNode發起RPC請求,來確定請求文件block所在的位置;
3、 NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode 都會返回含有該 block 副本的 DataNode 地址; 這些返回的 DN 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,然後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;
4、 Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那麼將從本地直接獲取數據(短路讀取特性);
5、 底層上本質是建立 Socket Stream(FSDataInputStream),重複的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;
6、並行讀取,若失敗重新讀取
7、 當讀完列表的 block 後,若文件讀取還沒有結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;
8、返回後續block列表
9、 最終關閉讀流,並將讀取來所有的 block 會合併成一個完整的最終文件。

1.2.4 MapReduce的Shuffle過程

1)Map方法之後Reduce方法之前這段處理過程叫Shuffle
2)Map方法之後,數據首先進入到分區方法,把數據標記好分區,然後把數據發送到環形緩衝區;環形緩衝區默認大小100m,環形緩衝區達到80%時,進行溢寫;溢寫前對數據進行排序,排序按照對key的索引進行字典順序排序,排序的手段快排;溢寫產生大量溢寫文件,需要對溢寫文件進行歸併排序;對溢寫的文件也可以進行Combiner操作,前提是彙總操作,求平均值不行。最後將文件按照分區存儲到磁盤,等待Reduce端拉取。
3)每個Reduce拉取Map端對應分區的數據。拉取數據後先存儲到內存中,內存不夠了,再存儲到磁盤。拉取完所有數據後,採用歸併排序將內存和磁盤中的數據都進行排序。在進入Reduce方法前,可以對數據進行分組操作。

1.2.5Hadoop優化
0)HDFS小文件影響
(1)影響NameNode的壽命,因爲文件元數據存儲在NameNode的內存中
(2)影響計算引擎的任務數量,比如每個小的文件都會生成一個Map任務
1)數據輸入小文件處理:
(1)合併小文件:對小文件進行歸檔(Har)、自定義Inputformat將小文件存儲成SequenceFile文件。
(2)採用ConbinFileInputFormat來作爲輸入,解決輸入端大量小文件場景。
(3)對於大量小文件Job,可以開啓JVM重用。
2)Map階段
(1)增大環形緩衝區大小。由100m擴大到200m
(2)增大環形緩衝區溢寫的比例。由80%擴大到90%
(3)減少對溢寫文件的merge次數。(10個文件,一次20個merge)
(4)不影響實際業務的前提下,採用Combiner提前合併,減少 I/O。
3)Reduce階段
(1)合理設置Map和Reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致Task等待,延長處理時間;太多,會導致 Map、Reduce任務間競爭資源,造成處理超時等錯誤。
(2)設置Map、Reduce共存:調整slowstart.completedmaps參數,使Map運行到一定程度後,Reduce也開始運行,減少Reduce的等待時間。
(3)規避使用Reduce,因爲Reduce在用於連接數據集的時候將會產生大量的網絡消耗。
(4)增加每個Reduce去Map中拿數據的並行數
(5)集羣性能可以的前提下,增大Reduce端存儲數據內存的大小。
4)IO傳輸
(1)採用數據壓縮的方式,減少網絡IO的的時間。安裝Snappy和LZOP壓縮編碼器。
(2)使用SequenceFile二進制文件
5)整體
(1)MapTask默認內存大小爲1G,可以增加MapTask內存大小爲4-5g
(2)ReduceTask默認內存大小爲1G,可以增加ReduceTask內存大小爲4-5g
(3)可以增加MapTask的cpu核數,增加ReduceTask的CPU核數
(4)增加每個Container的CPU核數和內存大小
(5)調整每個Map Task和Reduce Task最大重試次數

1.2.6 Hadoop參數調優

1)在hdfs-site.xml文件中配置多目錄,最好提前配置好,否則更改目錄需要重新啓動集羣
2)NameNode有一個工作線程池,用來處理不同DataNode的併發心跳以及客戶端併發的元數據操作。
dfs.namenode.handler.count=20 * log2(Cluster Size),比如集羣規模爲10臺時,此參數設置爲60
3)編輯日誌存儲路徑dfs.namenode.edits.dir設置與鏡像文件存儲路徑dfs.namenode.name.dir儘量分開,達到最低寫入延遲
4)服務器節點上YARN可使用的物理內存總量,默認是8192(MB),注意,如果你的節點內存資源不夠8GB,則需要調減小這個值,而YARN不會智能的探測節點的物理內存總量。yarn.nodemanager.resource.memory-mb
5)單個任務可申請的最多物理內存量,默認是8192(MB)。yarn.scheduler.maximum-allocation-mb

1.2.7 Hadoop解決數據傾斜方法
1)提前在map進行combine,減少傳輸的數據量
在Mapper加上combiner相當於提前進行reduce,即把一個Mapper中的相同key進行了聚合,減少shuffle過程中傳輸的數據量,以及Reducer端的計算量。
如果導致數據傾斜的key 大量分佈在不同的mapper的時候,這種方法就不是很有效了。
2)導致數據傾斜的key 大量分佈在不同的mapper
(1)局部聚合加全局聚合。
第一次在map階段對那些導致了數據傾斜的key 加上1到n的隨機前綴,這樣本來相同的key 也會被分到多個Reducer中進行局部聚合,數量就會大大降低。
第二次mapreduce,去掉key的隨機前綴,進行全局聚合。
思想:二次mr,第一次將key隨機散列到不同reducer進行處理達到負載均衡目的。第二次再根據去掉key的隨機前綴,按原key進行reduce處理。
這個方法進行兩次mapreduce,性能稍差。
(2)增加Reducer,提升並行度
JobConf.setNumReduceTasks(int)
(3)實現自定義分區
根據數據分佈情況,自定義散列函數,將key均勻分配到不同Reducer

1.3 Kafka相關總結
1.3.1 Kafka架構介紹一下
1.3.2 Kafka丟不丟數據
Ack=0,相當於異步發送,消息發送完畢即offset增加,繼續生產。
Ack=1,leader收到leader replica 對一個消息的接受ack才增加offset,然後繼續生產。
Ack=-1,leader收到所有replica 對一個消息的接受ack才增加offset,然後繼續生產。

1.3.3 Kafka的ISR副本同步隊列
ISR(In-Sync Replicas),副本同步隊列。ISR中包括Leader和Follower。如果Leader進程掛掉,會在ISR隊列中選擇一個服務作爲新的Leader。有replica.lag.max.messages(延遲條數)和replica.lag.time.max.ms(延遲時間)兩個參數決定一臺服務是否可以加入ISR副本隊列,在0.10版本移除了replica.lag.max.messages參數,防止服務頻繁的進去隊列。
任意一個維度超過閾值都會把Follower剔除出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的Follower也會先存放在OSR中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章