HBase
2016-08-12 15:11:55 0 举报
AI智能生成
HBase是一个分布式、面向列的开源数据库,它是Apache软件基金会的Hadoop项目的一部分。HBase的设计目标是为了满足大数据环境下对随机实时读写的需求,它提供了高可靠性、高性能、面向列、可伸缩的特性。HBase的数据存储在Hadoop的HDFS文件系统上,这使得它可以处理PB级别的数据。HBase支持数据的实时读写,并且可以通过MapReduce进行批量数据处理。HBase的主要应用场景包括日志记录、实时分析、全文搜索等。
作者其他创作
大纲/内容
1. Hbase架构
Hbase发展
2006:Google发表论文《Bigtable:A Distributed Storage System for Structured Data》
2007:最初的HBase发布
2008:HBase成为 Hadoop 的子项目
2010:HBase 成为 Apache 的顶级项目
最新版本: HBASE 2.1.0
Hbase简介
高可靠性、高性能、面向列、可伸缩的分布式存储系统
Hadoop HDFS为HBase提供了高可靠性的底层存储支持
Hadoop MapReduce为HBase提供了高性能的计算能力
Zookeeper为HBase提供了稳定服务和failover机制
海量数据的快速随机访问
逻辑模型
表Table
行健RowKey
列族ColumnFamily
时间戳TimeStamp
单元格Cell
分区Region
根据rowkey切分
Region:RegionServer的关系 1:1
RegionServer:Region的关系 1:n
物理模型
分区Region
Region:Store的关系 1:n
Store
Store:列族ColumnFamily的关系 1:1
由1个memStore和0至多个StoreFile组成
StoreFile以HFile格式保存在HDFS上
HFile:列族的关系 1:1
region定位
zookeeper中保存root region的位置:-Root-
-Root-:记录.META.的Region信息
.META.:记录用户表的Region信息
2. Hbase部署
单机部署
前提条件
安装Java,配置Java环境变量
不需要hadoop
不需要zookeeper,利用HBASE内置zookeeper
部署步骤
1. 下载HBASE tar文件并解压
2. 配置hbase-site.xml文件
hbase.rootdir: 使用本地文件系统
3. 配置hbase-env.sh文件
设置JAVA_HOME
4. 在/etc/profile中设置hbase环境变量
export HBASE_HOME=?
export PATH=$PATH:$HBASE_HOME/bin
5. 进入HBASE_HOME目录启动Hbase
bin/start-hbase.sh
6. 简单使用,验证部署成功:bin/hbase shell
完全分布式部署
前提条件
安装Java,配置Java环境变量
部署Hadoop集群
部署zookeeper集群
规划master和slave服务器
部署步骤
master节点配置
1. 下载HBASE tar文件并解压
2. 配置hbase-site.xml文件
hbase.rootdir: HDFS上的文件目录
hbase.cluster.distributed:true
zookeeper配置
hbase.zookeeper.quorum:zookeeper集群节点hostname
hbase.zookeeper.property.dataDir:zookeeper元数据目录
hbase.zookeeper.property.clientPort:zookeeper端口
3. 配置hbase-env.sh文件
设置JAVA_HOME
使用已有zookeeper集群:export HBASE_MANAGES_ZK=flase
4. 编辑conf/regionservers配置regionservers
添加规划好的slave机器的hostname
5. 在/etc/profile中设置hbase环境变量
export HBASE_HOME=HBASE主目录
export PATH=$PATH:$HBASE_HOME/bin
向所有region节点复制文件进行部署
通过脚本
启动hbase集群
5. 进入HBASE_HOME目录启动Hbase
bin/start-hbase.sh
6. 验证部署成功
通过shell命令: bin/hbase shell 登录shell执行若干命令
通过web UI:http://master:60010
3. Hbase shell
shell简介
通过shell命令创建/删除表、新增/更新数据
shell命令实例
list:通过list可以列出所有已创建的表
create 'testtable' 'colfam1':创建表testtable,其列族为colfam1
desc 'testtable' : 查看表testtable的表结构
put 'testtable', 'row1', 'colfam1:a', 'value1' : 向表testtable增加一条记录,rowkey为row1,列族colfam1中列a的值为value1
scan 'testtable' :全表扫描testtable
get 'testtable', 'row1' : 获取表testtable中rowkey为row1的记录
删除table step1:disable 'testtable'; step2: drop 'testtable'
Hbase设计模式
行健rowkey
为写优化
问题
rowkey顺序写入,产生热点HRegion;需要将负载在集群中分散
对策
散列:使用原始数据(比如时间戳、用户ID、产品ID)的散列值
加盐salt:在原始数据(比如时间戳、用户ID、产品ID)前面加一段随机产生的数值
为读优化
将原始数据逆序并加上其他频繁查询项
列族columnfamily
1. 一般不建议设计多个列族:一个列族对应一个HFile,一张表一般仅仅设计一个列族
2. 数据块缓存配置:建表时设置BLOCKCACHE=>'false'
3. 激进缓存配置:建表时设置IN_MOMERY=>'true'
4. 布隆过滤器(BLOOMFILTER)设置:建表时设置BLOOMFILTER=>'ROWCOL'
5. 生存时间(TTL)配置:建表时设置TTL=>'18000'
6. 列族压缩:建表时设置COMPRESSION=>'SNAPPY'
7. 单元时间版本:建表时设置VERSIONS=>1
4. API
HBaseConfiguration
所在包:org.apache.hadoop.hbase
功能: 继承自Hadoop的Configuration类,创建此类即获得hadoop和HBase(hbase-site.xml)的配置属性、用户提交的可选配置
创建注意事项
客户端访问HBase必须创建HBaseConfiguration实例来处理配置的属性
HBaseAdmin
所在包:org.apache.hadoop.hbase.client
功能:提供关于HBase数据库中的表信息
HTableDescriptor
所在包:org.apache.hadoop.hbase
功能:HTableDescriptor类包含了表的名字以及表的列族信息
HColumnDescriptor
所在包:org.apache.hadoop.hbase
功能:维护列族的信息
HTable
所在包:org.apache.hadoop.hbase.client
功能:HBase客户端与HBase服务端通讯的Java API对象,客户端可以通过HTable对象连接服务端,对数据进行CRUD操作
创建注意事项
规避HTable对象的创建开销:在程序启动时一次性创建完成需要的HTable对象
为执行的每一个线程创建独立的HTable实例
HTablePool:HTablePool通过维护固定数量的HTable对象,能够在程序运行期间复用这些HTable资源对象
scan
所在包:org.apache.hadoop.hbase
功能:Scan对象可以返回满足给定条件的多行数据。
常用构造函数
创建扫描所有行的Scan:Scan()
创建Scan,从指定行开始扫描:Scan(byte[] startRow)
创建Scan,指定起止行:Scan(byte[] startRow, byte[] stopRow)
创建Scan,指定起始行和过滤器:Scan(byte[] startRow, Filter filter)
常用方法
Scan setStartRow (byte[] startRow) 设置Scan的开始行,默认 结果集 包含该行。
Scan setStopRow (byte[] stopRow) 设置Scan的结束行,默认 结果集 不包含该行
Scan setBatch(int batch) 指定最多返回的Cell数目.用于防止一行中有过多的数据,导致OutofMemory错误
Scan setTimeRange (long minStamp, long maxStamp) 扫描指定时间范围的数据
Scan setTimeStamp (long timestamp) 扫描指定时间的数据
Scan addColumn (byte[] family, byte[] qualifier) 指定扫描的列
Scan addFamily (byte[] family) 指定扫描的列族
Scan setFilter (Filter filter) 为Scan设置过滤器
Scan setReversed (boolean reversed) 设置Scan的扫描顺序,默认是正向扫描(false),可以设置为逆向扫描(true)
Scan setMaxVersions() 获取所有版本的数据
Scan setMaxVersions (int maxVersions) 设置获取的最大版本数
void setCaching (int caching) 设定缓存在内存中的行数,缓存得越多,以后查询结果越快,同时也消耗更多内存
注意事项
如果希望获取所有的行,直接初始化一个Scan对象即可。如果希望限制扫描的行范围,可以使用Scan对象的方法
put
所在包:org.apache.hadoop.hbase
功能:增加或者修改数据,分为单行Put和多行Put
常用构造函数
指定行键:public Put(byte[] row)
指定行键和时间戳:public Put(byte[] row, long ts)
从目标字符串中提取子串,作为行键:Put(byte[] rowArray, int rowOffset, int rowLength)
从目标字符串中提取子串,作为行键,并加上时间戳:Put(byte[] rowArray, int rowOffset, int rowLength, long ts)
Put常用方法
指定列族和限定符,添加值:add(byte[] family, byte[] qualifier, byte[] value)
指定列族,限定符和时间戳,添加值:add(byte[] family, byte[] qualifier, long ts, byte[] value)
设置写WAL的级别:public void setDurability(Durability d)
注意事项
Put的构造函数都需要指定行键,如果是全新的行键,则新增一行;如果是已有的行键,则更新现有行
创建Put对象及put.add()过程都是在构建一行的数据
get
所在包:org.apache.hadoop.hbase
功能:希望获取整行数据,如果希望进一步缩小获取的数据范围,可以使用Get对象的的方法
常用构造函数
指定行键: Get(byte[] row)
常用方法
Get addFamily(byte[] family) 指定希望获取的列族
Get addColumn(byte[] family, byte[] qualifier) 指定希望获取的列
Get setTimeRange(long minStamp, long maxStamp) 设置获取数据的时间戳范围
Get setTimeStamp(long timestamp) 设置获取数据的时间戳
Get setMaxVersions(int maxVersions) 设定获取数据的版本数
Get setMaxVersions() 设定获取数据的所有版本
Get setFilter(Filter filter) 为Get对象添加过滤器
void setCacheBlocks(boolean cacheBlocks) 设置该Get获取的数据是否缓存在内存中
5. Hbase备份与迁移
简单备份模式
方案:通过snapshot或设置时间戳来dump出集群数据来实现这种方案,保证数据的安全性。
优点:可以做到对在线数据中心低干扰或无千扰的数据备份
缺点:只是对时间点之前的数据安全性得到保障,如果发生突发事件会导致不可避免的整段时间的数据丢失
集群间复制
配置
两个集群hbase-site.xml参数配置
打开主节点里表student的复制特性:设置列族的REPLICATION_SCOPE => '1'
主节点里添加要复制的从节点的peer
复制成功条件:主从拥有相同的表和列族
模式
主主模式
任何一个集群收到的写入都会被复制到另一个集群
主从模式
所有写入只写入主集群,然后被复制到从集群
注意事项
误写入从集群的数据不会被复制回主集群
从集群可以拥有不是从主集群复制来的其他表和列族
管理复制
停止复制,在shell中执行:stop_replication
重启复制,在shell中执行:start_replication
删除集群成员,在shell中执行:remove_peer '1'(此项为成员ID)
查看当前复制的成员列表,在shell中执行:list_peers
paxos算法
算法思想:Paxos是能够基于一大堆完全不可靠的网络条件下却能可靠确定地实现共识一致性的算法。
Paxos解决共识思路
step1. 由提交者Leader向所有其他服务器发出prepare消息请求准备,所有服务器中大多数如果回复诺言承诺就表示准备好了,可以接受写入
step2. 提交者向所有服务器发出正式建议propose,所有服务器中大多数如果回复已经接收就表示成功了
特点
一致性>可用性
保证在分布式系统中写操作能够顺利进行,保证系统中大多数状态是一致的
静态迁移
功能:在hbase停止的状态下进行数据的迁移
操作:采用Hadoop distcp方式,将以上目录的内容,迁移到另一个集群。 使用hdfs进行恢复。
动态迁移
1. 导入/导出(Import/Export)
Step1:导出
Step2:导入
2. 使用ImportTsv的高级导入方式
功能:将存储在HDFS上的自定义分隔符(默认\t)的数据文件,通过一条命令方便的导入到HBase表中
两种方式将数据导入到HBase表中
使用TableOutputformat在reduce中插入数据
先生成HFile格式的文件,再执行一个叫做CompleteBulkLoad的命令
3. Copy Table
功能:扫描一张HBase表并直接执行put写入另一张表
case:从一个集群把mytable表复制到另一个远程集群上
0 条评论
下一页