Hbase

本文介绍Hbase。但本文的前提是假设你已经读过Google的BigTable论文。

Introduction

Hbase 是基于Google Big Table用java实现的分布式,列式存储的数据库。传统的关系型数据库虽然已经存在了很多年,并且有很多成熟的解决方案,但是对大数据的支持略显不做。虽然关系型数据库也有一些集群,分布式等方案来处理大数据,但从关系型数据库从最初的设计上就不是为大数据而生的,所以都有其局限性。

Building Blocks

这一段将概述Hbase的架构。将从以下几个方面来讲:

Table row column Cell

Auto-Sharding

Storage API

Implementation

总结

Table , row, column, cell

Hbase 的table 是一个多维表。 表中的每一行数据都是由(rowkey,column,timestamp) 到 value的映射。或者说是rowkey,column映射到cell,而cell中的数据则保存着不同timestamp的不同版本。具体请参考BigTable的数据模型。

column 和 BigTable中一样,有column family的概念。column family 在创建表的时候就要指定。不同的一个column family下可以创建任意个column。而且不同的行可以有多个不同的column。

Auto-Sharding

Sharding 是数据库中一个通用的概念。Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题。我们知道BigTable中rowkey 按字典顺序排序,一个大的table 根据rowkey的范围分割成很多区域叫tablet。 Hbase中这个概念叫region。Hbase中的region和 BigTable中的tablet几乎没有区别。 一个表根据rowkey的范围分割成多个region。region 由region server负责管理。当region过大了,region server负责split region。 region 是hbase集群中负载均衡的单位,当一个region server有太多的region, hbase会通过负载均衡让压力较小的region server去承担工作。

Storage API

和BigTable 一样。Hbase提供的API能够

create / delete table和column family

操作table column family的metadata

操作table去读写数据

implementation

BigTable 中有一个SSTable。 在Hbase中叫做 HFile。和SSTable一样,HFile用来存储Hbase 的 column family数据。HFile中存储的数据也是键值对。在HFile的最底层有一个索引。因为HFile物理上也是一个个data block组成的,该索引用来查找对应的data block。 HFile对外提供接口可以根据key快速查找value,也可以对一个给定的Key范围对相应的 key-value 迭代。

HFile存储在HDFS中。在写入HFile之前,对数据的操作要写入一个redo log,在Hbase中这个redo log叫做 write-ahead-log WAL. 写入 WAL后,数据被写入内存中一个叫memstore的内存结构。当一个memstore满了后,该memstore flush到硬盘变成HFile。flush 后WAL 就可以丢弃了。memstore就是HFile的内存形式。 这一段和BigTable 的原理是一样的,不过名词略有不同。下面是一个名词对照表:

SSTable : HFile

commit log : WAL

GFS : HDFS

memtable : memstore

minor compaction : flush

HFile 和 SSTable 一样是不可变的。所以当做Delete 操作的时候 只能是写入一个带有delete 标记的记录,这样在读的时候该标记确保客户端读不到被删除的数据。

read的操作需要把memstore 和 对应的HFile 读入内存并merge。 WAL 在读操作中永远不会用到。WAL只有在server down掉的时候用来恢复 HFile。

Hbase中有mincompaction和major compaction。因为memstore定期flush到硬盘所以小的HFile会很多。minor compaction会定期的合并一些。 要注意这和BigTable中的minor compaction有点不一样。 BigTable 中的minor compaction和这里的flush对应。 还有一种majro compaction和BigTable中的概念一样。就是把同一个region下的同一个column family的HFile合并成唯一的一个。而且在合并的过程中会把之前标记为删掉的数据真正删掉。

和BigTable一样 Hbase 也由三部分组成, Master , region server 和 client library 。

Master 负责管理整个集群,负责region 的分配, 负责region server的负载均衡节点添加等操作。 Region server 管理若干个region。 client 直接和region server进行通信I/O。 这样减少了Master 的负载。 集群间协调工作用ZooKeeper。

Install

Hbase在安装前要先规划。Hbase中有Master 和 region server的概念。我们知道region server 负责I/O 所以region server的要求就是网速要好,硬盘容量要充足,并且I/O要好。 而 Master的CPU处理速度要高。 同时我们知道 Hbase基于HDFS。所以还要为安装HDFS 做一些规划。 HDFS 分name node 和data node。 data node 的要求和region server差不多,而name node 的要求和master server类似。我们的实验中用三台机器,Master和namenode 装在一台机器上,而region server和data node 装在一起。 规划如下:

名称 ip role
s1 192.168.1.81 name node && data node
s2 192.168.1.82 data node
s3 192.168.1.83 data node

在安装Hbase 之前要安装 HDFS。 安装HDFS之前则有一些通用的工作要做:

install java

配置s1 无密码访问s1,s2,s3

配置3台服务器使用统一的NTP 服务器

这些操作是比较通用的操作,这里不介绍。 在做完这些操作后开始第一步

Install HDFS

安装HDFS之前要配置一些环境变量如下:

export HADOOP_PREFIX="/opt/hadoop/hadoop-2.7.1"
export HADOOP_HOME=$HADOOP_PREFIX
export HADOOP_COMMON_HOME=$HADOOP_PREFIX
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
export HADOOP_HDFS_HOME=$HADOOP_PREFIX
export HADOOP_MAPRED_HOME=$HADOOP_PREFIX
export HADOOP_YARN_HOME=$HADOOP_PREFIX

然后去官网下载你想安装的hadoop版本。注意是hadoop而不是hdfs。因为hdfs是集成在hadoop的package中的。

wget http://apache.mirrors.spacedump.net/hadoop/common/stable/hadoop-2.7.1.tar.gz

把package放到之前指定的hadoop_prefix目录下解压缩。

三台机器的配置都一样

在$HADOOP_PREFIX/etc/hadoop/hdfs-site.xml中做如下配置:

<configuration>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop/hadoop-2.7.1/hdfs/datanode</value>
<description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.</description>
</property> <property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop/hadoop-2.7.1/hdfs/namenode</value>
<description>Path on the local filesystem where the NameNode stores the namespace and transaction logs persistently.</description>
</property>
</configuration>

在$HADOOP_PREFIX/etc/hadoop/core-site.xml中做如下配置:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://s1/</value>
<description>NameNode URI</description>
</property>
</configuration>

启动停止

## Start HDFS daemons
# Format the namenode directory (DO THIS ONLY ONCE, THE FIRST TIME)
# ONLY ON THE NAMENODE NODE
$HADOOP_PREFIX/bin/hdfs namenode -format
# Start the namenode daemon
# ONLY ON THE NAMENODE NODE
$HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
# Start the datanode daemon
# ON ALL SLAVES
$HADOOP_PREFIX/sbin/hadoop-daemon.sh start datanode

Install Hbase

hbase的安装其实也是解压。去官网下载你需要的package解压到/opt/hbase下。注意java要提前安装并且配置JAVA_HOME

三个节点的配置都一样,所以只要在一个节点上配置完成然后把文件copy到其他节点即可。 编辑conf/hbase-env.sh 在开始部分加入source /root/.bash_profile。 这是为了加载你之前设置的环境变量。 如果你把环境变量写入了不同文件, 那么这里需要加载对应的profile 文件。

编辑conf/regionservers ,内容如下:

s1
s2
s3

编辑conf/backup-masters(如果没有则创建),内容如下:

s2

编辑配置文件conf/hbase-site.xml ,增加内容如下:

<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://s1/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>s1,s2,s3</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper</value>
</property>
<property>
<name>
hbase.regionserver.port
</name>
<value>
18020
</value>
<source>
hbase-default.xml
</source>
</property>

这里修改了region server的监听地址指定为18020而不是采用默认, 因为master其实也是region server。 所以如果不修改,那么master以及backup master无法与region server起在同一台机器上。

在s1上启动 start-hbase.sh 会启动cluster中所有节点。

启动后可以通过http://s1:16010/ 访问master的web ui。

进入hbase安装目录的bin

./start-hbase.sh

swapness

region presplit

wal

二 hbase的更多相关文章

  1. 大数据学习系列之二 ----- HBase环境搭建(单机)

    引言 在上一篇中搭建了Hadoop的单机环境,这一篇则搭建HBase的单机环境 环境准备 1,服务器选择 阿里云服务器:入门型(按量付费) 操作系统:linux CentOS 6.8 Cpu:1核 内 ...

  2. hbase+hive应用场景

    一.Hive应用场景本文主要讲述使用 Hive 的实践,业务不是关键,简要介绍业务场景,本次的任务是对搜索日志数据进行统计分析.集团搜索刚上线不久,日志量并不大 .这些日志分布在 5 台前端机,按小时 ...

  3. HBase入门

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  4. Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型

    Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...

  5. NOSQL之旅---HBase

    最近因为项目原因,研究了Cassandra,Hbase等几个NoSQL数据库,最终决定采用HBase.在这里,我就向大家分享一下自己对HBase的理解. 在说HBase之前,我想再唠叨几句.做互联网应 ...

  6. 【DB】HBase的基本概念

    一 Hbase是个啥东东?  在说Hase是个啥家伙之前,首先我们来看看两个概念.面向行存储和面向列存储.面向行存储.我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的.面向行存储的数据库主要 ...

  7. 大数据学习系列之三 ----- HBase Java Api 图文详解

    版权声明: 作者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 个人博客出处:http ...

  8. 大数据学习系列之五 ----- Hive整合HBase图文详解

    引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...

  9. HBase篇--初始Hbase

    一.前述 1.HBase,是一个高可靠性.高性能.面向列.可伸缩.实时读写的分布式数据库.2.利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量 ...

随机推荐

  1. 2015年度精品 最新力作32位和64位xp,win7,win8,win10系统下载(电脑城专用版)

    一.系统主要特点 1.安装维护方便快速 - 全自动无人值守安装,采用万能GHOST技术,安装系统过程只需3-5分钟,适 合新旧各种机型. - 集成常见硬件驱动,智能识别+预解压技术,绝大多数硬件可以快 ...

  2. Java8新特性 Stream流式思想(一)

    遍历及过滤集合中的元素使用传统方式遍历及过滤集合中的元素package cn.com.zq.demo01.Stream.test01.Stream; import java.util.ArrayLis ...

  3. sql中递归查询

    with AA as ( select * from tb_ClientBranch_Category where BRANCH_MOM_NAME='北京易华录信息技术股份有限公司' union al ...

  4. Js 之图片懒加载插件

    一.PC端(lazyload) 1.引入js文件 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.m ...

  5. Java 斜杠 与 反斜杠

    除号 /(数字键盘的斜杠)网址 /(数字键盘的斜杠)文件地址 \转义 \正则表达式 \

  6. 05CSS链接

    CSS链接 链接的四种状态: •  a:link - 普通的.未被访问的链接 •  a:visited - 用户已访问的链接 •  a:hover - 鼠标指针位于链接的上方 •  a:active ...

  7. 借助百度地图API制作企业百度地图

    做网站需要插入地图,可以借助百度地图API,具体步骤如下: 1.打开百度地图API的网址:   http://api.map.baidu.com/lbsapi/creatmap/ 2.设置中心点 3. ...

  8. secureCRT 破解

    转自:http://www.cnblogs.com/qingtingzhe/articles/5008902.html

  9. Conv1D和Conv2D的区别

    我的答案是,在Conv2D输入通道为1的情况下,二者是没有区别或者说是可以相互转化的.首先,二者调用的最后的代码都是后端代码(以TensorFlow为例,在tensorflow_backend.py里 ...

  10. Chrome插件:微信公众号自动登录(chrome.extension)

    manifest.json: { "manifest_version": 2, "name": "WX.AutoLogin", " ...