HBase

引言

hbase是Apache组织开源的顶级项目distributed,scalable,big data store产品
hbase是基于Hadoop的一个NoSQL产品 Colume类型的nosql
hbase是Google Big Table的开源实现
hbase运行亿级数据查询是,效率可达到秒级,毫秒级 可在线处理实时处理

Hbase存储的逻辑结构

在这里插入图片描述
Hbase伪分布式环境的搭建

1. linux服务器 ip 主机名 主机映射 防火墙 selinux ssh免密 jdk
2. hadoop安装
   2.1 解压缩
   2.2 6个配置文件
   2.3 格式化
   2.4 启动进程
3. 安装zookeeper
   3.1 解压缩
   3.2 配置conf/zoo.cfg 
   3.3 创建临时目录 data ---> myid文件(集群)
   3.4 启动服务
4. hbase的安装
   4.1 解压缩hbase
   4.2 hdfs上创建 /hbase文件夹
                 hbase_home/data/tmp文件夹
   4.3 修改hbase相关的配置文件 
       env.sh
       export HBASE_MANAGES_ZK=false
       export JAVA_HOME=/usr/java/jdk1.7.0_71
       hbase-site.xml 
       <property >
	   <name>hbase.tmp.dir</name>
	   <value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value>
       </property>
       <property >
            <name>hbase.rootdir</name>
            <value>hdfs://hadoop31.baizhiedu.com:8020/hbase</value>
        </property>
        <property >
            <name>hbase.cluster.distributed</name>
            <value>true</value>
        </property>
        <property>
            <name>hbase.zookeeper.quorum</name>
            <value>hadoop31.baizhiedu.com</value>
        </property>
   4.4 修改
       regionservers文件
       hadoop31.baizhiedu.com
   4.5 替换hbase相关hadoop的jar
   4.6 启动hbase
       bin/hbase-daemon.sh start master
       bin/hbase-daemon.sh start regionserver
   4.7 网络访问
       http://hadoop31.baizhiedu.com:60010
       bin/hbase shell

Hbase的shell命令

1. help 帮助命令
   help '命令名字'
2. hbase中数据库的概念
   namespace 
2.1 显示所有的数据库 
    list_namespace 
    默认  default  
          hbase
2.2 显示当前数据库中所有的表
    list_namespace_tables 'hbase'
2.3 创建一个数据库
    create_namespace 'baizhi150'
2.4 描述数据库
    describe_namespace 'baizhi150'
2.5 修改数据库
    alter_namespace
2.6 删除数据库
    drop_namespace 'baizhi150'
3. 创建hbase中的表【重点】
3.1 基本的建表方式 【默认default库中】
   create 't1','cf1'
3.2 创建多个列簇【默认default库中】
   create 't1','cf1','cf2'
3.3 指定表所属的数据库
   create 'baizhi150:t1','cf1'
3.4 详细描述列簇的相关属性
   create 'baizhi150:t2',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2'}
4. 描述表 
   describe 'baizhi150:t1'
5. 修改表
   alter 'baizhi150:t2',{NAME=>'cf2',VERSIONS=>2}
6. 删除表
   disable 'baizhi150:t2'
   drop 'baizhi150:t2'
7. 失效 生效表相关命令
   enable disable 
   enable_all disable_all
   is_enable is_disable
8. 判断表是否存在
   exists 
9. 表的查找命令
   list 'ns:t.*'
10. 插入数据
   put 't1',’rowkey‘,'family:qualify','value'
   put 'ns:t1',’rowkey‘,'family:qualify','value'
11. 删除数据
   delete 'ns:t1' ,'rowkey','family:qualify',timestamp
12. 全表扫描 
    scan '表名'
    scan 'ns1:tb1', {STARTROW => '20170521_10001',STOPROW => '20170521_10003'}
    scan 'baizhi150:user',{STARTROW=>'001',STOPROW=>'004'}
    不包括stoprow的值
13. 某条数据的查询
    get 'baizhi150:user','001'
    get 'baizhi150:user','001','base:name'

Hbase集群的搭建

1.时间同步

 hadoop41.baizhiedu.com 作为时间同步服务器 主节点
 1. yum install ntp 三台机器
 2. service ntpd start 三台机器
 chkconfig ntpd on
 3. 服务器节点 主节点
 ntpdate -u 202.112.10.36
 vi /etc/ntp.conf
 restrict 192.168.111.0 mask 255.255.255.0 nomodify notrap
 # 中国这边最活跃的时间服务器 : http://www.pool.ntp.org/zone/cn
 server 210.72.145.44 perfer      # 中国国家受时中心
 server 202.112.10.36             # 1.cn.pool.ntp.org
 server 59.124.196.83             # 0.asia.pool.ntp.org

# 允许上层时间服务器主动修改本机时间
restrict 210.72.145.44 nomodify notrap noquery
restrict 202.112.10.36 nomodify notrap noquery
restrict 59.124.196.83 nomodify notrap noquery

# 外部时间服务器不可用时,以本地时间作为时间服务
server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10
service ntpd restart

4. client端
vi /etc/ntp.conf
server 192.168.111.41 #这里指的是ntp服务的ip 192.168.206.130
restrict 192.168.111.41 nomodify notrap noquery

server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10
5. 三台机器 service ntpd restart
6. 从节点同步主节点时间 ntpdate -u 192.168.184.16
adjust time server 192.168.19.10 offset -0.017552 sec
5. date命令查看处理结果

2.Hadoop集群

HDFS集群()
Yarn集群(略)

3.Zookeeper集群

1. 解压缩
2. 创建数据文件夹
   zookeeper_home/data
3. 修改配置文件
   conf/zoo.cfg
   dataDir
   server.0 
4. 在data文件夹中创建 myid文件 0 1 2 
5. 启动服务

4.Hbase集群

1. 准备:hbase_home  data/tmp  logs目录中的内容清空
        hdfs 上面 hbase目录清空
2. 修改hbase_home/conf/hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
export HBASE_MANAGES_ZK=false
3. hbase-site.xml
<property >
    <name>hbase.tmp.dir</name>
    <value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value>
</property>
<property >
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop6.baizhiedu.com:8020/hbase</value>
</property>
<property >
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop.baizhiedu.com,hadoop1.baizhiedu.com,hadoop2.baizhiedu.com</value>
</property>
4. regionservers
hadoop.baizhiedu.com
hadoop1.baizhiedu.com
hadoop2.baizhiedu.com
5. 替换jar hadoop jar
6. scp 分发
6. 启动hbase
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver

bin/hbase shell

HBase的Java API

java访问HBase的核心API

Configruation HBase相关的配置
Htable HBase中的表
Put 插入数据
Get 查询数据
Scan 扫描数据
BytesUtil 字节处理

 <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
   <dependency>
       <groupId>org.apache.hbase</groupId>
       <artifactId>hbase-client</artifactId>
       <version>0.98.6-hadoop2</version>
   </dependency>
   
   <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
   <dependency>
       <groupId>org.apache.hbase</groupId>
       <artifactId>hbase-server</artifactId>
       <version>0.98.6-hadoop2</version>
   </dependency>

Configuration :Hbase相关的配置文件

conf.set("key","value");

HTable:Hbase中的表,表相关的操作都是HTable完成。
Put:HBase中插入数据

Put put = new Put(rowkey)
put.add
HTable.put(put)

Delete:Hbase中删除操作

Delete delete = new Delete(rowkey)
HTable.delete(delete)

Get:HBase查询单条数据

Get get = new Get(rowkey)
HTable.get(get)

Result:单行数据

Result--Cells--Cell
cloneFamily
cloneQualify
cloneValue

Scan:表的扫描

ResultScanner -->Result

Hbase中的过滤器

在这里插入图片描述
1.行键相关的过滤器

1.比较行键值的大小
Filter filter1 = new RowFilter(CompareFilter.CompareOp.GREATER, new
                BinaryComparator(Bytes.toBytes("0003")));
scan.setFilter(filter1);

2. 比较行键按照特定的规则设计	
Filter filter1 = new PrefixFilter(Bytes.toBytes("000"));
scan.setFilter(filter1);

2.列簇相关的筛选

1. 只要base列簇相关的数据
Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new
                BinaryComparator(Bytes.toBytes("base")));
scan.setFilter(filter1);

3.限定符相关的筛选

Filter filter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new
BinaryComparator(Bytes.toBytes("age")));

scan.setFilter(filter1);

4.值的筛选

Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("1") );
scan.setFilter(filter);

5.列簇中的数据进行筛选

SingleColumnValueFilter filter = new SingleColumnValueFilter(
                Bytes.toBytes("base"),
                Bytes.toBytes("sex"),
                CompareFilter.CompareOp.EQUAL,
                new SubstringComparator("male"));
          filter.setFilterIfMissing(true);
        //filter.setFilterIfMissing(false); //符合要求的数据 password=123456
                                          //column 中不包含password限定符 查询出来
        scan.setFilter(filter);
        

同时要排除password 限定符        
SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter(
                Bytes.toBytes("base"),
                Bytes.toBytes("password"),
                CompareFilter.CompareOp.NOT_EQUAL,
                new SubstringComparator("66666"));
  filter.setFilterIfMissing(true);
        //filter.setFilterIfMissing(false); //符合要求的数据 password=123456
        //column 中不包含password限定符 查询出来
        scan.setFilter(filter);

6.FilterList

设置多个过滤器 同时生效
 FilterList filterList = new FilterList();

 Filter filter1 = new PrefixFilter(Bytes.toBytes("000"));

  SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
                Bytes.toBytes("base"),
                Bytes.toBytes("password"),
                CompareFilter.CompareOp.EQUAL,
                new SubstringComparator("123456"));
  filter2.setFilterIfMissing(true);

  filterList.addFilter(filter1);
  filterList.addFilter(filter2);

  scan.setFilter(filterList);

HBase中列簇的相关属性

1. 创建HBase表
   create 'table_name',{NAME=>'',VERSIONS=>''}
2. Hbase列簇的常见属性
   # 列簇的名字
   NAME='xxxxx'
   # 列簇对应限定符 能存几个版本的数据
   VERSIONS => '1'
   # TTL Time To Live  
   指定的是cell中的数据,存储在HBase中的存活时间 'FOREVER'
   TTL => 100  
   # 指定HBase上存储的数据 是否 启动压缩
   COMPRESSION => 'NONE'
   COMPRESSION => 'snappy'
   # 列簇中的数据,存储在内存中,提高查询效率 (默认关闭)
   IN_MEMORY => 'false’ 
   # 缓存 列簇部分数据,从而提高查询效率
   BLOCKCACHE => 'true'
   # Block是列簇中存储数据的最小单位
   BLOCKSIZE => '65536'
   调整大   顺序查询  需求高
   调整小   随机查询  需求高 
   # 提高查询效率
   BLOOMFILTER 布隆过滤(哪个块里没有要查找的元素

HBase的体系结构

1.RegionServer
处理来自客户端的读写请求和底层HDFS的交互,存储数据到HDFS
负责Region的拆分、storefile的合并工作
region存储表,store存储列簇在这里插入图片描述
HMaster作用

  1. HRegionServer 集群是否健康
  2. Region—RegionServer分配
  3. 新Region加入后,负载均衡

Zookeeper作用

  1. 管理HMaster的高可用
  2. 存储了HBase中非常重要的信息 meta信息
    rowkey 范围 ---- region ---- RegionServer(健康)

HBase compact 和 split
在这里插入图片描述

Hbase优化策略

  • 解决热点效应
  1. 预分区
    在创建表时,不按照默认的策略,为表只创建一个Region,而是根据需要,为一张表创建多个Region,从而避免热点效应
  2. 预分区的依据
    基于Rowkey进行预分区
  3. 语法:
    3.1 create ‘t1’, ‘f1’, SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]
    3.2 create ‘t1’, ‘f1’, SPLITS_FILE => ‘splits.txt’
    splits.txt
    10
    20
    30
    40
    3.3 create ‘t2’, ‘f1’, {NUMREGIONS => 15, SPLITALGO => ‘HexStringSplit’}
  4. 根本上解决热点问题需要注意如下几点
    预分区
    rowkey设置
    综上2者尽量解决热点问题。
  • 提高检索效率(两种途径:设置索引,空间换时间)
  1. rowkey 相对连续 那么检索效率一定高 (顺序查询 scan操作)
  2. 设置Memstore大小 , Block Cache大小
    hbase-site.xml 设置
    hbase.hregion.memstore.flush.size 128M 每一个memstore达到128M flush
    hbase.regionserver.global.memstore.size 0.4 堆空间的40% (regionserver占用JVM 对空间)
    让数据尽可能多的放置在内存中,提高检索效率
    避免flush memstore 阻塞client操作
    hbase.regionserver.global.memstore.size.lower.limit 当全局flush到 memstore用量达95%不再flush
    hfile.block.cache.size 0.4
  3. hbase内部的块数据索引,布隆过滤器
  • JVM参数设置

JVM Java进程
JVM (堆空间) HBase
新生代 1/3 老年代 2/3 永久代(静态,常量)
eden survivor(from) survivor(to)
8 1 1
ParNewGC ConcMarkSweepGC
”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC -XX:UseConcMarkSweepGC - XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc: H B A S E H O M E / l o g s / g c − HBASE_HOME/logs/gc- HBASEHOME/logs/gc{hostname}-hbase.log”
hbase-env.sh
export HBASE_REGIONSERVER_OPTS=”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc: H B A S E H O M E / l o g s / g c − HBASE_HOME/logs/gc- HBASEHOME/logs/gc{hostname}-hbase.log”

  • mslab
  1. 防止内存碎片,内存碎片过多,内存泄露,发生FullGC,导致STW.
    hbase.hregion.memstore.mslab.enabled true
    hbase.hregion.memstore.mslab.chunksize 2M --> 4,5M 6M
  • 自动化处理的功能变成手工处理

结合定时,shell脚本 完成处理
hbase tools 手工操作 compact split
test.sh
/opt/install/hbase-0.98.6-hadoop2/bin/hbase shell /root/hbase/test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值