Loading... ## 引言 HBase 是 Apache Hadoop 生态系统的重要组成部分,是一个高度可扩展的、分布式、大规模列存储的数据库,适合处理 PB 级别的非结构化和半结构化数据。本篇文章将引导你理解 HBase 的基础知识,并使用 Java API 进行实践操作。 ## HBase vs. MySQL 理解 HBase 的核心特性和能力,最直观的方法之一就是将其与我们熟知的关系型数据库进行对比,例如 MySQL。 - **数据模型**:HBase 是基于列的存储,适合存储非结构化和半结构化的大数据。MySQL 是基于行的存储,适合存储结构化的数据。 - **存储容量**:由于分布式架构,HBase 能够存储非常大的数据集,例如数 PB 级别的数据。MySQL 主要适用于中小型数据集,一般在数 TB 级别以下。 - **事务支持**:HBase 只支持单行的原子性操作,不支持传统的 ACID 事务。MySQL 完全支持 ACID 事务。 - **扩展性**:HBase 是为水平扩展设计的,可以通过增加更多的节点来处理更大的数据量。MySQL 主要依赖于垂直扩展,即增加单个服务器的硬件性能来提升处理能力。 ## 存储结构图 ![](https://blog.fivk.cn/usr/uploads/2023/06/3421633119.svg) 中文描述词汇对应 ![](https://blog.fivk.cn/usr/uploads/2023/06/405099924.svg) 之后的案例也是根据这个结构图 ## HBase Shell 操作 以下是一些常用的HBase Shell命令,包括中文解释和参数说明: 1. **创建表**: ```bash create 'table_name', 'column_family' ``` 创建一个名为'table_name'的表,并指定一个名为'column_family'的列族。 2. **列出所有表**: ```bash list ``` 列出HBase中所有的表。 3. **插入/更新数据**: ```bash put 'table_name', 'row_key', 'column_family:column', 'value' ``` 在'table_name'表中,给定的行键'row_key',列族'column_family'下的列'column',插入或更新一个值'value'。 4. **获取数据**: ```bash get 'table_name', 'row_key', {COLUMN => 'column_family:column'} ``` 从'table_name'表中,获取给定的行键'row_key',列族'column_family'下的列'column'的值。 5. **扫描表**: ```bash scan 'table_name' ``` 扫描'table_name'表中的所有行。 6. **删除单元格数据**: ```bash delete 'table_name', 'row_key', 'column_family:column' ``` 在'table_name'表中,删除给定的行键'row_key',列族'column_family'下的列'column'的值。 7. **删除行**: ```bash deleteall 'table_name', 'row_key' ``` 在'table_name'表中,删除给定的行键'row_key'的整行数据。 8. **删除表**: ```bash disable 'table_name' drop 'table_name' ``` 首先禁用'table_name'表,然后删除它。 9. **修改表**: ```bash disable 'table_name' alter 'table_name', NAME => 'column_family' enable 'table_name' ``` 首先禁用'table_name'表,然后修改它(例如,添加新的列族'column_family'),最后再启用它。 以上各命令中,'table_name'表示表名,'column_family'表示列族名,'row_key'表示行键,'column'表示列名,'value'表示值。这些参数都需要根据实际情况替换为真实的值。 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-d04e910239a789ae67a2428e2a0a9eb799" aria-expanded="true"><div class="accordion-toggle"><span style="">使用案例</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-d04e910239a789ae67a2428e2a0a9eb799" class="collapse collapse-content"><p></p> 假设我们要在HBase中存储一个用户信息的表。用户信息包括用户ID(作为行键),用户名,邮箱和电话。我们可以创建两个列族,一个用于存储用户的个人信息(例如用户名),另一个用于存储用户的联系信息(例如邮箱和电话)。 首先,我们需要创建一个表: ```bash create 'users', 'personal', 'contact' ``` 这个命令会创建一个名为'users'的表,有两个列族,'personal'和'contact'。 然后,我们可以插入一些用户数据: ```bash put 'users', 'user1', 'personal:name', 'Alice' put 'users', 'user1', 'contact:email', 'alice@example.com' put 'users', 'user1', 'contact:phone', '123-456-7890' put 'users', 'user2', 'personal:name', 'Bob' put 'users', 'user2', 'contact:email', 'bob@example.com' put 'users', 'user2', 'contact:phone', '098-765-4321' ``` 上述命令分别向'user1'和'user2'的'personal'和'contact'列族中添加数据。 接下来,我们可以获取用户的数据: ```bash get 'users', 'user1' ``` 上述命令将返回'user1'的所有数据,包括个人信息和联系信息。 最后,我们可以删除用户的数据: ```bash delete 'users', 'user1', 'contact:phone' ``` 上述命令将删除'user1'的电话信息。 这就是一个在HBase中存储用户数据的基本例子。请注意,HBase允许每行有不同数量的列,因此每个用户可以有不同数量的联系方式。 <p></p></div></div></div> ## HBase Java API 操作 HBase Java API 提供了丰富的方法来在Java程序中操作HBase。以下是一些常用的类和方法: 1. **连接到HBase** 使用 `Connection` 和 `ConnectionFactory` 类来连接到HBase。 ```java Configuration config = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(config); ``` 2. **创建表** 使用 `Admin` 类来创建表。 ```java Admin admin = connection.getAdmin(); HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf("table_name")); tableDescriptor.addFamily(new HColumnDescriptor("column_family")); admin.createTable(tableDescriptor); ``` 3. **插入数据** 使用 `Table` 和 `Put` 类来插入数据。 ```java Table table = connection.getTable(TableName.valueOf("table_name")); Put put = new Put(Bytes.toBytes("row_key")); put.addColumn(Bytes.toBytes("column_family"), Bytes.toBytes("column"), Bytes.toBytes("value")); table.put(put); ``` 4. **获取数据** 使用 `Table` 和 `Get` 类来获取数据。 ```java Table table = connection.getTable(TableName.valueOf("table_name")); Get get = new Get(Bytes.toBytes("row_key")); Result result = table.get(get); byte[] value = result.getValue(Bytes.toBytes("column_family"), Bytes.toBytes("column")); ``` 5. **扫描表** 使用 `Table` 和 `Scan` 类来扫描表。 ```java Table table = connection.getTable(TableName.valueOf("table_name")); Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); for (Result row : scanner) { // process row } ``` 6. **删除数据** 使用 `Table` 和 `Delete` 类来删除数据。 ```java Table table = connection.getTable(TableName.valueOf("table_name")); Delete delete = new Delete(Bytes.toBytes("row_key")); delete.addColumn(Bytes.toBytes("column_family"), Bytes.toBytes("column")); table.delete(delete); ``` 在以上代码中,"table_name" 是表名,"column_family" 是列族名,"row_key" 是行键,"column" 是列名,"value" 是值。你需要根据实际的情况替换这些值。另外,记住在完成操作后关闭 `Table` 和 `Connection` 对象,以防止资源泄漏。 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-93622de9480e817b8e08a4ea9146ffcb27" aria-expanded="true"><div class="accordion-toggle"><span style="">使用案例</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-93622de9480e817b8e08a4ea9146ffcb27" class="collapse collapse-content"><p></p> 在Java中使用HBase API进行用户数据的存储,代码可能如下所示: 首先,我们需要创建表: ```java Configuration config = HBaseConfiguration.create(); try (Connection connection = ConnectionFactory.createConnection(config); Admin admin = connection.getAdmin()) { HTableDescriptor table = new HTableDescriptor(TableName.valueOf("users")); table.addFamily(new HColumnDescriptor("personal")); table.addFamily(new HColumnDescriptor("contact")); admin.createTable(table); } ``` 然后,我们可以插入用户数据: ```java try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("users"))) { Put alice = new Put(Bytes.toBytes("user1")); alice.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"), Bytes.toBytes("Alice")); alice.addColumn(Bytes.toBytes("contact"), Bytes.toBytes("email"), Bytes.toBytes("alice@example.com")); alice.addColumn(Bytes.toBytes("contact"), Bytes.toBytes("phone"), Bytes.toBytes("123-456-7890")); table.put(alice); Put bob = new Put(Bytes.toBytes("user2")); bob.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"), Bytes.toBytes("Bob")); bob.addColumn(Bytes.toBytes("contact"), Bytes.toBytes("email"), Bytes.toBytes("bob@example.com")); bob.addColumn(Bytes.toBytes("contact"), Bytes.toBytes("phone"), Bytes.toBytes("098-765-4321")); table.put(bob); } ``` 然后,我们可以获取用户数据: ```java try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("users"))) { Get get = new Get(Bytes.toBytes("user1")); Result result = table.get(get); byte[] name = result.getValue(Bytes.toBytes("personal"), Bytes.toBytes("name")); byte[] email = result.getValue(Bytes.toBytes("contact"), Bytes.toBytes("email")); byte[] phone = result.getValue(Bytes.toBytes("contact"), Bytes.toBytes("phone")); // TODO: Process the result } ``` 最后,我们可以删除用户数据: ```java try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("users"))) { Delete delete = new Delete(Bytes.toBytes("user1")); delete.addColumn(Bytes.toBytes("contact"), Bytes.toBytes("phone")); table.delete(delete); } ``` 这就是一个在Java中使用HBase API存储用户数据的例子。 <p></p></div></div></div> ## 结论 HBase 是一个强大的大数据存储工具,它充分利用了 Hadoop 的分布式计算能力,适合存储和处理大量的非结构化和半结构化数据。无论是通过 HBase Shell 还是 Java API,你都可以方便地进行数据的操作和管理。如果你正在寻找一个可扩展的、大规模的数据存储解决方案,那么 HBase 可能是一个很好的选择。 最后修改:2023 年 06 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏