Hadoop數據存儲

Hadoop數據存儲

Hadoop能高效處理數據的基礎是有其數據存儲模型做支撐,典型的是Hadoop的分佈式文件系統HDFS和HBase。

一、HDFS文件系統

1.0、 HDFS簡介

HDFS是Hadoop的分佈式文件系統的實現,它設計的目的是存儲海量的數據,併爲分佈式在網絡中的大量客戶端提供數據訪問。想成功的使用HDFS,就要其實現方式及工作原理。

1.1、HDFS架構

HDFS的設計思想基於Google File System。它的出現具有以下優勢:

1、可以存儲相比於nfs能存儲的文件的量更大;

2、爲在大量機器和文件系統之間傳輸數據而設計;

3、具有可靠的數據存儲能力,並通過數據副本的方式處理集羣中某臺機器宕機或數據丟失的情況;

4、HDFS與Hadoop的MapReduce模型易於集成,因此,允許數據從本地讀取和處理 。

但是HDFS爲獲得可擴展性和高性能而進行的設計也是有代價的,它的不足之處有: 1、HDFS 並非一個通用的應用程序,而是侷限於某些特定的場景;

2、HDFS 優化了高速流數據讀取性能,代價則是在隨機讀取性能上的削弱,因此要避免數據的隨機讀取,訪問 HDFS 文件最好採取順序讀取的方式;

3、HDFS 只支持在文件上做少數的操作,但不包括任何更新操作;

4、HDFS 不提供數據的本地緩存機制。

HDFS被實現爲一種塊結構的文件系統。如圖所示,在Hadoop中,單個文件被拆分爲固定大小的塊存儲在Hadoop集羣上。對於每個塊保存在哪個DataNode上是隨機的,其結果是,訪問某個文件需要訪問多個DataNode,也就是HDFS能存儲的文件大小可以遠超出單機的磁盤容量。

這裏寫圖片描述

此圖展示了HDFS的整體架構,HDFS 採用 master/slave 主從結構,NameNode節點存儲了整個集羣的文件系統的元數據信息,它管理着文件系統的的命名空間和客戶端訪問文件的過程,NameNode節點確保HDFS中的元數據在各個節點間保持一致。

1.2、SecondaryNameNode

HDFS的實現基於master/slave 主從架構。一方面極大的簡化了HDFS的整體架構,但另一方面,這也變成了HDFS的一個弱點,即NameNode失效就意味着HDFS的失效。爲緩解這個問題,Hadoop實現了SecondaryNameNode,但SecondaryNameNode不是一個“熱備的NameNode”。它不能在NameNode失效後取代其功能,它爲主NameNode提供檢查點機制。除保存HDFS NameNode 的狀態外,它還在磁盤上維護用於持久化存儲當前文件系統狀態的兩個數據結構;這兩個數據結構分別是一個鏡像文件和一個編輯日誌。鏡像文件代表 HDFS 元數據在某個時間點的狀態,在一個名爲FsImage的文件中;而編輯日誌是一個事務日誌(與數據庫體系結構中的日誌相比),紀錄了自鏡像文件創建之後文件系統元數據的每一次更改,該日誌保存在NameNode本地文件系統上的EditLog文件中。當主NameNode失效後,有部分元數據(以及對應的內容數據)會丟失,因爲保存在編輯日誌中的最新狀態是不可用的,所有當主NameNode失效後是不能從SecondaryNameNode完全恢復主NameNode失效前的狀態。

1.3、機架感知策略

機架是存儲在單一位置的節點的實體集合.,一個大型的HDFS 實例在計算機集羣上運行時,通常需要跨越多個機架,同一個機架上的機器節點之間的網絡帶寬比不同機架上的機器節點之間的網絡帶寬大,NameNode節點通過Hadoop的機架感知過程決定了每一個DataNode 所屬的機架的ID,機架感知策略的一個優化方案就是減輕機架之間的寫操作負載,爲了最小化整體的帶寬消耗和數據讀取延遲,HDFS嘗試讓有讀請求的客戶端從最近的地方讀取複製塊。每一個DataNode節點會週期性的發送心跳信息給NameNode節點(如上圖),如果DataNode節點失效, NameNode 將會通過不正常的心跳信息檢測到。 NameNode如果規定時間內沒有收到 DataNodes的心跳信息,就認爲該DataNode節點已經失效,並不再發送任何的I/O請求給它們,和現在已有大部分的文件系統類似,HDFS 也支持傳統分層的文件組織方式。

1.4、HDFS Federation 及高可用

爲克服單個NameNode內存的限制,HDFS Federation是爲了緩解HDFS的單點故障問題而提出的NameNode水平擴展方案,HDFS Federation 基於多個獨立的NameNodes/Namespace。
● HDFS Federation的優勢:

1、命名空間的可擴展性: HDFS 集羣的存儲空間可以橫向擴展,但Namespace不可以;

2、性能: 文件操作的性能侷限於單個Namenode的吞吐量;
3、隔離性: 單個 NameNode 節點不提供多個環境配置之間的隔離性。

HDFS Federation是基於獨立的NameNode節點集合設計的,因此各NameNode節點之間不需相互協調.

這裏寫圖片描述

該圖展示了HDFS Federation的實現結構,namespace 作爲數據塊池,可以對數據塊集合操作,每一個數據塊池都各自獨立,這就允許命名空間在爲一個新的數據塊分配ID時,不需要與其它命名空間進行協調。單個 NameNode節點的失效不會對集羣中爲其它NameNode服務的Datanode節點產生影響,當某個NameNode/namespace被刪除,那對應的DataNode節點上的數據塊池也會被刪除,HDFS Federation 配置是後向兼容的,允許已經存在的單個NameNode節點不做任何改變繼續工作。

這裏寫圖片描述

如圖所示展示了新的HDFS高可用架構,其中包含2臺獨立的配置爲NameNodes的機器,其中一臺必須時刻處於激活狀態,活動狀態的NameNode節點負責集羣中所有的客戶端操作,爲了保證這兩臺機器的狀態同步,需要兩個節點對共同的存儲設備享有同樣的目錄訪問權利 。

1.5、HDFS的fs shell操作命令

HDFS作爲一個分佈式文件系統和Linux的文件系統一樣,也具有類似的命令行接口,所有的命令都由 bin/hadoop 腳本引發,若不指定參數運行 Hadoop 腳本會打印所有命令的描述。

通用語法:

hadoop [–config confidir] COMMAND

–config confidir 覆蓋默認配置目錄,

默認使用的配置是 $HADOOPHOME/conf 。

查看幫助信息命令:$HADOOPHOME/bin/hadoop fs –help

HDFS資源URI格式:scheme://authority/path

scheme:協議名,file或hdfs

authority:namenode主機名

path:路徑

示例:hdfs://master:9000/user/chunk/input.txt

前提是已經在core-site.xml裏配置了fs.default.name=hdfs://master:9000,則僅使用/user/chunk/input.txt即可。

hdfs默認工作目錄爲/user/USER USER是當前的登錄用戶名。

具體的 HDFS fs shell 常用命令:

1、cat

命令格式:hadoop fs -cat URI URI … 將路徑指定文件的內容輸出到stdout。

例如:hadoop fs -cat hdfs://master:port/file1

hadoop fs -cat file:///data/port-00000

成功返回0,失敗返回-1。

2、ls
命令格式:hadoop fs -ls <args>
如果是文件,則按照如下格式返回文件信息:文件名 <副本數> 文件大小 修改日期 修改時間 權限 用戶ID 組ID 
如果是目錄,則返回它直接子文件的一個列表,就像在Unix中一樣。目錄返回列表的信息:目錄名 <dir> 修改日期 修改時間 權限 用戶ID 組ID 

3、chgrp
命令格式:hadoop fs -chgrp -R GROUP URI URI … 

改變文件所屬的組。使用-R將使改變在目錄結構下遞歸進行。命令的使用者必須是文件的所有者或者超級用戶。

4、chmod
命令格式:hadoop fs -chmod -R <MODE,MODE… | OCTALMODE> URI URI …
改變文件的權限。使用-R將使改變在目錄結構下遞歸進行。命令的使用者必須是文件的所有者或者超級用戶。

5、chown
命令格式:hadoop fs -chown -R OWNER:[GROUP] URI URI 
改變文件的擁有者。使用-R將使改變在目錄結構下遞歸進行。命令的使用者必須是超級用戶。

6、copyFromLocal
命令格式:hadoop fs -copyFromLocal <localsrc> URI
除了限定源路徑是一個本地文件外,和put命令相似。
7、copyToLocal
命令格式:hadoop fs -copyToLocal -ignorecrc -crc URI <localdst>
除了限定目標路徑是一個本地文件外,和get命令類似。
8、cp
命令格式:hadoop fs -cp URI URI … <dest>
將文件從源路徑複製到目標路徑。這個命令允許有多個源路徑,此時目標路徑必須是一個目錄。

例如:hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
返回值:成功返回0,失敗返回-1。

9、du
命令格式:hadoop fs -du URI URI …
顯示目錄中所有文件的大小,或者當只指定一個文件時,顯示此文件的大小。

返回值:成功返回0,失敗返回-1。

10、expunge
命令格式:hadoop fs -expunge
清空回收站。

11、get
命令格式:hadoop fs -get -ignorecrc -crc <src> <localdst> 
複製文件到本地文件系統。可用-ignorecrc選項複製CRC校驗失敗的文件。使用-crc選項複製文件以及CRC信息。

12、put
使用方法:hadoop fs -put <localsrc> … <dst>
從本地文件系統中複製單個或多個源路徑到目標文件系統。也支持從標準輸入中讀取輸入寫入目標文件系統。

13、getmerge(合併多個文件下載到本地)
命令格式:hadoop fs -getmerge <src> <localdst> addnl
接受一個源目錄和一個目標文件作爲輸入,並且將源目錄中所有的文件連接成本地目標文件。addnl是可選的,用於指定在每個文件結尾添加一個換行符。

14、mkdir
命令格式:hadoop fs -mkdir <paths> 
接受路徑指定的uri作爲參數,創建這些目錄。其行爲類似於Unix的mkdir -p,它會創建路徑中的各級父目錄。

15、mv
命令格式:hadoop fs -mv URI URI … <dest>
將文件從源路徑移動到目標路徑。這個命令允許有多個源路徑,此時目標路徑必須是一個目錄。不允許在不同的文件系統間移動文件。

16、rm
命令格式:hadoop fs -rm URI URI …
刪除指定的文件。只刪除非空目錄和文件。請參考rmr命令瞭解遞歸刪除。

rmr
命令格式:hadoop fs -rmr URI URI …
delete的遞歸版本。
17、touchz
命令格式:hadoop fs -touchz URI URI … 
創建一個0字節的空文件。

二、HBase

爲了克服諸多侷限,Hadoop以HBase的形式引入了一個更加靈活的數據存儲和訪問模型。HBase是一個分佈式的、版 本化的、面向列的、多維度 的存儲系統,在設計上具備高性能和高可用性。

2.1、HBase架構

HBase是Google BigTable架構的開源實現。與傳統的關係型數據庫管理系統類似,Hbase中也是以表的形式組織數據。HBase 支持非常鬆散的結構定義,但不支持任何表連接joins、查詢語言或 SQL操作,HBase主要是在大稀疏表上做Create, Read, Update, and Delete (CRUD) 操作。大多數基於HBase的實現都在使用高度非結構化數據,與HDFS相似,HBase 也是以 master-slave 結構實現。HBase 利用 HDFS 來持久化數據存儲,這意味着 HBase 具有 HDFS 提供的很多優勢,包括校驗,數據複製,和容錯。

HBase數據管理由分佈式的域服務器(region Server)實現,域服務器由HBase主控服務器 (HMaster)進行管理,該圖是HBase的架構圖。

<img src="Screen%20Shot%202016-05-23%20at%208.14.47%20AM.png"/>

region server的實現主要包含以下組件:

memstore 是 HBase內存中數據的緩存實現,它通過直接從內存提供儘可能多的數據來提升HBase的整體性能;HFile是HBase專用的HDFS文件格式,域服務器中的HFile的實現主要負責從HDFS讀取 HFile,以及將HFile寫入HDFS。 • 爲了保存任意長度的表, HBase 將表格劃分成域(regions), 每個域中包含已排序(根據主鍵)的,範 圍連續的行。regions 的切分方式不取決於key space, 而是取決於數據量,當向表中插入一條新紀錄時, HBase 決定(基於鍵值)該記錄應該分配到哪個 region server 並在該域插入那條記錄,如果 region的大小超出了預先定義的值,那麼它會自動分裂,當一條記錄(或一個記錄集合) 被讀取/更新, HBase 會決定哪個regions 應該存儲該記錄,並指引 客戶端去訪問合適的那個region。

下圖展示了HBase 利用特殊的表設計來解決region server中特殊的key-table pair的存儲問題。

<img src="Screen%20Shot%202016-05-23%20at%208.21.27%20AM.png"/>

2.2、HBase結構設計

設計 HBase 的表結構時, 應該考慮如下幾個方面:

• Get 或 Scan操作是基於行鍵(row key)的;
• 列族名會顯式地與每個列名保存在一起;
• 在高而窄和扁而寬的設計之間進行選擇時,推薦使用前者;
• 設計的主要優勢之一是在多臺域服務器之間分佈式地執行請求;

以下是一些特殊的行鍵設計模式:
•鍵“鹽化(salting)”—這意味着爲順序鍵添加一個隨機值前綴,允許將順序鍵“分桶”到多個域中;
•鍵字段的交換/提升(例如“反轉域名”) ;
•鍵的完全隨機化 。

2.3、HBase的shell常用命令

1、whoami

這個不多說,都懂。

2、對錶的管理

1)list

查看都有哪些表存在;

2)創建表

語法:create <table>, NAME => <family>, VERSIONS => <VERSIONS>

例如:創建表t1,有兩個family name:f1,f2,且版本數均爲3

create 't1',NAME => 'f1', VERSIONS => 2,NAME => 'f2', VERSIONS => 2

3)刪除表

兩步走,首先disable,再drop掉;

4)查看錶的結構

語法:describe <table>

5)修改表結構

修改表結構必須先disable,修改後再enable回來就OK了;

語法:alter 't1', NAME => 'f1', NAME => 'f2', METHOD => 'delete'

3、權限管理

1)查看權限

語法:userpermission <table>

2)分配權限

語法 : grant <user> <permissions> <table> <column family> <column qualifier> 參數後使用逗號分隔

權限用五個字母表示: "RWXCA”,READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')

例如,給用戶‘test'分配對錶t1有讀寫的權限,grant 'test','RW','t1'

3)回收權限

語法:revoke <user> <table> <column family> <column qualifier>

例如,收回test用戶在表t1上的權限,hbase(main)> revoke 'test','t1'

4、表數據的增刪改查

1)添加數據

語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>

例如:給表t1的添加一行記錄:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系統默認

put 't1','rowkey001','f1:col1','value01'

2)查詢數據
a)查詢某行記錄

語法:get <table>,<rowkey>,<family:column>,….

例如:查詢表t1,rowkey001中的f1下的col1的值

get 't1','rowkey001', 'f1:col1'

或者:

get 't1','rowkey001', COLUMN=>'f1:col1'

查詢表t1,rowke002中的f1下的所有列值

get 't1','rowkey001'

b)掃描表

語法:scan <table>, COLUMNS => <family:column>,…. , LIMIT => num

例如:掃描表t1的前5條數據

hbase(main)> scan 't1',LIMIT=>5

c)查詢表中的數據行數

語法:count <table>, INTERVAL => intervalNum, CACHE => cacheNum

INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提高查詢速度

例如,查詢表t1中的行數,每100條顯示一次,緩存區爲500

count 't1', INTERVAL => 100, CACHE => 500

3)刪除數據
a )刪除行中的某個列值

語法:delete <table>, <rowkey>,  <family:column> , <timestamp>,必須指定列名

例如:刪除表t1,rowkey001中的f1:col1的數據

delete 't1','rowkey001','f1:col1'

注:將刪除改行f1:col1列所有版本的數據
b )刪除行

語法:deleteall <table>, <rowkey>,  <family:column> , <timestamp>,可以不指定列名,刪除整行數據

例如:刪除表t1,rowk001的數據

deleteall 't1','rowkey001'

c)刪除表中的所有數據

語法: truncate <table>

其具體過程是:disable table -> drop table -> create table

例如:刪除表t1的所有數據

truncate 't1'

三、HDFS 和 HBase 的結合

HDFS 採用順序讀取方式訪問數據,並具有海量數據的存儲能力,然而Hbase則以數據的快速隨機訪問能力見長,HBase 並不適用於非常大的數據量。HDFS 通過MapFiles文件類型提供了快速訪問特殊文件類型的機制,然而並不能隨着key的數
量增長得到比較好的擴展。結合HDFS和Hbase各種的優勢可以解決這些類型的問題,解決的方法是創建一個包含大量數據條目的SequenceFile,HDFS 和 HBase 都將數據視爲二進制流, 這意味着藉助於這些存儲機制實現的大部分應用程序必須使用某種形式的二進制封裝,一種這樣的封裝機制是 Apache Avro。

四、選擇合適的Hadoop數據組織方式

在Hadoop中,所有應用程序設計的重要一環是選擇合適的數據存儲方式,我們來討論一些情境:
數據只被 MapReduce模型訪問時:

•如果數據只被MapReduce模型實現的應用程序訪問, HDFS 是最佳方案;

•至於文件格式, SequenceFiles 是採用MapReduce 模型處理的最佳選項;

• 應用程序的實際分區模式取決於數據的使用模式;
• 通用的方法是評估數據計算請求的數量設計合適的分區模式。

當新數據產生時:

•如果數據的計算結果需要更新時,那麼應該考慮一種新的數據存儲設計方案;

•Hadoop唯一支持更新存儲機制的組件是Hbase;

•所以,如果MapReduce 計算結果需要更新數據,HBase就是你數據存儲的最好方案。

當數據量超級大時:

•當數據量超級大時,HBase 並不是最好的選擇;
•這種情況下, 典型的解決方案是 HBase/HDFS 結合使用;
•HDFS 存儲實際的數據, HBase 負責存儲數據的索引文件。

實時訪問數據時:

如果要對數據進行實時訪問, 根據數據量的大小, Hadoop 提供了幾種解決方案;如果數據的 key space 相對較小而且數據不經常改變, SequenceFiles 是一個非常不錯的選擇。對於較大 key spaces 和有數據更新需求的情況, HBase 或者 HBase/HDFS 聯合使用是很合適的解決方案,選擇合適的數據存儲方案時,安全性也是必須要考慮的方面。不管是 HDFS 還是 HBase 都需要應用級或特定的企業級解決方案來確保數據的安全性。

例如,下面這些方法可能會被經常用到:

• 數據加密;

• 定製防火牆 ;

• 定製服務層 。

注:版權歸作者所有,轉載請標明來源。

參考資料:《Hadoop高級編程》

網易雲課堂大數據微專業

《Hadoop核心技術》

《Hadoop權威指南》

HBase shell操作參考鏈接:http://www.cnblogs.com/nexiyi/p/hbase_shell.html

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