HBase 分布式数据库

我从来没见过我们单位的主库系统,无论是小机或者EMC。如果哪天在值班时,收到通知主库挂了,我会觉得是一个深藏在机房沉重铁门里的大家伙,冒了几缕青烟,紧接着监控上各种Web小图标就都红了....

在5、6年前,我们就希望能用分布式存储和分布式数据库来替代集中存储,觉得分布式廉价,而且高可靠。

其实,分布式存储不能替代集中存储。如果你问一个老鸟,他会给你一个关键字--事务。传统的集中存储有很强大的事务支持能力,而分布式系统不支持事务。

菜鸟就会很懵逼,事务?增删改查是事务吗? 什么是事务,我确实也不清楚,但我觉得分布式不能替换集中存储,主要因为性能,在小量数据规模下集中存储提供更高的性能。1000万条数据选择Mysql,1亿左右选择Oracle,10亿条数据用大数据。

至于高可靠,加各种HA吧。

bigtable

一、BigTable传说

03年(作者上大二),谷歌发表了三篇论文:Google FS、MapReduce、BigTable。虽然Google没有公布这三个产品的源码,但是他发布了这三个产品的详细设计论文,奠定了风靡全球的大数据算法的基础!

HBase就是基于BigTable思想,由开源社区发布的实现,除了CURD之外,还有很多特点:

  • 基于HDFS系统,存储空间不受限制
  • 可不断增加维度
  • 基于列的存储
  • 信息多版本

很多时候,HBase被当做HDFS系统的管理系统,将文件作为内容直接存储在HBase中,实现海量文件的索引、查找。

二、安装HBase,伪分布式

环境搭建,

  1. HDFS
  2. Zookeeper

下载tar包

  1. 解压
  2. 修改conf/hbase-env.sh,设置JAVA_HOME
  3. 修改配置文件conf/hbase-site.xml
   <property>
      <name>hbase.rootdir</name>
      <value>hdfs://namenode:9000/hbase</value>
   </property>
   <property>
      <name>hbase.zookeeper.quorum</name>
      <value>hbase</value>
   </property>

启动命令

bin/start-hbase.sh 
>jps
HMaster
HRegionServer

随着版本迭代,安装步骤可能变化,参照https://hbase.apache.org/book.html#getting_started

三、Shell

和MySql一样,先用shell完成一些操作。

Table操作

  • list 列出全部表
  • create "scores","grade","course" 创建一张表,命为scores,两个列族grade和course。
  • describe "score" 查看表信息。

Table scores is ENABLED scores COLUMN FAMILIES DESCRIPTION {NAME => 'course', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => ' 65536', REPLICATION_SCOPE => '0'} {NAME => 'grade', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', K EEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', C OMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6 5536', REPLICATION_SCOPE => '0'}

CURD

  • put 'scores', 'Tom', 'grade', 5 Tom是该条记录的RowKey,插入grade=5的记录;当Tom对应grade存在时,更新。
  • put 'scores', 'Tom', 'course:math', 97 Tom是该条记录的RowKey,插入course:math=97的记录
  • get 'scores', 'Tom', 'grade', 'course' 获得RowKey为Tom的记录

COLUMN CELL course:math timestamp=1534492933043, value=97 grade: timestamp=1534492881763, value=5

  • delete 'scores', 'Tom', 'course:math' 删除Rowkey 为Tom的记录。

hbase(main):011:0> delete 'scores', 'Tom', 'course:math' 0 row(s) in 0.0640 seconds hbase(main):012:0> get 'scores', 'Tom', 'grade', 'course' COLUMN CELL grade: timestamp=1534492881763, value=6 1 row(s) in 0.0210 seconds

Alert操作

  • alter 'scores', NAME => 'profile' 添加一列族
  • alter 'scores', NAME => 'profile', METHOD => 'delete' 删除列族

四、JavaApi

1.pom.xml

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>1.2.5</version>
</dependency>

2.创建Connection,获取Table对象

        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum","172.18.0.12");
        Connection connection = ConnectionFactory.createConnection(conf);

3.插入Put操作

Table table = connection.getTable(TableName.valueOf("scores"));
try {
// Use the table as needed, for a single operation and a single thread
    Put p = new Put(Bytes.toBytes("Rose"));
    p.addColumn(Bytes.toBytes("grade"),null,Bytes.toBytes("3"));
    p.addColumn(Bytes.toBytes("course"),Bytes.toBytes("math"),Bytes.toBytes("90"));
    table.put(p);
} finally {
    table.close();
    connection.close();
}

4.读取Get操作

Get get= new Get(Bytes.toBytes("Rose"));
//get.addColumn(Bytes.toBytes("course"),Bytes.toBytes("math"));
//指定列
Result result = table.get(get);
for (KeyValue keyValue : result.raw()) {
          System.out.println("列:" + new String(keyValue.getFamily())
                        +":"+ new String(keyValue.getQualifier())
                        + "====值:" + new String(keyValue.getValue()));
}

列:course:math====值:90 列:grade:====值:3

五、总结

作者接触HBase时间不长,无法估量在企业中流行程度,但已深感这个系统的强大。本文是作者一点感悟,和HBase的入门shell和Api,希望作为入门参考。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏贾老师の博客

网络数据帧与 MTU

24740
来自专栏杨建荣的学习笔记

dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)

今天来说几个问题,一个是对昨天《让我焦灼的四个问题》的升华,不能起博眼球的题目,技术分析给大家兜底了,你们看看有没有类似的问题。 还有几个小问题说说今天的感受和...

35850
来自专栏SAP最佳业务实践

SAP S/4HANA最佳业务实践:Order-to-Cash订单到收款-3合同处理

•The tile Manage Sales Contracts is part of the business catalog Sales –Contract...

39090
来自专栏转载gongluck的CSDN博客

波形音频(WAVE)底层接口的学习与使用

在WINDOWS下,音频函数有多种类型,如MCI、多媒体OLE控制、高级音频等,使用方法都比较简单。 但如果想编写一个功能较强大的音频处理程序,那...

1.3K50
来自专栏葡萄城控件技术团队

ActiveReports 报表应用教程 (6)---分组报表

在葡萄城ActiveReports报表中可以设置单级分组、嵌套分组,同时,还可以使用表格、列表以及矩阵等数据区域控件对数据源进行分组操作。分组报表在商业报表系统...

23650
来自专栏iOSDevLog

用Kotlin破解Android版微信小游戏-跳一跳成果跳一跳思路源码使用方法参考来源Android 插件 免PC

40160
来自专栏PHP在线

php中关于mysqli和mysql区别的一些知识点分析

一: PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,...

300100
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–资产会计(162)-15在建工程-F-54清算预付款

4.6.5 F-54清算预付款 既可以手动清算预付款,也可以由付款程序来清算。您可以随时进行手动清算。不需要任何特殊方法。 当您输入发票时,系统会发出有未清预付...

34080
来自专栏即时通讯技术

手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途。如本文内容有不妥之处,请联系JackJiang进行处理!

98120
来自专栏用户画像

实验室3 sql server 产品销售数据库

某公司的产品销售数据库company,company数据库中存在人事表employee、客户表customer、销售表sales、销售明细表sale_item、...

9230

扫码关注云+社区

领取腾讯云代金券