淘宝为什么使用HBase及如何优化的1 前言
hbase是从hadoop中 分离出来的apache顶级开源项目 。由于它很好地用java实现了google的bigtable系统大部分特性淘宝代码重构java,因此在数据量猛增的今天非常受到欢 迎 。对于淘宝而言 , 随着市场规模的扩大,产品与技术的发展,业务数据量越来越大,对海量数据的高效插入和读取变得越来越重要 。由于淘宝拥有也许是国内最大 的单一hadoop集群(云梯),因此对hadoop系列的产品有比较深入的了解,也就自然希望使用hbase来做这样一种海量数据读写服务 。本篇文章将 对淘宝最近一年来在online应用上使用和优化hbase的情况做一次小结 。
2 原因
为什么要使用hbase淘宝代码重构java?
淘宝在2011年之前所有的后端持久化存储基本上都是在mysql上进行的(不排除少量oracle/bdb/tair/mongdb等),mysql由于开源,并且生态系统良好 , 本身拥有分库分表等多种解决方案,因此很长一段时间内都满足淘宝大量业务的需求 。
但是由于业务的多样化发展,有越来越多的业务系统的需求开始发生了变化 。一般来说有以下几类变化:
a) 数据量变得越来越多,事实上现在淘宝几乎任何一个与用户相关的在线业务的数据量都在亿级别,每日系统调用次数从亿到百亿都有,且历史数据不能轻易删除 。这需要有一个海量分布式文件系统,能对TB级甚至PB级别的数据提供在线服务
b) 数据量的增长很快且不一定能准确预计,大多数应用系统从上线起在一段时间内数据量都呈很快的上升趋势,因此从成本的角度考虑对系统水平扩展能力有比较强烈的需求,且不希望存在单点制约
c) 只需要简单的kv读取,没有复杂的join等需求 。但对系统的并发能力以及吞吐量、响应延时有非常高的需求,并且希望系统能够保持强一致性
d) 通常系统的写入非常频繁,尤其是大量系统依赖于实时的日志分析
e) 希望能够快速读取批量数据
f ) schema灵活多变,可能经常更新列属性或新增列
g) 希望能够方便使用,有良好且语义清晰的java接口
以上需求综合在一起 , 淘宝代码重构java我们认为hbase是一种比较适合的选择 。首先它的数据由hdfs天然地做了数据冗余,云梯三年的稳定运行,数据100%可靠 己经证明了hdfs集群的安全性,以及服务于海量数据的能力 。其次hbase本身的数据读写服务没有单点的限制,服务能力可以随服务器的增长而线性增长,达到几十上百台的规模 。LSM-Tree模式的设计让hbase的写入性能非常良好,单次写入通常在1-3ms内即可响应完成,且性能不随数据量的增长而 下降 。
region(相当于数据库的分表)可以ms级动态的切分和移动,保证了负载均衡性 。由于hbase上的数据模型是按rowkey排序存储的,而读 取时会一次读取连续的整块数据做为cache , 因此良好的rowkey设计可以让批量读取变得十分容易,甚至只需要1次io就能获取几十上百条用户想要的 数据 。最后 , 淘宝大部分工程师是java背景的同学,因此hbase的api对于淘宝代码重构java他们来说非常容易上手,培训成本相对较低 。
当然也必须指出,在大数据量的背景下银弹是不存在的 , hbase本身也有不适合的场景 。比如,索引只支持主索引(或看成主组合索引),又比如服务是 单点的,单台机器宕机后在master恢复它期间它所负责的部分数据将无法服务等 。这就要求在选型上需要对自己的应用系统有足够了解 。
3 应用情况
我们从2011年3月开始研究hbase如何用于在线服务 。尽管之前在一淘搜索中己经有了几十节点的离线服务 。这是因为hbase早期版本的目标就 是一个海量数据中的离线服务 。2009年9月发布的0.20.0版本是一个里程碑,online应用正式成为了hbase的目标,为此hbase引入了 zookeeper来做为backupmaster以及regionserver的管理 。2011年1月0.90.0版本是另一个里程碑,基本上我们今天 看到的各大网站 , 如facebook/ebay/yahoo内所使用于生产的hbase都是基于这一个版本(fb所采用的0.89版本结构与0.90.x 相近) 。bloomfilter等诸多属性加入了进来,性能也有极大提升 。基于此,淘宝也选用了0.90.x分支作为线上版本的基础 。
推荐阅读
- excel框框中怎么打勾,excel如何框里打勾
- 微信关注公众号助力群,帮关注公众号的群
- 怎么设置页脚PPT,怎么设置页脚格式
- 么要用Go语言做后端 go语言适合做web开发吗
- linux下接受邮件命令,linux接收邮件
- 怎么上白金登山赛车游戏,登山赛车金币钻石不减反增
- 校园模拟下载游戏,模拟器校园模拟器350008版
- php之间如何传递数据 php值
- c语言怎么更换输入法,c语言怎么切换大小写