您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“HBase物理結(jié)構(gòu)有哪些”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
RowKey第一位 ColumnFamily ColumnQuiauer value(TimeStamps) Cell
管理節(jié)點(diǎn),用于管理HBase中的Table和Region的結(jié)構(gòu)操作,比如用戶增、刪、修改表的操作。 在HBase集群中,可以啟動多個HMaster,但是只能有一個HMaster屬于Active的狀態(tài),通過ZooKeeper和其它standby狀態(tài)的HMaster進(jìn)程完成,一個狀態(tài)的切換,或者選舉。 我們可以使用HMaster的shutdown放關(guān)閉整個集群,在關(guān)閉整個集群的時候,需要向通知HRegionServer進(jìn)行關(guān)閉,并反饋給HMaster,HMaster才自行關(guān)閉。
存放Region的服務(wù)器,需要在HMaster進(jìn)行注冊,如此才能在HMaster中對其進(jìn)行管理,在HBase集群中,可以部署多個HRegionServer
存儲的是一張表的一個特定的Region數(shù)據(jù),包含了一部分行的所有的列,region通過table和對應(yīng)行健rowkey來定義,在region級別 添加一個鎖的唯一的目的,就是擋在執(zhí)行其它操作的時候,阻止region被關(guān)閉,以及split。每一行的操作,都需要在執(zhí)行過程中獲得一個row所和region的讀鎖。
存放hbase中數(shù)據(jù)的一個概念,可以簡單的理解為表的一個分區(qū),存放一張表中的一部分?jǐn)?shù)據(jù),當(dāng)該region中的數(shù)據(jù)超過一定量的時候,會自動進(jìn)行分裂, 分裂成兩個region(一分為二),從這個角度上而言,Region是對hbase中表的一個橫向的劃分。 每一個HRegion有多個HStore組成,每一個HRegion是一張表中所有的列做成部分?jǐn)?shù)據(jù)(也就是說部分記錄),每一個region都有一個startKey和endKey
一些配置參數(shù)說明:
<property> <name>hbase.hregion.max.filesize</name> <value>10737418240</value> <description> Maximum HStoreFile size. If any one of a column families' HStoreFiles has grown to exceed this value, the hosting HRegion is split in two.</description> </property> hregion最大的大小,當(dāng)一個region中的storeFile增長到10G的時候,split一分為二 手動將一個表今次那個region的切分,使用命令split 'table'/'region', 'splitKey'
假設(shè),我一張表里面有100條記錄,我要把它分別存放到10個region里面,又因?yàn)榇娣旁趆base里面的數(shù)據(jù)都是有序的,是能夠進(jìn)行一個高速隨機(jī)讀寫的, 也就是說有序能夠保證我的快讀,就需要能夠通過rowkey,快速的定位到當(dāng)前記錄在哪一個region里面,然后當(dāng)定位到region之后,再去掃描當(dāng)前region,獲取數(shù)據(jù), 為了滿足于此,我們就對這些region進(jìn)行劃分,編號,也是為了方便管理。這里每一個region的范圍:[startKey, endKey),需要注意一定最后一個region的endkey是需要被包含進(jìn)去的。 region 0 [null, 10) region 1 [10, 20) region 2 [20, 30) region ... ... region 9 [90, null] 將HRegion數(shù)據(jù)從memstore中手動刷新到磁盤中,使用命令flush 'table'/'region' 手動將一個表今次那個region的切分,使用命令split 'table'/'region', 'splitKey'
每一個HRegion由多一個HStore來組成,一個HStore對應(yīng)HRegion中的一個列族,一個HStore有一個MemStore和一個系列StoreFiles組成。 HStore級別不會持有鎖,以及事務(wù),鎖和事務(wù)在更高一個級別或者說HRegion持有的, HStore最核心的一個service就是合并memstore刷新到到磁盤里面的storefiles, 把多個storefiles合并成為一個storefile,寫到hdfs里面,寫到hdfs里面的文件稱之為hfile。 在寫的過程中,唯一設(shè)計(jì)到hlog的部分就是關(guān)于hlog日志的重建的過程,當(dāng)hstore將用戶提交的數(shù)據(jù)最終寫到了hdfs之后,會反饋給hlog, 將hlog里面冗余的數(shù)據(jù)刪除掉。 hbase.hstore.compactionThreshold=3,當(dāng)hstore個數(shù)超過3個之后就要開啟hstore合并的工作 Compaction: minor compaction(小合并): 就是將多個HFile合并成為一個大的HFile,然后對之前的HFile做清除處理。 常見的會在執(zhí)行刪除數(shù)據(jù)的動作、以及達(dá)到hbase.hstore.compactionThreshold觸發(fā)條件的時候發(fā)生, 刪除數(shù)據(jù):不會立即刪除,做一個標(biāo)記(標(biāo)記刪除),等到執(zhí)行合并操作的時候,才進(jìn)行數(shù)據(jù)的處理。 major compaction(大合并): 將一個列族中的所有的HFile合并成為一個HFile,然后對之前的HFile做清除處理。 大合并非常消耗性能,非常耗時,不建議操作,當(dāng)然是直接可以在shell執(zhí)行操作的。
一些配置屬性的說明如下:
<property> <name>hbase.hstore.compactionThreshold</name> <value>3</value> <description> If more than this number of HStoreFiles in any one HStore (one HStoreFile is written per flush of memstore) then a compaction is run to rewrite all HStoreFiles files as one. Larger numbers put off compaction but when it runs, it takes longer to complete. </description> </property> <property> <name>hbase.server.compactchecker.interval.multiplier</name> <value>1000</value> <description>The number that determines how often we scan to see if compaction is necessary. Normally, compactions are done after some events (such as memstore flush), but if region didn't receive a lot of writes for some time, or due to different compaction policies, it may be necessary to check it periodically. The interval between checks is hbase.server.compactchecker.interval.multiplier multiplied by hbase.server.thread.wakefrequency. </description> </property> <property> <name>hbase.hregion.majorcompaction</name> <value>604800000</value> 7天 <description>The time (in miliseconds) between 'major' compactions of all HStoreFiles in a region. Default: Set to 7 days. Major compactions tend to happen exactly when you need them least so enable them such that they run at off-peak for your deploy; or, since this setting is on a periodicity that is unlikely to match your loading, run the compactions via an external invocation out of a cron job or some such.</description> </property> <property> <name>hbase.hstore.blockingStoreFiles</name> <value>10</value> <description> If more than this number of StoreFiles in any one Store (one StoreFile is written per flush of MemStore) then updates are blocked for this HRegion until a compaction is completed, or until hbase.hstore.blockingWaitTime has been exceeded.</description> </property> <property> <name>hbase.hstore.compaction.max</name> <value>10</value> <description>Max number of HStoreFiles to compact per 'minor' compaction. </description> </property>
注意:在memstore寫的過程中,必須不能是多線程的(并行)調(diào)用的,hstore在調(diào)用的過程中必須持有一個讀鎖和寫鎖 在寫的過程中,預(yù)先數(shù)據(jù)在memstore中進(jìn)行排序,因?yàn)閿?shù)據(jù)最終是有序存放,當(dāng)memstore中的數(shù)據(jù)量超過閾值之后就會刷新到磁盤文件storefile中。
配置參數(shù)如下:
<property> <name>hbase.hregion.memstore.flush.size</name> <value>134217728</value> <description> Memstore will be flushed to disk if size of the memstore exceeds this number of bytes. Value is checked by a thread that runs every hbase.server.thread.wakefrequency.</description> </property>
最終保存HStore數(shù)據(jù)的文件,數(shù)據(jù)是由MemStore不斷向磁盤刷新過程中產(chǎn)生的,當(dāng)storefile達(dá)到一定量的時候,會將這些storefile組成一個storefiles。 這個storefiles有可能持有其他store里面的storefile。
在hdfs上存放數(shù)據(jù)之前的一個物理結(jié)構(gòu),用于接收從客戶端提交過來的數(shù)據(jù)。 HFile中的數(shù)據(jù)都Key-Value鍵值對兒的方式存儲,并且key和value都是字節(jié)數(shù)組。并且因?yàn)閿?shù)據(jù)已經(jīng)在memstore中排序過了,在hfile中也是有序的。 hfile同時是由一個個的block來組成的,最終k-v實(shí)際上是在這一個個的block中的,block的推薦的大小在8k~1M之間,默認(rèn)大小65536byte-->16kb。 每一個block都有索引,沒有hfile有由索引 官方建議: blocksize在8k~1M之間,默認(rèn)是64k 如果執(zhí)行順序讀的操作,建議將blocksize調(diào)大一點(diǎn)點(diǎn),這個會影響隨機(jī)訪問的效率 如果執(zhí)行隨機(jī)讀的操作,建議將blocksize調(diào)小一點(diǎn)點(diǎn),用默認(rèn)就可以了 在掃描全表數(shù)據(jù)的時候,一定要指定start key和end key,不然容易操作OOM異常
HRegionServer |---一個HLog |---多個HRegion(一張表對應(yīng)多個HRegion,是對hbase表的一個橫向的劃分) |---多個HStore(一個HStore對應(yīng)一個列族,反之一個列族對應(yīng)多個HStore,列族是對HBase表的縱向的劃分) |--一個MemStore |--多個StoreFile HFile |---多個data block HBase如何做到高速隨機(jī)讀? rowkey---->region 先到memstore中去找,如果有,則直接取出<rowkey, <cf, <col, <ts, value>>>> 如果沒有,則就去在hfile中找,通過索引定位到具體的block,然后遍歷該block塊,找到相應(yīng)的數(shù)據(jù) -------------------------------------------------------------------------- 把在想memstore寫數(shù)據(jù)的過程中,同時向hlog中寫數(shù)據(jù)的這種解決問題的方式稱之為SLM-Tree(Structure Log merge tree) 這種數(shù)據(jù)結(jié)構(gòu)和B-Tree有些類似,也是引自于Google BigTable
是由于行健相似、連續(xù)且數(shù)據(jù)量過大操作成單region的數(shù)據(jù)量過大,進(jìn)而影響讀寫效率 行健應(yīng)該盡量的隨機(jī)、不要出現(xiàn)連續(xù)行健。 常見的行健設(shè)計(jì)就是,比如手機(jī)號碼倒置+時間戳,比如隨機(jī)前綴+關(guān)系型數(shù)據(jù)庫中的主鍵(以存放在mr中電信日志案例為例) 因?yàn)閔base提供的查詢內(nèi)容非常非常low,但是所有關(guān)于hbase的查詢只能通過rowkey,所以 在設(shè)計(jì)行健的時候,應(yīng)該考慮將盡量多的查詢條件放到rowkey中去,形成的行健就成為復(fù)合鍵
cf1----->"maxRowLength" cf2----->"mrl" 建議hbase表是高表,不建議寬表,因?yàn)閷挶頁碛械牧凶搴芏?,操作并跨越的文?HFile)就很多,效率會有相應(yīng)影響, 反之建議使用高表,列族不宜過多。 在設(shè)計(jì)表的時候,各個列/列族名稱不宜過長,因?yàn)閔base需要對這些數(shù)據(jù)在內(nèi)存中做緩存,做索引,進(jìn)而影響內(nèi)存容量, 所以建議不易過長,以便能夠在內(nèi)存中容納更多的數(shù)據(jù)。至于閱讀性,有項(xiàng)目文檔搞定。
/home/uplooking/app/hive/bin/hive --auxpath /home/uplooking/app/hive/lib/hive-hbase-handler-2.1.0.jar,/home/uplooking/app/hive/lib/zookeeper-3.4.6.jar --hiveconf hbase.master=uplooking01:16010 --hiveconf hbase.zookeeper.quorum=uplooking01,uplooking02,uplooking03
創(chuàng)建一張表:
如果hbase中不存在該表我們只能在hive中使用創(chuàng)建內(nèi)部表的方式,來創(chuàng)建一張表,同會在hbase中也會創(chuàng)建相關(guān)的表。
eg. create table h3hb_1( id int, name string, age int )row format delimited fields terminated by ',' stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties ( "hbase.columns.mapping" = ":key,cf:name,cf:age", "hbase.table.name" = "t" ); 在hive中創(chuàng)建了一張表h3hb_1,有三列內(nèi)容id, name,age,同時映射到hbase中的表t,其中id對應(yīng)行健 name對應(yīng)hbase中列族cf中的name,age同理
嘗試向表中導(dǎo)入數(shù)據(jù),會報(bào)下面的錯誤:
hive (mydb1)> load data local inpath 'stu.txt' into table h3hb_1; FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD
所以創(chuàng)建了一張臨時表并導(dǎo)入數(shù)據(jù):
hive (mydb1)> create temporary table tmp( > id int, > name string, > age int)row format delimited > fields terminated by ','; OK Time taken: 0.104 seconds hive (mydb1)> load data local inpath 'stu.txt' into table tmp; Loading data to table mydb1.tmp OK Time taken: 0.408 seconds
最后通過查詢的方式向其插入數(shù)據(jù):
hive (mydb1)> insert into h3hb_1 select * from tmp; ... 2018-03-24 01:09:47,267 Stage-0 map = 0%, reduce = 0% 2018-03-24 01:09:59,883 Stage-0 map = 100%, reduce = 0%, Cumulative CPU ... Time taken: 32.315 seconds
可以看到會啟動一個MR的任務(wù)。
如果使用上述建表語句創(chuàng)建的時候,則會報(bào)錯,因?yàn)樵趆base中已經(jīng)存在了一張表為t,所以這時只能創(chuàng)建外部表去映射hbase中的一張表。
create external table h3hb_2 (id int, name string, age int )row format delimited fields terminated by ',' stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties ( "hbase.columns.mapping" = ":key,cf:name,cf:age", "hbase.table.name" = "t" );
約定安裝到/home/uplooking/app目錄下面 解壓: [uplooking@uplooking01 ~]$ tar -zxvf soft/phoenix-4.7.0-HBase-1.1-bin.tar.gz -C app/ 重命名 [uplooking@uplooking01 ~]$ mv app/phoenix-4.7.0-HBase-1.1-bin/ app/phoenix 拷貝lib目錄下面jar包到regionserver機(jī)器的lib($HBASE_HOME/lib)目錄 [uplooking@uplooking01 phoenix]$ scp *.jar uplooking@uplooking02:/home/uplooking/app/hbase/lib/ [uplooking@uplooking01 phoenix]$ scp *.jar uplooking@uplooking03:/home/uplooking/app/hbase/lib/ 重啟regionserver hbase-daemon.sh stop regionserver hbase-daemon.sh start regionserver 將phoenix中的client拷貝到hbase的client中,重啟master p[uplooking@uplooking01 phoenix]$ cp phoenix-4.7.0-HBase-1.1-client.jar /home/uplooking/app/hbase/lib/ hbase-daemon.sh stop master hbase-daemon.sh start master 官網(wǎng)測試案例: http://phoenix.apache.org/Phoenix-in-15-minutes-or-less.html ./psql.py uplooking01:2181 us_population.sql us_population.csv us_population_queries.sql
./sqlline.py uplooking01:2181:/hbase
查詢操作:
0: jdbc:phoenix:uplooking01:2181:/hbase> !tables +------------+--------------+----------------+---------------+----------+------------+---------------------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE_NAME | SELF_REFERENCING_COL_NAME | +------------+--------------+----------------+---------------+----------+------------+---------------------------+ | | SYSTEM | CATALOG | SYSTEM TABLE | | | | | | SYSTEM | FUNCTION | SYSTEM TABLE | | | | | | SYSTEM | SEQUENCE | SYSTEM TABLE | | | | | | SYSTEM | STATS | SYSTEM TABLE | | | | | | | US_POPULATION | TABLE | | | | +------------+--------------+----------------+---------------+----------+------------+---------------------------+ 0: jdbc:phoenix:uplooking01:2181:/hbase> select * from US_POPULATION; +--------+---------------+-------------+ | STATE | CITY | POPULATION | +--------+---------------+-------------+ | AZ | Phoenix | 1461575 | | CA | Los Angeles | 3844829 | | CA | San Diego | 1255540 | | CA | San Jose | 912332 | | IL | Chicago | 2842518 | | NY | New York | 8143197 | | PA | Philadelphia | 1463281 | | TX | Dallas | 1213825 | | TX | Houston | 2016582 | | TX | San Antonio | 1256509 | +--------+---------------+-------------+ 10 rows selected (0.138 seconds)
創(chuàng)建表與插入數(shù)據(jù):
0: jdbc:phoenix:uplooking01:2181:/hbase> create table p1(id integer not null primary key, name varchar(20), age integer); No rows affected (2.351 seconds) 0: jdbc:phoenix:uplooking01:2181:/hbase> !tables +------------+--------------+----------------+---------------+----------+------------+---------------------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE_NAME | SELF_REFERENCING_COL_NAME | +------------+--------------+----------------+---------------+----------+------------+---------------------------+ | | SYSTEM | CATALOG | SYSTEM TABLE | | | | | | SYSTEM | FUNCTION | SYSTEM TABLE | | | | | | SYSTEM | SEQUENCE | SYSTEM TABLE | | | | | | SYSTEM | STATS | SYSTEM TABLE | | | | | | | P1 | TABLE | | | | | | | US_POPULATION | TABLE | | | | +------------+--------------+----------------+---------------+----------+------------+---------------------------+ 0: jdbc:phoenix:uplooking01:2181:/hbase> !describe p1; +------------+--------------+-------------+--------------+------------+------------+--------------+--------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | COLUMN_SIZE | BUFFER_LENGT | +------------+--------------+-------------+--------------+------------+------------+--------------+--------------+ | | | P1 | ID | 4 | INTEGER | null | null | | | | P1 | NAME | 12 | VARCHAR | 20 | null | | | | P1 | AGE | 4 | INTEGER | null | null | +------------+--------------+-------------+--------------+------------+------------+--------------+--------------+ 0: jdbc:phoenix:uplooking01:2181:/hbase> upsert into p1 values(1, 'zhangsan',13); 1 row affected (0.13 seconds) 0: jdbc:phoenix:uplooking01:2181:/hbase> upsert into p1 values(2, 'lisi',14); 1 row affected (0.019 seconds) 0: jdbc:phoenix:uplooking01:2181:/hbase> select * from p1; +-----+-----------+------+ | ID | NAME | AGE | +-----+-----------+------+ | 1 | zhangsan | 13 | | 2 | lisi | 14 | +-----+-----------+------+ 2 rows selected (0.066 seconds)
可以看到,我們創(chuàng)建的表p1,在實(shí)際創(chuàng)建時,會變成大寫的P1,在hbase中查看:
hbase(main):004:0> scan 'P1' ROW COLUMN+CELL \x80\x00\x00\x01 column=0:AGE, timestamp=1521827542938, value=\x80\x00\x00\x0D \x80\x00\x00\x01 column=0:NAME, timestamp=1521827542938, value=zhangsan \x80\x00\x00\x01 column=0:_0, timestamp=1521827542938, value=x \x80\x00\x00\x02 column=0:AGE, timestamp=1521827553065, value=\x80\x00\x00\x0E \x80\x00\x00\x02 column=0:NAME, timestamp=1521827553065, value=lisi \x80\x00\x00\x02 column=0:_0, timestamp=1521827553065, value=x 2 row(s) in 0.0410 seconds
可以看到列族也默認(rèn)為0,可以嘗試下面的方式來創(chuàng)建表:
0: jdbc:phoenix:uplooking01:2181:/hbase> create table "p2"(id varchar(100000) primary key, "cf"."name" varchar(20), "cf"."age" varchar(100)); No rows affected (1.288 seconds) 0: jdbc:phoenix:uplooking01:2181:/hbase> !tables +------------+--------------+----------------+---------------+----------+------------+---------------------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE_NAME | SELF_REFERENCING_COL_NAME | +------------+--------------+----------------+---------------+----------+------------+---------------------------+ | | SYSTEM | CATALOG | SYSTEM TABLE | | | | | | SYSTEM | FUNCTION | SYSTEM TABLE | | | | | | SYSTEM | SEQUENCE | SYSTEM TABLE | | | | | | SYSTEM | STATS | SYSTEM TABLE | | | | | | | P1 | TABLE | | | | | | | US_POPULATION | TABLE | | | | | | | p2 | TABLE | | | | +------------+--------------+----------------+---------------+----------+------------+---------------------------+ 0: jdbc:phoenix:uplooking01:2181:/hbase> upsert into "p2" values('1','zhangsan','13'); 1 row affected (0.061 seconds) 0: jdbc:phoenix:uplooking01:2181:/hbase> upsert into "p2" values('2','lisi','14'); 1 row affected (0.015 seconds) 0: jdbc:phoenix:uplooking01:2181:/hbase> select * from "p2"; +-----+-----------+------+ | ID | name | age | +-----+-----------+------+ | 1 | zhangsan | 13 | | 2 | lisi | 14 | +-----+-----------+------+ 2 rows selected (0.055 seconds)
這樣創(chuàng)建的表就為小寫的了,同時在hbase中查看也可以看到列族:
hbase(main):006:0> scan 'p2' ROW COLUMN+CELL 1 column=cf:_0, timestamp=1521827723448, value=x 1 column=cf:age, timestamp=1521827723448, value=13 1 column=cf:name, timestamp=1521827723448, value=zhangsan 2 column=cf:_0, timestamp=1521827735556, value=x 2 column=cf:age, timestamp=1521827735556, value=14 2 column=cf:name, timestamp=1521827735556, value=lisi 2 row(s) in 0.0390 seconds
java -jar squirrel-sql-3.7-standard.jar
然后就可以進(jìn)行安裝。
使用squirrel-sql添加一個驅(qū)動,其屬性值可為如下:
Name:hbase Example URL:jdbc:phoenix:uplooking01,uplooking02,uplooking03:2181 Class Name:org.apache.phoenix.jdbc.PhoenixDriver 驅(qū)動可以到phoenix目錄下找到:phoenix-4.7.0-HBase-1.1-client.jar,然后添加即可
選擇驅(qū)動為前面創(chuàng)建的驅(qū)動,然后用戶名和密碼都為uplooking
這樣之后就可以像使用navicat管理MySQL數(shù)據(jù)庫一樣,比較方便。
“HBase物理結(jié)構(gòu)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。