[关闭]
@zhangyy 2020-01-16T17:13:52.000000Z 字数 7601 阅读 207

hbase 的高级使用

hbase的部分


  • 一:hbase 表的设计管理
  • 二:hbase hive 集成
  • 三:sqoop 与hbase 的集成
  • 四:hbase 与hue 集成
  • 五:hbase 表的修复

一:hbase 表的设计管理

1.1 hbase 的shell 命令

1.1.1 创建一个命名空间

  1. 在新版本的hbase 表是存储在命名空间当中,默认的命名空间是default
  2. 创建一个命名空间:
  3. create_namespace 'ns2'
  4. 查看有多少个命名空间:
  5. list_namespace
  6. 在命名空间中建立表:
  7. create 'ns2:student','info'
  8. 查询命名空间中的表:
  9. list_namespace_tables 'ns2'

image_1al48k8l81tju1js2g0p1o221g3c9.png-6.4kB

image_1al48risotjo1i0tkbr1mv710q13.png-7.8kB

image_1al48l0oj1qmo8h715qt1hu81u01m.png-15.1kB


1.1.2 一张表创建多个列簇

  1. create 'ns1:t1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
  2. 相当于:
  3. create 'ns1:t1', 'f1', 'f2', 'f3'
  4. 描述一张表:
  5. describe 't1'

image_1al49cup41qbgqa1pg4d8d166t1g.png-30.6kB

1.2.3 创建rowkey 的范围region 区域:

  1. 默认情况下hbase 创建表时,会默认划分region 区域
  2. 结合实际环境来看,无论是测试环境还是生产环节,我们创建好的hbase 需要大量的的导入数据
  3. file/data --> hfile -> bulk load into hbase tables
  4. 方式一:
  5. create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
  6. ti(rowkey) Start Key End Key
  7. region1 10
  8. region2 10 20
  9. region3 20 30
  10. region4 30 40
  11. region5 40
  12. ----
  13. 方式二:
  14. cd /home/hadoop/
  15. vim region.txt
  16. 20160601
  17. 20160602
  18. 20160603
  19. 20160604
  20. create 't2', 'f1', SPLITS_FILE => '/home/hadoop/region.txt', OWNER => 'johndoe'
  21. ---
  22. 方式三: 采用十六进制的这种方式创建
  23. create 't3', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

image_1al3qlpclct914ms15pb9af1is813.png-7.7kB

image_1al3qq41m1lav70g1acjnag9o71g.png-14.2kB

image_1al3v6442no1dgd1odo18irad11t.png-9.3kB

1.2 依据话单划分hbase 表:

  1. 需求: 查询在一段时间的内的通话数
  2. 依据条件查询
  3. telphone + (starttime -- endtime)
  4. ---
  5. time area active phone talktime mode price
  6. 设计思想:根据rowkey 查询时间比较快
  7. rowkey:
  8. telphone + time
  9. 18721732851_20151001092345
  10. info:
  11. area active phone talktime mode price
  12. scan
  13. startrow
  14. 18721732851_20150401000000
  15. stoprow
  16. 18721732851_20150413000000
  17. ---
  18. 实时性
  19. 如何在海量数据中,获取我所需要的数据(查询的数据)。
  20. 表的rowkey设计中:
  21. 核心思想:
  22. 依据rowkey查询最快
  23. rowkey进行范围查询range
  24. 前缀匹配
  25. 表分区的处理
  26. ---
  27. 新需求:新的需求(话单数据的查询)
  28. phone + time
  29. >>> 依据前面设计的表
  30. 使用filter
  31. columnFilter
  32. 索引表/辅助表(主表) -- 功能
  33. phone_time
  34. 比如:
  35. 182600937645_2015100100000
  36. 182600937645_2015102400000
  37. 列簇:info
  38. 列:
  39. rowkey ->
  40. Get最快的数据查询
  41. ---
  42. 主表和索引表的数据 如何同步呢?????
  43. >> 程序,事物
  44. >> phoenix
  45. >> JDBC方式,才能同步
  46. 创建索引表
  47. >> solr
  48. lily
  49. cloudera search

一张表的详细参数:

  1. 'user',
  2. {
  3. NAME => 'info',
  4. DATA_BLOCK_ENCODING => 'NONE',
  5. BLOOM FILTER => 'ROW',
  6. REPLICATION_SCOPE => '0',
  7. VERSIONS => '1',
  8. COMPRESSION => 'NONE',
  9. MIN_VERSIONS => '0',
  10. TTL => 'FOREVER',
  11. KEEP_DELETED_CELLS => 'false',
  12. BLOCKSIZE => '65536',
  13. IN_MEMORY => 'false',
  14. BLOCKCACHE => 'true'
  15. }

1.3 hbase 启用压缩功能:

  1. 压缩参数:COMPRESSION => 'NONE',
  2. ---
  3. cd /home/hadoop/yangyang/hadoop
  4. bin/hadoop checknative

image_1al56q4re1890mig1mljihff6b9.png-28.2kB

  1. 配置hbase-site.xml 增加:
  2. <property>
  3. <name>hbase.regionserver.codecs</name>
  4. <value>snappy</value>
  5. </property>
  1. tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz
  2. cd hadoop-snappy-0.0.1-SNAPSHOT/lib
  3. cp -p hadoop-snappy-0.0.1-SNAPSHOT.jar /home/hadoop/yangyang/hbase/lib/
  4. cd /home/hadoop/yangyang/hbase/lib
  5. mkdir native
  6. cd native
  7. ln -s /home/hadoop/yangyang/hadoop/lib/native ./Linux-amd64-64
  8. ---
  9. 从新启动hbase
  10. bin/stop-hbase.sh
  11. bin/start-hbase.sh
  12. hbase 创建压缩的表
  13. create 't1_snappy' ,{NAME => 'f1',COMPRESSION => 'SNAPPY'}
  14. put 't1_snappy','1001','f1:name','zhangyy'

image_1al57ho40pbk19fm1tga1q311qeb13.png-11kB

image_1al5889101t8f1icuntt25eq8q1g.png-6.5kB

1.4 hbase 启用块缓存

  1. RegionServer - 12G
  2. >> MemStore 40%
  3. write
  4. >> BlockCache 40%
  5. read
  6. >> other 20%
  1. 块缓存参数:BLOCKCACHE => 'true'
  2. ---
  3. 关于:Memstore& BlockCache
  4. 1.HBaseRegionserver的内存分为两个部分,一部分作为Memstore,主要用来写;另外一部分作为BlockCache,主要用于读。
  5. 2.写请求会先写入MemstoreRegionserver会给每个region提供一个Memstore,当Memstore64MB以后,会启动flush刷新到磁盘。当Memstore的总大小超过限制时(heapsize * hbase.regionserver.global.memstore.upperLimit * 0.9),会强行启动flush进程,从最大的Memstore开始flush直到低于限制。
  6. 3.读请求先到Memstore中查数据,查不到就到BlockCache中查,再查不到就会到磁盘上读,并把读的结果放入BlockCache。由于BlockCache采用的是LRU策略,因此BlockCache达到上限(heapsize * hfile.block.cache.size * 0.85)后,会启动淘汰机制,淘汰掉最老的一批数据。
  7. 4.在注重读响应时间的应用场景下,可以将BlockCache设置大些,Memstore设置小些,以加大缓存的命中率。
  8. ---
  9. BlockCache:
  10. Cache分级思想的好处在于:
  11. 1.首先,通过inMemory类型Cache,可以有选择地将in-memorycolumn families放到RegionServer内存中,例如Meta元数据信息;
  12. 2.通过区分SingleMulti类型Cache,可以防止由于Scan操作带来的Cache频繁颠簸,将最少使用的Block加入到淘汰算法中。
  13. 3.默认配置下,对于整个BlockCache的内存,又按照以下百分比分配给SingleMultiInMemory使用:0.250.500.25

1.5 hbase 表的管理:

  1. 概述:
  2. 随着memstore 中的数据不断的刷写到磁盘中,会产生越来越多的HFile 文件, HBASE 内部有一个解决这个问题的管理机制,即用合并将多个文件合并成一个较大的文件,合并有两种:minor合并(minor compaction)和major 合并(major compaction). minor 合并将多个小文件从写为数据量较少的大文件,减少对存储文件的数量,这个过程实际上是个多路归并的过程,以为HFile 的每个文件都是经过归类的,所以合并速度很快,只受到磁盘I/O的性能影响。
  3. major 合并将一个region 中一个列簇的若干个Hfile 从写为一个新的Hfile,与minor 合并相比,还有更独特的功能:major 合并 能扫描所有的键/值对,顺序从写全部的数据,重写数据的过程中略过做凌删除标记的数据,断言删除此时生效,比如:对于那些超过版本号限制的数据以及生存时间到期的数据,在重写数据时就不再写入磁盘了。
  1. HRegoin Server上的storefile文件是被后台线程监控的,以确保这些文件保持在可控状态。磁盘上的storefile的数量会随着越来越多的memstore被刷新而变等于越来越多——每次刷新都会生成一个storefile文件。当storefile数量满足一定条件时(可以通过配置参数类调整),会触发文件合并操作——minor compaction,将多个比较小的storefile合并成一个大的storefile文件,直到合并的文件大到超过单个文件配置允许的最大值时会触发一次region的自动分割,即region split操作,将一个region平分成2个。
  1. 1. minor compaction:轻量级
  2. 将符合条件的最早生成的几个storefile合并生成一个大的storefile文件,它不会删除被标记为“删除”的数据和以过期的数据,并且执行过一次minor合并操作后还会有多个storefile文件。
  3. 2. major compaction,重量级
  4. 把所有的storefile合并成一个单一的storefile文件,在文件合并期间系统会删除标记为"删除"标记的数据和过期失效的数据,同时会block所有客户端对该操作所属的region的请求直到合并完毕,最后删除已合并的storefile文件。

二: hbase 与其它框架的集成

2.1 hbase 与hive 集成:

2.1.1 hive 同步hbase 的jar 包

  1. 参考官网:
  2. https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
  3. 进行配置
  1. cd /home/hadoop/yangyang/hive/lib/
  2. ---
  3. ln -s /home/hadoop/yangyang/hbase/lib/hbase-server-0.98.6-cdh5.3.6.jar ./hbase-server-0.98.6-cdh5.3.6.jar
  4. ln -s /home/hadoop/yangyang/hbase/lib/hbase-client-0.98.6-cdh5.3.6.jar ./hbase-client-0.98.6-cdh5.3.6.jar
  5. ln -s /home/hadoop/yangyang/hbase/lib/hbase-protocol-0.98.6-cdh5.3.6.jar ./hbase-protocol-0.98.6-cdh5.3.6.jar
  6. ln -s /home/hadoop/yangyang/hbase/lib/hbase-it-0.98.6-cdh5.3.6.jar ./hbase-it-0.98.6-cdh5.3.6.jar
  7. ln -s /home/hadoop/yangyang/hbase/lib/htrace-core-2.04.jar ./htrace-core-2.04.jar
  8. ln -s /home/hadoop/yangyang/hbase/lib/hbase-hadoop2-compat-0.98.6-cdh5.3.6.jar ./hbase-hadoop2-compat-0.98.6-cdh5.3.6.jar
  9. ln -s /home/hadoop/yangyang/hbase/lib/hbase-hadoop-compat-0.98.6-cdh5.3.6.jar ./hbase-hadoop-compat-0.98.6-cdh5.3.6.jar
  10. ln -s /home/hadoop/yangyang/hbase/lib/high-scale-lib-1.1.1.jar ./high-scale-lib-1.1.1.jar

2.1.2 hive 增加zookeeper 的属性

  1. vim hive-site.xml 增加:
  2. ---
  3. <property>
  4. <name>hbase.zookeeper.quorum</name>
  5. <value>namenode01.hadoop.com</value>
  6. </property>

2.1.3 重新启动hbase

  1. cd /home/hadoop/yangyang/hbase
  2. bin/stop-hbase.sh
  3. bin/start-hbase.sh

2.1.4 创建hive中创建表测试

  1. 介于hive管理表:
  2. CREATE TABLE hbase_table_1(key int, value string)
  3. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  4. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
  5. TBLPROPERTIES ("hbase.table.name" = "xyz");
  6. ---
  7. hive 截取表的数据到 另一张表:
  8. insert overwrite table hbase_table_1 select empno,ename from emp;
  9. 查询这个表:
  10. select * from hbase_table_1
  11. hbase 查询xyz 表:
  12. scan 'xyz'
  13. 注:hive 的管理表中,如果在hive中删除了这张表,hbase 的生成的表也会消失。

image_1al6ijdc1pv0arl1hmp6d01ubk9.png-21.3kB

image_1al6io2kv11qfaou1o0t1360e18m.png-39.6kB

image_1al6iol5g121t1115kef1pac1asn13.png-18.3kB

image_1al6iql1dag115ru1ngvmrdkvh1g.png-47.8kB

2.1.5 hive中创建外部表 与hbase 集成:

  1. hbase 创建一种空表
  2. create 'huser','info'
  3. put 'huser','1001','info:name','zhangyy'
  4. put 'huser','1001','info:age','12'
  5. put 'huser','1002','info:name','harry'
  6. put 'huser','1002','info:age','22'

image_1al6nkh49t40iaj16h5rgioh4m.png-7.4kB

image_1al6nu40n1jrp1ffa5ge10i415q913.png-17.5kB

  1. hive 中创建外部表进行与hbase 关联:
  2. CREATE EXTERNAL TABLE hbase_user(id int, name string,age int)
  3. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  4. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:age")
  5. TBLPROPERTIES ("hbase.table.name" = "huser");
  6. select * from hbase_user;

image_1al6njv314fo12gn1qq0fbldj9.png-15.5kB
image_1al6nvck210s3men124g9km13k1g.png-9.3kB

2.2 :sqoop 与hbase 的集成

  1. 使用sqoop mysql 里面的表提取到hbase 当中
  2. cd /home/hadoop/yangyang/sqoop
  3. bin/sqoop import --connect jdbc:mysql://namenode01.hadoop.com:3306/yangyang --username root --password 123456 --table my_user --hbase-create-table --hbase-table student --column-family info --hbase-row-key id
  4. ---
  5. 查看hbase 中的表:
  6. scan 'student'

image_1al6p7gop1m54tj3b141s091r3fp.png-74.4kB

image_1al6p83121gi1b29hbm14k8ecc16.png-52.7kB

image_1al6p9r5oiaik8t8og11ph11lj1j.png-46.7kB

2.3:hbase 与hue 集成

2.3.1 启动hbase 的thrift

  1. cd /home/hadoop/yangyang/hbase
  2. bin/hbase-daemon.sh start thrift

image_1al6vnobsdtncuu35o1lak1r049.png-23.6kB


  1. [hbase]
  2. # Comma-separated list of HBase Thrift servers for clusters in the format of '(name|host:port)'.
  3. # Use full hostname with security.
  4. ## hbase_clusters=(Cluster|localhost:9090)
  5. hbase_clusters=(Cluster|namenode01.hadoop.com:9090)
  6. # HBase configuration directory, where hbase-site.xml is located.
  7. hbase_conf_dir=/home/hadoop/yangyang/hbase/conf
  8. # Hard limit of rows or columns per row fetched before truncating.
  9. ## truncate_limit = 500
  10. # 'buffered' is the default of the HBase Thrift Server and supports security.
  11. # 'framed' can be used to chunk up responses,
  12. # which is useful when used in conjunction with the nonblocking server in Thrift.
  13. ## thrift_transport=buffered

重启hue 测试:

  1. cd /home/hadoop/yangyang/hue
  2. build/env/bin/supervisor &

image_1al70eaf2sr01l6o1qnq1l381takm.png-25.1kB

打开浏览器测试:

image_1al70fokd1sq65ko121t116r7ck13.png-38.4kB

三:hbase 表的修复

  1. 5.1:当hbase数据表meta 出现问题的时候需要涉及修复:
  2. 5.2 hbase 表的迁移时,根据hdfs 数据block块迁移到另一hdfs 集群 的时候,新的hbase表会出现源没有的这种情况需要重新生成数据源meta
  3. 进行修复

3.1 修复命令:

  1. 查看hbasemeta情况
  2. hbase hbck
  3. 1.重新修复hbase meta表(根据hdfs上的regioninfo文件,生成meta表)
  4. hbase hbck -fixMeta
  5. 2.重新将hbase meta表分给regionserver(根据meta表,将meta表上的region分给regionservere
  6. hbase hbck -fixAssignments
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注