hadoop核心組件(一)

来源:https://www.cnblogs.com/asura7969/archive/2018/01/19/8319127.html
-Advertisement-
Play Games

hadoop的核心組件:hdfs(分散式文件系統)、mapreduce(分散式計算框架)、Hive(基於hadoop的數據倉庫)、HBase(分散式列存資料庫)、Zookeeper(分散式協作服務)、Sqoop(數據同步工具)和Flume(日誌手機工具) hdfs(分散式文件系統): 由client ...


  hadoop的核心組件:hdfs(分散式文件系統)、mapreduce(分散式計算框架)、Hive(基於hadoop的數據倉庫)、HBase(分散式列存資料庫)、Zookeeper(分散式協作服務)、Sqoop(數據同步工具)和Flume(日誌手機工具)   hdfs(分散式文件系統): 由client、NameNode、DataNode組成
  • client負責切分文件,並與NameNode交互,獲取文件位置;與DataNode交互,讀取和寫入數據
  • NameNode是Master節點,管理HDFS的名稱空間和數據塊映射信息,配置副本策略,處理客戶端請求
  • DataNode是Slave節點,存儲實際數據,彙報存儲信息給NameNode
  • DataNode與NameNode保持心跳,提交block列表
在hadoop1.x的時候還有Secondary NameNode,負責輔助NameNode,分擔其工作量;定期合併fsimage和fsedits,推送給NameNode;緊急情況下,可輔助恢復NameNode   存儲模型 (1)文件線性切割成Block  offset (2)Block分散存儲在集群節點中,Block是HDFS的基本存儲單元,預設大小是64M (3)單一文件Block大小一致,文件與文件可以不一致 (4)Block可設置副本數(小於節點數),分散在不同節點 (5)文件上傳可以設置Block大小和副本數 (6)已上傳的文件Block副本數可以調整,大小不變 (7)只支持一次寫入多次讀取,同一時刻只有一個寫入者 (8)可以append追加數據   架構模型 (1)NameNode節點保存文件元數據 (2)DataNode節點保存文件Block數據 (3)DataNode與NameNode保持心跳,提交Block列表 (4)HdfsClient與NameNode交互元數據信息 (5)HdfsClient與DataNode交互文件Block數據   hdfs結構 一、NameNode(不會與磁碟發生交換)     (1)基於記憶體存儲
  • 只存在記憶體中
  • 持久化
    • 啟動後, 元數據(metadate)信息載入到記憶體
    • metadata的磁碟文件名為”fsimage”
    • Block的位置信息不會保存到fsimage
    • (journalNode的作用是存放EditLog的)edits記錄對metadata的操作日誌
      (2)功能
  • 接收客戶端讀寫
  • 收集DataNode彙報的block列表信息
    (3) metadata
  • 文件ownership, permissions(文件所有權、許可權)
  • 文件大小, 時間
  • (block列表,block偏移量)--->會持久化, 位置信息--->不會持久化(啟動時候由DataNode彙報過來)
  • block每個副本位置(dataNode上報)
二、DataNode     (1)本地文件形式存儲block     (2)存儲Block的元數據信息文件     (3)啟動DN時會向NN彙報block信息     (4)通過向NameNode發送心跳(3秒一次),如果NameNode 10分鐘沒有收到,則認為已經lost,並copy其上的block到其它DN 三、SecondaryNameNode/Qurom Journal Manager     合併時機         fs.checkpoint.period  3600s         fs.checkpoint.size  64MB 四、ZooKeeper Failover Controller(HDFS 2.0 HA)     (1)監控NameNode健康狀態     (2)向Zookeeper註冊NameNode     (3)NameNode掛掉後,ZKFC為NameNode競爭鎖,獲得ZKFC 鎖的NameNode變為active   5、Block副本放置位置 (1)第一個副本:放置在上傳文件的DN;如果是集群外提交,則隨機挑選一臺磁碟不太滿,CPU不太忙的節點 (2)第二個副本:放置在於第一個副本不同的機架的節點上 (3)第三個副本:與第二個副本相同機架的節點 (4)更多副本:隨機節點   6、安全模式 (1)NameNode啟動, fsimage載入記憶體, 執行edits (2)成功建立元數據映射後, 創建新的fsimage文件(無需SNN)和空的edits (3)檢查副本數, 數量正常後,過若幹時間, 解除安全模式   7、優缺點 優點:     高容錯性(多副本, 自動恢復)     適合批處理(計算移動, 數據位置暴露給計算框架(block))     適合大數據處理(GB TB PB級數據)     可構建在廉價機器上     高吞吐 缺點:     高延遲     小文件存取(占用namenode記憶體, 尋道時間超過讀取時間)     併發寫入、文件隨機修改(一個文件一個寫入者, 只能append)   hdfs寫流程

 

client切分文件與NanmeNode交互,獲取DataNode列表,驗證DataNode後連接DataNode,各節點之間兩兩交互,確定可用後, client以更小單位流式傳輸數據; Block傳輸數據結束後,DataNode向NameNode彙報Block信息,DataNode向Client彙報完成,Client向NameNode彙報完成,獲 取去下一個Block存放的DataNode列表,迴圈以上步驟,最終client彙報完成,NameNode會在寫流程更新文件狀態。   hdfs讀流程   client與NameNode交互,獲取Block存放的DataNode列表(Block副本的位置信息),線性和DataNode交互,獲取Block,最終 合併為一個文件,其中,在Block副本列表中按距離擇優選取DataNode節點獲取Block塊。   mapreduce(分散式計算框架)

 MR運行原理:

    1、客戶端提交作業之前,檢查輸入輸出路徑,首先創建切片列表             反射出作業中設置的input對象,預設是TextInputFormat類             通過input類得到切片列表(getSpilits()方法)                         最小值 minSize 預設為1,如果設置就取設置的值                         最大值 maxSize 預設為long的最大值                         根據輸入路徑取出文件,獲取每個文件的所有block列表,接著創建splits列表(包含文件名,偏移量,長度和位置信息)                         切片大小根據最大最小值取,預設為block的大小                    一個split對應一個map         提交作業到集群(submitJob()方法)     2、mapInput:             input.initialize    輸入初始化                     拿到taskContext(上下文)                     創建mapper(預設為Mapper類,一般取用戶設置的)                     獲取InputFomat類(輸入格式化的類)                     獲取split                     根據以上信息創建input(NewTrackingRecordReader)                         input初始化                            獲取split的開始和結束位置和文件,開啟對文件的IO流,將起始偏移量個IO設置一下                                如果不是第一個切片(split),每次讀取放棄第一行(跳過第一行數據),只有第一個切片才會讀取第一行數據             mapper.run     3、output:             MapOutputBuffer初始化                     環形緩衝區的閾值0.8、大小(100M)    預設值                     sorter :QuickSort演算法                     反射獲取比較器 OutputKeyComparator                     排序,溢寫,一些一次觸發一次combiner                     溢寫達到3次的時候還會觸發一次combiner             通過反射獲取Partitioner類,預設為HashPartitoner             write(k,v)                 collector.collect(key,value,partition)             output.close()                 merger                 如果numSplits<minSpillsForCombiner 判斷溢寫的次數是不是小於設置的合併的溢寫次數(預設是3),成立的話combiner     4、reduce:             shuffle:copy             sort:SecondarySort             reduce   1、mapreduce shuffle (1)maptask的輸入是hdfs上的block塊,maptask只讀取split,block與split的對應關係預設是一對一 (2)進過map端的運行後,輸出的格式為key/value,Mapreduce提供介面partition,他的作用是根據maptask輸出的key hash後與 reduce數量取模,來決定當前的輸出對應到哪個reduce處理,也可以自定義partition (3)map運行後的數據序列化到緩衝區,預設這個緩衝區大小為100M,作用是收集這個map的結果,當數據達到溢寫比例 (預設是spill.percent=0.8)後,所定這80M的記憶體,對這80M記憶體中的key做排序(sort),maptask的輸出結果還可以往剩下的20M內 存中寫,互不影響。之後執行溢寫的線程會往磁碟中寫數據。每次溢寫都會產生一個溢寫小文件,map執行完後,會合併這些溢寫小文件, 這個過程叫Merge。 (4)如果客戶端設置了Combiner,那麼會優化MapReduce的中間結果,合併map端的數據(相當於reduce端的預處理),Combiner 不能改變最終的計算結果。 (5)reduce在執行之前就是從各個maptask執行完後的溢寫文件中拿到所對應的數據,然後做合併(Merge),最終形成的文件作為 reduce的輸入文件,這個過程是歸併排序。最後就是reduce計算,把結果放到hdfs上面。   hdfs參數調優
io.file.buffer.size:4096 (core-default.xml) SequenceFiles在讀寫中可以使用緩存大小,可減少I/O次數;在大型Hadoop cluster,建議可設定為65536-131072
dfs.blockes:134217728( hdfs-default.xml ) hdfs中一個文件的Block塊的大小,CDH5中預設為128M;設置太大影響map同時計算的數量,設置較少會浪費map個數資源
mapred.reduce.tasks(mapreduce.job.reduces):1 預設啟動的reduce數
mapreduce.task.io.sort.factor:10 reduce task中合併文件時,一次合併的文件數據
mapred.child.java.opts:-Xmx200m jvm啟動子線程可以使用的最大記憶體
mapred.reduce.parallel.copies:5 Reduce copy數據的線程數量,預設值是5
 
mapreduce.tasktracker.http.threads:40 map和reduce是通過http進行傳輸的,這個設置傳輸的並行線程數
mapreduce.map.output.compress:flase map輸出是否進行壓縮,如果壓縮就會多耗cpu,但是減少傳輸時間,如果不壓縮,就需要較多的傳輸帶寬。配合 mapreduce.map.output.compress.codec使用,預設是 org.apache.hadoop.io.compress.DefaultCodec,可以根據需要設定數據壓縮方式。
mapreduce.tasktracker.tasks.reduce.maximum:2 一個tasktracker併發執行的reduce數,建議為cpu核數
mapreduce.map.sort.spill.percent:0.8 溢寫比例
min.num.spill.for.combine:3 spill的文件達到設置的參數進行combiner
  避免推測執行
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
  自定義partition 適當添加combiner   自定義reduce端的grouping Comparator - mapred.reduce.tasks:手動設置reduce個數 - mapreduce.map.output.compress:map輸出結果是否壓縮   - mapreduce.map.output.compress.codec - mapreduce.output.fileoutputformat.compress:job輸出結果是否壓縮   - mapreduce.output.fileoutputformat.compress.type   - mapreduce.output.fileoutputformat.compress.codec   9、調優文件以及參數   一、調優的目的     充分的利用機器的性能,更快的完成mr程式的計算任務。甚至是在有限的機器條件下,能夠支持運行足夠多的mr程式。   二、調優的總體概述     從mr程式的內部運行機制,我們可以瞭解到一個mr程式由mapper和reducer兩個階段組成,其中mapper階段包括數據的讀取、map處理以及寫出操作(排序和合併/sort&merge),而reducer階段包含mapper輸出數據的獲取、數據合併(sort&merge)、reduce處理以及寫出操作。那麼在這七個子階段中,能夠進行較大力度的進行調優的就是map輸出、reducer數據合併以及reducer個數這三個方面的調優操作。也就是說雖然性能調優包括cpu、記憶體、磁碟io以及網路這四個大方面,但是從mr程式的執行流程中,我們可以知道主要有調優的是記憶體、磁碟io以及網路。在mr程式中調優,主要考慮的就是減少網路傳輸和減少磁碟IO操作,故本次課程的mr調優主要包括伺服器調優、代碼調優、mapper調優、reducer調優以及runner調優這五個方面。   三、伺服器調優     伺服器調優主要包括伺服器參數調優和jvm調優。在本次項目中,由於我們使用hbase作為我們分析數據的原始數據存儲表,所以對於hbase我們也需要進行一些調優操作。除了參數調優之外,和其他一般的java程式一樣,還需要進行一些jvm調優。     hdfs調優     1. dfs.datanode.failed.volumes.tolerated: 允許發生磁碟錯誤的磁碟數量,預設為0,表示不允許datanode發生磁碟異常。當掛載多個磁碟的時候,可以修改該值。     2. dfs.replication: 複製因數,預設3     3. dfs.namenode.handler.count: namenode節點併發線程量,預設10     4. dfs.datanode.handler.count:datanode之間的併發線程量,預設10。     5. dfs.datanode.max.transfer.threads:datanode提供的數據流操作的併發線程量,預設4096。         一般將其設置為linux系統的文件句柄數的85%~90%之間,查看文件句柄數語句ulimit -a,修改vim /etc/security/limits.conf, 不能設置太大文件末尾,添加             * soft nofile 65535             * hard nofile 65535             註意:句柄數不能夠太大,可以設置為1000000以下的所有數值,一般不設置為-1。             異常處理:當設置句柄數較大的時候,重新登錄可能出現unable load session的提示信息,這個時候採用單用戶模式進行修改操作即可。                 單用戶模式:                     啟動的時候按'a'鍵,進入選擇界面,然後按'e'鍵進入kernel修改界面,然後選擇第二行'kernel...',按'e'鍵進行修改,在最後添加空格+single即可,按回車鍵回到修改界面,最後按'b'鍵進行單用戶模式啟動,當啟動成功後,還原文件後保存,最後退出(exit)重啟系統即可。     6. io.file.buffer.size: 讀取/寫出數據的buffer大小,預設4096,一般不用設置,推薦設置為4096的整數倍(物理頁面的整數倍大小)。     mapreduce調優     1. mapreduce.task.io.sort.factor: mr程式進行合併排序的時候,打開的文件數量,預設為10個.     2. mapreduce.task.io.sort.mb: mr程式進行合併排序操作的時候或者mapper寫數據的時候,記憶體大小,預設100M     3. mapreduce.map.sort.spill.percent: mr程式進行flush操作的閥值,預設0.80。     4. mapreduce.reduce.shuffle.parallelcopies:mr程式reducer copy數據的線程數,預設5。     5. mapreduce.reduce.shuffle.input.buffer.percent: reduce複製map數據的時候指定的記憶體堆大小百分比,預設為0.70,適當的增加該值可以減少map數據的磁碟溢出,能夠提高系統性能。     6. mapreduce.reduce.shuffle.merge.percent:reduce進行shuffle的時候,用於啟動合併輸出和磁碟溢寫的過程的閥值,預設為0.66。如果允許,適當增大其比例能夠減少磁碟溢寫次數,提高系統性能。同mapreduce.reduce.shuffle.input.buffer.percent一起使用。     7. mapreduce.task.timeout:mr程式的task執行情況彙報過期時間,預設600000(10分鐘),設置為0表示不進行該值的判斷。      四、代碼調優     代碼調優,主要是mapper和reducer中,針對多次創建的對象,進行代碼提出操作。這個和一般的java程式的代碼調優一樣。      五、mapper調優     mapper調優主要就是就一個目標:減少輸出量。我們可以通過增加combine階段以及對輸出進行壓縮設置進行mapper調優。     combine介紹:         實現自定義combine要求繼承reducer類,特點:         以map的輸出key/value鍵值對作為輸入輸出鍵值對,作用是減少網路輸出,在map節點上就合併一部分數據。         比較適合,map的輸出是數值型的,方便進行統計。     壓縮設置:         在提交job的時候分別設置啟動壓縮和指定壓縮方式。   六、reducer調優     reducer調優主要是通過參數調優和設置reducer的個數來完成。     reducer個數調優:         要求:一個reducer和多個reducer的執行結果一致,不能因為多個reducer導致執行結果異常。         規則:一般要求在hadoop集群中的執行mr程式,map執行完成100%後,儘量早的看到reducer執行到33%,可以通過命令hadoop job -status job_id或者web頁面來查看。             原因: map的執行process數是通過inputformat返回recordread來定義的;而reducer是有三部分構成的,分別為讀取mapper輸出數據、合併所有輸出數據以及reduce處理,其中第一步要依賴map的執行,所以在數據量比較大的情況下,一個reducer無法滿足性能要求的情況下,我們可以通過調高reducer的個數來解決該問題。         優點:充分利用集群的優勢。         缺點:有些mr程式沒法利用多reducer的優點,比如獲取top n的mr程式。   七、runner調優     runner調優其實就是在提交job的時候設置job參數,一般都可以通過代碼和xml文件兩種方式進行設置。     1~8詳見ActiveUserRunner(before和configure方法),9詳解TransformerBaseRunner(initScans方法)     1. mapred.child.java.opts: 修改childyard進程執行的jvm參數,針對map和reducer均有效,預設:-Xmx200m     2. mapreduce.map.java.opts: 需改map階段的childyard進程執行jvm參數,預設為空,當為空的時候,使用mapred.child.java.opts。     3. mapreduce.reduce.java.opts:修改reducer階段的childyard進程執行jvm參數,預設為空,當為空的時候,使用mapred.child.java.opts。     4. mapreduce.job.reduces: 修改reducer的個數,預設為1。可以通過job.setNumReduceTasks方法來進行更改。     5. mapreduce.map.speculative:是否啟動map階段的推測執行,預設為true。其實一般情況設置為false比較好。可通過方法job.setMapSpeculativeExecution來設置。     6. mapreduce.reduce.speculative:是否需要啟動reduce階段的推測執行,預設為true,其實一般情況設置為fase比較好。可通過方法job.setReduceSpeculativeExecution來設置。     7. mapreduce.map.output.compress:設置是否啟動map輸出的壓縮機制,預設為false。在需要減少網路傳輸的時候,可以設置為true。     8. mapreduce.map.output.compress.codec:設置map輸出壓縮機制,預設為org.apache.hadoop.io.compress.DefaultCodec,推薦使用SnappyCodec     9. hbase參數設置         由於hbase預設是一條一條數據拿取的,在mapper節點上執行的時候是每處理一條數據後就從hbase中獲取下一條數據,通過設置cache值可以一次獲取多條數據,減少網路數據傳輸。   源碼: 1、設置map端的數量:mapreduce.input.fileinputformat.split.minsize 位置FileInputFormat.getSplits()方法 (1)輸入文件size巨大,但不是小文件 減小map的數量:增大mapred.min.split.size的值 (2)輸入文件數量巨大,且都是小文件 使用FileInputFormat衍生的CombineFileInputFormat將多個input path合併成一個InputSplit送給mapper處理,從而減少mapper的數量   2、增加Map-Reduce job 啟動時創建的Mapper數量 可以通過減小每個mapper的輸入做到,即減小blockSize或者減小mapred.min.split.size的值,設置blockSize一般不可行
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先貼出今天要與大家分享的內容源碼(位於內核源碼的 os_cpu_a.asm 中):PendSV_Handler CPSID I MRS R0, PSP CBZ R0, PendSV_Handler_Nosave SUBS R0, R0, #0x20 STM R0, {R4-R11} LDR R1, ...
  • 最近剛接觸Linux系統,現在以一個初學者的角度總結一下vim命令 Vim的四種模式 一.啟動Vim 1.雙擊桌面的圖標,就可以啟動Vim(是圖形界面的) 2.在開始菜單 點--運行 接著輸入 vim 或者gvim,就可以啟動Vim或Gvim了. 3.在命令行視窗中輸入以下命令即可: vim 直接啟 ...
  • #################匿名許可權控制############### anonymous_enable=YES #是否啟用匿名用戶no_anon_password=YES #匿名用戶login時不詢問口令下麵這四個主要語句控制這文件和文件夾的上傳、下載、創建、刪除和重命名。anon_uplo ...
  • Vi Vim進入編輯後退出 ...
  • linux連接mysql /usr/local/mysql/bin/mysql -uroot -p 輸入密碼出現Access denied for user 'root'@'localhost'(using password: YES)錯誤。 解決辦法: 1.先停止mysql 服務 2.進入mysq ...
  • 一:到mysql官網下載最新的mysql包 mysql-5.7.21-linux-glibc2.12-x86_64 https://dev.mysql.com/downloads/mysql/ 二:在linux /usr/local/中解壓mysql壓縮包 改名為mysql 三:創建用戶組mysql ...
  • 在上一章,裁剪uboot以及分區後,本章主要使uboot支持yaffs以及製作補丁 1. 修改uboot支持yaffs 首先,每個命令都會對應一個文件,比如nand命令對應的common/cmd_nand.c 而我們使用nand命令時,便會進入do_nand()函數,位於common/cmd_nan ...
  • 天蒼蒼,野茫茫,終於把oracle安裝成功了,來來訪問下資料庫,訪問失敗,咋回事,這是個啥錯誤 心裡是不是在怨恨,小編你耍我呢。no,no,no,小編如此善良的人怎麼會坑人呢,下麵小編就來講講安裝以後的步驟。 首先如果需要別人訪問你的資料庫,你要配置以下信息,還記得上一篇小編讓你記住oracle數據 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...