HBase:存储在一个区域中的所有数据

时间:2017-09-29 13:28:29

标签: apache-spark hbase partitioning

我使用以下命令将HFile导入HBase:

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dcreate.table=no /user/myuser/map_data/hfiles my_table

当我刚看一下HBase Master UI时,我发现所有数据似乎都存储在一个区域:

enter image description here

HFiles由Spark应用程序使用以下命令创建:

JavaPairRDD<String, MyEntry> myPairRDD = ...
myPairRDD .repartitionAndSortWithinPartitions(new HashPartitioner(hbaseRegions));

为什么数据不会分割到所有区域?

1 个答案:

答案 0 :(得分:4)

  

为什么数据不会分割到所有区域?

enter image description here 从上面的图片看,在加载到hbase之前,你的rowkeys不是salted。所以在源表它自己加载到一个特定的区域。

因此,您的rdd将携带导致hotspotting

的源分区数

hbase docs

查看Rowkey设计

所以我建议在表创建时自行预分割为多个区域可以是0到10然后在0-10之间追加前缀到行密钥将确保数据的均匀分布。

例如:

create 'tableName', {NAME => 'colFam', VERSIONS => 2, COMPRESSION => 'SNAPPY'}, 
    {SPLITS => ['0','1','2','3','4','5','6','7']}

前缀可以是在预分割范围之间生成的任何随机ID。

如果数据增加,这种行键也可以避免热点。 &安培;数据将分布在区域服务器上。

另请查看我的answer