二 hbase
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的更多相关文章
- 大数据学习系列之二 ----- HBase环境搭建(单机)
引言 在上一篇中搭建了Hadoop的单机环境,这一篇则搭建HBase的单机环境 环境准备 1,服务器选择 阿里云服务器:入门型(按量付费) 操作系统:linux CentOS 6.8 Cpu:1核 内 ...
- hbase+hive应用场景
一.Hive应用场景本文主要讲述使用 Hive 的实践,业务不是关键,简要介绍业务场景,本次的任务是对搜索日志数据进行统计分析.集团搜索刚上线不久,日志量并不大 .这些日志分布在 5 台前端机,按小时 ...
- HBase入门
/×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...
- Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型
Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...
- NOSQL之旅---HBase
最近因为项目原因,研究了Cassandra,Hbase等几个NoSQL数据库,最终决定采用HBase.在这里,我就向大家分享一下自己对HBase的理解. 在说HBase之前,我想再唠叨几句.做互联网应 ...
- 【DB】HBase的基本概念
一 Hbase是个啥东东? 在说Hase是个啥家伙之前,首先我们来看看两个概念.面向行存储和面向列存储.面向行存储.我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的.面向行存储的数据库主要 ...
- 大数据学习系列之三 ----- HBase Java Api 图文详解
版权声明: 作者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 个人博客出处:http ...
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- HBase篇--初始Hbase
一.前述 1.HBase,是一个高可靠性.高性能.面向列.可伸缩.实时读写的分布式数据库.2.利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量 ...
随机推荐
- MVC 附件在线预览
原因:应客户需求,在系统中浏览附件内容,需要先下载到本地然后打开,对使用造成了不便,要求可以不需下载直接在浏览器中打开减少操作步骤. 领导给了3天时间,最后查找方法,写测试项目,往正式项目添加,测试, ...
- C++学习之继承篇
今天通过对实验二继承,重载,覆盖的学习,让我更深一步理解了这些概念的区别. 首先来明确一个概念,函数名即地址,也就是说函数名就是个指针. 编译阶段,编译器为每个函数的代码分配一个地址空间并编译函数代码 ...
- Java泛型中的协变和逆变
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...
- nginx 服务器
1.windows版本的nginx启动报错 No mapping for the Unicode character exists in the target multi-byte code page ...
- C#筆記--DataGridView使用
1.databingcomplete 当数据源的内容更改时,或者当 DataSource.DataMember 或 BindingContext 属性的值更改时,会引发此事件. 例如,如果要基于内容更 ...
- dom监听事件class
layui.use(['layer', 'form'], function(){ var layer = layui.layer ,form = layui.form; var $ = layui.j ...
- asp 数据库 模块化 - 思路是没一个页面有一个自己的数据类 这里用nPath表示
<!--#include file="db_class.asp" --> <% '当前页面数据 nPath = "..\..\.." 't模块 ...
- python中的next()以及iter()函数
我们首先要知道什么是可迭代的对象(可以用for循环的对象)Iterable: 一类:list,tuple,dict,set,str 二类:generator,包含生成器和带yield的generato ...
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...
- 18mybatis
18mybatis-2018/08/02 1.mybatis标签 定义SQL语句 id :唯一的标识符 parameterType:传给此语句的参数的全路径名或别名例:com.test.poso.Us ...