Hadoop HBase

简介:

一、概述: 

1、定义:HBase是Google Bigtable的开源山寨版本。是建立的HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时、随机读写的数据库系统。

        它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

 

2、特点:

       HBase中的表一般有这样的特点:

(1) 、大:一个表可以有上亿行,上百万列

(2)、 面向列面向列(族)的存储和权限控制,列(族)独立检索。

(3)、稀疏对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。


二、hbase命令行:

1、进入hbase命令行  ./hbase shell

2、显示hbase中的表   list

3、创建user表,包含info、data两个列族

create 'user', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}

4、向user表中插入信息:

(1)、插入row key为rk0001,列族info中添加name列标示符,值为zhangsan

 put 'user', 'rk0001', 'info:name', 'zhangsan'

(2)、插入row key为rk0001,列族info中添加gender列标示符,值为female

 put 'user', 'rk0001', 'info:gender', 'female'

(3)、插入row key为rk0001,列族info中添加age列标示符,值为20

 put 'user', 'rk0001', 'info:age', 20

(4)、插入row key为rk0001,列族data中添加pic列标示符,值为picture

 put 'user', 'rk0001', 'data:pic', 'picture'

5、get获取数据:

(1)、获取user表中row key为rk0001的所有信息

   get 'user', 'rk0001'

(2)、获取user表中row key为rk0001,info列族的所有信息

get 'user', 'rk0001', 'info'

(3)、获取user表中row key为rk0001,info列族的name、age列标示符的信息

get 'user', 'rk0001', 'info:name', 'info:age'

(4)、获取user表中row key为rk0001,info、data列族的信息

get 'user', 'rk0001', 'info', 'data'

get 'user', 'rk0001', {COLUMN => ['info', 'data']}

(5)、获取user表中row key为rk0001,列族为info,版本号最新5个的信息

get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}

6、scan获取数据:

(1)、查询user表中的所有信息

    scan 'user'

(2)、查询user表中row key以rk字符开头的

scan 'user',{FILTER=>"PrefixFilter('rk')"}

(3)、查询user表中列族为info,rk范围是[rk0001, rk0003)的数据

scan 'people', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

(4)、查询user表中列族为info和data且列标示符中含有a字符的信息

scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

(5)、查询user表中指定范围的数据

scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

7、删除数据

(1)、删除user表row key为rk0001,列标示符为info:name的数据

delete 'user', 'rk0001', 'info:name'

(2)、删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据

delete 'user', 'rk0001', 'info:name', 1392383705316

8、删除表

disable 'user'

drop 'user'

三、HBase的java api:


import java.util.List;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.Cell;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.HTableDescriptor;

import org.apache.hadoop.hbase.KeyValue;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.Delete;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HBaseAdmin;

import org.apache.hadoop.hbase.client.HTable;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.filter.BinaryComparator;

import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;

import org.apache.hadoop.hbase.filter.ByteArrayComparable;

import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;

import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;

import org.apache.hadoop.hbase.filter.FamilyFilter;

import org.apache.hadoop.hbase.filter.Filter;

import org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter;

import org.apache.hadoop.hbase.filter.PrefixFilter;

import org.apache.hadoop.hbase.filter.QualifierFilter;

import org.apache.hadoop.hbase.filter.RegexStringComparator;

import org.apache.hadoop.hbase.filter.RowFilter;

import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;

import org.apache.hadoop.hbase.filter.SubstringComparator;

import org.apache.hadoop.hbase.master.TableNamespaceManager;

import org.apache.hadoop.hbase.util.Bytes;

import org.junit.Before;

import org.junit.Test;


public class HbaseDemo {


private Configuration conf = null;

@Before

public void init(){

conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "node1,node2,node3");

}

@Test

public void testDrop() throws Exception{

HBaseAdmin admin = new HBaseAdmin(conf);

admin.disableTable("account");

admin.deleteTable("account");

admin.close();

}

@Test

public void testPut() throws Exception{

HTable table = new HTable(conf, "person_info");

Put p = new Put(Bytes.toBytes("person_rk_bj_zhang_000002"));

p.add("base_info".getBytes(), "name".getBytes(), "zhangwuji".getBytes());

table.put(p);

table.close();

}

@Test

public void testGet() throws Exception{

HTable table = new HTable(conf, "person_info");

Get get = new Get(Bytes.toBytes("person_rk_bj_zhang_000001"));

get.setMaxVersions(5);

Result result = table.get(get);

List<Cell> cells = result.listCells();

   //result.getValue(family, qualifier);  可以从result中直接取出一个特定的value

//遍历出result中所有的键值对

for(KeyValue kv : result.list()){

String family = new String(kv.getFamily());

System.out.println(family);

String qualifier = new String(kv.getQualifier());

System.out.println(qualifier);

System.out.println(new String(kv.getValue()));

}

table.close();

}

/**

* 多种过滤条件的使用方法

* @throws Exception

*/

@Test

public void testScan() throws Exception{

HTable table = new HTable(conf, "person_info".getBytes());

Scan scan = new Scan(Bytes.toBytes("person_rk_bj_zhang_000001"), Bytes.toBytes("person_rk_bj_zhang_000002"));

//前缀过滤器----针对行键

Filter filter = new PrefixFilter(Bytes.toBytes("rk"));

//行过滤器

ByteArrayComparable rowComparator = new BinaryComparator(Bytes.toBytes("person_rk_bj_zhang_000001"));

RowFilter rf = new RowFilter(CompareOp.LESS_OR_EQUAL, rowComparator);

/**

         * 假设rowkey格式为:创建日期_发布日期_ID_TITLE

         * 目标:查找  发布日期  为  2014-12-21  的数据

         */

        rf = new RowFilter(CompareOp.EQUAL , new SubstringComparator("_2014-12-21_"));

//单值过滤器 1 完整匹配字节数组

new SingleColumnValueFilter("base_info".getBytes(), "name".getBytes(), CompareOp.EQUAL, "zhangsan".getBytes());

//单值过滤器2 匹配正则表达式

ByteArrayComparable comparator = new RegexStringComparator("zhang.");

new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);


//单值过滤器2 匹配是否包含子串,大小写不敏感

comparator = new SubstringComparator("wu");

new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);


//键值对元数据过滤-----family过滤----字节数组完整匹配

        FamilyFilter ff = new FamilyFilter(

                CompareOp.EQUAL , 

                new BinaryComparator(Bytes.toBytes("base_info"))   //表中不存在inf列族,过滤结果为空

                );

        //键值对元数据过滤-----family过滤----字节数组前缀匹配

        ff = new FamilyFilter(

                CompareOp.EQUAL , 

                new BinaryPrefixComparator(Bytes.toBytes("inf"))   //表中存在以inf打头的列族info,过滤结果为该列族所有行

                );

        

       //键值对元数据过滤-----qualifier过滤----字节数组完整匹配

        

        filter = new QualifierFilter(

                CompareOp.EQUAL , 

                new BinaryComparator(Bytes.toBytes("na"))   //表中不存在na列,过滤结果为空

                );

        filter = new QualifierFilter(

                CompareOp.EQUAL , 

                new BinaryPrefixComparator(Bytes.toBytes("na"))   //表中存在以na打头的列name,过滤结果为所有行的该列数据

        );

        //基于列名(即Qualifier)前缀过滤数据的ColumnPrefixFilter

        filter = new ColumnPrefixFilter("na".getBytes());

        

        //基于列名(即Qualifier)多个前缀过滤数据的MultipleColumnPrefixFilter

        byte[][] prefixes = new byte[][] {Bytes.toBytes("na"), Bytes.toBytes("me")};

        filter = new MultipleColumnPrefixFilter(prefixes);

 

        //为查询设置过滤条件

        scan.setFilter(filter);

        

        

scan.addFamily(Bytes.toBytes("base_info"));

ResultScanner scanner = table.getScanner(scan);

for(Result r : scanner){

/**

for(KeyValue kv : r.list()){

String family = new String(kv.getFamily());

System.out.println(family);

String qualifier = new String(kv.getQualifier());

System.out.println(qualifier);

System.out.println(new String(kv.getValue()));

}

*/

//直接从result中取到某个特定的value

byte[] value = r.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"));

System.out.println(new String(value));

}

table.close();

}

@Test

public void testDel() throws Exception{

HTable table = new HTable(conf, "user");

Delete del = new Delete(Bytes.toBytes("rk0001"));

del.deleteColumn(Bytes.toBytes("data"), Bytes.toBytes("pic"));

table.delete(del);

table.close();

}

public static void main(String[] args) throws Exception {

Configuration conf = HBaseConfiguration.create();

//conf.set("hbase.zookeeper.quorum", "weekend05:2181,weekend06:2181,weekend07:2181");

HBaseAdmin admin = new HBaseAdmin(conf);

TableName tableName = TableName.valueOf("person_info");

HTableDescriptor td = new HTableDescriptor(tableName);

HColumnDescriptor cd = new HColumnDescriptor("base_info");

cd.setMaxVersions(10);

td.addFamily(cd);

admin.createTable(td);

admin.close();


}


}












本文转自lzf0530377451CTO博客,原文链接:http://blog.51cto.com/8757576/1840366 ,如需转载请自行联系原作者




相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
84 0
|
8月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
143 0
|
4月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
53 0
|
3月前
|
存储 分布式计算 Hadoop
Hadoop中的HBase是什么?请解释其作用和用途。
Hadoop中的HBase是什么?请解释其作用和用途。
40 0
|
4月前
|
SQL 分布式计算 Hadoop
Hadoop学习笔记(HDP)-Part.16 安装HBase
01 关于HDP 02 核心组件原理 03 资源规划 04 基础环境配置 05 Yum源配置 06 安装OracleJDK 07 安装MySQL 08 部署Ambari集群 09 安装OpenLDAP 10 创建集群 11 安装Kerberos 12 安装HDFS 13 安装Ranger 14 安装YARN+MR 15 安装HIVE 16 安装HBase 17 安装Spark2 18 安装Flink 19 安装Kafka 20 安装Flume
82 1
Hadoop学习笔记(HDP)-Part.16 安装HBase
|
8月前
|
分布式计算 Hadoop 分布式数据库
开机时监听Hadoop和Zookpeer启动之后再启动Hbase
开机时监听Hadoop和Zookpeer启动之后再启动Hbase
|
8月前
|
存储 分布式计算 Hadoop
Hadoop之Hbase安装和配置
Hadoop之Hbase安装和配置
738 0
|
12天前
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
36 2
|
12天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
14天前
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
54 1

热门文章

最新文章

相关实验场景

更多