Hadoop歷史:
2002年Apatch Nutch項目啟動(Apatch
Lucene的創(chuàng)始人Dout Cutting負責),用于解決網(wǎng)頁搜索問題
2003年谷歌發(fā)表論文,講述了他們海量數(shù)據(jù)存儲和網(wǎng)頁搜索的解決思想,即GFS
2004年,受谷歌啟發(fā),Apatch Nutch分布式文件系統(tǒng)項目(NDFS)啟動。同年,google用論文向世界介紹了他們的MapReduce
2005年,NDFS上也實現(xiàn)了Mapreduce,而且不僅僅適用與搜索環(huán)境。
2006年NDFS和MapReduce移出Nutch,形成Lucene的一個子項目,被稱為為Hadoop。同年,Dout
Cutting進入雅虎,成立了專門的研究團隊,把Hadoop發(fā)展成能進行web數(shù)據(jù)處理的系統(tǒng)。
2008年,Hadoop已經(jīng)成為Apache的頂級項目
Hadoop分布式文件系統(tǒng)
HDFS設計思想
超大文件
專注大規(guī)模數(shù)據(jù)處理,Hadoop能存儲PB級別的數(shù)據(jù)
流式數(shù)據(jù)訪問,一次寫,多次讀
流式,指的是批量讀取,而非隨機讀取。由于hadoop設計為做數(shù)據(jù)分析,所以并不需要修改。
硬件故障是常態(tài),需要冗余。
集群化部署,量變引起質(zhì)變,對單個節(jié)點硬件要求并不太高,不必考慮大型數(shù)據(jù)庫級別的機器。
“數(shù)據(jù)就近與就遠”原則
副本之間距離要遠,讀取數(shù)據(jù)時盡量從近的節(jié)點讀?。C架策略)。
不適應在hadoop上運行的情況:
低延遲訪問
Hadoop設計再與處理海量數(shù)據(jù),并沒有關注實時訪問,可以考慮使用Hbase滿足低延遲的需求。
大量小文件
因為每個文件都要在namenode內(nèi)存中存儲元數(shù)據(jù),每個文件,目錄和數(shù)據(jù)塊大約占用150字節(jié),如果小文件太多,勢必影響namenode性能.
多用戶寫入和修改
Hadoop不支持多用戶同時寫入,也不支持修改。
HDFS概念
數(shù)據(jù)塊:
HDFS中的文件被劃分為多個塊,獨立存儲
為了降低磁盤尋址開銷時間,即一次讀更多的塊,可以適當調(diào)大塊大小
由于map階段一次讀取一個塊,如果這個塊設置的過大,map任務較少,速度會變慢。
分塊的好處:
1. 使一個文件可以存儲在不同磁盤上
2. 簡化管理,因為元數(shù)據(jù)由其他系統(tǒng)控制
3. 適用與容錯處理和數(shù)據(jù)備份
列出磁盤中文件的塊信息:
[~/hadoop/hadoop-1.2.1/conf]$hadoop fsck /user/huangxing/input files blocks
FSCK started by huangxing from /127.0.0.1
for path /user/huangxing/input at Thu Feb 27 23:40:14 CST 2014
.
/user/huangxing/input/README.html: Under replicated
blk_5326121453921514416_1014. Target Replicas is 3 but found 1 replica(s).
Status: HEALTHY
Total size:
114 B
Total dirs:
1
Total files:
1
Total blocks (validated): 1 (avg. block size 114 B)
Minimally replicated blocks: 1 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 1 (100.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 1
Average block replication: 1.0
Corrupt blocks: 0
Missing replicas: 2 (200.0 %)
Number of data-nodes: 1
Number of racks: 1
FSCK ended at Thu Feb 27 23:40:14 CST 2014
in 4 milliseconds
The filesystem under path
'/user/huangxing/input' is HEALTHY
namenode和datanode
namenode和datanode是HDFS系統(tǒng)的兩個重要概念
nodename節(jié)點管理系統(tǒng)命名空間,類似mongodb的配置服務器,維護系統(tǒng)文件和目錄信息,所以連接namenode就可以查看整個目錄樹。注意,這些信息以一對文件保存在本地磁盤上:包括命名空間鏡像文件和事務日志文件。Namenode還記錄每個塊的數(shù)據(jù)節(jié)點信息,但是不永久保存,這些信息在系統(tǒng)重啟時候由datanode節(jié)點建立,然后傳輸給nodename節(jié)點。總結namenade作用:
(1) 管理文件系統(tǒng)的命名空間
(2) 記錄每個文件數(shù)據(jù)塊在各個Datanode上的位置和副本信息
(3) 協(xié)調(diào)客戶端對文件的訪問
(4) 記錄命名空間內(nèi)的改動或空間本身屬性的改動
(5) amenode使用事務日志記錄HDFS元數(shù)據(jù)的變化。使用映像文件存儲文件系統(tǒng)的命名空間,包括文件映射,文件屬性等
[~/hadoop/hadoop-1.2.1/name]$ls -lR
.:
總用量 12
drwxrwxr-x 2 huangxing huangxing 4096 3月 1 01:24 current
drwxrwxr-x 2 huangxing huangxing 4096 2月 27 01:12 image
-rw-rw-r-- 1 huangxing huangxing 0 3月 1 01:19 in_use.lock
drwxrwxr-x 2 huangxing huangxing 4096 2月 28 11:22
previous.checkpoint
./current:
總用量 1040
-rw-rw-r-- 1 huangxing huangxing
1048580 3月 1 01:29 edits
-rw-rw-r-- 1 huangxing huangxing 1501
3月 1 01:24 fsimage
-rw-rw-r-- 1 huangxing huangxing 8
3月 1 01:24 fstime
-rw-rw-r-- 1 huangxing huangxing 101
3月 1 01:24 VERSION
./image:
總用量 4
-rw-rw-r-- 1 huangxing huangxing 157 3月 1 01:24 fsimage
./previous.checkpoint:
總用量 1040
-rw-rw-r-- 1 huangxing huangxing
1048580 2月 28 11:29 edits
-rw-rw-r-- 1 huangxing huangxing 1501
2月 28 11:22 fsimage
-rw-rw-r-- 1 huangxing huangxing 8
2月 28 11:22 fstime
-rw-rw-r-- 1 huangxing huangxing 101
2月 28 11:22 VERSION
Fsimage就是映像文件,edit是事務日志
dataNode受客戶端或者namenode調(diào)度,存儲并檢索數(shù)據(jù)塊,并且定期向namenode發(fā)送他們存儲的塊的列表,datanode特性:
(1) 負責物理節(jié)點的存儲管理,
(2) 一次寫入,多次讀?。ú恍薷模?
(3) 數(shù)據(jù)塊組成,典型的塊大小是64MB
(4) 據(jù)塊盡量散布到各個節(jié)點
如果namenode節(jié)點崩潰,整個集群系統(tǒng)將不可用,hadoop提供兩種容錯策略:
1. 通過寫入多個目的地,例如寫入本地和NFS目錄
2. 使用輔助namenode節(jié)點,定期編輯日志,合并命名空間,防止日志過大。由于他的狀態(tài)總是落后namenode,所以一旦namenode失效,就會產(chǎn)生數(shù)據(jù)丟失。失效時,可以把nfs上的數(shù)據(jù)拷貝到輔助節(jié)點,使之以namenode運行。
Hadoop數(shù)據(jù)讀取流程
(1) 客戶端向namenode發(fā)出請求(集群中每個節(jié)點都知道namenode在哪里)
(2) Namenode收集datanode信息
(3) Namenode向客戶端傳送數(shù)據(jù)
(4) 客戶端向datanode查詢數(shù)據(jù)(就近原則讀,利用帶寬)
所以,namenode只是存儲datanode元數(shù)據(jù),但是他是放在內(nèi)存里面的,定位效率較高
HDFS可用性
冗余副本策略
(1) 可以在hdfs-site.xml中設置復制因子指定副本數(shù)量
(2) 所有數(shù)據(jù)塊都有副本
(3) Datanode啟動時,遍歷本地文件系統(tǒng),產(chǎn)生一份hdfs數(shù)據(jù)塊和本地文件的對應關系列
表(blockreport)匯報給namenode
機架策略
(1) 集群一般放在不同機架上,機架間帶寬要比機架內(nèi)帶寬要小
(2) HDFS的“機架感知”
(3) 一般在本機架存放一個副本,在其它機架再存放別的副本,這樣可以防止機架失效時
丟失數(shù)據(jù),也可以提高帶寬利用率,而且讀取數(shù)據(jù)盡量不跨越機柜
心跳機制
(1) Namenode周期性從datanode接收心跳信號和塊報告
(2) Namenode根據(jù)塊報告驗證元數(shù)據(jù)
(3) 按時發(fā)送心跳的datanode會被標記為宕機,不會再給它任何I/O請求(與impala類似)
(4) 如果datanode失效造成副本數(shù)量下降,并且低于預先設置的閾值,namenode會檢測出這些數(shù)據(jù)塊,并在合適的時機進行重新復制(討論閾值)
(5) 引發(fā)重新復制的原因還包括數(shù)據(jù)副本本身損壞、磁盤錯誤,復制因子被增大等
安全模式
(1) node啟動時會先經(jīng)過一個“安全模式”階段
安全模式階段不會產(chǎn)生數(shù)據(jù)寫,此階段Namenode收集各個datanode的報告,當數(shù)據(jù)塊達到最小副本數(shù)以上時,會被認為是“安全”的(否則不安全.
(2) 在一定比例(可設置)的數(shù)據(jù)塊被確定為“安全”后,再過若干時間,安全模式結束。檢測到副本數(shù)不足的數(shù)據(jù)塊時,該塊會被復制直到達到最小副本數(shù)。
校驗和
校驗和文件如下所示:
[~/hadoop/hadoop-1.2.1/data/current]$ls -lh
總用量 82M
-rw-rw-r-- 1 huangxing huangxing 138 2月 27 23:09
blk_-1148524011628330155
-rw-rw-r-- 1 huangxing huangxing 11 2月 27 23:09
blk_-1148524011628330155_1020.meta
-rw-rw-r-- 1 huangxing huangxing 64M 3月 1 01:29 blk_2941913032423535550
-rw-rw-r-- 1 huangxing huangxing 513K 3月 1 01:29 blk_2941913032423535550_2280.meta
-rw-rw-r-- 1 huangxing huangxing 4 3月 1 01:20 blk_3165250348914594670
-rw-rw-r-- 1 huangxing huangxing 11 3月 1 01:20 blk_3165250348914594670_1025.meta
-rw-rw-r-- 1 huangxing huangxing 114 2月 27 19:14
blk_5326121453921514416
-rw-rw-r-- 1 huangxing huangxing 11 2月 27 19:14
blk_5326121453921514416_1014.meta
-rw-rw-r-- 1 huangxing huangxing 9.1K 2月 28 11:18
blk_-7495815267218679520
-rw-rw-r-- 1 huangxing huangxing 83 2月 28 11:18
blk_-7495815267218679520_1023.meta
-rw-rw-r-- 1 huangxing huangxing 17M 3月 1 01:29 blk_-7878323630152692968
-rw-rw-r-- 1 huangxing huangxing 130K 3月 1 01:29 blk_-7878323630152692968_2280.meta
-rw-rw-r-- 1 huangxing huangxing 9.1K 2月 28 11:19
blk_-9178443108632575838
-rw-rw-r-- 1 huangxing huangxing 83 2月 28 11:19
blk_-9178443108632575838_1024.meta
-rw-rw-r-- 1 huangxing
huangxing 1.7K 3月 1 02:02
dncp_block_verification.log.curr
drwxrwxr-x 2 huangxing huangxing 4.0K 3月 1 01:25 subdir0
1. 在文件創(chuàng)立時,每個數(shù)據(jù)塊都產(chǎn)生校驗和
2. 校驗和會作為單獨一個隱藏文件保存在命名空間下
3. 客戶端獲取數(shù)據(jù)時可以檢查校驗和是否相同,從而發(fā)現(xiàn)數(shù)據(jù)塊是否損壞
4. 如果正在讀取的數(shù)據(jù)塊損壞,則可以繼續(xù)讀取其它副本
回收站
(1) 刪除文件時,其實是放入回收站/trash
(2) 回收站里的文件可以快速恢復
(3) 可以設置一個時間閾值,當回收站里文件的存放時間超過這個閾值,就被徹底刪除,
(4) 并且釋放占用的數(shù)據(jù)塊
(5) 可以設置不需要回收站
元數(shù)據(jù)保護
十分核心的內(nèi)容:
(1)
映像文件剛和事務日志是Namenode的核心數(shù)據(jù)。可以配置為擁有多個副本(類似oracle的控制文件多個復制)
(2) 副本會降低Namenode的處理速度,但增加安全性
(3) Namenode依然是單點,如果發(fā)生故障要手工切換
快照
類似oracle的回滾:
(1) 支持存儲某個時間點的映像,需要時可以使數(shù)據(jù)重返這個時間點的狀態(tài)
(2) Hadoop目前還不支持快照,已經(jīng)列入開發(fā)計劃
命令行接口
基本文件系統(tǒng)操作(fs)
查看幫助:
[root@hexel
/hadoop/hadoop-1.2.1/name]#hadoop fs –help
復制本地文件到hdfs:(或者put)
[~]$hadoop dfs -copyFromLocal ./notice.html
/user/huangxing/input
[~]$hadoop dfs -copyFromLocal ./notice.html
/user/huangxing/input/notice1.html
把文件復制到本地:(或者get命令)
[~]$hadoop dfs -copyToLocal
/user/huangxing/input/notice1.html ./
進行md5驗證:
[~]$md5sum notice.html
a00d6f9ab542be7babc2d8b80d5d2a4c notice.html
[~]$hadoop dfs -copyToLocal
/user/huangxing/input/notice1.html ./
[~]$md5sum notice1.html
a00d6f9ab542be7babc2d8b80d5d2a4c notice1.html
[~]$
顯示hdfs文件:
[~]$hadoop dfs -ls /user/huangxing/input
Found 3 items
-rw-r--r--
3 huangxing supergroup 114
2014-02-27 19:14 /user/huangxing/input/README.html
-rw-r--r--
1 huangxing supergroup 9230
2014-02-28 11:18 /user/huangxing/input/notice.html
-rw-r--r--
1 huangxing supergroup 9230
2014-02-28 11:19 /user/huangxing/input/notice1.html
第一列是權限信息,第二列表示副本數(shù)
查看統(tǒng)計信息
[~/hadoop/hadoop-1.2.1/data/current]$hadoop
dfsadmin -report
Configured Capacity: 19359907840 (18.03 GB)
Present Capacity: 13920987045 (12.96 GB)
DFS Remaining: 13920464896 (12.96 GB)
DFS Used: 522149 (509.91 KB)
DFS Used%: 0%
Under replicated blocks: 2
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)
Name: 191.255.255.250:50010
Decommission Status : Normal
Configured Capacity: 19359907840 (18.03 GB)
DFS Used: 522149 (509.91 KB)
Non DFS Used: 5438924891 (5.07 GB)
DFS Remaining: 13920460800(12.96 GB)
DFS Used%: 0%
DFS Remaining%: 71.9%
Last contact: Sat Mar 01 02:12:12 CST 2014
進入和退出安全模式
Dananode啟動時候發(fā)送數(shù)據(jù)塊信息給namenode,塊副本量達到閾值時,才會退出安全模式,接受讀寫。手動進入安全模式:
[~/hadoop/hadoop-1.2.1/data/current]$hadoop
dfsadmin -safemode enter
Safe mode is ON
Safemode下無法讀寫了?。?
[~]$hadoop dfs -put ./notice.html
/user/huangxing/hxnotice.xml
put:
org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create
/user/huangxing/hxnotice.xml. Name node is in safe mode.
離開安全模式:
[~/hadoop/hadoop-1.2.1/data/current]$hadoop
dfsadmin -safemode leave
這個時候可以正常操作了。
添加節(jié)點
(1) 在新節(jié)點安裝好hadoop(linux,hadoop,配置文件,java)
(2) 把namenode的有關配置文件復制到該節(jié)點
(3) 修改masters和slaves文件,增加該節(jié)點
(4) 設置ssh免密碼進出該節(jié)點
(5) 單獨啟動該節(jié)點上的datanode和tasktracker(hadoop-daemon.sh start datanode/tasktracker)
(6) 運行start -balancer.sh進行數(shù)據(jù)負載均衡
負載均衡
作用:當節(jié)點出現(xiàn)故障,或新增加節(jié)點時,數(shù)據(jù)塊分布可能不均勻,負載均衡可以重新平衡各個datanode上數(shù)據(jù)塊的分布(比較耗時間)
API
需要熟練上傳,刪除,重命名文件相關java類和方法.
|