2006 年10 月Google 发布三架马车之一的《Bigtable:A Distributed Storage System for Strctured Data》论文之后,Powerset 公司就宣布 HBase 在 Hadoop 项目中成立,作为子项目存在。后来,在2010 年左右逐渐成为 Apache 旗下的一个顶级项目。可能是实际应用中包装得太好,很多人对于 HBase 的认识止步于 NoSQL 。今天,蚂蚁金服的南俊从基础开始讲起,希望有助于增强大家在实际业务中对 HBase 的理解。
  
  一、 HBase 简介
  
  HBase 名称的由来是由于其作为 Hadoop Database 存在的,用来存储非结构化、半结构化数据。
  
  要想知道 HBase 的用途,就需要看一看其在 Apache 的 Hadoop 生态系统中的位置,可以看到 HBase 是构建在 HDFS 之上的,这是由于 HBase 内部管理的文件全部都是存储在 HDFS 当中的。同时,MapReduce 这个计算框架在 HBase 之上又提供了高性能的计算能力来处理海量数据。此外还有一些像 Pig、Hive 用来提供高层语言的支持。还有 Sqoop 用来完成传统数据库到 HBase 之间的数据迁移。类似衍生出来的新技术还有很多,有兴趣的同学可以自己去了解一下。
  
  Google 的三架马车 BigTable、GFS、MapReduce 现在在开源社区中都能找到对应的实现。HBase 就是 Bigtable 的开源实现,当然这句话不是完全正确,因为两者之间还是有些差异的。但是主要还是基于 BigTable 这个数据模型开发的,因此也是具有 Key-Value 特征的,同时也就具有 Bigtable 稀疏的、面向列的这些特性。
  
  也是由于 HBase 利用 HDFS 作为它的文件系统,因此它也具有 HDFS 的高可靠性和可伸缩性。和 Hadoop 一样,HBase 也是依照横向扩展,通过不断地通过添加廉价的服务器来增加计算和存储的能力。BigTable 利用 Chubby 来进行协同服务,HBase 则是利用 Zookeeper 来对整个分布式系统进行协调服务。正是因为通过HDFS 的高可靠可伸缩性,以及应用了 Bigtable 的稀疏的面向列的这些高效的数据组织形式。所以 HBase 才能如此地适合大数据随机和实时读写。
  
  二、 HBase 基本概念
  
  这里介绍一下 HBase 的一些基本概念:

[root@by ~]# tcpdump -i www.baihuiyule.cn/ eth0 -nnt dst host 172.18.82.173 and port 22 -c 1 -vv
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP (tos 0x14, ttl 114, id 27674, offset 0, flags [DF], proto TCP (6), length 40)
113.98.59.61.51830 > 172.18.82.173.22: Flags [.], cksum 0x7fe3 (correct), seq 19775964, ack 1564316089, win 2053, length 0
4.3 抓取某网络(网段)的数据包#
抓取经过指定 interface,并且 DST_NET 或 SRC_NET 是 172.18.82 的包

Copy
tcpdump -i eth0 net 172.18.82
筛选 SRC_NET

Copy
tcpdump -i eth0 src net 172.18.82
筛选 DST_NET

Copy
tcpdump -i eth0 dst net 172.18.82
4.4 抓取某协议的数据包#
Copy
tcpdump -i eth0 icmp
tcpdump -i eth0 ip
tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 arp
4.5 复杂的逻辑表达式抓取过滤条件#
抓取经过 interface eth0 发送到 host 200.200.200.1 或 200.200.200.2 的 TCP 协议 22 号端口的数据包

Copy
tcpdump -i eth0 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 200.200.200.1) or (dst host 200.200.200.2)))'
PS:对于复杂的过滤器表达式,为了逻辑清晰,可以使用 (),不过默认情况下,tcpdump 会将 () 当做特殊字符,所以必须使用 '' 来消除歧义。

抓取经过 interface eth0, DST_MAC 或 SRC_MAC 地址是 00:16:3e:12:16:e7 的 ICMP 数据包

Copy
tcpdump -i eth0 'www.dasheng178.com((icmp) and ((ether host 00:16:3e:12:16:e7))www.baihuiyul.com/)' -nnvv
抓取经过 interface eth0,目标网络是 172.18 但目标主机又不是 172.18.82.173 的 TCP 且非 22 号端口号的数据包

Copy
tcpdump -i eth0 -nntvv '(www.yinmaoyule178.com/(dst net 172.18) and (not dst host 172.18.82.173) and (tcp) and (not port 22))'
抓取流入 interface eth0,host 为 172.18.82.173 且协议为 ICMP 的数据包

Copy
tcpdump -i eth0 -nntvv -P in host 172.18.82.173 and icmp
抓取流出 interface eth0,host 为 172.18.82.173 且协议为 ICMP 的数据包

Copy
tcpdump -i eth0 -nntvv -P out host 172.18.82.173 and icmp
05 与 wireshark、Snort 等工具的结合#
tcpdump 抓包的时候,默认是打印到屏幕输出,如果是抓取包少还好,如果包很多,很多行数据,刷刷刷从眼前一闪而过,根本来不及看清内容。不过,tcpdump 提供了将抓取的数据保存到文件的功能,查看文件就方便分析多了,而且还能与其他图形工具一起配合分析,比如 wireshark、Snort 等。

-w 选项表示把数据报文输出到文件
Copy
tcpdump -w capture_file.pcap port 80 # 把所有 80 端口的数据导出到文件
-r 选项表示读取文件里的数据报文,显示到屏幕上
Copy
tcpdump -nXr capture_file.pcap host host1
PS:.pcap 格式的文件需要用 wireshark、Snort 等工具查看,使用 vim 或 cat 会出现乱码。

06 tcpdump 的输出格式#
tcpdump 的输出格式总体上为:

Copy
系统时间 源主机.端口 > 目标主机.端口 数据包参数
比如下面的例子,显示了 TCP 的三次握手过程:

Copy
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0

21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0

21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, w
  
  RowKey(行键),顾名思义也就是我们在关系型数据库中常见的主键,它是Unique 的,在 HBase 中这个主键可以是任意的字符串,其最大长度是64K,在内部存储中会被存储为字节数组,HBase 表中的数据是按照 RowKey 的字典序排列的,例如很多索引的实现,包括地理空间索引很大程度就是依赖这个特性。
  
  不过也要注意一个点,现实当中期望排序是1、2、3、4...10,而在 HBase 中1 后面紧跟的会是10。因此,在设计行键的时候一定要充分地利用字典序这个特性,将一下经常读取的行存储到一起或者靠近,减少Scan 的耗时,提高读取的效率。这里一定要说的一点是,行键设计真的很重要,例如做组合行键时将时间排前面,导致写热点(曾经踩过的坑,记忆犹新)。
  
  Column Family(列族),它是由若干列构成,是表 Schema 的一部分,所以需要在创建表的时候就指定好。但也不是所表创建完之后就不能更改列族,只是成本会比较大,因此不建议更改。HBase 中可允许定义的列族个数最多就20多个。列族不仅仅能够帮助我们构建数据的语义边界,还能有助于我们设置某些特性,比如可以指定某个列族内数据的压缩形式。一个列族包含的所有列在物理存储上都是在同一个底层的存储文件当中。
  
  Column (列),一般都是从属于某个列族,跟列族不一样,列的数量一般的没有强限制的,一个列族当中可以有数百万个列,而且这些列都可以动态添加的。这也是我们常说的 HBase 面向列的优点,不像传统的关系型数据库,调整一下 Schema 都需要担心对于生产的影响。
  
  Version Number(版本号),HBase 中每一列的值或者说是每个单元格的值都是具有版本号的,默认使用的系统当前的时间戳,精确到毫秒。当然也可以是用户自己显式地设置,我们是通过时间戳来识别不同的版本,因此如果要自己设置的话,也要保证版本号的唯一性。用户也可以指定保存指定单元格的最后 N 个版本,或者某个时间段的版本,这个是可以在配置中配置的。一个单元格里面是数据是按照版本号降序的。也就是说最后写入的值会被最先读取。
  
  Cell(单元格),一个单元格就是由前面说的行键、列标示、版本号唯一确定的,这里说的列标示包括列族和列名。Cell 中的数据是没有类型的,全部都是字节码。
  
  三、HBase 表逻辑视图
  
  由于 HBase 表的一个单元格是由多维决定的,我这里尝试用一个二维的电子表格来展示。可以结合前面说的 HBase 的基本概念来理解。可以看到通过二维表格来展示一个成绩表,中间有很多单元格是空的,整体看起来很稀疏,需要说明的是在 HBase 的实际存储中这些空的单元格并不占存储。
  
  四、HBase 表物理视图
  
  物理视图比较复杂,下面以图来展示一个 HBase 表从宏观到微观到物理存储。尽量以最简单到方式展示物理视图的几个层次。
  
  表的横向切分(TableRegion)
  
  Region 的分裂
  
  Region 的分布
  
  Region 的存储结构
  
  一个 Region 是由一个或多个 Store 组成。每一个 Store 其实就是一个列族。每个
  
  Store 又是由一个 memStore 和 0 个或者多个 storeFile 组成。memStore 是存储在内存中,storeFile 是存储在 HDFS 中,有时候也称作 HFile。数据都会先写入memStore,一旦 memStore 超过给的的最大值之后,HBase 就会将memStore 持久化为 storeFile。
  
  五、HBase 集群结构
  
  一个 HBase 集群一般由一个 Master 和多个 RegionServer 组成。
  
  客户端库:可以通过 HBase 提供的各式语言API 库访问集群。API 库也会维护一个本地缓存来加快对 HBase 对访问,比如缓存中记录着 Region 的位置信息。
  
  Maste 节点:主要为各个 RegionServer 分配 Region,负责 RegionServer 对负载均衡,管理用户对于 Table 对 CRUD 操作。
  
  RegionServer:维护 Region,处理对这些 Region 对IO 请求,负责切分在运行过程中变过大的 Region。

Bigtable:A Distributed Storage System for Strctured Data的更多相关文章

  1. Bigtable: A Distributed Storage System for Structured Data

    https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf Abstr ...

  2. [IR] Bigtable: A Distributed Storage System for Semi-Structured Data

    良心博文: http://blog.csdn.net/opennaive/article/details/7532589 这里只是基础简述 众人说: 链接:http://blog.csdn.net/o ...

  3. Note: Bigtable, A Distributed Storage System for Structured Data

    Abstract Introduction::  Bigtable设计主旨:可扩地扩展到pByte级别和数千台机器的系统, 通用.可伸缩.高性能.高可用性.  不实现完整的关系数据模型,而是支持一个可 ...

  4. spark 笔记 2: Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing

    http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf  ucb关于spark的论文,对spark中核心组件RDD最原始.本质的理解, ...

  5. HDFS(Hadoop Distributed File System )

    HDFS(Hadoop Distributed File System ) HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表 ...

  6. Ceph: A Scalable, High-Performance Distributed File System译文

    原文地址:陈晓csdn博客 http://blog.csdn.net/juvxiao/article/details/39495037 论文概况 论文名称:Ceph: A Scalable, High ...

  7. [LeetCode] Design Log Storage System 设计日志存储系统

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  8. Storage System and File System Courses

    I researched a lot about storage system classes given at good universities this year. This had two r ...

  9. HDFS分布式文件系统(The Hadoop Distributed File System)

    The Hadoop Distributed File System (HDFS) is designed to store very large data sets reliably, and to ...

随机推荐

  1. JS的MD5加密

    /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as d ...

  2. C# 用户控件之温度计

    本文以一个用户控件[User Control]实现温度计的小例子,简述用户控件的相关知识,以供学习分享使用,如有不足之处,还请指正. 概述 一般而言,用户控件[User Control],是在Visu ...

  3. Android为TV端助力listview 非常重要的几个属性

    首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false Android:stackFromBottom="true" ...

  4. android viewpage预加载和懒加载问题

    1.本人理解懒加载和预加载问题某种情况下可以归结为一类问题,下面我就说一下我遇到的预加载问题和懒加载问题及解决的相应方法: - [1 ] 预加载问题        描述:我用到了三个fragment. ...

  5. 这么小的key-val数据库居然也支持事务——与短跑名将同名的数据库Bolt

    传送门: 柏链项目学院 什么是Bolt?   Bolt是一个纯净的基于go语言编写的key-val数据库,该项目受到LMDB项目的启发,目标是提供一个不需要完整服务器的简单.快速.可靠的数据库.    ...

  6. ReSharper导致Visual Studio缓慢?

    问题排查 我们会竭尽所能的ReSharper的性能方面,但是也有一些已知和未知的情况下,ReSharper的可以减缓的Visual Studio. 这里有一些关键点进行故障排除和修复ReSharper ...

  7. RHEL/Centos7 安装图形化桌面(转)

    RHEL/Centos7 安装图形化桌面   Linux是一个多任务的多用户的操作系统,好多linux爱好者在安装完linux后经常遇到一个问题——没有图形化桌面.今天小编在安装RHEL7的时候,一步 ...

  8. 黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号

    <环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...

  9. Tmux 入门

    什么是 Tmux Tmux 官方 Wiki 简单来说,Tmux 是一个能够让你一个窗口当多个窗口使用的终端模拟器.并且你还可以将它放到后台,等到想使用的时候再使用. 为什么要用 Tmux 在服务器上调 ...

  10. Ubuntu16.04中php如何切换版本

    其实就是一条Linux命令,如下: sudo update-alternatives --config php 会出现下面选项: There are choices for the alternati ...