初识Hbase

HBase中的一张表

  1. schema-less 每一列没有类型。只需要告知column family,不关心每一列的名字和类型
  2. 每一个cell能存储多个版本,默认只保留最近的3个版本,每次创建,修改,删除都会变更版本号
  3. rowkey 每一行都不一样,真个table的所有row都是唯一的
  4. 在HBase中的原生数据都是以byte的形式存储的
  5. cell :通过[ rowkey, column family,column qualifier]定位,例如:
Put p =new Put(Bytes.toByte("TheRealMT"));
p.add(Bytes.toByte("info"))
p.add(Bytes.toByte("name"))
p.add(Bytes.toByte("Mark Twain"))
复制代码

在这里 rowdy是 TheRealMT,column family是 info,column qualifier是name,cell中真正存值是 Mark Twain

  1. table创建好之后,每次修改column family必须先下线当前的额表
  2. column qualifier能被当做数据,HBase本身相当于是一个多维的map
  3. hbase总没有多对多和一对多这种映射,更多的是非结构化数据
  4. hbase单行操作是原子的

schema设计一般需要考虑以下几个问题:

  • table该有几个column family?
  • 数据应该去哪个column family?
  • 每个column family该有几个column?
  • 每个column该叫什么名字?
  • 什么样的信息该放入cells?
  • 每个cells里面改存储几个版本?
  • rowkey的结构是什么,它本身该包含什么信息?

如何理解HBase中的key-value结构?

宽表和高表的概念

wide table: 包含多个列的table; tall table: 包含多行的table;

tall table 相对来说性能会好一点

rowkey设计需要考虑的一些因素

在内存中,数据存在的时候就已经是排好序的,当存储到HFile的时候也是排好序的,HBase中获取数据的唯一方式就是rowkey

  1. 基于IO的考虑,比如时间作为rowkey,如果要获取前几秒的数据,那么扫描一小块数据就能得到想要的结果,但是要写入数据的时候,很有可能一直是写在了table的最后面,负载不均匀
  2. 写优化。比如时间来说,读是很快,但是以写来消耗的。要优化写,即均匀分布,首先可以通过 hash,这样每次查找的时候,必须知道rowkey生成的元素,同时确保生成的rowkey能通过确定的方式计算得到;其次可以通过添加随机元素(salt)的方式生成rowkey,比如根据机器的多少,生成随机数,并与之取模再得出rowkey的前缀,然后拼上时间
  3. 读优化。比如时间放在前面的情况
  4. 拼接顺序和决定放什么元素在里头都很重要

比如 名字+时间戳 的组合

    Olivia1
    Olivia2
    Olivia5
    Olivia7
    Olivia9
    TheFakeMT2
    TheFakeMT3
    TheFakeMT4
    TheFakeMT5
    TheFakeMT6
    TheRealMT1
    TheRealMT2
    TheRealMT5
    TheRealMT8
复制代码

时间戳+名字 的组合

1Olivia
1TheRealMT
2Olivia
2TheFakeMT
2TheRealMT
3TheFakeMT
4TheFakeMT
5Olivia
5TheFakeMT
5TheRealMT
6TheFakeMT
7Olivia
8TheRealMT
9Olivia
复制代码

如果要知道一段时间之内某个名字的行,(时间戳+名字)的方式需要遍历整个表,而(名字+时间戳)则不需要

使用MD5加密rowkey的好处:长度是一致的,不再需要单独的分隔符。但是时无法获取原来的rowkey元素 把信息放在rowkey的好处:可以以常量的时间获取数据

java访问的一般方式

java api连接HBase,一般使用HTablePool,然后根据pool再拿到具体的表。单个的创建表的方式花销太大

附录

本文来自<HBase In Action>一书。推荐。可以基本了解HBase的概念

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 企业应用架构模式中的层次模型简介

    企业对外提供服务,通常借助于软件应用。比如交易零售系统,用来提供购买商品的服务,这里就涉及到交易数据,这些数据会被用户“反复”的产生、查看,而且随着服务时间增长...

    爬蜥
  • 一种插入、查找后继节点耗时为 lglgu 的算法van Emde Boas Trees

    假设总共有n个int元素,它的值在 {0,1,..,u-1}范围内,可以做到插入、删除、后继节点耗时为 lglgu 。

    爬蜥
  • 从源码看redis的string结构

    redis.c 中数组 redisCommandTable 为所有暴漏出去的命令列表,以及实现命令的函数指针

    爬蜥
  • Linq查询权限模块动态生成

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    PHY_68
  • 笔记 |《深度学习原理与TensorFlow实践》学习笔记(四)

    作者 | 王清 目录 CNN应用之图像风格化实例 如何量化风格 快速风格化的两种模型训练生成风格的滤镜 生成对抗网络介绍GAN GAN的基本思想 GAN的基本框...

    AI科技大本营
  • 请你说明concurrenthashmap有什么优势以及1.7和1.8区别?

    Concurrenthashmap线程安全的,1.7是在jdk1.7中采用Segment + HashEntry的方式进行实现的,lock加在Segment上面...

    剑走天涯
  • Python控制Word文件中段落格式与文本格式

    本文主要介绍扩展库python-docx中关于Word文件中文本格式控制的接口和用法,可以使用命令pip install python-docx安装,然后通过名...

    Python小屋屋主
  • 开源 Kubernetes 原生 CI/CD 框架 Tekton 探秘及使用

    tektoncd/pipeline(以下简称pipeline) 是一套适用于k8s的开源的CI/CD框架。它依赖k8s的一些特性,实现了CI/CD 中的流程的控...

    灵雀云
  • 「2016 CSS」腾讯云副总裁黎巍:云安全是安全能力的一次整合再超越

    腾讯云安全
  • 工业机器人的创业趋势

    工业4.0趋势下,全球涌现出了众多的自动化创业公司,但是它们的技术创新往往实现的是一个小众产品而且受制于系统集成商被变相“绑架”等相似的问题;同时,想押宝“自动...

    机器人网

扫码关注云+社区

领取腾讯云代金券