我使用以下命令将HFile导入HBase:
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dcreate.table=no /user/myuser/map_data/hfiles my_table
当我刚看一下HBase Master UI时,我发现所有数据似乎都存储在一个区域:
HFiles由Spark应用程序使用以下命令创建:
JavaPairRDD<String, MyEntry> myPairRDD = ...
myPairRDD .repartitionAndSortWithinPartitions(new HashPartitioner(hbaseRegions));
为什么数据不会分割到所有区域?
答案 0 :(得分:4)
为什么数据不会分割到所有区域?
从上面的图片看,在加载到hbase之前,你的rowkeys不是salted。所以在源表它自己加载到一个特定的区域。
因此,您的rdd将携带导致hotspotting
的源分区数 查看Rowkey设计所以我建议在表创建时自行预分割为多个区域可以是0到10然后在0-10之间追加前缀到行密钥将确保数据的均匀分布。
例如:
create 'tableName', {NAME => 'colFam', VERSIONS => 2, COMPRESSION => 'SNAPPY'},
{SPLITS => ['0','1','2','3','4','5','6','7']}
前缀可以是在预分割范围之间生成的任何随机ID。
如果数据增加,这种行键也可以避免热点。 &安培;数据将分布在区域服务器上。
另请查看我的answer