重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、 创建表:
hbase(main):005:0> create 'users','info'
其中,info是users表的一个列族,HBase中的表必须至少有一个列族。
HBase创建表时没提到任何列或者数据类型。除了列族名字,不需要什么。这是HBase被称为"无模式"数据库的原因。
十余年的桦南网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整桦南建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“桦南网站设计”,“桦南网站推广”以来,每个客户项目都认真落实执行。
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可以看做是一个键值数据库。抽象看逻辑模型,可以把坐标视为键,把单元数据视为值。