Hbase基础概念
**HBase 基础概念**
HBase 是一个开源的、分布式的、面向列的NoSQL数据库。它基于谷歌BigTable的设计理念,提供高性能、高可扩展性和高可靠性的数据存储服务。下面是 HBase 的基础概念:
###1. HBase 架构HBase 的架构主要包括以下几个组件:
* **RegionServer**:负责存储和管理 Region 数据。
* **Master**:负责分配 RegionServer 和 Region,维护 RegionServer 的状态。
* **ZooKeeper**:用于维护 HBase 集群的配置信息和 RegionServer 的状态。
###2. RegionRegion 是 HBase 中数据的基本存储单位。每个 Region 由一个 RegionServer 来管理,每个 RegionServer 可以管理多个 Region。Region 的大小可以根据实际需求进行调整。
###3. RowKeyRowKey 是 HBase 中用于唯一标识一条记录的字段。RowKey 的长度和值都非常重要,因为它们决定了数据在磁盘上的存储位置和访问顺序。
###4. ColumnFamilyColumnFamily 是 HBase 中用于组织列的逻辑集合。每个表可以有多个 ColumnFamily,每个 ColumnFamily 可以包含多个列。
###5. CellCell 是 HBase 中最小的数据存储单位,代表一行中的一条记录。每个 Cell 由 RowKey、ColumnFamily 和 Timestamp 组成。
###6. PutPut 是 HBase 中用于插入或更新数据的命令。Put 命令可以指定多个列值,并且可以批量执行。
###7. GetGet 是 HBase 中用于获取数据的命令。Get 命令可以根据 RowKey 和 ColumnFamily 来获取特定数据。
###8. DeleteDelete 是 HBase 中用于删除数据的命令。Delete 命令可以根据 RowKey 和 Timestamp 来删除特定数据。
###9. ScanScan 是 HBase 中用于扫描数据的命令。Scan 命令可以根据 RowKey、ColumnFamily 和 Timestamp 来获取指定范围内的数据。
**示例代码**
javaimport org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.mapreduce.TableInputFormat; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.conf.Configuration; import java.io.IOException; public class HBaseExample { public static void main(String[] args) throws IOException { // 创建HBase配置 Configuration conf = HBaseConfiguration.create(); // 连接到HBase集群 String zookeeperQuorum = "localhost"; int zookeeperPort =2181; conf.set("hbase.zookeeper.quorum", zookeeperQuorum); conf.set("hbase.zookeeper.property.clientPort", String.valueOf(zookeeperPort)); // 创建表 String tableName = "example_table"; HBaseAdmin hbaseAdmin = new HBaseAdmin(conf); if (!hbaseAdmin.tableExists(tableName)) { HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName)); tableDesc.addFamily(new HColumnDescriptor("cf1").setMaxVersions(3)); hbaseAdmin.createTable(tableDesc); } // 插入数据 Put put = new Put(Bytes.toBytes("row1")); put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("column1"), Bytes.toBytes("value1")); put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("column2"), Bytes.toBytes("value2")); HTable table = new HTable(conf, tableName); table.put(put); // 获取数据 Get get = new Get(Bytes.toBytes("row1")); Result result = table.get(get); byte[] value = result.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("column1")); System.out.println(Bytes.toString(value)); // 扫描数据 Scan scan = new Scan(); TableInputFormat.addDependency(conf, HTable.class); Job job = Job.getInstance(conf, "HBaseExample"); job.setJarByClass(HBaseExample.class); job.setInputFormatClass(TableInputFormat.class); job.setOutputKeyClass(ImmutableBytesWritable.class); job.setOutputValueClass(Result.class); TableMapReduceUtil.initTableReducerJob(tableName, null, job); job.setMapperClass(ScanMapper.class); job.setNumReduceTasks(1); System.exit(job.waitForCompletion(true) ?0 :1)); } }
**注释**
* `HBaseConfiguration.create()`:创建 HBase 配置。
* `conf.set("hbase.zookeeper.quorum", zookeeperQuorum)`:设置 ZooKeeper 的 Quorum 地址和端口。
* `HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName))`:创建表描述器。
* `tableDesc.addFamily(new HColumnDescriptor("cf1").setMaxVersions(3))`:添加列族。
* `hbaseAdmin.createTable(tableDesc)`:创建表。
* `Put put = new Put(Bytes.toBytes("row1"))`:插入数据。
* `put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("column1"), Bytes.toBytes("value1"))`:添加列值。
* `table.put(put)`:写入数据。
* `Get get = new Get(Bytes.toBytes("row1"))`:获取数据。
* `Result result = table.get(get)`:读取数据。
* `byte[] value = result.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("column1"))`:获取列值。
* `System.out.println(Bytes.toString(value))`:输出列值。
* `Scan scan = new Scan()`:扫描数据。
* `TableInputFormat.addDependency(conf, HTable.class)`:添加依赖。
* `Job job = Job.getInstance(conf, "HBaseExample")`:创建任务。
* `job.setJarByClass(HBaseExample.class)`:设置 jar 文件。
* `job.setInputFormatClass(TableInputFormat.class)`:设置输入格式。
* `TableMapReduceUtil.initTableReducerJob(tableName, null, job)`:初始化表减少任务。
* `job.setMapperClass(ScanMapper.class)`:设置 mapper 类。
* `job.setNumReduceTasks(1)`:设置 reduce任务数。
* `System.exit(job.waitForCompletion(true) ?0 :1))`:等待完成并退出。