大数据HBase(二)

大数据HBase(二)

Hbase的shell命令
1. help 帮助命令
   help '命令名字'
2. hbase中数据库的概念
   hbase中没有数据库的概念 , 只有 namespace,我们为了方便,暂时也叫做数据库
   2.1 显示所有的数据库
       list_namespace
       默认会有  default    hbase   两个库
   2.2 显示当前数据库中所有的表 (namespace_name 以下简称 ns)
       list_namespace_tables  'ns'
   2.3 创建一个数据库
       create_namespace  'ns'
   2.4 描述数据库
       describe_namespace  'ns'
   2.5 修改数据库
       alter_namespace
   2.6 删除数据库
       drop_namespace 'ns'
3. 创建hbase中的表【重点】
   3.1 基本的建表方式【默认建在default库中】
       create 't1','cf1'   ----  t1:代表表名   cf1:代表列簇
   3.2 创建多个列簇【默认建在default库中】
       create 't1','cf1','cf2'
   3.3 指定表所属的数据库
       create 'ns:t1','cf1'
   3.4 详细描述列簇的相关属性
       create 'ns:t2',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2'}
4. 描述表
   describe 'ns:t1'
5. 修改表
   alter 'ns:t2',{NAME=>'cf2',VERSIONS=>2}
6. 删除表
   disable 'ns:t2'
   drop 'ns: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=>'001',STOPROW=>'003'}
   # 不包括stoprow的值
13. 某条数据的查询
   get 'ns:t1','rowkey'
   get 'ns:t1','rowkey','base:cf1'
Hbase集群的搭建(我是以三台虚拟机为例,如有需要可以扩充)

hadoop.hbase1、hadoop.hbase2、hadoop.hbase3

  1. 时间同步集群

    hadoop.hbase1 作为时间同步服务器  主节点
    1. yum -y install ntp   yum安装ntp
    2. service ntpd start   三台虚拟机
       chkconfig ntpd on   设置开机自启动
    3. 服务器节点 主节点
       ntpdate -u 202.112.10.36   同步主节点时间
       
       vi /etc/ntp.conf    修改配置文件  添加以下内容
       
       restrict 192.168.134.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 主节点IP
    7. date 命令查看处理结果
    
  2. Hadoop集群(详见 大数据Hadoop、yarn学习笔记)

    HDFS集群
    Yarn集群
    
  3. Zookeeper集群(详见 大数据zookeeper 学习笔记)

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

    1. 准备:hbase_home下  data/tmp  logs目录中的内容清空
     		hdfs服务器  上面 hbase目录清空  如果没有 需要创建 hbase文件夹
    2. 修改 hbase_home/conf/hbase-env.sh
       export JAVA_HOME=/usr/java/jdk1.7.0_71    #本机安装jdk的路径
       export HBASE_MANAGES_ZK=false    #默认true:使用集群自带的zookeeper
    3. conf/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://hadoop41:8020/hbase</value>
    	</property>
    	<property>
       		 <name>hbase.cluster.distributed</name>
       		 <value>true</value>
    	</property>
    	<property>
    		<name>hbase.zookeeper.quorum</name>
    	<value>hadoop41,hadoop42,hadoop43</value>
    	</property>
    4. regionservers
       hadoop.hbase1
       hadoop.hbase2
       hadoop.hbase3
    5. 替换 hbase_home/lib 下面的jar包   hadoop  zookeeper  jar    
        #此步骤同 hbase伪分布式集群搭建步骤
    6. scp分发 给其他两个从机
    7. 启动hbase
       bin/hbase-daemon.sh start master
       bin/hbase-daemon.sh start regionserver
    
Hbase的Java API
# java访问Hbase的核心API
Configuration	Hbase相关的配置
HTable       	Hbase中的表
Put         	插入数据
Get         	查询数据
Scan         	扫描数据
BytesUtil   	字节处理

pom.xml

<!-- 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>
对象作用基本用法
ConfigurationHbase相关的配置文件conf.set(“key”,“value”);
HTableHbase中的表表相关的操作都是HTable完成
PutHbase中插入数据Put put=new Put(rowkey)
put.add
HTable.put(put)
DeleteHbase中的删除操作Delete delete = new Delete(rowkey)
HTable.delete(delete)
GetHbase查询单条数据Get get = new Get(rowkey)
HTabel.get(get) --> result
Result单行数据Result – Cells – Cell
cloneFamily
cloneQualify
cloneValue
Scan表的扫描ResultScanner —> Result
Hbase中的过滤器
  1. 行键相关的过滤

    1. 比较行键值的大小
       Filter filter = new RowFilter(CompareFilter.CompareOp.GREATER,new BinaryComparator(Bytes.toBytes('rowkey')));
       // rowkey 为需要比较的行键值  需要填入真实的行键
       scan.setFilter(filter);
    2. 比较行键 按照自己设定的规则设计
       Filter filter = new PrefixFilter(Bytes.toBytes('xxx'));
       //xxx:需要填入 自定义的行键值,可以是行键的一部分  比如:rowkey:0001  xxx:000
       scan.setFilter(filter);
    
  2. 列簇相关的筛选

    1. 只要base列簇相关的数据
       Filter filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes('cf')));
       // cf:column family  填入需要筛选的列簇
       scan.setFilter(filter);
    
  3. 限定符相关的筛选

    ~~Filter filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes('qualify')));
    //qualify:填入需要筛选的限定符
    scan.setFilter(filter); 
    
  4. 值的筛选

    Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator('value'));
    //value:填入需要筛选的值
    scan.setFilter(filter);
    
  5. 列簇中的数据筛选

    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("cf"),Bytes.toBytes("qualify"),CompareFilter.CompareOp.EQUAL,new SubstringComparator("value")); filter.setFilterIfMissing(true);
    //filter.setFilterIfMissing(false);
    //符合要求的数据 password=123456
    //column 中不包含password限定符 查询出来
    scan.setFilter(filter);
            
    
    同时要排除qualify限定符        
    SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter(Bytes.toBytes("cf"),Bytes.toBytes("qualify"),CompareFilter.CompareOp.NOT_EQUAL,new SubstringComparator("value"));
    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('xxx'));
    
    SingleColumoValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes('cf'),Bytes.toBytes('qualify'),CompareFilter.CompareOp.EQUAL,new SubstringComparator('value'));
    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 【重点】
    在这里插入图片描述

  2. HMaster作用

    1. HRegionServer 集群是否健康 
    2. Region---RegionServer分配
    3. 新Region加入后,负载均衡
    
  3. Zookeeper作用 【重点】

    1. 管理HMaster的高可用
    2. 存储了HBase中非常重要的信息  meta信息
       rowkey 范围  ---- region  ---- RegionServer(健康)
    
  4. HBase compact 和 split
    在这里插入图片描述

RowKey设计
1. HBase相关的查询操作,95%上都是对RowKey查询。
2. 设计过程 
   2.1 复合
   2.2 查询内容作为rowkey组成
3. rowkey 64K 10--100字节唯一
4. rowkey结合自己的实际需求
   4.1  区域查询多,建议 rowkey 连续    
   4.4  区域查询少,散列 hash ---> 加密、UUID
System.out.println(UUID.randomUUID().toString());
String rowkey = "suns_male_130";
String result = DigestUtils.md5Hex(rowkey);
System.out.println(result);
HBase优化策略
  1. 解决热点效应

    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. 根本上解决热点问题需要注意如下几点
       1. 预分区
       2. rowkey设置
       综上2者尽量解决热点问题。
    
  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 对空间)
       1. 让数据尽可能多的放置在内存中,提高检索效率
       2. 避免flush memstore 阻塞client操作
       hbase.regionserver.global.memstore.size.lower.limit 当全局flush到 memstore用量达95%不在flush
       
       hfile.block.cache.size 0.4
    3. hbase内部的块数据索引,布隆过滤器
    
  3. JVM参数配置

    1. JVM Java进程 
    2. 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:$HBASE_HOME/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:$HBASE_HOME/logs/gc-${hostname}-hbase.log”
    
    
  4. mslab

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

    结合定时,shell脚本 完成处理
    hbase tools 手工操作 compact split
    
    test.sh
    /opt/install/hbase-0.98.6-hadoop2/bin/hbase shell /root/hbase/test
    
HBase与MapReduce的集成
  1. Hbase为什么需要和MR集成?

    HBase数据的迁移。

  2. MR改如何与HBase集成

    hadoop-env.sh 
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/install/hbase-0.98.6-hadoop2/lib/*
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值