㈠ hbase濡備綍鍏抽棴鑷鍔ㄥ悎骞朵笌鍘嬬缉
hbase濡備綍鍏抽棴鑷鍔ㄥ悎骞朵笌鍘嬬缉濡備笅锛
鍏抽棴鑷鍔ㄥ悎骞讹細瑕佸叧闂鑷鍔ㄥ悎骞讹紝闇瑕佷慨鏀笻Base鐨勯厤缃鏂囦欢锛坔base-site.xml锛夈傚湪鏂囦欢涓鎵惧埌hbase.hstore.merge.鏀跨瓥灞炴э紝骞跺皢鍏惰剧疆涓簄one銆傝繖鏍凤紝HBase灏嗕笉鍐嶈嚜鍔ㄥ悎骞跺皬鏂囦欢銆傝锋敞鎰忓ぇ甯︼紝鍏抽棴鑷鍔ㄥ悎骞跺彲鑳戒細瀵艰嚧HBase鐨凴egion鏁伴噺澧炲姞锛屽洜姝ゅ湪杩涜屾ゆ搷浣滀箣鍓嶏紝璇风‘淇濅簡瑙f綔鍦ㄧ殑褰卞搷銆
鍏抽棴鑷鍔ㄥ帇缂╋細瑕佸叧闂鑷鍔ㄥ帇缂╋紝闇瑕佷慨鏀笻Base鐨勯厤缃鏂囦欢锛坔base-site.xml锛夈傚湪鏂囦欢涓鎵惧埌hbase.hstore.compress灞炴э紝骞跺皢鍏惰剧疆涓篺alse銆傝繖鏍凤紝HBase灏嗕笉鍐嶅规暟鎹杩涜岃嚜鍔ㄥ帇缂┿傝锋敞鎰忥紝妫闂峰叧闂鑷鍔ㄥ帇缂╁彲鑳戒細澧炲姞婊氭槬鑺︽暟鎹瀛樺偍鐨勫崰鐢ㄧ┖闂淬
㈡ HBase是什么呢,都有哪些特点呢
Hbase是一种NoSQL数据库,这意味着它不像传统的RDBMS数据库那样支持SQL作为查询语言。Hbase是一种分布式存储的数据库,技术上来讲,它更像是分布式存储而不是分布式数据库,它缺少很多RDBMS系统的特性,比如列类型,辅助索引,触发器,和高级查询语言等待
那Hbase有什么特性呢?如下:
强读写一致,但是不是“最终一致性”的数据存储,这使得它非常适合高速的计算聚合
自动分片,通过Region分散在集群中,当行数增长的时候,Region也会自动的切分和再分配
自动的故障转移
Hadoop/HDFS集成,和HDFS开箱即用,不用太麻烦的衔接
丰富的“简洁,高效”API,Thrift/REST API,Java API
块缓存,布隆过滤器,可以高效的列查询优化
操作管理,Hbase提供了内置的web界面来操作,还可以监控JMX指标
什么时候用Hbase?
Hbase不适合解决所有的问题:
首先数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选项,如果只有几百万行甚至不到的数据量,RDBMS是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态
其次,如果你不需要辅助索引,静态类型的列,事务等特性,一个已经用RDBMS的系统想要切换到Hbase,则需要重新设计系统。
最后,保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数量是3,再加上一个NameNode。
Hbase在单机环境也能运行,但是请在开发环境的时候使用。
内部应用
存储业务数据:车辆GPS信息,司机点位信息,用户操作信息,设备访问信息。。。
存储日志数据:架构监控数据(登录日志,中间件访问日志,推送日志,短信邮件发送记录。。。),业务操作日志信息
存储业务附件:UDFS系统存储图像,视频,文档等附件信息
不过在公司使用的时候,一般不使用原生的Hbase API,使用原生的API会导致访问不可监控,影响系统稳定性,以致于版本升级的不可控。
HFile
HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
探讨数据库的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。
Hfile生成方式
起初,HFile中并没有任何Block,数据还存在于MemStore中。
Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:
注:如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。
㈢ hbase鐨勪綔鐢
HBase 鏄鍏稿瀷鐨 NoSQL 鏁版嵁搴擄紝閫氬父琚鎻忚堪鎴愮█鐤忕殑銆佸垎甯冨紡鐨勩佹寔涔呭寲鐨勶紝鐢辫岄敭銆佸垪閿鍜屾椂闂存埑杩涜岀储寮曠殑澶氱淮鏈夊簭鏄犲皠鏁版嵁搴擄紝涓昏佺敤鏉ュ瓨鍌ㄩ潪缁撴瀯鍖栧拰鍗婄粨鏋勫寲鐨勬暟鎹銆傚洜涓 HBase 鍩轰簬 Hadoop 鐨 HDFS 瀹屾垚鍒嗗竷寮忓瓨鍌锛屼互鍙 MapRece 瀹屾垚鍒嗗竷寮骞惰岃$畻锛屾墍浠ュ畠鐨勪竴浜涚壒鐐逛笌 Hadoop 鐩稿悓锛屼緷闈犳í鍚戞墿灞曪紝閫氳繃涓嶆柇澧炲姞鎬т环姣旈珮鐨勫晢涓氭湇鍔″櫒鏉ュ炲姞璁$畻鍜屽瓨鍌ㄨ兘鍔涖
HBase 铏界劧鍩轰簬 Bigtable 鐨勫紑婧愬疄鐜帮紝浣嗗畠浠涔嬮棿杩樻槸鏈夊緢澶氬樊鍒鐨勶紝Bigtable 缁忓父琚鎻忚堪鎴愰敭鍊兼暟鎹搴擄紝鑰 HBase 鍒欐槸闈㈠悜鍒楀瓨鍌ㄧ殑鍒嗗竷寮忔暟鎹搴銆
涓嬮潰浠嬬粛 HBase 鍏峰囩殑鏄捐憲鐗规э紝杩欎簺鐗规ц HBase 鎴愪负褰撳墠鍜屾湭鏉ユ渶瀹炵敤鐨勬暟鎹搴撲箣涓銆
瀹归噺宸ㄥぇ
HBase 鐨勫崟琛ㄥ彲浠ユ湁鐧句嚎琛屻佺櫨涓囧垪锛屽彲鍝鎼轰互鍦ㄦí鍚戝拰绾靛悜涓や釜缁村害鎻掑叆鏁版嵁锛屽叿鏈夊緢澶х殑寮规с
褰鍏崇郴鍨嬫暟鎹搴鐨勫崟涓琛ㄧ殑璁板綍鍦ㄤ嚎绾ф椂锛屾煡璇㈠拰鍐欏叆鐨勬ц兘閮戒細鍛堢幇鎸囨暟绾т笅闄嶏紝杩欑嶅簽澶х殑鏁版嵁閲忓逛紶缁熸暟鎹搴撴潵璇存槸涓绉嶇伨闅撅紝鑰 HBase 鍦ㄩ檺瀹氭煇涓鍒楃殑鎯呭喌涓嬪逛簬鍗曡〃瀛樺偍鐧句嚎鐢氳嚦鏇村氱殑鏁版嵁閮芥病鏈夋ц兘闂棰樸
HBase 閲囩敤 LSM 鏍戜綔涓哄唴閮ㄦ暟鎹瀛樺偍缁撴瀯锛岃繖绉嶇粨鏋勪細鍛ㄦ湡鎬у湴灏嗚緝灏忔枃浠跺悎骞舵垚澶ф枃浠讹紝浠ュ噺灏戝圭佺洏鐨勮块棶銆
鎵╁睍鎬у己
HBase 宸ヤ綔鍦 HDFS 涔嬩笂锛岀悊鎵褰撶劧鍦版敮鎸佸垎甯冨紡琛锛屼篃缁ф壙浜 HDFS 鐨勫彲鎵╁睍鎬с侶Base 鐨勬墿灞曟槸妯鍚戠殑锛屾í鍚戞潕鎱т紡鎵╁睍鏄鎸囧湪鎵╁睍鏃朵笉闇瑕佹彁鍗囨湇鍔″櫒鏈韬纰ф瘉鐨勬ц兘锛屽彧闇娣诲姞鏈嶅姟鍣ㄥ埌鐜版湁闆嗙兢鍗冲彲銆
HBase 琛ㄦ牴鎹 Region 澶у皬杩涜屽垎鍖猴紝鍒嗗埆瀛樺湪闆嗙兢涓涓嶅悓鐨勮妭鐐逛笂锛屽綋娣诲姞鏂扮殑鑺傜偣鏃讹紝闆嗙兢灏遍噸鏂拌皟鏁达紝鍦ㄦ柊鐨勮妭鐐瑰惎鍔 HBase 鏈嶅姟鍣锛屽姩鎬佸湴瀹炵幇鎵╁睍銆傝繖閲岄渶瑕佹寚鍑猴紝HBase 鐨勬墿灞曟槸鐑鎵╁睍锛屽嵆鍦ㄤ笉鍋滄㈢幇鏈夋湇鍔$殑鍓嶆彁涓嬶紝鍙浠ラ殢鏃舵坊鍔犳垨鑰呭噺灏戣妭鐐广
楂樺彲闈犳
HBase 杩愯屽湪 HDFS 涓婏紝HDFS 鐨勫氬壇鏈瀛樺偍鍙浠ヨ╁畠鍦ㄥ瞼鐜版晠闅滄椂鑷鍔ㄦ仮澶嶏紝鍚屾椂 HBase 鍐呴儴涔熸彁渚 WAL 鍜 Replication 鏈哄埗銆
WAL锛圵rite-Ahead-Log锛夐勫啓鏃ュ織鏄鍦 HBase 鏈嶅姟鍣ㄥ勭悊鏁版嵁鎻掑叆鍜屽垹闄ょ殑杩囩▼涓鐢ㄦ潵璁板綍鎿嶄綔鍐呭圭殑鏃ュ織锛屼繚璇佷簡鏁版嵁鍐欏叆鏃朵笉浼氬洜闆嗙兢寮傚父鑰屽艰嚧鍐欏叆鏁版嵁鐨勪涪澶憋紱鑰 Replication 鏈哄埗鏄鍩轰簬鏃ュ織鎿嶄綔鏉ュ仛鏁版嵁鍚屾ョ殑銆
㈣ HBase存储架构
上图是HBase的存储架构图。
由上图可以知道,客户端是通过Zookeeper找到HMaster,然后再与具体的Hregionserver进行沟通读写数据的。
具体到物理实现,细节包括以下这些:
首先要清楚HBase在hdfs中的存储路径,以及各个目录的作用。在hbase-site.xml 文件中,配置项 <name> hbase.rootdir</name> 默认 “/hbase”,就是hbase在hdfs中的存储根路径。以下是hbase0.96版本的个路径作用。1.0以后的版本请参考这里: https://blog.bcmeng.com/post/hbase-hdfs.html
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之后,会将 HFile 移到.archive 目录中,然后将之前的 hfile 删除掉,该目录由 HMaster 上的一个定时任务定期去清理。
2、 /hbase/.corrupt
存储HBase损坏的日志文件,一般都是为空的。
3、 /hbase/.hbck
HBase 运维过程中偶尔蔽升会遇到元数据不一致的情况,这时候会用到提供的 hbck 工具去修复,修复过程中会使用该目录作为临时过度缓冲。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 会在第一次启动之初会给每一台 RegionServer 在.log 下创建一个目录,若客户端如果开启WAL 模式,会先将数据写入一份到.log 下,当 RegionServer crash 或者目录达到一定大小,会开启 replay 模式,类似 MySQL 的 binlog。
5、 /hbase/oldlogs
当.logs 文件夹中的 HLog 没用之后会 move 到.oldlogs 中,HMaster 会定期去清理。
6、 /hbase/.snapshot
hbase若开启了 snapshot 功能之后,对某一个用户表建立一个 snapshot 之后,snapshot 都存储在该目录下,如对表test 做了一个 名为sp_test 的snapshot,就会在/hbase/.snapshot/目录下创建一个sp_test 文件夹,snapshot 之后的所有写入都是记录在这个 snapshot 之上。
7、 /hbase/.tmp
当对表做创建或者删除操作的时候,会将表move 到该 tmp 目录下,然后再去做处理操作。
8、 /hbase/hbase.id
它是一个文件,存储集群唯一的 cluster id 号,是一个 uuid。
9、 /hbase/hbase.version
同样也是一宏拿老个文件,存储集群的版本号,貌似是加密的,看不到,只能通过web-ui 才能正确显示出来
10、 -ROOT-
该表是一张的HBase表,只是它存储的是.META.表的信息。通过HFile文件的解析脚本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存储的内容,如下所示:
以上可以看出,-ROOT-表记录的.META.表的所在机器是dchbase2,与web界面看到的一致:
11、 .META.
通过以上表能找到.META.表的信息,该表也是一张hbase表,通过以上命令,解析其中一个region:
以敏神上可以看出,adt_app_channel表的数据记录在dchbase3这台reginserver上,也与界面一致,如果有多个region,则会在表名后面加上rowkey的范围:
通过以上描述,只要找到-ROOT-表的信息,就能根据rowkey找到对应的数据,那-ROOT-在哪里找呢?从本文一开始的图中可以知道,就是在zookeeper中找的。进入zookeeper命令行界面:
可以看出-ROOT-表存储在 dchbase3 机器中,对应界面如下:
以上就是HBase客户端根据指定的rowkey从zookeeper开始找到对应的数据的过程。
那在Region下HBase是如何存储数据的呢?
以下就具体操作一张表,查询对应的HFile文件,看HBase的数据存储过程。
在HBase创建一张表 test7,并插入一些数据,如下命令:
查看wal日志,通过 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,内容如下:
查看HFile文件,内容如下:
由此可见,HFile文件就是存储HBase的KV对,其中Key的各个字段包含了的信息如下:
由于hbase把cf和column都存储在HFile中,所以在设计的时候,这两个字段应该尽量短,以减少存储空间。
但删除一条记录的时候,HBase会怎么操作呢?执行以下命令:
删除了rowkey为200的记录,查看hdfs,原来的HFile并没有改变,而是生成了一个新的HFile,内容如下:
所以在HBase中,删除一条记录并不是修改HFile里面的内容,而是写新的文件,待HBase做合并的时候,把这些文件合并成一个HFile,用时间比较新的文件覆盖旧的文件。HBase这样做的根本原因是,HDFS不支持修改文件。