HBASE

列式存储,设计思想参考BigTable

文档:http://hbase.apache.org/book.html

  • hive适合数据分析,离线任务
  • hbase大数据实时查询
  • 避免显式锁,提供行原子性操作
  • 每行数据只有一台服务器服务,因此有强一致性

存储层使用HDFS

  • 按照CF存储,按照Row-key进行关联

Master\Region Server

高可用 容灾

  • Master协调Region Server,负载均衡,分配Region给Region Server
  • Region Server包括多个Region。Client直接连接Region Server
  • Zookeeper 高可用,负责Region和Region Server注册(依赖列表特性)

客户端有上亿条数据时使用
- rowKey设计很重要,选一个rowKey,使你的数据均匀的分布在集群中
- 客户端频繁写一张表时,随机RowKey性能更好
- 客户端需要频繁读一张表时,有序RowKey性能更好
- 时间连续的数据,有序RowKey更好
- Column Family一般不会超过2-3个CF,一般一个就够了
,它聚合同一特性的数据

安装

windows环境需要cgyWin,太麻烦了,cgywin挺大的,下载老慢。

  • download stabe hbase version

  • 修改conf/hbase-env.cmd/sh的JAVA_HOME配置

  • 编辑conf/hbase-site.xml配置(本机文件系统,非hdfs系统)

    hbase.rootdir
    file:///home/testuser/hbase

    hbase.zookeeper.property.dataDir
    /home/testuser/zookeeper

  • 启动bin/start-hbase.cmd/sh

create a table:
create 'test','cf'
list information:
list 'test'
put data:
put 'test','row1','cf:a','value1'
scan table
scan 'test'
get a row:
get 'test','row1'

版本相关

Hbase 2.0仅支持JDK 8, Hbase 1.x不再支持jAVA 6

Habase可能会同一时刻打开大量文件,ulimit -n 检查值,使用ulimit -u 确保系统至少配置为10,240

通过预写日志WAL文件来恢复未flush到磁盘的数据,建议配置足够的WAL文件数,使足够多的数据可以被存储

自动切分HRegion

Namespace

Namespace可以用来管理一组table,功能上类似于RDBS的数据库

Column Family

有相同前缀的列,用冒号分隔,如course:history\course:math都是course列族的

Data Model Operations

Get


public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Get get = new Get(Bytes.toBytes("row1"));
Result r = table.get(get);
byte[] b = r.getValue(CF, ATTR);

查询带Version的GET


public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Get get = new Get(Bytes.toBytes("row1"));
get.setMaxVersions(3); // will return last 3 versions of row
Result r = table.get(get);
byte[] b = r.getValue(CF, ATTR); // returns current version of value
List<KeyValue> kv = r.getColumn(CF, ATTR); // returns all versions of this column

获取某一行Row

Put

add new rows或者更新已存在的row,有点像upsert


隐式version
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Put put = new Put(Bytes.toBytes(row));
put.add(CF, ATTR, Bytes.toBytes( data));
table.put(put); 显式version
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Put put = new Put( Bytes.toBytes(row));
long explicitTimeInMs = 555; // just an example
put.add(CF, ATTR, explicitTimeInMs, Bytes.toBytes(data));
table.put(put);

Scans

查询多行row


//rowKey的规则可以是复合的,相对于rdbms,可以是几个字段合在一起
byte[] startRow = Bytes.add(规则1.getBytes(), 规则2.getBytes(), Bytes.toBytes(startTime.getTime()));
Scan scan = new Scan();
scan.setStartRow(startRow);
scan.setStopRow(endRow);
scan.addFamily(family);
ResultScanner rs = table.getScanner(scan);

Delete

删除行,并不立即删除数据,而是记标记,等Master来整理时被处理

http://hadoop-hbase.blogspot.hk/2012/01/scanning-in-hbase.html

Versions

A {row, column, version} tuple exactly specifies a cell in HBase

row和column相同的数据可能有很多,但是他们的version一定不同

version维度的数据是逆序存储的,所以能更快的找到最新的一条数据

  • Hbase允许多次写操作的对象为同一version,只有最后的那次写可以被获取
  • 写数据时可以不按version的顺序进行写
  • api可以操作获取的versions个数,如Get.setMaxVersions()

Hbase number of column families

目前并不能很好的处理列族为2或3的情况,因此尽量保持只有1个列族,除非数据操作总是针对列的,也就是说查询一个列族或另一个列族,但不同时查询两个列族

原因:

  • 刷新、整理是在一个Region上的,一个列族在刷新时,相邻的列族也会被刷新,即使它们的数据量很少,所以多个列族会存在着很多无效I/O的问题
  • 当CFa有1百万条数据,CFb有10亿条数据时,CFa的数据会被分布在很多,很多的Region上,会导致CFa的查询非常低效

RowKey设计

  • 在Hbase中,rows是按字典顺序排序的,这样可以优化查询效率,因为相关的rows是挨着的。
  • 拙劣的设计会使Hbase读写存在热点问题,即绝大多数请求指向同一个node或少量的nodes,甚至导致这台region server上的其他region的操作受影响,因为服务器可能过载了(解决办法和ConcurrentHashMap的设计理念相似,分而治之,类似hashcode再rehash)

解决热点问题

  • salting 通过一定规则产生随机前缀,达到数据更易均匀分布
  • hashing
  • 逆序
  • 综合多个属性

HBase基础知识摘要的更多相关文章

  1. HBASE基础知识总结

    HBASE基础知识总结 一,概要说明 文章首先回顾HBase 的数据模型和数据层级结构,对数据的每个层级的作用和架构进行了详细阐述:随后介绍了数据写入和读取的详细流程.先把架构图和流程图来坐镇. 架构 ...

  2. HBASE基础知识

    HBASE的集群的搭建HBASE的表设计HBASE的底层存储模型 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式缓存系统.利用HBase 技术可在廉价PC Server上搭建起大规模结构化存 ...

  3. Hadoop第11周练习—HBase基础知识

    1 :数据即日志 内容 2 :HBase合并过程 内容 3 :HBase一致性 内容 书面作业1:数据即日志 内容 我们常说HBase是“数据即日志”的数据库,它是怎样修改和删除数据的?和Oracle ...

  4. hbase基础知识一

    1. hbase是什么 漫画学习hbase----最易懂的Hbase架构原理解析 http://developer.51cto.com/art/201904/595698.htm 1.1 hbase的 ...

  5. [C#高级编程]基础知识摘要一

    核心C#: 值类型存储在堆栈中,而引用类型存储在托管堆上. object类型可以用于两个目的: 可以使用object引用绑定任何子类型的对象 object类型执行许多一般用途的基本方法,包括Equal ...

  6. CSS基础知识摘要

    元素分类 块级元素 什么是块级元素?在html中<div>. <p>.<h1>.<form>.<table>.<ul> 和 &l ...

  7. Python基础知识摘要

    python字典 增,删,改,查 1.增:XXX[新的key] = value 2.删:DEL XXX[key] 3.改:XXX[已经存在的key] = NewValue 4.查:aList.exte ...

  8. 加密解密(7)*PKI基础知识(完整)

    PKI 基础知识 摘要 本白皮书介绍了加密和公钥基本结构(PKI)的概念和使用 Microsoft Windows 2000 Server 操作系统中的证书服务的基础知识.如果您还不熟悉加密和公钥技术 ...

  9. [No0000138]软件开发基础知识

    1. 本文目的 本文目的在于,介绍软件开发的各种基础知识 以实现,看了之后,对于软件开发的很多领域的基础知识有所了解 如此在进行后续的真正的软件开发时,遇到各种细节知识,才会明白由来和背景知识 第 1 ...

随机推荐

  1. solr综合案例

    1.  综合案例 1.1. 需求 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字.分类.价格搜索商品信息,也可以根据价格进行排序,并且实现分页功能. 界面如下: 1.2分析 开发人员需要的 ...

  2. 一篇带你熟悉ansible-playbook剧本

    #playbook介绍 #playbook简单介绍 playbook翻译过来就是剧本,以yml/yaml为后缀结尾的一个文本文件 #playbook组成:分为两部分play(定义主机的角色)和task ...

  3. 图片压缩工具pngquant

    关于图片压缩的,之前看到一个imageOptim,用着不错,也挺好用的,直接打开要压缩的图片或者文件夹,唰唰唰的就开始压缩了,如下图 后来觉得不是很方面,还要打开软件,选择文件夹,然后就又研究了一下, ...

  4. Mongodb PHP封装类

    分享一个Mongodb PHP封装类 <?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该 ...

  5. Go 基本类型

    整形 标准整形 标准整形是按长度进行分类的,其中uint8为byte型,int16为C语言中的short型,int64为C语言中的long类型. 类型 描述 uint8 无符号 8位整型 (0 到 2 ...

  6. 编程源自生活:抽象 -> 生活中的洗头问题

    设计背景: 我:头上的油揩给了手,手接触洗手液.洗手液伤头皮,这样头皮就不会和洗手液接触了. 具体执行过程描述: 1.手揩油  ->  2.取液体  3.->洗手   我:这是什么设计模式 ...

  7. C语言普通写法实现:针对多次同步失败的节能处理机制

    程序不美, 不来一一整理了. 以后有时间可以把这个功能封装为一个类的对象来操作.即使不封装为类,至少也该封装为一个独立的函数吧... 关键代码摘要如下: 无线同步信号发射端,每分钟发一次,每次发射的时 ...

  8. 解决SpringBoot项目创建缓慢问题

    SpringBoot项目构建缓慢 快速创建springboot项目 在创建一个springboot项目的时候,往往速度会很慢,原因是下载springboot文件的默认地址是springboot官网(国 ...

  9. [POI2009]ARC-Architects

    [POI2009]ARC-Architects 题意: 给定一个序列,从中挑选k个数,满足下标单调递增,并且字典序最小: 思路: 由于字典序最小,所以考虑贪心,即前面的数尽可能大,所以用单调队列维护最 ...

  10. 全方位剖析 Linux 操作系统,太全了!!!

    Linux 简介 UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线.为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是 ...