第一章 介绍
HBase历史及使用场景
关系数据库问题
1.如果访问量过大,必须主从分离
2.主写从读,写作压力还是很大的,前端只能加缓存
3.水平分区
一致性模型
1.强一致性 所有的变化都会立即生效原子性
2.顺序一致性 每个客户端都会看到统一数据的顺序,但不一定是实时的
3.因果关系的一致性 存在因果关系的操作将看到相同的顺序,无因果关系将并行进行
4.最终一致性 当没有数据更新时,通过网络传播复制所有数据最终达成一致
5.弱一致性 不包括数据更新和传播,使客户端看到的数据不一致
Nosql的维度
1.数据模型
2.存储模型
3.一致模型
4.物理模型
5.读写性能
6.二级索引
7.失败处理
8.压缩
9.负载均衡
10.原子的读修改写
11.锁等待和死锁
构建块
table,rows,columns,cell,类似这种结构:
SortedMap<RowKey, List<SortedMap<Column, List<Value,Timestamp>>>>
自动分片,存储API
HBase:Hadoop数据库
hbase和bigtable对比
HBase Bigtable
region tablet
regionserver tablet server
flush minor compaction
minor compaction merging compaction
major compaction major compaction
write-ahead log commit log
HDFS GFS
mapreduce mapreduce
memstore memtable
HFile SSTable
zookeeper chubby
第二章 安装
需求
最好是商用pc,而不是桌面pc,内存要大,因为region节点需要大量内存,cpu最好4核以上
master和slave机器可以配置相同也可以不同,master要有更高的可靠性
CPU
master 2.5G(4核)
slave 2.5G(4核)
内存
namenode 8G
secondary namenode 8G
job tracker 2G
hbase master 4G
datanode 1G
task tracker 1G
region server 12G
zookeeper 1G
主从机器物理内存最好超过24G
磁盘
master 4 * 1TB STAT,raid0+1
slave 6 * 1TB STAT,jbod
从IOPS考虑,可以将4*1TB换成8*500G,这样可以提高一倍的IOPS
机架
master 1000M带宽,双PSU,1U或2U
slave 1000M带宽,单PSU,1U或2U
操作系统
建议选择CentOS或Red hat
文件系统
有ext3,ext4,XFS,ZFS,建议选择更高的ext4或XFS
SSH可以不用安装
域名服务器 ping -c
时钟同步服务器NTP
文件句柄上线
lsof -p region_server_pid
datanode处理线程
dfs.datanode.max.xcievers 调整到4096
调整交换分区
挂起进程可能会导致zookeeper超时,设置/etc/sysctl.conf
vm.swappiness=5
cat /proc/sys/vm/swappiness
HBase的文件系统
本地文件系统
HDFS
S3
其他,如CloudStore,KFS
安装选择
源码安装
mvn assembly:assembly
mvn -DskipTests assembly:assembly
运行模式
独立模式
伪分布式
完全分布式
name: hbase.rootdir value: hdfs://namenodeip:9000/hbase
name: hbase.cluster.distributed value: true
配置
hbase-site.xml
优先hbase-site.xml
其次hbase-default.xml
再是hadoop相关xml
hbase-env.sh
regionservers
log4j.properties
部署
脚本部署
apache whirr
puppet和chef
第三章 客户端API的基本操作
这一章将要讨论的是HBase提供的客户端API。按照之前的介绍,HBase是用java语言编写的。但是这并不意味着必须用java客户端去访问HBase。事实上,在第六章我们将介绍如何用其他语言访问HBase。
操作HBase的主要接口在org.apache.hadoop.hbase.client中,使用HTable类
1.在一个客户端的生命周期中使用一个HTalbe使用,因为创建HTable花销比较大,会先扫描.META.表
2.如果要在多线程中使用HTable,推荐使用HTablePool
3.对每一行的更新操作都是原子的
1.Put
用Put这个类做更新操作
有一个工具累Bytes,可以将各种类型的值转换为byte[]
Put#add(byte[] famliy,byte[] qualifier,long ts,byte[] value)
基本的add()操作
另外add()支持放入KeyValue这个对象
KeyValue是HBase API中最低级别的类,这个类的数据格式,就是HBase中存储的字节格式,所以
如果对性能要求很高的话,可以直接对这个类进行操作
has(byte[] family,byte[] qualifier)
这个类似迭代中的检查,检查某一个指定的cell是否存在
Put的父类中,有一些API
getRow()
getRowLock()
getLockId()
getTimeStamp()
heapSize()
通过Configuration创建一个默认配置实例,它会从classpath查找hbase-default.xml和
hbase-site.xml,使用Configuration.create(config)指定一个配置,这样优先级更高
HBaseConfiguration继承并兼容Configuration
可以手动指定一些属性,这样优先级最高,会覆盖配置文件中的属性
KeyValue
字节级别的操作,比对象级别的操作更有效,这是HBase提供的可以访问数据格式内部的类
从构造函数就可以看出,是对底层KeyValue结构的一个封装,可以直接访问byte[]
提供了一些比较类(实现了Comparator接口)
toString()返回当前的KeyVlaue的元信息,格式如下:
<row-key>/<family>:<qualifier>/<version>/<type>/<value-length>
Hbase有一个版本的概念,所有的版本都是按时间降序排列的,所以拿到的就是最新版本
如有一个test表
create 'test','name'
put 'test','row1','name','value1'
put 'test','row1','name','value2'
scan 'test' 执行之后会发现只有一条数据,即第二个put将第一put的值覆盖了
如果执行scan 'test',{VERSIONS=>3}
就看以检索出两个数据,将'value1'和'value2'都检索出来
客户端缓存
HTable#setAutoFlush()可以设置缓存
可以强制刷新缓存flushCommits()
HBase客户端会将缓存的内容排序后,put到相应的region server上
可以设置缓存大小: setWriteBufferSize()
计算服务端的内存使用:
hbase.client.write.buffer * hbase.regionserver.handler.count * region server数量
在没有刷新缓存之前,Htable#put()的内容都在内存中,此时如果去查找,则获取不到值
Put多个值
put<List<Put> 操作
标签: 0aa1压力变送器