温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

HBase入门

发布时间:2020-03-13 16:21:01 来源:网络 阅读:536 作者:maninglwj 栏目:关系型数据库

一、 创建表:
hbase(main):005:0> create 'users','info'
其中,info是users表的一个列族,HBase中的表必须至少有一个列族。
HBase创建表时没提到任何列或者数据类型。除了列族名字,不需要什么。这是HBase被称为"无模式"数据库的原因。

hbase(main):006:0> list
hbase(main):007:0> describe 'users'
DESCRIPTION                                                                           ENABLED                                      
 'users', {NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPL true                                         
 ICATION_SCOPE => '0', VERSIONS => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', T                                              
 TL => '2147483647', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY =                                              
 > 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'true'}                                                                        
1 row(s) in 0.0580 seconds
显示表的名字和列族的列表

二、建立连接
1.Htable对象用来和一张Hbase表来交流。
创建一张表实例是个开销很大的操作,需要占用网络资源。
    Configuration myconf = new Configuration();
  //HTableInterface users = new HTable(myconf,"users");   //创建一张表实例。开销比较大。

  
  HConnection hc = HConnectionManager.getConnection(myconf);
  HTableInterface users = hc.getTable("users");         //使用连接池getTable。
  users.close();
  
2.数据操作:
HBase表的行有唯一标识,叫做行键rowkey。
有5个基本命令来访问HBase,Get(读)、Put(写)、Delete(删除)、Scan(扫描)、Increment(递增)。
Hbase中所有数据都是作为原始数据使用"字节数组"的形式存储的,行键也如此。

提交数据:
使用Put对象存储要插入/提交的数据。
HBase中使用坐标来定位表中的数据。行键是第一个坐标、下一个是列族、再下一个坐标是列限定符(column qualifier)。列限定符分别是name、email和password。
Put p = new Put(Bytes.toBytes("TheRealMT"));
p.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("Mark Twain"));
p.add(Bytes.toBytes("info"), Bytes.toBytes("email"), Bytes.toBytes("mt@google.com"));
p.add(Bytes.toBytes("info"), Bytes.toBytes("password"), Bytes.toBytes("lamborgini"));
 
修改数据:
修改数据与插入数据的方式,是一样的,也是使用Put对象。

工作机制:HBase写路径
默认情况下,执行写入时会写到2个地方:预写式日志(write-ahead log ,也成HLog)和MemStore。MemStore是内存里的写入缓冲区。 HFile是HBase使用的底层存储格式。 
如果HBase服务器宕机,没有从MemStore里刷写到HFile的数据将可以通过WAL来回复。

读数据:
创建一个Get命令实例。Result r = users.get(g);
HBase在读操作上使用了LRU(最近最少使用算法)缓存技术。也叫作BlockCache,和MemStore在一个JVM堆里。

删除数据:
Delete命令并不立即删除数据,也就是说不是物理删除,只是打上了删除标记。HFile文件是不能该表的,直到执行一次大合并,这些墓碑记录才会被处理,被删除记录占用的空间才释放。
合并分为小合并和大合并。小合并是将多个小HFile合并生成一个大HFile,大合并同时处理一个列族的所有HFile

有时间版本的数据:
HBase出了无模式外,还是有时间版本的数据库。

HBase数据模型:
表:
行:
列族:
列限定符:
单元:行键、列族和列限定符一起确定一个单元。
时间版本:每个单元值都有一个时间版本。

下面代码中,涉及到了HBase表中数据,增加、修改、删除、读取数据的方法,TablesControl.java

package com.pmpa.hbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HConnection;
import org.apache.hadoop.hbase.client.HConnectionManager;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
/**
 * HBase表操作,增删改查。
 * @author Neil
 * @Date  2016-07-18
 */
public class TablesControl {
 /**
  * @param args
  * @throws IOException 
  */
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  Configuration myconf = new Configuration();
  myconf.set("hbase.zookeeper.quorum", "10.101.22.31");
  myconf.set("hbase.zookeeper.property.clientPort", "5181");
  HTableInterface users = new HTable(myconf,"users");
  
//  HConnection hc = HConnectionManager.getConnection(myconf);
//  HTableInterface users = hc.getTable("users");
  
  //插入数据。
  //创建Put对象
  Put p = new Put(Bytes.toBytes("TheRealMT"));
  p.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("Mark Twain"));
  p.add(Bytes.toBytes("info"), Bytes.toBytes("email"), Bytes.toBytes("mt@google.com"));
  p.add(Bytes.toBytes("info"), Bytes.toBytes("password"), Bytes.toBytes("lamborgini"));
  users.put(p);
  
  //修改数据
  Put p1 = new Put(Bytes.toBytes("TheRealMT"));
  p1.add(Bytes.toBytes("info"), Bytes.toBytes("password"), Bytes.toBytes("Porsche"));
  users.put(p1);
  
  //读取数据
  Get g = new Get(Bytes.toBytes("TheRealMT"));
  g.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
  g.addColumn(Bytes.toBytes("info"), Bytes.toBytes("password"));
  Result r = users.get(g);
  byte[] b = r.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
  System.out.println("The name of the one is " + Bytes.toString(b));
  
  //删除操作: 
  Delete del = new Delete(Bytes.toBytes("TheRealMT"));
  del.deleteColumns(Bytes.toBytes("info"), Bytes.toBytes("password"));  //deleteColumns是删除列标识符,deleteColumn是直接删除某个行键。
  users.delete(del);
  
  users.close();
 }
}


3.数据坐标:
HBase使用的坐标依次是行键、列族、列限定符和时间版本。把所有坐标视为一个整体,HBase可以看做是一个键值数据库。抽象看逻辑模型,可以把坐标视为键,把单元数据视为值。

向AI问一下细节
推荐阅读:
  1. HBase简介
  2. HBase调研

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI