首页 > 数据库 >HBase 分布式数据库

HBase 分布式数据库

时间:2023-08-29 12:03:26浏览次数:42  
标签:grade 数据库 toBytes Bytes course scores HBase 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,希望作为入门参考。

标签:grade,数据库,toBytes,Bytes,course,scores,HBase,hbase,分布式
From: https://blog.51cto.com/u_14682436/7274429

相关文章

  • .NET Core Entity Framework Core 创建数据库
    自动创建数据库必须在NuGet中安装一下EFCore库Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools数据迁移常用命令dotnetefmigrationsaddNewColum--新增migrationsdotnetefdatabaseupdate--跟新数据库dotnetefmigrationsaddAddrs--......
  • 深入理解数据库连接池及其在后端性能优化中的作用
    在后端开发中,数据库连接池是一个至关重要的概念,它在保障系统性能、资源利用以及稳定性方面起着重要作用。本篇博客将深入探讨数据库连接池的工作原理,以及在Java应用中如何合理地配置和使用连接池来优化后端性能。什么是数据库连接池?数据库连接池是一个管理数据库连接的技术,它在应用......
  • Kafka - 不仅是消息引擎,还是分布式流处理平台
     如果你通读全篇文字但只能记住一句话,我希望你记住的就是这句ApacheKafka是消息引擎系统,也是一个分布式流处理平台(DistributedStreamingPlatform) 作为流处理平台,Kafka与其他主流大数据流式计算框架相比,优势在哪里呢?我能想到的有两点。第一点是更容易实现端到端的正......
  • MYSQL如何从文件中把数据复制进数据库表中
    。至少有两种修正方法:·编辑文件“mysql.txt”改正错误,然后使用DELETE和LOADDATA清空并重新装载表:·mysql>DELETEFROMpet;·mysql>LOADDATALOCALINFILE'pet.txt'INTOTABLEpet;注:‘***’->是你的文件路径地址然而,如果这样操做,......
  • Mysql之数据库设计
    一、三大范式1、第一范式:消除一个字段包含多个数据库值,消除一个记录包含重复的组(单独的一列包含多个项目),即可满足1NF。2、第二范式:消除部分依赖性即可转化为2NF。部分依赖性表示一个记录中包括的字段只依赖于主键的一部分。解决部分依赖性的最简单方法是将复合主键分成两部分,每......
  • 数据库中字段名的命名规范
    使用有描述性的名称:字段名应该能清楚地描述该字段所代表的含义,尽量避免使用模糊或不具有明确含义的名称。使用小写字母:使用小写字母能提高可读性,并且在某些数据库中,字段名是大小写敏感的。此外,建议使用下划线(_)来分隔单词,而不是使用空格或驼峰命名法。避免保留字和关键字:避免使......
  • 数据库MySQL
     Concat(a,b)连接a,b两个字段                                    MySQL函数       分组之后再插入查询条件不能用Where关键字,而要用HA......
  • 数据库中字段无符号和自动递增
    无符号(unsigned):无符号属性用于指定数值类型字段的取值范围。通常,数值类型(如整数)的字段可以存储正数和负数。但是,如果将字段声明为无符号(unsigned),则该字段只能存储非负数(即正数和零)。无符号字段扩展了字段的正数范围,但不能存储负数。例如,对于整数类型的字段,可以使用INT表示有符号......
  • 查询SQL Server数据库执行时间最长的sql语句
    SELECT(total_elapsed_time/execution_count)/1000N'平均时间ms',total_elapsed_time/1000N'总花费时间ms',total_worker_time/1000N'所用的CPU总时间ms',total_physical_readsN'物理读取总次数',total_logical_reads/execution_countN'每次......
  • 数据库中什么是主键
    在数据库中,主键就像是每个记录的独特标识符,就像每个人都有自己的名字一样。它帮助区分不同的记录,就像名字帮助我们区分不同的人一样。想象一下,你有一个装满了糖果的罐子。为了区分每颗糖果,你会给每颗糖果贴上一个标签,上面写着它的名字或编号。这个标签就像是糖果的主键,确保每颗糖......