最近朋友公司在做一些数据的迁移,主要是将一些Hive处理之后的热数据导入到HBase中,但是遇到了一个很奇怪的问题:同样的数据到了HBase中,所占空间竟增长了好几倍!详谈中,笔者建议朋友至少从几点原因入手分析:
- HBase中的数据相对于Hive中的数据会新增一些附加信息导致磁盘占用的增加,比如布隆过滤器
- Hive中的数据是否进行过压缩,比如snappy,压缩比还是很高的
- row key和列族都会占据一定的空间,当数据量较大时,仅二者就会占据很多不必要的空间
- 建议将相同查询场景下的几个常用的列的值拼接成一个列,节省KeyValue结构化带来的开销
Hive和HBase都可以作为存储系统,不禁思考引入HBase做数据存储的原因?
- 通过scan、get可以批量、单条获取数据,通过bulkload、put可以批量、单条导入数据
- 在实际生产环境,通常将计算和存储进行分离,保证集群规模水平可扩展,易于提高整体的吞吐。通过单机性能优化和集群的扩容,确保业务大幅增长时,存储不能没有成为系统的瓶颈
- 弱schema的特性能够很好的应对业务数据频繁变化的情况,也能够方便支持一些特殊业务场景的数据逻辑
当然,除了上述原因,还有很多涉及底层的原理环节和实际的业务场景需求,这就要求我们对HBase有足够的了解。