Hadoop NoSQL中的HBase是什么?

作者 : IT 大叔 本文共4363个字,预计阅读时间需要11分钟 发布时间: 2020-08-16

HBase是一个面向列的数据存储,位于Hadoop分布式文件系统的顶部,可为大数据顾问提供随机数据查找和更新。Hadoop分布式文件系统基于“多次写入”架构,这意味着一次写入HDFS存储层的文件不能被修改,只能被读取多次。但是,HBase在HDFS文件之上提供了一个架构,可以多次访问和更新这些文件。

HBase特性

Hadoop NoSQL中的HBase是什么?插图

强大的一致性

HBase为读/写提供了强大的一致性,这意味着您将始终在读操作中获取最新数据,并且除非所有副本都已更新,否则写操作将不会完成。

水平可扩展

HBase使用区域概念提供自动分片,这些概念分布在整个群集中。每当表大小太大而无法容纳数据时,表都会自动分片并分布在多台计算机之间。

容错

HBase在发生故障时提供自动区域故障转移。

HDFS / MapReduce集成

HBase基于HDFS,可以与MapReduce程序集成以充当源和接收器。

Java API / Rest / Thrift API

HBase为非Java端点提供Java API以及Rest / Thrift API

查询优化

HBase具有内置的块缓存和Bloom过滤器,用于查询优化。

什么时候不使用HBase?

  • 当您的数据不够大时。HBase适用于无法以传统RDBMS数据库容纳的数十亿行表示的数据。
  • 当您的数据以恒定的速度增长并且将来不会增长时。
  • 当您不关心事务控制,触发器,二级索引以及传统数据库支持的许多其他功能时。

HBase架构

HBase具有Master-Slave架构,其中有一个HBase Master(也称为HMaster)和多个从属服务器(称为区域服务器或HRegionServers)。

区域: HBase中的表分为多个区域,这些区域分布在集群中的多台计算机上。

HBase主站: HBase负责将区域分配给区域服务器,提供管理控制台(以创建,更新和删除表)并控制故障。在读取请求的情况下,HMaster接收客户端请求并将其转发到适当的区域服务器。

区域服务器从站:区域服务器在所有工作节点上运行,并服务于一组区域。区域服务器由块高速缓存组成,该块高速缓存保留频繁访问的数据,以更有效地满足读取请求。区域服务器还包含内存存储区,该内存存储区是写缓存,用于缓存尚未写入磁盘的新数据。数据被写入区域服务器磁盘上的多个Hfile。

ZooKeeper:  HBase使用Zookeeper进行协调和故障恢复。Zookeeper包含有关HBase主服务器和区域服务器的配置信息。客户端必须首先访问zookeeper才能与HBase群集连接。ZKquoram是一个Zookeeper守护程序,它监视故障并修复故障节点。因此Zookeeper是HBase体系结构不可或缺的一部分,该体系结构维护HBase集群中的所有协调和同步。

HBase数据模型

Hadoop NoSQL中的HBase是什么?插图(2)

HBase表:它是行的集合,并且这些表分布在分布式区域中。

HBase行:表示HBase表中的单个实体。

行键:就像主键一样,用于唯一标识HBase表中的每一行。

:列代表实体的属性。例如,在客户HBase表中,列可以是客户名称,年龄,电话号码等。

列族:可以将表现出相同性质的所有列合并到同一列族中,这些列作为Hfile存储在Hadoop分布式文件系统中。

HBase入门

我们将使用HBase shell命令,然后使用Java API,创建名为雇员的下表。雇员表有两个列族,即“个人列族”(代表姓名,年龄等个人信息)和“专业列族”(代表薪资和职务等专业信息)。

Hadoop NoSQL中的HBase是什么?插图(4)

HBase Shell命令

//Create table employee with column family personal & professional
create 'employee', ‘personal', 'professional'
//Insert data into table employee
put 'employee','1','personal:name','John'
put 'employee','1','personal:age','24'
put 'employee','1','professional:designation','Manager'
put 'employee','1','professional:salary','7000'
put 'employee','1','personal:name','Mary'
put 'employee','1','personal:age','30'
put 'employee','1','professional:designation','Developer'
put 'employee','1','professional:salary','4000'
put 'employee','1','personal:name','Albert'
put 'employee','1','personal:age','45'
put 'employee','1','professional:designation','Director'
put 'employee','1','professional:salary','12000'
//Read data from employee
get 'employee', 'row1', {COLUMN ⇒ 'personal:name'}

Java API

建立表格

public class CreateEmployeeTable {
   public static void main(String[] args {
      Configuration conf = HBaseConfiguration.create();
      HBaseAdmin hAdmin = new HBaseAdmin(conf);
      HTableDescriptor tDescriptor = new
      HTableDescriptor(TableName.valueOf("employee"));
      tableDescriptor.addFamily(new HColumnDescriptor("personal"));
      tableDescriptor.addFamily(new HColumnDescriptor("professional"));
      hAdmin.createTable(tableDescriptor);
      System.out.println(" Employee Table created ");
   }}

放入数据

public class InsertEmployeeData{

   public static void main(String[] args) {
      Configuration conf = HBaseConfiguration.create();
      HTable hTable = new HTable(config, "employee");
      Put p = new Put(Bytes.toBytes("row1")); 
      p.add(Bytes.toBytes("personal"),
      Bytes.toBytes("name"),Bytes.toBytes("John"));
      p.add(Bytes.toBytes("personal"),Bytes.toBytes("age"),Bytes.toBytes("24"));
      p.add(Bytes.toBytes("professional"),Bytes.toBytes("designation"),Bytes.toBytes("Manager"));
      p.add(Bytes.toBytes("professional"),Bytes.toBytes("salary"),Bytes.toBytes("7000"));
      hTable.put(p);
      System.out.println("Employee row inserted");
      hTable.close();
   }}

更新表

public class UpdateEmployeeData{
   public static void main(String[] args){
      Configuration hconfig = HBaseConfiguration.create();
      HTable hTable = new HTable(hconfig, "employee");
      Put p = new Put(Bytes.toBytes("row1"));
      p.add(Bytes.toBytes("personal"),Bytes.toBytes("name"),Bytes.toBytes("jim"));
      hTable.put(p);
      hTable.close();
   }}

读取数据

public class ReadEmployeeData{

   public static void main(String[] args){
      Configuration hconfig = HBaseConfiguration.create();
      HTable table = new HTable(hconfig, "employee");
      Get g = new Get(Bytes.toBytes("row1"));
      byte [] value = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("name"));
      byte [] value1 = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("age"));
      String name = Bytes.toString(value);
      String city = Bytes.toString(value1);   
      System.out.println("name: " + name + " age: " + age);
   }}

修改表

public class AddColoumnFsmily{

   public static void main(String args[]){

      Configuration conf = HBaseConfiguration.create();

      HBaseAdmin admin = new HBaseAdmin(conf);

      HColumnDescriptor columnDescriptor = new HColumnDescriptor("address");

      admin.addColumn("employee", columnDescriptor);

      System.out.println("column added");

   }}

结论

当您的大数据已经存储在Hadoop上时,HBase是理想的选择。HBase通过提供随机的读/写和更新来减轻HDFS系统的缺点。它是一个分布式的,水平可伸缩的,容错的数据存储,与Hadoop Cluster配合得很好。

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Hadoop NoSQL中的HBase是什么?

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论