8:00 2019/3/141:什麼是hadoop?
hadoop是解決大數據問題的一整套技術方案
2:hadoop的組成?
核心框架
分佈式文件系統
分佈式計算框架
分佈式資源分配框架
hadoop對象存儲
機器計算
3:hadoop 雲計算 大數據 微服務 人工智能關係
參見word學習文檔
1. 現階段,雲計算的兩大底層支撐技術爲「虛擬化」和「大數據技術」
2. 而HADOOP則是雲計算的PaaS層的解決方案之一,並不等同於PaaS,更不等同於雲計算自己。
4:大數據項目的一般結構
採集數據
數據分析統計
數據展現
5:大數據項目的一般技術架構
見畫圖
Hadoop Common:
爲其餘Hadoop模塊提供基礎設施。
Hadoop DFS:
一個高可靠、高吞吐量的分佈式文件系統
Hadoop MapReduce:
一個分佈式的離線並行計算框架
Hadoop YARN:
一個新的MapReduce框架,任務調度與資源管理
6:安裝一個僞分佈式的hdfs
a:準備安裝介質
hadoop-2.8.2.tar.gz
b:把安裝介質上傳到linux
c:在linux使用hostname命令確認主機名
d:編輯/etc/hosts文件 完成ip地址和主機名的映射
在分佈式的每一臺機器中都須要把全部機器的ip地址和主機名的映射關係配置
注意:關閉每臺機器的防火牆
systemctl stop firewalld.service 關閉
systemctl disable firewalld.service 禁止開機啓動
e:配置ssh免密碼登陸
f:從/export/software/下面把hadoop-2.8.2.tar.gz 解壓到/export/servers/下
經常使用目錄說明:
bin sbin hadoop經常使用的命令目錄 配置到/etc/profile中
etc hadoop經常使用配置文件目錄
share hadoop核心jar包目錄
g:完成配置文件
hadoop-env.sh 配置java環境
core-site.xml hadoop核心配置
hdfs-site.xml hdfs核心配置
mapred-site.xml mr的核心配置
yarn-site.xml yarn的核心配置
h:格式化namenode環境
建立namenode保存數據的環境
hdfs namenode -format
i:使用命令啓動hdfs
start-dfs.sh
start-yarm.sh
執行完成回到命令行
可使用jps查看關鍵進程是否已經在運行
namenode
SecondaryNameNode
datanode
還要從web頁面使用http鏈接管理頁面查看
http://192.168.21.134:50070 能夠看到hdfs的管理頁面 證實hdfs安裝並啓動成功
http://192.168.21.134:8088 能夠看到mr計算任務的管理頁面 證實mr yarn安裝並啓動成功
注意事項:
a:若是某個進程沒有正確啓動 要學會看日誌
eg:
starting namenode, logging to /export/service/hadoop-2.8.2/logs/hadoop-root-namenode-text4.out
以上輸出信息是說明namenode啓動過程寫入了哪個日誌
假設最終namenode沒有啓動成功 須要打開日誌查看緣由
b:經常使用命令中還有單獨啓動某個進程的命令
hdfs單獨啓動各個進程服務
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
yarn單獨啓動各個進程服務
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
7:安裝分佈式
a:已有一臺虛擬機基礎環境配置完畢 text4
b:利用有的虛擬機複製出2臺 一共3臺虛擬機
複製以已及每臺配置網絡 參照文檔便可
b1:配置每臺機器的主機名(提早規劃好)(text4 text5 text6)
text4 —— namenode datanode secondarynamenode resourcemanager nodemanager
text5 —— datanode nodemanager
text6 —— datanode nodemanager
b2:修改網卡配置(每臺機器的ip地址是提早規劃好)(192.168.21.134 192.168.21.138 192.168.21.139)
b3:修改/etc/hosts文件 配置每臺機器和ip地址的映射關係
c:配置3臺之間能夠ssh免密登陸
ssh-keygen
ssh-copy-id root@機器名稱
c1:配置text4 text5 text6互相均可以ssh免密登陸
c2:選取一臺虛擬機作namenode 配置它到text5 text6免密登陸
能夠在多個機器之間使用scp傳輸文件 若是不須要輸入密碼 則ssh免密配置正確
scp -r(目錄總體複製) 目錄/文件名稱 用戶名@機器名:目的機器的路徑
d:確保全部機器防火牆都是關閉
e:修改每臺機器的hadoop配置文件
e1:把每一個block(數據塊)修改成有2個備份
e2:把namenode相關的ip地址都修改爲了主機名
f:把已有的namenode datanode配置好的數據文件夾刪除
g:在namenode節點 執行namenode格式化 hdfs namenode -format
h:在namenode執行start-dfs.sh 啓動hdfs
使用jps查看每臺機器的進程規劃
8:namenode datanode 數據目錄結構講解
namenode:
存放數據目錄位置 /data/hadoop/dfs/name
datanode:
存放數據目錄位置 /data/hadoop/dfs/data
實際上傳到datanote中的文件數據都是保存在finalized目錄下
eg:從linux 往hdfs上傳一個文件 a0001.data
由於配置的block副本是2分 因此3臺datanode節點中只有text4 text5有數據
經驗證和原有的上傳文件內容一致 就以2個副本的方式保證了數據的完整性
eg:從linux往hdfs上傳一個大於128m的文件hadoop-2.8.2.tar.gz(240m)
由於它大於128m(128m是hdfs中默認的一個block的大小) 因此這個壓縮包被分紅2個block上傳
每一個block仍是2個備份文件
hdfs dfs -put 待上傳的文件名稱 要上傳的hdfs的目的地路徑
secondarynamenode:
存放數據目錄位置 /data/hadoop/tmp/dfs/namesecondary
start-all.sh
啓動全部的Hadoop守護進程。包括NameNode、 Secondary NameNode、DataNode、JobTracker、 TaskTrack
stop-all.sh
中止全部的Hadoop守護進程。包括NameNode、 Secondary NameNode、DataNode、JobTracker、 TaskTrack
start-dfs.sh
啓動Hadoop HDFS守護進程NameNode、SecondaryNameNode和DataNode
stop-dfs.sh
中止Hadoop HDFS守護進程NameNode、SecondaryNameNode和DataNode
hadoop-daemons.sh start namenode
單獨啓動NameNode守護進程
hadoop-daemons.sh stop namenode
單獨中止NameNode守護進程
hadoop-daemons.sh start datanode
單獨啓動DataNode守護進程
hadoop-daemons.sh stop datanode
單獨中止DataNode守護進程
hadoop-daemons.sh start secondarynamenode
單獨啓動SecondaryNameNode守護進程
hadoop-daemons.sh stop secondarynamenode
單獨中止SecondaryNameNode守護進程
start-mapred.sh
啓動Hadoop MapReduce守護進程JobTracker和TaskTracker
stop-mapred.sh
中止Hadoop MapReduce守護進程JobTracker和TaskTracker
hadoop-daemons.sh start jobtracker
單獨啓動JobTracker守護進程
hadoop-daemons.sh stop jobtracker
單獨中止JobTracker守護進程
hadoop-daemons.sh start tasktracker
單獨啓動TaskTracker守護進程
hadoop-daemons.sh stop tasktracker
單獨啓動TaskTracker守護進程
sc文件:hdfs dfs -put aa.data /logs
io nio aio思想
b:編寫hdfs java客戶端程序
b1:創建開發工程
創建maven工程
在pom文件中引入開發hdfs客戶端須要的jar包
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.2</version>
</dependency>
創建普通的java工程
引入jar包 目前只是開發hdfs的java客戶端 只引入hadoop安裝包下share目錄中common和hdfs jar包便可
b2:規劃包結構
b3:編寫demo測試類
建立一個配置信息封裝對象(客戶端處理hdfs 編寫mr 處理hive 處理hase都是須要配置信息)
建立一個文件系統的客戶端對象 方便處理文件數據
對文件的增刪改查的java api接口使用
對某個指定目錄下全部文件或者目錄基本信息的查看
hdfs複習點:
1:hdfs就是一個文件系統 在操做系統之上。
一般操做系統針對hdfs叫作本地
2:hdfs的重要組成部分
namenode:存儲元數據
元數據中數據都有什麼?
a:某個文件的某個block存儲在哪一個datanode上
b:每一個datanode資源使用狀況
c:每一個文件的屬性 修改時間等等信息
datanode:
真正存儲文件數據
因此一個hdfs沒有namenode或者namenode出問題則不能再使用
可是若是是datanode出問題 只多是數據部分丟失 而不是hdfs不能使用
secondary namenode namenode datanode 關係
https://www.cnblogs.com/chenyaling/p/5521464.html
3:基本的理論知識
13:49 2019/3/1413:49 2019/3/14https://blog.csdn.net/lvtula/article/details/82354989
a:hdfs中namenode datanode secondarynamenode 某些主要目錄或者文件的做用
https://blog.csdn.net/baiye_xing/article/details/76268495
namenode:edits fsimage version
datanode:finalized version blc文件每一個都有一個meta文件
secondarynamenode:edits fsimage
b:namenode中edits和fsimage的做用以及其和內存的相互關係
c:namenode和secondarynamenode的工做機制
d:hdfs寫流程
hdfs讀流程
4:hdfs shell
5:java api操做hdfs
HA hadoop集羣搭建步驟:
1:對集羣每一臺機器須要安裝什麼服務進行規劃。
text4:zk nn dn zkfc jn nm rm
text5: zk nn dn zkfc jn nm rm
text6: zk dn jn nm
2:準備每臺機器的基本環境
a:3臺機器之間須要免密登陸
b:每臺機器必須安裝好jdk 8.0以上
c:集羣每臺機器之間時間同步
c1:設定每臺機器的正確時區
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 1
date
c2:選擇集羣中一臺機器爲主 master 讓其它機器和這臺機器完成時間同步
使用rdate完成集羣之間時間同步
具體操做請參見保存的時間同步頁面說明
3:修改hadoop集羣的配置文件
按照樣例配置文件修改便可
4:啓動集羣過程(安裝過程的啓動)
a:啓動zk
b: 啓動jn
hadoop-daemon.sh start journalnode
c:格式化nn (選取text4)
d:格式化zkfc
hdfs zkfc -formatZK
e:把text4的nn結構複製到text5
先在text4啓動nn
在text5執行 hdfs namenode bootstrapstandby
若是出現此時在text5並無能成功複製text4的nn的目錄機構
則直接能夠從text4複製到text5 完成2臺nn之間的複製
f:啓動集羣
zk啓動
zkfc啓動
start-dfs.sh
start-yarn.sh(若是那個rm沒有啓動 直接可使用守護進程)
1:什麼是hadoop?
hadoop是解決大數據問題的一整套技術方案
2:hadoop的組成?
核心框架
分佈式文件系統
分佈式計算框架
分佈式資源分配框架
hadoop對象存儲
機器計算
3:hadoop 雲計算 大數據 微服務 人工智能關係
參見word學習文檔
4:大數據項目的一般結構
採集數據
數據分析統計
數據展現
hadoop-env.sh 配置java環境
core-site.xml hadoop核心配置
hdfs-site.xml hdfs核心配置
mapred-site.xml mr的核心配置
yarn-site.xml yarn的核心配置
namenode:
存放數據目錄位置 /data/hadoop/dfs/name
namenode的數據文件:
namenode保存的是整個hdfs的元數據
eg:
上傳文件的所屬 大小 修改日期
以及文件每個block所在哪一個datanode對應關係都是namenode元數據保存的
edtis:保存的是最近的日誌記錄(namenode接收到的命令以及解析)
fsimage:保存的是namenode內存信息的鏡像
seen_txid:集羣狀態的恢復標識
步驟解析1:
上傳
1、根namenode通訊請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在
2、namenode返回是否能夠上傳
3、client請求第一個 block該傳輸到哪些datanode服務器上
4、namenode返回3個datanode服務器ABC
5、client請求3臺dn中的一臺A上傳數據(本質上是一個RPC調用,創建pipeline),A收到請求會繼續調用B,而後B調用C,將真個pipeline創建完成,逐級返回客戶端
6、client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位,A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答
7、當一個block傳輸完成以後,client再次請求namenode上傳第二個block的服務器。
詳細步驟解析2:
下載
1、跟namenode通訊查詢元數據,找到文件塊所在的datanode服務器
2、挑選一臺datanode(就近原則,而後隨機)服務器,請求創建socket流
3、datanode開始發送數據(從磁盤裏面讀取數據放入流,以packet爲單位來作校驗)
4、客戶端以packet爲單位接收,如今本地緩存,而後寫入目標文件
HA hadoop集羣搭建步驟:
1:對集羣每一臺機器須要安裝什麼服務進行規劃。
text4:zk nn dn zkfc jn nm rm
text5: zk nn dn zkfc jn nm rm
text6: zk dn jn nm
2:準備每臺機器的基本環境
a:3臺機器之間須要免密登陸
b:每臺機器必須安裝好jdk 8.0以上
c:集羣每臺機器之間時間同步
c1:設定每臺機器的正確時區
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 1
date
c2:選擇集羣中一臺機器爲主 master 讓其它機器和這臺機器完成時間同步
使用rdate完成集羣之間時間同步
具體操做請參見保存的時間同步頁面說明
3:修改hadoop集羣的配置文件
按照樣例配置文件修改便可
4:啓動集羣過程(安裝過程的啓動)
a:啓動zk
b: 啓動jn
hadoop-daemon.sh start journalnode
c:格式化nn (選取text4)
d:格式化zkfc
hdfs zkfc -formatZK
e:把text4的nn結構複製到text5
先在text4啓動nn
在text5執行 hdfs namenode bootstrapstandby
若是出現此時在text5並無能成功複製text4的nn的目錄機構
則直接能夠從text4複製到text5 完成2臺nn之間的複製
f:啓動集羣
zk啓動
zkfc啓動
start-dfs.sh
start-yarn.sh(若是那個rm沒有啓動 直接可使用守護進程)
Zookeeper是一個分佈式協調服務;就是爲用戶的分佈式應用程序提供協調服務
A、zookeeper是爲別的分佈式程序服務的
B、Zookeeper自己就是一個分佈式程序(只要有半數以上節點存活,zk就能正常服務)
C、Zookeeper所提供的服務涵蓋:主從協調、服務器節點動態上下線、統一配置管理、分佈式共享鎖、統一名稱服務……
D、雖說能夠提供各類服務,可是zookeeper在底層其實只提供了兩個功能:
管理(存儲,讀取)用戶程序提交的數據;
併爲用戶程序提供數據節點監聽服務;
1、Znode有兩種類型:
短暫(ephemeral)(斷開鏈接本身刪除)
持久(persistent)(斷開鏈接不刪除)
2、Znode有四種形式的目錄節點(默認是persistent )
PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL
EPHEMERAL_SEQUENTIAL
3、建立znode時設置順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護
4、在分佈式系統中,順序號能夠被用於爲全部的事件進行全局排序,這樣客戶端能夠經過順序號推斷事件的順序
1、Zookeeper:一個leader,多個follower組成的集羣
2、全局數據一致:每一個server保存一份相同的數據副本,client不管鏈接到哪一個server,數據都是一致的
3、分佈式讀寫,更新請求轉發,由leader實施
4、更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
5、數據更新原子性,一次數據更新要麼成功,要麼失敗
6、實時性,在必定時間範圍內,client能讀到最新數據
4.2. zookeeper數據結構
1、層次化的目錄結構,命名符合常規文件系統規範(見下圖)
2、每一個節點在zookeeper中叫作znode,而且其有一個惟一的路徑標識
3、節點Znode能夠包含數據和子節點(可是EPHEMERAL類型的節點不能有子節點,下一頁詳細講解)
4、客戶端應用能夠在節點上設置監視器(後續詳細講解)
yarn的流程:1:客戶端向yarn發送請求,開始運行job
2:resourcemanager反饋信息,把切片資源在hdfs的存放目錄發送給客戶端
3:客戶端調用fileinputformat的getsplits方法完成數據切片計算
4:客戶端把切片資源上傳到yarn指定的hdfs目錄下
5:通知yarn資源已上傳,請分配mrappmaster開始執行任務
6:yarn吧客戶端待執行的任務放入任務隊列
7:resourcemanager從某個namemodemanager選擇一臺機器準備運行環境(根據充足的空間斷定)
8:制定後 mappermaster從指定位置獲取任務資源(job.split jar job.xml)
9:mappermaster從job.spilit中確認須要運行多少maptask,想yarn的rm申請運行資源
10resourcemanager給mrappmaster反饋可用的運行maptask的資源
11mrappmaster根據yarn提供的資源開始運行maptask
12:當maptask運行完畢,mrappmaster會知道
13:重複申請資源的步驟 開始運行reducetask
14當reducetask運行完畢 回收mappmaster的佔用資源
yarn只是一個分佈式資源分配系統,核心是resourcemanager和nodemanager
yarn只負責資源分配,不負責xuanfayunsuan
sheff運行流程
map()輸出結果->內存(環形緩衝區,當內存大小達到指定數值,如80%,開始溢寫到本地磁盤)
溢寫以前,進行了分區partition操做,分區的目的在於數據的reduce指向,分區後進行二次排序,第一次是對partitions進行排序,
第二次對各個partition中的數據進行排序,以後若是設置了combine,就會執行相似reduce的合併操做,還能夠再進行壓縮,
由於reduce在拷貝文件時消耗的資源與文件大小成正比
內存在達到必定比例時,開始溢寫到磁盤上
當文件數據達到必定大小時,本地磁盤上會有不少溢寫文件,須要再進行合併merge成一個文件
reduce拷貝copy這些文件,而後進行歸併排序(再次merge),合併爲一個文件做爲reduce的輸入數據
wordcount流程:
計算在某個目錄下有n多份文件,每一個文件中有n多個單詞,計算每一個單詞出現的個數
1:yarn的resourcemanager會反饋給客戶端吧切片信息存放到那個目錄下,而後客戶端經過調用fileinputformat的getsplits進行切片機算,獲得3樣數據(
a:切片的描述信息jobsplit b:計算全部單詞個數的jar包 c:把此次計算任務job的配置信息放入文件中的job。xml
)
2:放置後會通知yarn分配mappermaster任務,會挑選一臺nodemanager機器做爲mrappmaster
3:mrappmaster會根據job的描述信息 根據job。split肯定須要幾個 maptaskxiang yarn申請計算資源,
4:yarn反饋給mrappmaster明確的可用的計算資源
5:mrappmaster根據yarn提供的資源開始運行maptask
6:maptask從hdfs中依據job。spilt的描述的數據從hdfs 複製到本地的server,調用wordcount程序完成計算
(計算:maptask運行map方法,map方法接受的是文本中的每一行的偏移量, v是每次map方法執行時讀取的一行單詞)
7:map階段執行完後在執行reduce階段, reduce完成對map階段輸出的解過進行合併操做
reducetask的數量是程序員根據需求制定,若是不指定是1
8:reduce完成後會輸出問結果文件
1yarn的resourcemanager會反饋給客戶端切片信息放置的目錄,而後客戶端經過調用fileinputformat的getsplits進行切片機算,獲得三楊樹局,
(a切片的描述信息b機損全部單詞的jar包c將job的藐視信息放入job。xml)
2客戶端放置後通知yarn分配mrappmaster執行任務,yarn會挑選一臺namenodemanager做爲mrappmaster
3mrappmaster會從指定位置下獲取資源,根據job。splits計算須要多少個maptask,並向yarn申請及資源
4yarn反饋資源,mrappmaster給句yarn提供的資源開始運行maptask
5maptask從hdfs中依據job。split的描述的數據從hdfs複製到本地的server,調用wordcount完成計算
1.hadoop運行原理
MapReduce
HDFS 分佈式文件系統(HDFS客戶端的讀寫流程)
寫:
客戶端接收用戶數據,並緩存到本地
當緩存足夠一個HDFS大小的時候
客戶端同NameNode通信註冊一個新的塊
註冊成功後 NameNode給客戶端返回一個DateNode的列表
客戶端向列表中的第一個DateNode寫入塊
收到全部的DateNode確認信息後,客戶端刪除本地緩存
客戶端繼續發送下一個塊
重複以上步驟 全部數據發送完成後,寫操做完成
讀:
客戶端與NameNode通信獲取文件的塊位置信息,包括塊的全部冗餘備份的位置信息:DateNode列表
客戶端獲取文件位置信息後直接同有文件塊的DateNode通信,讀取文件
若是第一個DateNode沒法鏈接,客戶端將自動聯繫下一個DateNode
若是塊數據的校驗值出錯,則客戶端須要向NameNode報告,並自動聯繫下一個DateNode
客戶端的hadoop環境:與集羣的hadoop包同樣
集羣入口:core-site.xml、fs.default.name
緩存塊大小:fs.block.size
存多少份:fs.replication
2.mapreduce的原理
mapreduce的原理:一個MapReduce框架由一個單獨的master JobTracker和集羣節點每個slave TaskTracker共同組成。
master負責調度構成一個做業的全部任務,在這些slave上,master監控它們的執行,而且從新執行已經失敗的任務。
而slave僅負責執行由maste指派的任務。
3.Mapreduce數據傾斜是什麼意思?怎麼處理?
Mapreduce數據傾斜是指咱們在分片的時候導不一樣分片上的數據不均,致使這些分片在並行處理的時候,有的分片執行事件過長,
有的執行時間太短,致使總的執行時間過長的一種現象,一般是由:1.map端的key值過多或者有空值;
2.業務自己的特性;3.某些sql就有數據傾斜;4.建表的時候考慮不周等緣由形成的。
處理:* a:增長reducetask的數量
* b:在不改變總體統計結果的前提下,能夠修改key的設定方式
* c:在作關聯時,儘可能避免reducetask端的join 可使用maptask端的join
4.combiner的做用,使用時機?
Combiner其實也是一種reduce操做,是map運算的後續操做,在map後續對於相同key值作一個簡單合併,減少後續的reduce的計算壓力。
數據量小的時候,且輸入的結果不會影響到reduce輸入的結果,且不作平均值的時候,用基於map端以後shuffle端以前的reduce操做。
1
5.MapReduce–如何設置Reducer的個數
1.在代碼中經過:JobConf.setNumReduceTasks(Int numOfReduceTasks)方法設置reducer的個數;
2.在hive中:set mapred.reduce.tasks;
3.reducer的最優個數與集羣中可用的reducer的任務槽數相關,通常設置比總槽數微少一些的reducer數量;Hadoop文檔中推薦了兩個公式:
0.95*NUMBER_OF_NODES*mapred.tasktracker.reduce.tasks.maximum
1.75*NUMBER_OF_NODES*mapred.tasktracker.reduce.tasks.maximum
備註:NUMBER_OF_NODES是集羣中的計算節點個數;
mapred.tasktracker.reduce.tasks.maximum:每一個節點所分配的reducer任務槽的個數;
6.MR的過程:
input —–>spilt—–>map—–>combiner—–>shuffer—> partition—–>reduce—–>output
spilt :對數據進行split分片處理,產生K1值和V1值,傳給map
map: 數據整理,把數據整理成K2和V2,
combiner:若是map輸出內容比較多,reduce計算比較慢,咱們能夠加個combiner
map端的本地化reduce,減小map輸出;
shuffer:相同的數據放到一個分區
partiton:若是reduce不是一個,shuffler作一個分區,將相同的K值,分到一個區;
排序方式:hash方式;
reduce:shuffer分區結束後交給reduce進行計算,造成K3 V 3
output: 將reduce處理完的 K3和V3交給output輸出;
a. 客戶端編寫好mapreduce程序,提交job到jobtracker;
b. Jobtracker進行檢查操做,肯定輸出目錄是否存在,存在拋出錯誤;
c. Jobtracker根據輸入計算輸入分片input split、配置job的資源、初始化做業、分配任務;
d. 每一個input split建立一個map任務,tasktracker執行編寫好的map函數;
e. Combiner階段是可選的,它是一個本地化的reduce操做,合併重複key的值;
f. Shuffle一開始就是map作輸出操做,並對結果進行排序,內存使用達到閥值就會spill,把溢出文件寫磁盤,寫磁盤前有個排序操做,map輸出所有作完後,
會合並溢出文件,這個過程當中還有個Partitioner操做,一個partitioner對應一個reduce做業,reduce開啓複製線程,複製對應的map輸出文件,複製時候reduce還會進行排序操做和合並文件操做
g. 傳輸完成,執行編寫好的reduce函數,結果保存到hdfs上。
7.MR怎麼處理小文件:
1.輸入過程合併處理:1.在linux 10000個文件上傳到HDFS時候,用腳本造成二進制文件流上傳,上傳的過程當中就合併成了一個文件。
2.若是在hdfs中有大量小文件,首先進行清洗,把10000個小文件清洗成一個文件或者幾個文件,寫個map(1.前提10000小文件格式相同,
2.不會有太多的小文件 一千萬個小文件,首先會在操做系統上傳時就處理完了,可是要是問能夠說,分批作,每一萬個存儲到一個目錄中,對一個目錄進行map清洗)),其次,進行reduce計算
清洗會產生數據傾斜: 不少小文件是數據傾斜(解決方法):2.1.基於map端的離散方法;2.2.combiner;
//hdfs爲何怕不少小文件:由於不少小文件的話也會佔用namenode目錄樹的空間,通常一個文件的元數據會佔到150字節;
而NameNode是要接收集羣中全部的DataNode的心跳信息,來肯定元數據的信息變化的,當小文件一旦過多,namenode的元數據讀取就會變慢。
(在HDFS中,namenode將文件系統中的元數據存儲在內存中,所以,HDFS所能存儲的文件數量會受到namenode內存的限制)
8.如何從編程的角度講解MR的過程
對數據進行底層默認分片把數據解析成k1/v1形式傳給map;
Map對k1/v1進行截取、運算等操做生成k2/v2傳給reduce;
Reduce對相同key的值進行計算,生成最終結果k3/v3輸出
9.MR中有沒有隻有Map的
有,只對數據進行分片,解析成key/value形式後,直接輸出結果不進行reduce端的去重和數組化的。
eg:好比說我把全部的通過split(map)造成的元素都放到context的key作標籤就不會用到reduce。
10.Map輸出端的組成部份
Combiner、shuffle、partitioner
11.如何用MR實現join
1) reduce side join(在reduce端作join操做)
在map階段,map函數同時讀取兩個文件File1和File2,爲了區分兩種來源的key/value數據對,對每條數據打一個標籤 (tag),
好比:tag=0表示來自文件File1,tag=2表示來自文件File2。即:map階段的主要任務是對不一樣文件中的數據打標籤。
在reduce階段,reduce函數獲取key相同的來自File1和File2文件的value list, 而後對於同一個key,對File1和File2中的數據進行join(笛卡爾乘積)。即:reduce階段進行實際的鏈接操做。
2) map side join(在map端作join操做)
之因此存在reduce side join,是由於在map階段不能獲取全部須要的join字段,即:同一個key對應的字段可能位於不一樣map中。Reduce side join是很是低效的,由於shuffle階段要進行大量的數據傳輸。
Map side join是針對如下場景進行的優化:兩個待鏈接表中,有一個表很是大,而另外一個表很是小,以致於小表能夠直接存放到內存中。這樣,咱們能夠將小表複製多份,
讓每一個map task內存中存在一份(好比存放到hash table中),而後只掃描大表:對於大表中的每一條記錄key/value,在hash table中查找是否有相同的key的記錄,
若是有,則鏈接後輸出便可。爲了支持文件的複製,Hadoop提供了一個類DistributedCache,使用該類的方法以下:
(1)用戶使用靜態方法DistributedCache.addCacheFile()指定要複製的文件,它的參數是文件的URI(若是是 HDFS上的文件,能夠這樣:
hdfs://namenode:9000/home/XXX/file,其中9000是本身配置的NameNode端口 號)。JobTracker在做業啓動以前會獲取這個URI列表,並將相應的文件拷貝到各個TaskTracker的本地磁盤上。
(2)用戶使用 DistributedCache.getLocalCacheFiles()方法獲取文件目錄,並使用標準的文件讀寫API讀取相應的文件。
DistributedCache方法:(DistributedCache 是一個提供給Map/Reduce框架的工具,用來緩存文件(text, archives, jars and so on)文件的默認訪問協議爲(hdfs://).
DistributedCache將拷貝緩存的文件到Slave節點在任何Job在節點上執行以前。
文件在每一個Job中只會被拷貝一次,緩存的歸檔文件會被在Slave節點中解壓縮。)
符號連接
每一個存儲在HDFS中的文件被放到緩存中後均可以經過一個符號連接使用。
URI hdfs://namenode/test/input/file1#myfile 你能夠在程序中直接使用myfile來訪問 file1這個文件。 myfile是一個符號連接文件。
12.MAP如何排序
在map端一共經歷兩次的排序:
當map函數產生輸出時,會首先寫入內存的環形緩衝區,當達到設定的閾值,在刷寫磁盤以前,
後臺線程會將緩衝區的數據劃分紅相應的分區。在每一個分區中,後臺線程按鍵進行內排序,在Map任務完成以前,
磁盤上存在多個已經分好區,並排好序的、大小和緩衝區同樣的溢寫文件,
這時溢寫文件將被合併成一個已分區且已排序的輸出文件。
因爲溢寫文件已經通過第一次排序,因此合併分區文件時只須要再作一次排序就可以使輸出文件總體有序。
13.什麼是inputsplit
InputSplit是MapReduce對文件進行處理和運算的輸入單位,只是一個邏輯概念,每一個InputSplit並無對文件實際的切割
,只是記錄了要處理的數據的位置(包括文件的path和hosts)和長度(由start和length決定)。
14.MR中使用了哪些接口?(或者是抽象類)
FileinputFormat、Mapper、Reducer、FileoutputFormat、Combiner、Partitioner等
---------------------
做者:QianShiK
來源:CSDN
原文:https://blog.csdn.net/QianShiK/article/details/81480854
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
這個業務中map輸出value包含日誌數據中每一行的上行流量 下行流量
* 由於一次要輸出3個值 因此咱們一般都是編寫一個自定義的類型
*
* 自定義map reducer的輸出值類型?
* a:須要編寫一個java類封裝每一行日誌數據中的上行流量和下行流量
* b:還須要在a中封裝根據上行流量和下行流量計算總流量
* c:由於a中的java類作的是map的輸出值類型 因此它須要符合hadoop io類型
* LongWritable Text IntWritable都實現了WritableComparable接口
* 反推就是想編寫hadoop io類型就須要實現WritableComparable接口
*
* WritableComparable接口又包括了
* Writable接口(write,readFields兩個方法) 這個接口是負責這個對象的序列化和反序列化
* Comparable接口(compareTo一個方法) 這個接口是負責對象比較大小/排序使用的
* 因此兩個接口中Writable接口才是標識是否屬於hadoop io的類型
*
* 又覺得map的輸出值不須要排序 只須要序列化 因此咱們在這需求須要編寫的map輸出自定義類型只
* 須要實現Writable接口便可
切片怎麼切的:切片的數量不是越大或者越小寫好,而是要根據每次計算的實際數據涼,自定義優化的切片大小來控制切片的數量
好比有一共300m,前128m以一個切片,若是129到300m的存儲空間小能夠直接是一個切片
NIO
1:什麼是NIO?
NIO是基於通道和緩存的非阻塞IO。
2:IO 和 NIO的區別?
a:通道在IO中只是一個便於理解的虛擬概念 而在NIO中通道是一個實際的概念
b:在IO中最底層的傳輸數據是字節 而在NIO中最小的傳輸都是緩存
c:在IO中 虛擬的通道直接會和數據接觸 在NIO中通道直接面對的不是數據 而是緩存
d:在IO中某一個通道一般都是單向的 在NIO中通道是雙向的
e:IO和NIO針對數據傳輸內存使用的方式不一樣
IO是面向流的 NIO是面向緩存的
3:NIO中的緩存
在NIO中傳輸數據 都是把數據先放入某個緩存中 再在某個通道中 按照緩存傳輸
在java中原有針對NIO的開發包 java.nio.*
在java.nio包下直接都是可使用的緩存類:
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
MappedByteBuffer
ShortBuffer
4:直接緩衝區和非直接緩衝區
a:系統內存(系統內核內存) 和 JVM內存(程序內存的區別)
b:IO是把數據先傳入JVM內存 再從JVM內存複製到系統內存 組後從系統內存寫入目的硬盤
NIO是把數據能夠先傳入硬盤內存區 再從硬盤內存區直接寫入目的硬盤
buffer.allocate方法建立的緩衝區是在非直接緩衝區申請的內存
buffer.allocateDirect一旦使用 就是在直接緩衝區申請的內存
5:通道
通道是爲了替代cpu完成io操做 從而提高cpu的利用率