简述Hbase

Hbase简介

一、HBase概述

  1. HBase是一个领先的NoSQL数据库
    是一个面向列存储的NoSQL数据库
    是一个分布式Hash Map,底层数据是Key-Value格式
    基于Google Big Table论文
    使用HDFS作为存储并利用其可靠性
  2. HBase特点
    数据访问速度快,响应时间约2-20毫秒
    支持随机读写,每个节点20k~100k+ ops/s
    可扩展性,可扩展到20,000+节点
    高并发

二、HBase 应用场景

  1. 增量数据-时间序列数据
    特点:高容量,高速写入
    HBase之上有OpenTSDB模块,可以满足时序类场景,比如传感器,系统监控,股票行情监控等
  2. 信息交换-消息传递
    特点:高容量,高速读写
    通信、消息同步的应用构建在HBase之上,比如email,FaceBook等
  3. 内容服务-Web后端应用程序
    特点:高容量,高速读写
    头条类、新闻类的的新闻、网页、图片存储在HBase中
    补充: HBase生态圈技术
    Lily – 基于HBase的CRM
    OpenTSDB – HBase面向时间序列数据管理
    Kylin – HBase上的OLAP
    Phoenix – SQL操作HBase工具
    Splice Machine – 基于HBase的OLTP
    Apache Tephra – HBase事务支持
    TiDB – 分布式SQL DB
    Apache Omid - 优化事务管理
    Yarn application timeline server v.2 迁移到HBase
    Hive metadata存储可以迁移到HBase
    Ambari Metrics Server将使用HBase做数据存储
    常用的有:Kylin – HBase上的OLAP
    Phoenix – SQL操作HBase工具
    Yarn application timeline server v.2 迁移到HBase
    Hive metadata存储可以迁移到HBase

三、Habase架构

HBase 也是 Master/slaves 架构,从前面安装环境应该能看出, HBase 分布式环境安装成功后,是有一个 HMaster,多个 HResgionServer 进程。 HBase 架构如图所示:
在这里插入图片描述
从上图中能看出 HBase 是由 Client、 ZooKeeper、 HMaster、 HRegionServer、HDFS 等几个组件组成,组件的相关功能:
1.Client:客户端,可以是 HBase Shell、 Java API 客户端、 RestAPI 等
Client 就是用来访问 HBase 数据库的,它不仅提供了访问接口,还维护了对应的缓存(cache)来加速 HBase 的访问.
Client端的缓存主要是缓存 Region 的位置信息,减少获取元数据的时间。当 Client 端没有缓存的时候(第一次请求),
会加载 Region 的位置信息到 Client 端,后面直接使用 cache 中的信息,如果出现重试,则会重新获取 Region 的位置信息,
更新 Client 端的 cache。
2.ZooKeeper
HBase 通过 ZooKeeper 来做 HMaster 的高可用、 HRegionServer 的监控、元数据的入口以及集群配置的维护等工作。
它具体 工作如下:
(1)通过 ZoopKeeper 来保证集群中只有 1 个 HMaster 在运行,如果 HMaster异常,会通过竞争机制产生新的
HMaster 提供服务。
(2)通过 ZoopKeeper 来监控 HRegionServer 的状态,当 HRegionSevrer 有异常的时候,通过 Master
会收到 ZooKeeper 消息通知 HRegionServer 上下线的信息。
(3)通过 ZoopKeeper 存储元数据的统一入口地址(数据目录)
3.HMaster
HMaster 节点的主要职责如下:
(1) 监 控 HRegionServer , 处 理 HRegionServer 故 障 转 移 , 当 某 个HRegionServer 挂掉时, ZooKeeper 会将分配
在该 HRegionServer 上的 HRegion 分配到其他 HRegionServer 上进行管理。
(2) HRegion 分裂后,负责新的 HRegion 的分配。
(3)处理元数据的变更,比如对表的添加,修改,删除等操作。
(4)在空闲时间进行数据的负载均衡,主要就是在 HRegionServer 间迁移HRegion,达到负载均衡。
(5)通过 ZooKeeper 发布自己的位置给客户端。
4.HRegionServer
HRegionServer 直接负责用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
(1)负责和底层 HDFS 的交互,存储数据到 HDFS, HBase 是依托于 HDFS的 NoSQL 数据库,数据会存储在 HDFS 上。
(2)处理分配给它的 HRegion。
(3)刷新缓存到 HDFS。
(4)维护 HLog, HLog 是一个容错机制,下面的内容会介绍到 HLog 的功能。
(5)处理来自客户端的读写请求。 HRegionServer 是实际管理数据的,客户端的读写请求最终都要由 HRegionServer 来处理。
(6)负责处理 HRegion 变大后的拆分。
(7)负责 StoreFile 的合并工作。
5.HDFS
HDFS 为 HBase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(HLog 存储在 HDFS)的支持,具体功能概括如下:
(1) 提供元数据和表数据的底层分布式存储服务。
(2) 数据多副本,保证的高可靠和高可用性。
6.Write-Ahead Logs
Write-Ahead Logs 也叫预写日志(WAL),在 HBase 中为 HLog, HLog 存储在 HDFS 上。HLog 是每一个 RegionServer 对应一个。
数据先写道HLog里面,然后在进行存储,目的是在数据丢失时可以通过日志进行恢复。
7.HRegion
HRegion是HBase集群分布数据的最小单位Region被分配给集群中的RegionServerHBase 每

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tephra 在 Apache HBase 的基础上提供了全局一致性的事务支持。HBase 提供了强一致性的基于行和区域的 ACID 操作支持,但是牺牲了在跨区域操作的支持。这就要求应用开发者花很大力气来确保区域边界上操作的一致性。而 Tephra 提供了全局事务支持,可以夸区域、跨表以及多个 RPC 上简化了应用的开发。示例代码:  /**    * A Transactional SecondaryIndexTable.    */   public class SecondaryIndexTable {     private byte[] secondaryIndex;     private TransactionAwareHTable transactionAwareHTable;     private TransactionAwareHTable secondaryIndexTable;     private TransactionContext transactionContext;     private final TableName secondaryIndexTableName;     private static final byte[] secondaryIndexFamily =       Bytes.toBytes("secondaryIndexFamily");     private static final byte[] secondaryIndexQualifier = Bytes.toBytes('r');     private static final byte[] DELIMITER  = new byte[] {0};     public SecondaryIndexTable(TransactionServiceClient transactionServiceClient,                                HTable hTable, byte[] secondaryIndex) {       secondaryIndexTableName =             TableName.valueOf(hTable.getName().getNameAsString()   ".idx");       HTable secondaryIndexHTable = null;       HBaseAdmin hBaseAdmin = null;       try {         hBaseAdmin = new HBaseAdmin(hTable.getConfiguration());         if (!hBaseAdmin.tableExists(secondaryIndexTableName)) {           hBaseAdmin.createTable(new HTableDescriptor(secondaryIndexTableName));         }         secondaryIndexHTable = new HTable(hTable.getConfiguration(),                                           secondaryIndexTableName);       } catch (Exception e) {         Throwables.propagate(e);       } finally {         try {           hBaseAdmin.close();         } catch (Exception e) {           Throwables.propagate(e);         }       }       this.secondaryIndex = secondaryIndex;       this.transactionAwareHTable = new TransactionAwareHTable(hTable);       this.secondaryIndexTable = new TransactionAwareHTable(secondaryIndexHTable);       this.transactionContext = new TransactionContext(transactionServiceClient,                                                        transactionAwareHTable,                                                        secondaryIndexTable);     }     public Result get(Get get) throws IOException {       return get(Collections.singletonList(get))[0];     }     public Result[] get(List<Get> gets) throws IOException {       try {         transactionContext.start();         Result[] result = transactionAwareHTable.get(gets);         transactionContext.finish();         return result;       } catch (Exception e) {         try {           transactionContext.abort();         } catch (TransactionFailureException e1) {           throw new IOException("Could not rollback transaction", e1);         }       }       return null;     }     public Result[] getByIndex(byte[] value) throws IOException {       try {         transactionContext.start();         Scan scan = new Scan(value, Bytes.add(value, new byte[0]));         scan.addColumn(secondaryIndexFamily, secondaryIndexQualifier);         ResultScanner indexScanner = secondaryIndexTable.getScanner(scan);         ArrayList<Get> gets = new ArrayList<Get>();         for (Result result : indexScanner) {           for (Cell cell : result.listCells()) {             gets.add(new Get(cell.getValue()));           }         }         Result[] results = transactionAwareHTable.get(gets);         transactionContext.finish();         return results;       } catch (Exception e) {         try {           transactionContext.abort();         } catch (TransactionFailureException e1) {           throw new IOException("Could not rollback transaction", e1);         }       }       return null;     }     public void put(Put put) throws IOException {       put(Collections.singletonList(put));     }     public void put(List<Put> puts) throws IOException {       try {         transactionContext.start();         ArrayList<Put> secondaryIndexPuts = new ArrayList<Put>();         for (Put put : puts) {           List<Put> indexPuts = new ArrayList<Put>();           Set<Map.Entry<byte[], List<KeyValue>>> familyMap = put.getFamilyMap().entrySet();           for (Map.Entry<byte [], List<KeyValue>> family : familyMap) {             for (KeyValue value : family.getValue()) {               if (value.getQualifier().equals(secondaryIndex)) {                 byte[] secondaryRow = Bytes.add(value.getQualifier(),                                                 DELIMITER,                                                 Bytes.add(value.getValue(),                                                 DELIMITER,                                                 value.getRow()));                 Put indexPut = new Put(secondaryRow);                 indexPut.add(secondaryIndexFamily, secondaryIndexQualifier, put.getRow());                 indexPuts.add(indexPut);               }             }           }           secondaryIndexPuts.addAll(indexPuts);         }         transactionAwareHTable.put(puts);         secondaryIndexTable.put(secondaryIndexPuts);         transactionContext.finish();       } catch (Exception e) {         try {           transactionContext.abort();         } catch (TransactionFailureException e1) {           throw new IOException("Could not rollback transaction", e1);         }       }     }   } 标签:Tephra

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值