可能有很多类似的问题,但他们不回答我的情况(至少我不能明白这一点)。
我说,我有一个HBase中有4个列族的表。主要原因是每个列族具有不同的VERSIONS属性(非常不同)。
所有系列的所有列都不存储大数据(例如fulltexts),但平均为1KB(标识符为long,一些短字符串,整数等)
我需要以多种方式访问数据:按列系列扫描和获取,按版本(特定版本或范围)获取给定行的所有单元格,最后但并非最不重要:获取最新版本的给定行的所有列。
那么,在这种情况下,有4个列族的缺点是什么?读取是否效率较低,因为它们在不同的存储文件上运行(如果行不在内存中)?
答案 0 :(得分:11)
HBase中的列族数有限制。每个Column Family都有一个MemStore(它是一个写入缓存,在将数据写入Hfiles之前存储新数据),当一个已满时,它们都会刷新。
添加列族的次数越多,创建的MemStore就越多,Memstore刷新次数也会越来越频繁。它会降低性能。
答案 1 :(得分:10)
列族背后的想法非常棒 - 遗憾的是,目前的HBase实现并不能很好地处理很多列族。基本上,如果你有完全不同的访问模式,你应该尝试坚持使用一个并添加一秒。另请参阅HBase manual
您可以做的是将不同的“家庭”保留为具有不同前缀的列。 HBase是稀疏的,因此它不会占用更多空间,如果你需要,你仍然可以在扫描时只使用一个带有columnPrefix过滤器的“系列”
答案 2 :(得分:5)
根据Apache HBase wiki,Hbase将面临超过2或3个列族的性能问题。
答案 3 :(得分:1)
当MemStore累积足够的数据时,整个排序集将被写入HDFS中的新HFile。 HBase每个列族使用多个HFile,这些HFile包含实际的单元格或KeyValue实例。这些文件是随着时间的推移而创建的,因为将MemStore中排序的KeyValue编辑作为文件刷新到磁盘。
请注意,这是HBase中的列族数量受到限制的原因之一。每个CF都有一个MemStore;当一个装满后,它们都会冲洗。它还会保存最后写入的序列号,以便系统知道到目前为止所保留的内容。添加列族的次数越多,创建的MemStore就会越多,并且Memstore刷新将更加频繁。