免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
HBase 基本入門篇

無論是 NoSQL,還是大數(shù)據(jù)領(lǐng)域,HBase 都是非常”炙熱”的一門數(shù)據(jù)庫。本文將對(duì) HBase 做一些基礎(chǔ)性的介紹,旨在入門。

一、簡介

HBase 是一個(gè)開源的、面向列的非關(guān)系型分布式數(shù)據(jù)庫,目前是Hadoop體系中非常關(guān)鍵的一部分。在最初,HBase是基于谷歌的 BigTable 原型實(shí)現(xiàn)的,許多技術(shù)來自于Fay Chang在2006年所撰寫的Google論文”BigTable”。與 BigTable基于Google文件系統(tǒng)(File System)一樣,HBase則是基于HDFS(Hadoop的分布式文件系統(tǒng))之上而開發(fā)的。

HBase 采用 Java 語言實(shí)現(xiàn),在其內(nèi)部實(shí)現(xiàn)了BigTable論文提到的一些壓縮算法、內(nèi)存操作和布隆過濾器等,這些能力使得HBase 在海量數(shù)據(jù)存儲(chǔ)、高性能讀寫場景中得到了大量應(yīng)用,如 Facebook 在 2010年11 月開始便一直選用 HBase來作為消息平臺(tái)的存儲(chǔ)層技術(shù)。HBase 以Apache License Version 2.0開源,這是一種對(duì)商業(yè)應(yīng)用友好的協(xié)議,同時(shí)該項(xiàng)目當(dāng)前也是Apache軟件基金會(huì)的頂級(jí)項(xiàng)目之一。

有什么特性

  • 基于列式存儲(chǔ)模型,對(duì)于數(shù)據(jù)實(shí)現(xiàn)了高度壓縮,節(jié)省存儲(chǔ)成本

  • 采用 LSM 機(jī)制而不是B( )樹,這使得HBase非常適合海量數(shù)據(jù)實(shí)時(shí)寫入的場景

  • 高可靠,一個(gè)數(shù)據(jù)會(huì)包含多個(gè)副本(默認(rèn)是3副本),這得益于HDFS的復(fù)制能力,由RegionServer提供自動(dòng)故障轉(zhuǎn)移的功能

  • 高擴(kuò)展,支持分片擴(kuò)展能力(基于Region),可實(shí)現(xiàn)自動(dòng)、數(shù)據(jù)均衡

  • 強(qiáng)一致性讀寫,數(shù)據(jù)的讀寫都針對(duì)主Region上進(jìn)行,屬于CP型的系統(tǒng)

  • 易操作,HBase提供了Java API、RestAPI/Thrift API等接口

  • 查詢優(yōu)化,采用Block Cache 和 布隆過濾器來支持海量數(shù)據(jù)的快速查找

與RDBMS的區(qū)別

對(duì)于傳統(tǒng) RDBMS 來說,支持 ACID 事務(wù)是數(shù)據(jù)庫的基本能力,而 HBase 則使用行級(jí)鎖來保證寫操作的原子性,但是不支持多行寫操作的事務(wù)性,這主要是從靈活性和擴(kuò)展性上做出的權(quán)衡。

ACID 要素包含 原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)以及持久性(Durability)

總體來說, HBase 與傳統(tǒng)關(guān)系數(shù)據(jù)庫的區(qū)別,如下表所示:

特性HBaseRDBMS
硬件架構(gòu)類似于 Hadoop 的分布式集群,硬件成本低廉傳統(tǒng)的多核系統(tǒng),硬件成本昂貴
容錯(cuò)性由軟件架構(gòu)實(shí)現(xiàn),由于由多個(gè)節(jié)點(diǎn)組成,所以不擔(dān)心一點(diǎn)或幾點(diǎn)宕機(jī)一般需要額外硬件設(shè)備實(shí)現(xiàn) HA 機(jī)制
數(shù)據(jù)庫大小PBGB、TB
數(shù)據(jù)排布方式稀疏的、分布的多維的 Map以行和列組織
數(shù)據(jù)類型Bytes豐富的數(shù)據(jù)類型
事物支持ACID 只支持單個(gè) Row 級(jí)別全面的 ACID 支持,對(duì) Row 和表
查詢語言只支持 Java API (除非與其他框架一起使用,如 Phoenix、Hive)SQL
索引只支持 Row-key,除非與其他技術(shù)一起應(yīng)用,如 Phoenix、Hive支持
吞吐量百萬查詢/每秒數(shù)千查詢/每秒

二、數(shù)據(jù)模型

下面,我們以關(guān)系型數(shù)據(jù)庫的一個(gè)數(shù)據(jù)表來演示 HBase 的不同之處。

先來看下面這張表:

ID設(shè)備名狀態(tài)時(shí)間戳
1空調(diào)打開20190712 10:05:01
2電視機(jī)關(guān)閉20190712 10:05:08

這里記錄的是一些家庭設(shè)備上報(bào)的狀態(tài)數(shù)據(jù)(DeviceState),其中包括設(shè)備名、狀態(tài)、時(shí)間戳這些字段。

在 HBase 中,數(shù)據(jù)是按照列族(Column Family,簡稱CF)來存儲(chǔ)的,也就是說對(duì)于不同的列會(huì)被分開存儲(chǔ)到不同的文件。那么對(duì)于上面的狀態(tài)數(shù)據(jù)表來說,在HBase中會(huì)被存儲(chǔ)為兩份:

列族1. 設(shè)備名

Row-KeyCF:Column-KeyTimestampCell Value
1DeviceState:設(shè)備名20190712 10:05:01空調(diào)
2DeviceState:設(shè)備名20190712 10:05:08電視機(jī)

列族2. 狀態(tài)

Row-KeyCF:Column-KeyTimestampCell Value
1DeviceState:狀態(tài)20190712 10:05:01打開
2DeviceState:狀態(tài)20190712 10:05:08關(guān)閉

這里Row-key是唯一定位數(shù)據(jù)行的ID字段,而Row-key 加上 CF、Column-Key,再加上一個(gè)時(shí)間戳才可以定位到一個(gè)單元格數(shù)據(jù)。其中時(shí)間戳用來表示數(shù)據(jù)行的版本, 在HBase中默認(rèn)會(huì)有 3 個(gè)時(shí)間戳的版本數(shù)據(jù),這意味著對(duì)同一條數(shù)據(jù)(同一個(gè)Rowkey關(guān)聯(lián)的數(shù)據(jù))進(jìn)行寫入時(shí),最多可以保存3個(gè)版本。

在查詢某一行的數(shù)據(jù)時(shí),HBase需要同時(shí)從兩個(gè)列族(文件)中進(jìn)行查找,最終將結(jié)果合并后返回給客戶端。 由此可見如果列族太多,則會(huì)影響讀取的性能,在設(shè)計(jì)時(shí)就需要做一些權(quán)衡。

由此可見,HBase的使用方式與關(guān)系型數(shù)據(jù)庫是大不相同的,在使用 HBase 時(shí)需要拋棄許多關(guān)系型數(shù)據(jù)庫的思維及做法,比如強(qiáng)類型、二級(jí)索引、表連接、觸發(fā)器等等。

然而 HBase 的靈活性及高度可伸縮性卻是傳統(tǒng) RDBMS 無法比擬的。

三、安裝HBase

單機(jī)環(huán)境安裝

1. 準(zhǔn)備JDK環(huán)境

確保環(huán)境上JDK已經(jīng)裝好,可執(zhí)行java -version確認(rèn):

host:/home/hbase # java -versionopenjdk version "1.8.0_201"OpenJDKRuntimeEnvironment(build 1.8.0_201-Huawei_JDK_V100R001C00SPC060B003-b10)OpenJDK64-BitServer VM (build 25.201-b10, mixed mode)

2. 下載軟件

官網(wǎng)的下載地址頁面:

http://archive.apache.org/dist/hbase/

選擇合適的版本,比如1.4.10。 下載后解壓:

wget http://archive.apache.org/dist/hbase/2.1.5/hbase-2.1.5-bin.tar.gztar -xzvf hbase-2.1.5-bin.tar.gzmkdir -p /opt/localmv hbase-2.1.5/opt/local/hbase

配置HBase執(zhí)行命令路徑:

export HBASE_HOME=/opt/local/hbaseexport PATH=$PATH:$HBASE_HOME/bin

3. 配置軟件

vim conf/hbase-env.sh

#JDK安裝目錄export JAVA_HOME=/usr/local/jre1.8.0_201#配置hbase自己管理zookeeperexport HBASE_MANAGES_ZK=true

vim conf/hbase-site.xml

<configuration><!-- zookeeper端口  --><property><name>hbase.zookeeper.property.clientPort</name><value>2182</value>                                                                                                                                           </property><!--  HBase 數(shù)據(jù)存儲(chǔ)目錄 --><property><name>hbase.rootdir</name><value>file:///opt/local/hbase/data</value></property><!-- 用于指定 ZooKeeper 數(shù)據(jù)存儲(chǔ)目錄 --><property><name>hbase.zookeeper.property.dataDir</name><value>/opt/local/hbase/data/zookeeper</value></property><!-- 用于指定臨時(shí)數(shù)據(jù)存儲(chǔ)目錄 --><property><name>hbase.tmp.dir</name><value>/opt/local/hbase/temp/hbase-${user.name}</value></property></configuration>

其中 hbase.rootdir 和 hbase.zookeeper.property.dataDir 都用來指定數(shù)據(jù)存放的目錄,默認(rèn)情況下hbase會(huì)使用/tmp目錄,這顯然是不合適的。配置了這兩個(gè)路徑之后,hbase會(huì)自動(dòng)創(chuàng)建相應(yīng)的目錄。

關(guān)于更多的參數(shù)設(shè)定可參考這里

4. 啟動(dòng)軟件

start-hbase.sh

此時(shí)查看 logs/hbase-root-master-host-xxx.log,如下:

2019-07-1107:37:23,654 INFO  [localhost:33539.activeMasterManager] hbase.MetaMigrationConvertingToPB: hbase:meta doesn't have any entries to update.2019-07-11 07:37:23,654 INFO  [localhost:33539.activeMasterManager] hbase.MetaMigrationConvertingToPB: META already up-to date with PB serialization2019-07-11 07:37:23,664 INFO  [localhost:33539.activeMasterManager] master.AssignmentManager: Clean cluster startup. Assigning user regions2019-07-11 07:37:23,665 INFO  [localhost:33539.activeMasterManager] master.AssignmentManager: Joined the cluster in 11ms, failover=false2019-07-11 07:37:23,672 INFO  [localhost:33539.activeMasterManager] master.TableNamespaceManager: Namespace table not found. Creating...

檢查進(jìn)程情況,發(fā)現(xiàn)進(jìn)程已經(jīng)啟動(dòng)

ps -ef |grep hadooproot     1104911032207:37 pts/100:00:20/usr/local/jre1.8.0_201/bin/java -Dproc_master-XX:OnOutOfMemoryError=kill -9%p -XX: UseConcMarkSweepGC-XX:PermSize=128m-XX:MaxPermSize=128m-XX:ReservedCodeCacheSize=256m-Dhbase.log.dir=/opt/local/hbase/logs -Dhbase.log.file=hbase-root-master-host-192-168-138-148.log-Dhbase.home.dir=/opt/local/hbase -Dhbase.id.str=root -Dhbase.root.logger=INFO,RFA -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.master.HMaster startroot     1890730747007:50 pts/100:00:00 grep --color=auto hadoop

通過JPS(JDK自帶的檢查工具) 可以看到當(dāng)前啟動(dòng)的Java進(jìn)程:

# jps5701Jps4826HMaster1311 jar

查看 data目錄,發(fā)現(xiàn)生成了對(duì)應(yīng)的文件:

host:/opt/local/hbase/data # ls -lh .total 36Kdrwx------. 4 root root 4.0KJul1108:08 datadrwx------. 4 root root 4.0KJul1108:08 hbase-rw-r--r--. 1 root root   42Jul1108:08 hbase.id-rw-r--r--. 1 root root    7Jul1108:08 hbase.versiondrwx------. 2 root root 4.0KJul1108:08MasterProcWALsdrwx------. 2 root root 4.0KJul1108:08 oldWALsdrwx------. 3 root root 4.0KJul1108:08.tmpdrwx------. 3 root root 4.0KJul1108:08WALsdrwx------. 3 root root 4.0KJul1108:08 zookeeper

關(guān)于運(yùn)行模式

HBase啟動(dòng)時(shí)默認(rèn)會(huì)使用單機(jī)模式,此時(shí) Zookeeper和 HMaster/RegionServer 會(huì)運(yùn)行在同一個(gè)JVM中。以standalone模式啟動(dòng)的HBase會(huì)包含一個(gè)HMaster、RegionServer、Zookeeper實(shí)例,此時(shí) HBase 會(huì)直接使用本地文件系統(tǒng)而不是HDFS。

通過將 conf/hbase-site.xml中的 hbase.cluster.distributed 配置為true,就是集群模式了。在這個(gè)模式下,你可以使用分布式環(huán)境進(jìn)行部署,或者是”偽分布式”的多進(jìn)程環(huán)境。

<configuration><property><name>hbase.cluster.distributed</name><value>true</value></property></configuration>

需要注意的是,如果以standalone啟動(dòng)的話,HMaster、RegionServer端口都是隨機(jī)的,無法通過配置文件指定。

四、基本使用

打開HBase Shell

hbase shell

執(zhí)行status命令

Version2.1.5, r76ab087819fe82ccf6f531096e18ad1bed079651, WedJun516:48:11 PDT 2019
hbase(main):001:0> status1 active master, 0 backup masters, 1 servers, 0 dead, 2.0000 average load

這表示有一個(gè)Master在運(yùn)行,一個(gè)RegionServer,每個(gè)RegionServer包含2個(gè)Region。

表操作

  • 創(chuàng)建DeviceState表

hbase(main):002:0> create "DeviceState", "name:c1", "state:c2"
=> Hbase::Table- DeviceState

此時(shí),已經(jīng)創(chuàng)建了一個(gè)DeviceState表,包含name(設(shè)備名稱)、state(狀態(tài))兩個(gè)列。

查看表信息

hbase(main):003:0> listTABLEDeviceState1 row(s) in0.0090 seconds
=> ["DeviceState"]
hbase(main):003:0> describe "DeviceState"TableDeviceStateis ENABLEDDeviceStateCOLUMN FAMILIES DESCRIPTION{NAME => 'name', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}{NAME => 'state', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}2 row(s) in0.0870 seconds
  • 寫入數(shù)據(jù)

通過下面的命令,向DeviceState寫入兩條記錄。

由于有兩個(gè)列族,因此需要寫入四個(gè)單元格數(shù)據(jù):

put "DeviceState", "row1", "name", "空調(diào)"put "DeviceState", "row1", "state", "打開"put "DeviceState", "row2", "name", "電視機(jī)"put "DeviceState", "row2", "state", "關(guān)閉"
  • 查詢數(shù)據(jù)

查詢某行、某列

hbase(main):012:0> get"DeviceState","row1"COLUMN                                      CELL name:                                      timestamp=1562834473008, value=\xE7\x94\xB5\xE8\xA7\x86\xE6\x9C\xBA state:                                     timestamp=1562834474630, value=\xE5\x85\xB3\xE9\x97\xAD1 row(s) in0.0230 seconds
hbase(main):013:0> get"DeviceState","row1", "name"COLUMN                                      CELL name:                                      timestamp=1562834473008, value=\xE7\x94\xB5\xE8\xA7\x86\xE6\x9C\xBA1 row(s) in0.0200 seconds

掃描表

hbase(main):026:0> scan "DeviceState"ROW                                         COLUMN CELL row1                                       column=name:, timestamp=1562834999374, value=\xE7\xA9\xBA\xE8\xB0\x83 row1                                       column=state:, timestamp=1562834999421, value=\xE6\x89\x93\xE5\xBC\x80 row2                                       column=name:, timestamp=1562834999452, value=\xE7\x94\xB5\xE8\xA7\x86\xE6\x9C\xBA row2                                       column=state:, timestamp=1562835001064, value=\xE5\x85\xB3\xE9\x97\xAD2 row(s) in0.0250 seconds

查詢數(shù)量

hbase(main):014:0> count "DeviceState"2 row(s) in0.0370 seconds
=> 1
  • 清除數(shù)據(jù)

刪除某列、某行

delete"DeviceState", "row1", "name"0 row(s) in0.0080 seconds
hbase(main):003:0> deleteall "DeviceState", "row2"0 row(s) in0.1290 seconds

清空整個(gè)表數(shù)據(jù)

hbase(main):021:0> truncate "DeviceState"Truncating'DeviceState' table (it may take a while):- Disabling table...- Truncating table...0 row(s) in3.5060 seconds

刪除表(需要先disable)

hbase(main):006:0> disable "DeviceState"0 row(s) in2.2690 seconds
hbase(main):007:0> drop "DeviceState"0 row(s) in1.2880 seconds

五、FAQ

  • A. 啟動(dòng)時(shí)提示 ZK 端口監(jiān)聽失敗:Could not start ZK at requested port of 2181. ZK was started at port: 2182. Aborting as clients (e.g. shell) will not be able to find this ZK quorum

原因

HBase需要啟動(dòng)Zookeeper,而本地的2181端口已經(jīng)被啟用(可能有其他Zookeeper實(shí)例)

解決辦法

conf/hbase-site.xml中修改hbase.zookeeper.property.clientPort的值,將其修改為2182,:

<configuration><property><name>hbase.zookeeper.property.clientPort</name><value>2182</value>                                                                                                                                           </property></configuration>
  • B. 啟動(dòng)HBase Shell 時(shí)提示java.lang.UnsatisfiedLinkError

原因

在執(zhí)行hbase shell期間,JRuby會(huì)在“java.io.tmpdir”路徑下創(chuàng)建一個(gè)臨時(shí)文件,該路徑的默認(rèn)值為“/tmp”。如果為“/tmp”目錄設(shè)置NOEXEC權(quán)限,然后hbase shell會(huì)啟動(dòng)失敗并拋出“java.lang.UnsatisfiedLinkError”錯(cuò)誤。

解決辦法

  1. 取消/tmp的noexec權(quán)限(不推薦)

  2. 設(shè)置java.io.tmpdir變量,指向可用的路徑,編輯conf/hbase-env.sh文件:

export HBASE_TMP_DIR=/opt/local/hbase/tempexport HBASE_OPTS="-XX: UseConcMarkSweepGC -Djava.io.tmpdir=$HBASE_TMP_DIR"

本文公眾號(hào)來源:美碼師
作者:美碼師

來源:https://www.icode9.com/content-4-585151.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)??戳诉@個(gè),就不用
[一起學(xué)Hive]之十三
HBase 深入淺出 – IBM Developer
HBase下的MapReduce應(yīng)用實(shí)例
如何在 HBase Shell 命令行正常查看十六進(jìn)制編碼的中文?哈哈~
搭建HBase+thrift+php環(huán)境
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服