HBase是一個高可靠性、高效能、面向列、可伸縮的分散式儲存系統,同時也是知名的NoSQL資料庫之一。NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用的難題。
本文對NoSQL資料庫的定義、分類、特徵、當前比較流行的NoSQL資料庫系統等進行了簡單的介紹,並對NoSQL和SQL語法進行了簡單的比較,為大家對NoSQL資料庫的學習提供了有益的參考。
一、NoSQL的出現
關係型資料庫系統多年來在解決資料儲存、服務和處理問題方面取得了巨大的成功。一些大型的公司使用關係型資料庫建立了自己的系統,如聯機事務處理系統和後端分析應用系統。聯機事務處理(OLTP)系統用來實時記錄交易資訊。對這類系統的期望是能夠快速返回響應資訊(一般在毫秒級)。聯機分析處理(OLAP)系統用來分析查詢所儲存的資料。OLAP屬於商業智慧的範疇,資料需要研究、處理和分析,以便收集資訊,進一步驅動商業決策。
關係型資料庫的內部設計由關係演算法決定,這些系統需要預先定義一個模式(schema)和資料要遵守的型別。SQL是與這些系統互動的標準方式。但在物件-關係不匹配問題出現的場合,SQL就不是表達訪問模式的最好方式了。例如目前炙手可熱的大資料領域,關係型資料庫不能很好地工作。
有關大資料常見定義包括:第一,大資料意味著資料足夠大,為了從這些資料中獲得一些真知灼見,你不得不研究它;第二,大資料就是不再適用於單臺機器的資料。這些觀點並不完整,我們需要用一種根本上不同的方式來考慮資料,從如何驅動商業價值的角度來考慮資料,這種資料就是大資料。
在大資料領域中,系統需要能夠適應不同種類的資料格式和資料來源,不需要預先嚴格定義模式,並且能夠處理大規模資料。這樣,NoSQL就出現了。
二、NoSQL的定義
NoSQL(NoSQL= Not Only SQL ),意即“不僅僅是SQL”,是一項全新的資料庫革命性運動。NoSQL的擁護者們提倡運用非關係型的資料儲存。大多數資料庫技術不能保證支援ACID(原子性、一致性、隔離性和永續性),而且大部分技術都是開源專案,這些技術作為整體被稱為NoSQL。
三、NoSQL的分類
一般將NoSQL資料庫分為四大類:鍵值(Key-Value)儲存資料庫、列儲存資料庫、文件型資料庫和圖形(Graph)資料庫。它們的資料模型、優缺點、典型應用場景如表1所示。
表1 四大NoSQL資料庫分析
分類 | 資料模型 | 優點 | 缺點 | 典型應用場景 |
鍵值(Key-Value)儲存資料庫 | Key指向Value的鍵值對,通常用hash表來實現 | 查詢速度快 | 資料無結構化(通常只被當作字串或者二進位制資料) | 內容快取,主要用於處理大量資料的高訪問負載,也用於一些日誌系統等 |
列儲存資料庫 | 以列簇式儲存,將同一列資料存在一起 | 查詢速度快,可擴充套件性強,更容易進行分散式擴充套件 | 功能相對侷限 | 分散式的檔案系統 |
文件型資料庫 | Key-Value對應的鍵值對,Value為結構化資料 | 資料結構要求不嚴格,表結構可變(不需要像關係型資料庫一樣需預先定義表結構) | 查詢效能不高,而且缺乏統一的查詢語法 | Web應用 |
圖形(Graph)資料庫 | 圖結構 | 利用圖結構相關演算法(如最短路徑定址,N度關係查詢等) | 很多時候需要對整個圖做計算才能得出需要的資訊,而且這種結構不太好做分散式的叢集方案 | 社交網路,推薦系統等 |
四、NoSQL的特徵
NoSQL資料庫並沒有一個統一的架構,但是它們都普遍存在表2所示的一些共同特徵。
表2 NoSQL的特徵
特徵 | 描述 |
不需要預定義模式 | 不需事先定義資料模式,預定義表結構等。資料中每條記錄都可能有不同的屬性和格式 |
無共享架構 | NoSQL往往將資料劃分後儲存在各個本地伺服器上,從而提高了系統的效能 |
彈性可擴充套件 | 可以在系統執行的時候,動態增加或者刪除結點。不需要停機維護,資料可以自動遷移 |
分割槽 | NoSQL資料庫將資料進行分割槽,將記錄分散在多個節點上面,並且通常分割槽的同時還要做複製 |
非同步複製 | NoSQL中的複製,往往是基於日誌的非同步複製。這樣,資料就可以儘快地寫入一個節點,而不會出現網路傳輸遲延 |
BASE | 相對於ACID特性,NoSQL資料庫保證的是BASE特性(BASE是最終一致性和軟事務) |
五、常見的NoSQL資料庫
比較適合採用NoSQL資料庫的場合是:(1)資料模型比較簡單;(2)需要靈活性更強的IT系統;(3)對資料庫效能要求較高;(4)不需要高度的資料一致性;(5)對於給定key,比較容易對映覆雜值的環境。
常見的NoSQL資料庫如表3所示。
表3常見的NoSQL資料庫
分類 | 例項 |
鍵值(Key-Value)儲存資料庫 | * Riak:一個開源、分散式鍵值資料庫,支援資料複製和容錯* Redis:一個開源的鍵值儲存資料庫,支援主從式複製、事務,Pub/Sub、Lua指令碼,還支援給Key新增時限* Dynamo:一個鍵值分散式儲存資料庫,直接由亞馬遜Dynamo資料庫實現
* Oracle NoSQL Database:來自Oracle的鍵值NoSQL資料庫,支援事務ACID和JSON * Oracle NoSQL Database:具備資料備份和分散式鍵值儲存系統 * Voldemort:具備資料備份和分散式鍵值儲存系統 * Aerospike:一個鍵值儲存資料庫,支援混合記憶體架構,通過強一致性和可調一致性保證資料的完整性 |
列儲存資料庫 | * Cassandra:支援跨資料中心的資料複製,提供列索引* HBase:一個開源、分散式、面向列儲存的模型* Amazon SimpleDB:一個非關係型資料儲存
* Apache Accumulo:有序的、分散式鍵值資料儲存,基於Google的BigTable設計 * Hypertable:一個開源、可擴充套件的資料庫,模仿Bigtable,支援分片 * Azure Tables:為要求大量非結構化資料儲存的應用提供NoSQL效能 |
文件型資料庫 | * MongoDB:開源、面向文件* CounchDB:一個使用JSON的文件資料庫,使用Javascript做MapReduce查詢,也是一個使用HTTP的API* Couchbase:基於JSON模型
* RavenDB:一個基於.net語言的面向文件資料庫 * MarkLogic:用來儲存基於XML和以文件為中心的資訊,支援靈活的模式 |
圖形(Graph)資料庫 | * Neo4j:一個圖資料庫,支援ACID事務* InfiniteGraph:用來維持和遍歷物件間的關係,支援分散式資料儲存* AllegroGraph:結合使用了記憶體和磁碟,提供了高可擴充套件性,支援SPARQ、RDFS++和Prolog推理 |
六、NoSQL和SQL語法的簡單比較
前面介紹了NoSQL的基本情況,下面以HBase和ORACLE為例,對NoSQL和SQL的語法進行簡單的比較。HBase資料庫被認為是安全特性最完善的NoSQL資料庫產品之一,它被證實是一個強大的工具,尤其是在已經使用Hadoop的場合。如今,它已經是Apache頂級專案,有著眾多的開發人員和興旺的使用者社群。
1.建立表
如果要建立一個表“mytable”,其中包含了一個“info”欄位,那麼:
(1)ORACLE中的語法為:
create table mytable
(
info varchar(30) not null
);
(2)HBase中的語法為:
create ‘mytable’, ‘cf’
該命令建立了一個有一個列族(“cf”)的表“mytable”。
2.寫資料
如果要向表中寫入資料“hello hbase”,那麼:
(1)ORACLE中的語法為:
insert into mytable(info) values(‘hello hbase’);
(2)HBase中的語法為:
put ‘mytable’, ‘first’, ‘cf:info’, ‘hello hbase’
該命令在“mytable”表的“first”行中的“cf:info”列對應的資料單元中插入“hello hbase”。
3.讀(查)資料
如果要從表中讀出單條資料,那麼:
(1)ORACLE中的語法為:
select * from mytable where info = ‘hello hbase’;
(2)HBase中的語法為:
get ‘mytable’, ‘first’
該命令輸出了該行的資料單元。
如果要從表中讀出所有資料,那麼:
(1)ORACLE中的語法為:
select * from mytable;
(2)HBase中的語法為:
scan ‘mytable’
該命令輸出了所有資料。
4.刪資料
如果要從表中刪除資料,那麼:
(1)ORACLE中的語法為:
delete from mytable where info = ‘hello hbase’;
(2)HBase中的語法為:
put ‘mytable’, ‘first’, ‘cf:info’, ‘hello hbase1’
該命令用最新的值覆蓋了舊的值,就相當於將原資料刪除了。
5.修改資料
如果要在表中修改資料,那麼:
(1)ORACLE中的語法為:
update mytable set info = ‘hello hbase1’ where info = ‘hellohbase’;
(2)HBase中的語法為:
put ‘mytable’, ‘first’, ‘cf:info’, ‘hello hbase1’
該命令用最新的值覆蓋了舊的值,就相當於修改了原資料。
6.刪表
如果要刪除表,那麼:
(1)ORACLE中的語法為:
drop table mytable;
(2)HBase中的語法為:
1 2 3 |
disable 'mytable' drop 'mytable' |
該命令先將表“disable”掉,然後再“drop”掉。
我們可以看到,HBase的語法比較的簡單,因此完全可以將上述所有命令放到一個shell指令碼中,讓命令批量執行。下面,我們來具體操作一下:
第一步,編寫名為“command.sh”的指令碼,其內容如下:
1 2 3 4 5 6 7 8 9 |
exec /root/zhouzx/hbase-1.0.1/bin/hbase shell <<EOF create 'mytable', 'cf' put 'mytable', 'first', 'cf:info', 'hello hbase' get 'mytable', 'first' scan 'mytable' put 'mytable', 'first', 'cf:info', 'hello hbase1' disable 'mytable' drop 'mytable' EOF |
第二步,將該指令碼上傳到Linux機器的安裝HBase的使用者下,依次執行“dos2unix command.sh”和“chmod 777command.sh”命令來轉換檔案格式和對檔案賦許可權。
第三步,執行“./command.sh”命令,在Linux介面上,我們可以看到如下輸出資訊:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
HBase Shell; enter 'help' for list of supportedcommands. Type "exit" to leave the HBase Shell Version 1.0.1, r66a93c09df3b12ff7b86c39bc8475c60e15af82d, Fri Apr17 22:14:06 PDT 2015 create 'mytable', 'cf' 0 row(s) in 0.6660 seconds Hbase::Table - mytable put 'mytable', 'first', 'cf:info', 'hello hbase' 0 row(s) in 0.1140 seconds get 'mytable', 'first' COLUMN CELL cf:info timestamp=1435807200326, value=hello hbase 1 row(s) in 0.0440 seconds scan 'mytable' ROW COLUMN+CELL first column=cf:info,timestamp=1435807200326, value=hello hbase 1 row(s) in 0.0210 seconds put 'mytable', 'first', 'cf:info', 'hello hbase1' 0 row(s) in 0.0040 seconds disable 'mytable' 0 row(s) in 1.1930 seconds drop 'mytable' 0 row(s) in 0.1940 seconds |
整個指令碼執行過程不過幾秒鐘,但我們之前提到的所有HBase命令都包括其中了,由此可見批處理的威力。大家一定要好好體會一下。
七、總結
本文對NoSQL進行了全面的介紹,並比較了它與SQL語法之間的不同。儘管大多數NoSQL資料儲存系統都已被部署到實際應用中,但仍存在以下挑戰性問題需要解決:
- 第一,已有key-value資料庫產品大多是面向特定應用自治構建的,缺乏通用性。
- 第二,已有產品支援的功能有限(不支援事務特性),導致其應用具有一定的侷限性。
- 第三,已有一些研究成果和改進的NoSQL資料儲存系統,但它們都是針對不同應用需求而提出的相應解決方案,很少從全域性考慮系統的通用性,也沒有形成系列化的研究成果。
- 第四,缺乏類似關聯式資料庫所具有的強有力的理論(如armstrong公理系統)、技術(如成熟的基於啟發式的優化策略、兩段封鎖協議等)、標準規範(如SQL語言)的支援。
- 第五,很多NoSQL資料庫沒有提供內建的安全機制。
隨著雲端計算、移動網際網路等技術的發展,大資料廣泛存在,同時也出現了許多雲環境下的新型應用,如社交網路、移動服務、協作編輯等。這些新型應用對海量資料管理或稱雲資料管理系統也提出了新的需求,NoSQL資料庫在這些方面有大展身手的機會。我們有理由相信,NoSQL資料庫的明天會更加的美好!