Skip to content

Instantly share code, notes, and snippets.

@chenzx
Created February 17, 2014 13:00
Show Gist options
  • Save chenzx/9050096 to your computer and use it in GitHub Desktop.
Save chenzx/9050096 to your computer and use it in GitHub Desktop.
HBase实战
HBase实战
跳转至: 导航、 搜索
目录
1 介绍、入门
2 表设计
3 协处理器
4 其他的客户端(略)
5 OpenTSDB
6 HBase上查询GIS
7 部署
8 运维
介绍、入门
[rowkey, column family, column qualifier]
cell:总是视为byte[]
KeyValue
映射的映射:Map<RowKey, Map<ColumnFamily, Map<ColumnQualifier, Map<Version, Data>>>>
Put/Get
WAL/HLog + MemStore
读缓存:BlockCache
Delete(仅仅标记)
合并(compaction)
时间版本:默认只存3个?
Scan(扫描/查询)
stopRow
ResultsScanner
setCaching(n)
Filter(服务器端过滤)
ValueFilter
ICV(incrementColumnValue)
Increment命令对象?
RegionServer
通常和DataNode配置为同一物理硬件
2个特殊的表:-ROOT- .META.
使HBase作为MapReduce数据源
[ImmutableBytesWritable rowkey:scan, Result]
TableInputFormat
map侧联结与reduce侧联结
TableMapper/Reducer*
表设计
p85 这里的“无模式”太扯淡了,等于应用代码需要考虑所有的细节
把用户名字直接作为列限定符(HBase列族支持任意多的列)
“高表”:把"follower+followed"作为rowkey?太扯淡了
由于拆成了多个行,Put只支持行级事务,放弃了原子性
使用固定长度的Hash(follower)Hash(followed)散列键:更容易为扫描操作计算start/stop键
HBase里只有键(rowkey、列限定符、时间戳)可以建立索引
反规范化
读热点问题:为每个用户建立单独的twit流(也就是说,用复制提高了可用性),md5(followed)+倒序ts作为rowkey
列族高级配置
IN_MEMORY
BLOOMFILTER => 'ROWCOL':反向测试,要么“该行不在”,要么“不知道”
TTL
COMPRESSION => "SNAPPY"
VERSIONS => 3
过滤数据
FilterBase
filterRowKey(buffer, offset, length)
filterkeyValue
filterRow
filterAllRemaining ?(定制过滤器内部保存了状态,如一旦找到第一个匹配的即停止)
reset
预置过滤器
RowFilter
PrefixFilter
QualifierFilter
ValueFilter
FilterList 组合多个过滤器
协处理器
把任意计算逻辑push到托管数据的HBase节点上?
observer
你可以把它想象成RDB里的trigger,或AOP里的advice
CoprocessorHost
0.92+
RegionObserver
p126例 postPut
WALObserver
MasterObserver
endpoint
类似于RDB里的存储过程
CoprocessorProtocol?扩展的RPC协议?
coprocessorExec
其他的客户端(略)
via HBase Shell
via JRuby
via asynchbase
via REST
via Thrift
OpenTSDB
时间序列数据库?
p182 精心设计的rowkey?
监控指标UID + 高序时间戳 + 标签1名UID + 标签1值UID ...
列限定符:低序时间戳 + 掩码(?)
3个任务:
数据采集
每台监控主机上运行tcollector守护进程...
数据存储
查询服务
tsd构造范围扫描请求...
HBase上查询GIS
设计空间索引
geohash
p209 其他技术:Z轴次序曲线、Hilbert曲线(要点:多维度输入单维度输出)
实现k-NN查询
p211 queryKNN首先生成geohash,然后计算出需要扫描的9个前缀,然后合并结果
?Google Guava库 MinMaxPriorityQueue
p213 根据查询设计扫描
凸包、BoundingBox、。。。
WithinFilter
部署
Cloudera CDH*
HBase配置*
运维
Ganglia:原生支持Hadoop
性能指标
CPU IO Wait
写延迟:fsWriteLatency fsSyncLatency
YCSB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment