主要解決海量數據的存儲和數據分析計算的問題java
8bite =1 Byte,1k=1024Byte,node
Bite Byte KB MB,GB,TB,PB,EB,ZB,YB,BB,NB,DBmysql
Volume 大量 (部分企業數據量達EB)sql
Velocity 高速(數據處理效率要高)shell
Variety 多樣。(結構化+非結構化)數據庫
value 低價值密度apache
1.x和2.x的區別是將資源調度和管理進行分離!由統一的資源調度平臺YARN進行大數據計算資源的調度!
提高了Hadoop的通用性!Hadoop搭建的集羣中的計算資源,不只能夠運行Hadoop中的MR程序!也能夠運行其餘計算框架的程序!編程
在hadoop不久以後,因爲MR的低效性,出現了許多更爲高效的計算框架!
例如: Tez,Storm,Spark,Flinktomcat
完成大數據的計算
①寫程序,程序須要複合計算框架的要求!安全
java---->main----->運行 MapReduce(編程模型)----->Map--Reducer
②運行程序,申請計算資源(cpu+內存,磁盤IO,網絡IO)
java----->JVM------>OS----->申請計算資源 1.0: MapReduce(編程模型)---->JobTracker----->JVM----->申請計算資源 2.0: MapReduce(編程模型)---->jar------>運行時,將jar包中的任務,提交給YARN,和YARN進行通訊 由YARN中的組件-----JVM------>申請計算資源
HDFS(框架):負責大數據的存儲
YARN(框架): 負責大數據的資源調度
MR(編程模型): 使用Hadoop制定的編程要求,編寫程序,完成大數據的計算!
Namenode(1個):
DataNode(N個)
MapReduce(編程規範): 程序中有Mapper(簡單處理)和Reducer(合併)
遵循MapReduce的編程規範,編寫的程序,打包後,稱爲一個Job(任務)!
Job須要提交到YARN上,向YARN申請計算資源,運行Job中的Task(進程)!
Job會先建立一個進程MRAppMaster(mapreduce 應用管理者),由MRAppMaster向YARN申請資源!
MRAppMaster負責監控Job中各個Task運行狀況,進行容錯管理!
ResourceManager(1個): 負責整個集羣全部資源的管理!
NodeManager(N個): 負責單臺計算機全部資源的管理!
Container(容器): 對任務運行環境的抽象
(1)bin目錄:存放對Hadoop相關服務(HDFS,YARN)進行操做的腳本
(2)etc目錄:Hadoop的配置文件目錄,存放Hadoop的配置文件
(3)lib目錄:存放Hadoop的本地庫(對數據進行壓縮解壓縮功能)
(4)sbin目錄:存放啓動或中止Hadoop相關服務的腳本
(5)share目錄:存放Hadoop的依賴jar包、文檔、和官方案例
(1)4個默認的配置文件:
位置: HADOOP_HOME/share/xxxx.jar/xxx-default.xml
文件名:core-default.xml: 設置hadoop最核心的參數!
hdfs-default.xml 保存的是hdfs相關的參數!
mapred-default.xml: MR程序在運行時,須要使用的參數!
yarn-default.xml: yarn在啓動時,須要的參數!
(2)4個可自定義的配置文件:xxx-site.xml
core-site.xml: 用戶自定義的設置hadoop最核心的參數!
hdfs-site.xml 用戶自定義的保存的是hdfs相關的參數!
mapred-site.xml: 用戶自定義的MR程序在運行時,須要使用的參數!
yarn-site.xml: 用戶自定義的yarn在啓動時,須要的參數!
(3) tips
能夠自定義配置文件的目錄: hadoop --config 配置文件的目錄
若是沒有配置,默認讀取 HADOOP_HOME/etc/hadoop 中對應的配置文件!
Hadoop在啓動時,先加載4個默認的配置文件,再加載用戶自定義的配置文件,若是用戶自定義的配置文件中有和4個默認配置文件中門的參數,能夠覆蓋以前已經加載的值!
hadoop-daemon.sh start namenode腳本在執行時,只會去默認的目錄中讀取配置文件!
(1) 本地模式:在本機上使用hdfs,使用的就是本地的文件系統
設置方法:
core-site.xml
中fs.defaultFS=file:///
(默認,不用修改)
(2)僞分佈式:NN和DN在一臺機器,且只有一個DN節點
設置方法:
指定HDFS中namenode的地址,core-site.xml
中fs.defaultFS=hdfs://hadoop101:9000
配置hdfs-site.xml
指定HDFS副本的數量dfs.replication
啓動集羣
格式化nameNode ,bin/hdfs namenode -format
,啓動namenode,datanode
啓動NN: hadoop-daemon.sh start namenode
中止NN: hadoop-daemon.sh stop namenode 啓動DN: hadoop-daemon.sh start datanode 中止DN: hadoop-daemon.sh stop datanode 使用: hadoop fs 命令 文件路徑
jps是JDK中的命令,不是Linux命令。不安裝JDK不能使用jps
Yarn上運行mapreduce程序
完成大數據的計算!
①按照MR的規範編寫一個程序 ②將程序打包爲jar ③運行jar中的程序
兩種運行模式:
取決於參數: mapreduce.framework.name=local(默認)
①本地模式(在本機上運行MR) mapreduce.framework.name=local
在本機運行MR!在本機使用多線程的方式,運行多個Task!
②在YARN上運行 mapreduce.framework.name=yarn
將MR提交給YARN,由YARN將Job中的多個task分配到多臺機器中,啓動container運行task! 須要啓動YARN,YARN由RM和NM進程組成!
(3) 徹底分佈式
準備3臺客戶機 P0501&wo
緣由:文件在HDFS上存儲時,以block爲基本單位存儲的
a. 沒有提供對文件的在線尋址功能
b. 文件以塊形式存儲,修改了一個塊中的內容,就會影響當前塊以後的全部塊,效率低
緣由: HDFS存儲了大量的小文件,會下降NN的服務能力
NN負責文件元數據(屬性,塊的映射)的管理,NN在運行時,必須將當前集羣中存儲的全部文件的元數據所有加載到內存,NN須要大量的內存
緣由: 基於最佳傳輸損耗理論(在一次傳輸中,尋址時間佔用總傳輸時間的1%時,本次傳輸的損耗最小,爲最佳性價比傳輸)
不論對磁盤的文件進行讀仍是寫,都須要先進行尋址
目前硬件的發展條件,普通磁盤寫的速率大概爲100M/s,尋址時間通常爲10ms
塊在傳輸時,每64k還須要校驗一次,所以塊大小,必須爲2的n次方
不能太大,a. 在一些分塊讀取的場景,不夠靈活,會帶來額外的網絡消耗;b.在上傳文件時,一旦發生故障,會形成資源的浪費。
不能過小,a. 塊過小,一樣大小的文件,會佔用過多的NN的元數據空間;b. 塊過小,在進行讀寫操做時,會消耗額外的尋址空間
默認塊大小128M,指的是塊的最大大小。每一個塊最多存128M,若是當前塊存儲的數據不滿128M,存了多少數據,就佔用多少磁盤空間,一個塊只屬於一個文件。
hadoop fs 既能夠對本地文件系統進行操做還能夠操做分佈式文件系統
hdfs dfs 只能操做分佈式文件系統
hadoop fs -help +命令,可查幫助文檔
①服務端啓動HDFS中的NN和DN進程
②客戶端建立一個分佈式文件系統客戶端,由客戶端向NN發送請求,請求上傳文件
③NN處理請求,檢查客戶端是否有權限上傳,路徑是否合法等
④檢查經過,NN響應客戶端能夠上傳
⑤客戶端根據本身設置的塊大小,開始上傳第一個塊,默認0-128M,
NN根據客戶端上傳文件的副本數(默認爲3),根據機架感知策略選取指定數量的DN節點返回
⑥客戶端根據返回的DN節點,請求創建傳輸通道
客戶端向最近(網絡舉例最近)的DN節點發起通道創建請求,由這個DN節點依次向通道中的(距離當前DN距離最近) 下一個節點發送創建通道請求,各個節點發送響應 ,通道創建成功
⑦客戶端每讀取64K的數據,封裝爲一個packet(數據包,傳輸的基本單位),將packet發送到通道的下一個節點
通道中的節點收到packet以後,落盤(檢驗)存儲,將packet發送到通道的下一個節點! 每一個節點在收到packet後,向客戶端發送ack確認消息!
⑧一個塊的數據傳輸完成以後,通道關閉,DN向NN上報消息,已經收到某個塊
⑨第一個塊傳輸完成,第二塊開始傳輸,依次重複⑤-⑧,直到最後一個塊傳輸完成,NN向客戶端響應傳輸完成!
客戶端關閉輸出流
①-⑥見上
⑦客戶端每讀取64K的數據,封裝爲一個packet,封裝成功的packet,放入到一個隊列中,這個隊列稱爲dataQuene(待發送數據包)
在發送時,先將dataQuene中的packet按順序發送,發送後再放入到ackquene(正在發送的隊列)。
每一個節點在收到packet後,向客戶端發送ack確認消息!
若是一個packet在發送後,已經收到了全部DN返回的ack確認消息,這個packet會在ackquene中刪除!
假如一個packet在發送後,在收到DN返回的ack確認消息時超時,傳輸停止,ackquene中的packet會回滾到
dataQuene。
從新創建通道,剔除壞的DN節點。創建完成以後,繼續傳輸!
只要有一個DN節點收到了數據,DN上報NN已經收完此塊,NN就認爲當前塊已經傳輸成功!
NN會自動維護副本數!
2.7.2默認的策略:
第一個副本放在本地機架的一個DN節點
第二個副本放在本地機架的另外一個DN節點
本地機架的網絡拓撲舉例最多爲2,速度快!
第三個副本放在其餘機架的一個DN節點
爲了安全性
tomcat服務器日誌
數據庫服務卡mysql數據 客戶端()
開源的分佈式的,爲分佈式應用提供協調服務的apache項目,多用做爲集羣提供服務的中間件
負責存儲和管理你們都關心的數據,eg,hdfs 的url
Zookeeper是java編寫的一個開源的分佈式的存儲中間件!
Zookeeper能夠用來存儲分佈式系統中各個進程都關心的核心數據!
Zookeeper採起觀察者模式設計,能夠運行客戶端在讀取數據時,設置一個觀察者一旦觀察的節點觸發了指定的事件,服務端會通知客戶端線程,客戶端能夠執行回調方法,執行對應的操做!
(1)一致性:zookpeer 中的數據按順序分批入庫,並最終一致
(2)原子性:一次數據更新要麼成功要麼失敗
(3)單一視圖:client 不管鏈接到哪一個zk節點,數據都是一致的
(4)可靠性:每次對zk的操做狀態都會保存到服務器,每一個server保存一份相同的數據副本(和hdfs不同,dhfs 每一個datanode 數據不一致)
(5)更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
(6)實時性:在必定範圍內,client 能讀取到最新數據
與unix文件系統相似,總體可看做一棵樹,每一個節點稱做一個znode,每一個znode能夠相似看做一個目錄,其餘能夠建立子目錄
zookeeper 集羣自身維護了一套數據結構,存儲結構是一個樹形結構,其上每一個節點,成爲znode,每一個znode默認能存1M的數據,每一個znode能夠經過其路徑惟一標示
數據發佈與訂閱:適用於配置信息多設備共享,會發生動態變化
軟負載均衡:負責收集服務信息與狀態監控
集羣管理:每臺機器的運行狀態收集
啓動: bin/zkServer.sh start bin/zkCli.sh -server host:port 中止: bin/zkServer.sh stop bin/zkCli.sh -server host:port close|exit 增: create [-s] [-e] path data -s: 建立一個帶序號的znode -e: 建立一個臨時znode,臨時的znode被所建立的session擁有,一旦session關閉,臨時 節點會被刪除 刪: delete path rmr path 改: set path data 查: get path stat path ls path ls2 path 支持四字命令 nc hadoop101 2181 ruok 設置觀察者 get path watch: 監聽指定節點數據的變化 ls path watch: 監聽當前路徑子階段數據的變化,一旦新增或刪除了子節點,會觸發事件 注意: 觀察者在設置後,只有當次有效!
2、ZK集羣的注意事項
ZK在設計時,採用了paxos協議設計,這個協議要求,集羣半數以上服務實例存儲,集羣
才能夠正常提供服務
ZK集羣中,server有Leader 和Followwer兩種角色
Leader只有一個,在集羣啓動時,自動選舉產生! 選舉Leader時,只有數據和Leader保持同步的Follower有權參與競選Leader! 在競選Leader時,serverid大的Server有優點!
集羣模式ZK的寫流程
①客戶端能夠鏈接任意的zkserver實例,向server發送寫請求命令 ②若是當前鏈接的server不是Leader,server會將寫命令發送給Leader ③Leader將寫操做命令廣播到集羣的其餘節點,全部節點都執行寫操做命令 ④一旦集羣中半數以上的節點寫數據成功,Leader會響應當前Server,讓當前Server 響應客戶端,寫操做完成!