Hbase入门之三HBase Client API使用入门1

本文是关于Hbase的入门介绍,讲解了Hbase的分布式特性、面向列的存储方式,以及如何通过HBase Client API进行表的创建、数据的插入、查询、删除等操作。此外,还分享了Hbase的最佳实践,如减少字段名长度以降低存储开销,调整region大小以避免过多split操作等。
摘要由CSDN通过智能技术生成
Hbase的基本介绍

  今天公司进行了一样关于Hbase的培训,让我对Hbase有了基础的了解。和大家分享一样。自己的理解不是很深,如果有说的不对地方,希望大家斧正。

  什么是Hbase?

  HBase是一个分布式的、面向列的开源数据库。

  分布式:Hbase的分布式是依托于Hadoop的,那Hadoop又是什么?Hadoop 是一个能够对大量数据进行分布式处理的软件框架。其实我也不懂这是个什么框架,我的理解是利用Hadoop可以将很多台服务器集成一个集群,接受这个框架统一的调配。不再是分散的,而变成一个有机的整体。Hbase架设在整个服务器集群上。当Hbase创建表时,Hbase会建立一个region,假设为A(默认的region大小为64M),当表中数据越来越大,大小超过64M时,就会发生spite即将这台服务器上该region移动到另外一台服务器上,重新建立一个region B继续保存数据,然后超过64M又继续spite。 这样可以将数据分摊到整个服务器的集群中,在查询的时候会首先查找A,如果没有继续查B....这样充分利用了多台服务器资源,防止某一单一的服务器查询工作量过大,实现了负载均衡。 Hbase还可以实现MapReduce。 MapReduce其实就是Map和Reduce两个步骤。Map是将数据分散到各个服务器上去。Reduce就是每个服务器做同样的工作,然后统计出结果。比如:有一张全国所有人名字的表,服务器集群有6台机器,我们想统计出全国姓”张“有多少个。首先Map过程会将这样表分成6份,放到集群中的6台机器中。Reduce就是每台机器都统计自己分到的表中有多少个姓”张“的。然后将每台机器的结果汇总。得出结果。让效率得到极大的提高。

  面向列:指的是同一个列簇里所有数据都存放在一个文件中,从而在读写时有效降低磁盘I/O的开销,并且由于类似数据存放在一起,提高了压缩比。Hbase数据存储是一个四维的表,1、Rowkey 2、版本数 3、ColumnFamily 4、Qualify。Rowkey就是这个表的关键字,相当于一个Map的key。然后value是ColumnFamily。 版本数是数据的版本的数,是以时间戳来记录的。默认的Hbase记录数据的3个版本。就是第一次存入的数据是第一个版本,然后更新之后的数据,Hbase不会讲原来的数据删除,而是作为该数据的老版本继续保留。直到更新的3次。才将最原始数据删除。这样导致数据量翻了3倍。如果不需要最好在更改默认设置。ColumnFamily也相当于一个Map里面继续存Qualify。不过ColumnFamily最好不要超过3个。3个以上会导致查询速率出现问题。Qualify同样是一个Map结构。里面支持好像支持100W对键值对。 以一个例子来看一样Hbase的存储结构吧。例如:一张个人信息表,姓名:Mark 年龄:22 性别:男 毕业学校:xxx学校  获奖情况:最佳新人奖。 可以这样建立表结构,Rowkey中存入姓名Mark,2个ColumnFamily一个保存这个人的base基本信息如:年龄,性别,一个保存other其他信息。如:学校、获奖。然后Qualify保存详细信息,如name:mark。 最后得到格式为:  mark:{"base":{"name":"Mark","age":22,"sex":"man"},"other":{"school":"xxx学校",{"reward":"最佳新人奖"}}}  可以看到所有的列名都会存在数据库中所以最好将名字取得短。

  还有一个索引问题,这种map类型的数据格式。是没有索引的。如果要加索引就是以要加索引的字段为key,原来的Rowkey做值重新建立一张表。也可以存入其他数据。这个就看使用空间换时间还是用时间换空间了。

  大概就是这么一个基本介绍。

  最佳实践:

  1、如果不要用到多版本记录。那么就将最大版本数设为1。否则会多增加很多数据量。

  2、尽可能将字段的名字长度减少,因为这些也都会保存到数据库中。

  3、当存入数据量很大,很快的时候,可以调节region的大小。防止过多的spite操作。过多的spite的操作可能导致hbase挂掉,从而会导致整个集群宕机。

  4、在存入数据前,先把表格式定好。因为存Hbase中的数据一般都是上T的数据,没办法更改表结构。只能重新建立表导入。



前言


1. 创建表:(由master完成)

  • 首先需要获取master地址(master启动时会将地址告诉zookeeper)因而客户端首先会访问zookeeper获取master的地址
  • client和master通信,然后有master来创建表( 包括表的列簇,是否 cache ,设置存储的最大版本数,是否压缩等 )。

2. 读写删除数据

  • client与regionserver通信,读写、删除数据
  • 写入和删除数据时讲数据打上不同的标志append,真正的数据删除操作在compact时发生

 3. 版本信息

configuration


HbaseConfiguration, 表示HBase的配置信息

两种构造函数如下:

public HBaseConfiguration() -----------默认的构造方式会从hbase-default.xml和hbase-site.xml中读取配置,如果classpath中没有这两个文件,需要自己配置

public HBaseConfiguration(final Configuration c)

eg:

    static HBaseConfiguration cfg = null;
    static {
        Configuration HBASE_CONFIG = new Configuration();
        HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.1.95");
        HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181");
        cfg = new HBaseConfiguration(HBASE_CONFIG);
    }

创建表


 使用HBaseAdmin对象的createTable方法

 eg:

public static void createTable(String tableName) { 
            System.out.println("************start create table**********"); 
            try { 
                HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); 
                if (hBaseAdmin.tableExists(tableName)) {
 // 如果存在要创建的表,那么先删除,再创建 
  hBaseAdmin.disableTable(tableName); 
  hBaseAdmin.deleteTable(tableName); 
  System.out.println(tableName + " is exist"); 
                } 
                HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);// 代表表的schema 
                tableDescriptor.addFamily(new HColumnDescriptor("name")); //增加列簇 
                tableDescriptor.addFamily(new HColumnDescriptor("age")); 
                tableDescriptor.addFamily(new HColumnDescriptor("gender")); 
                hBaseAdmin.createTable(tableDescriptor); 
            } catch (MasterNotRunningException e) { 
                e.printStackTrace(); 
            } catch (ZooKeeperConnectionException e) { 
                e.printStackTrace(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
            System.out.println("*****end create table*************"); 
        } 
public static void main(String[] agrs) {
        try {
            String tablename = "wishTest";
            HBaseTest.createTable(tablename);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

日志信息如下:

************start create table********** 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Client environment:host.name=LJ-PC 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Client environment:java.version=1.6.0_11 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Sun Microsystems Inc. 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Client environment:java.home=D:\java\jdk1.6.0_11\jre 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Client environment:java.class.path=.... 
... 
14/05/18 14:14:22 INFO zookeeper.RecoverableZooKeeper: The identifier of this process is 6560@LJ-PC 
14/05/18 14:14:22 INFO zookeeper.ClientCnxn: Socket connection established to hadoop/192.168.1.95:2181, initiating session 
14/05/18 14:14:22 INFO zookeeper.ClientCnxn: Session establishment complete on server hadoop/192.168.1.95:2181, sessionid = 0x460dd23bda0007, negotiated timeout = 180000 
14/05/18 14:14:22 INFO zookeeper.ZooKeeper: Session: 0x460dd23bda0007 closed 
14/05/18 14:14:22 INFO zookeeper.ClientCnxn: EventThread shut down 
*****end create table*************

在centos中查看是否创建成功:

  网页上查看:

 

  HTableDescriptor其他方法如下:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值