murmurhash用于hbase数据均衡分配,真正的避免热点读写.

本文介绍了一种使用MurmurHash算法结合HBase存储系统的方法,旨在均匀分布数据到不同region,避免热点问题。算法考虑了时间因素,通过解析日期时间字符串,将数据均匀分散,提高HBase读写效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 系统中使用hbase作为存储,由于hbase的特性,数据存储在多个分区region上。为了避免分区region的热点读写,需要将数据可以平均分配到每个region上。算法就是通过murmurhash,根据时间的推移、分区region个数进行计算。

 

#define TIME_PAST(X,B) \
({ \
int year, month, day, hour, minute, second; \
sscanf(X,"%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second); \
B?hour*60+minute:hour; \
})

int HBaseAdapter::getHashRegion(string key,int keyLen,string dateTime,int regionTotal){
	int seed=0x1234ABCD;
	int hashCode=murmurHash(key.c_str(),keyLen,seed);
	hashCode = (hashCode + TIME_PAST(dateTime.c_str(),1)) %13;
	return hashCode & 0xFF;
}

/**
 * calu murmurhash32
 * @return hash code
 * @param key key to calculate
 * @param key length
 * @param seed the seed
 */
int HBaseAdapter::murmurHash ( const void * key, int len, int seed )
{
	const int m = 0x5bd1e995;
	const int r = 24;
 	unsigned char* data = (unsigned char*)key;
	uint32_t h = seed ^ len;
	int len_4 =len >> 2;
	for(int i=0;i<len_4;i++){
		int i_4 = (i << 2);
		uint32_t k = data[i_4  + 3];
		k = k << 8;
		k = k | (data[i_4 + 2] & 0xff);
 		k = k << 8;
		k = k | (data[i_4 + 1] & 0xff);
 		k = k << 8;
      		k = k | (data[i_4 + 0] & 0xff);
      		k *= m;
      		k ^= k >> r;
      		k *= m;
      		h *= m;
      		h ^= k;
	}
    int len_m = len_4 << 2;
    int left = len - len_m;
    int i_m = len_m;

    if (left != 0) {
      if (left >= 3) {
        h ^= data[i_m + 2] << 16;
      }
      if (left >= 2) {
        h ^= data[i_m + 1] << 8;
      }
      if (left >= 1) {
        h ^= data[i_m];
      }

      h *= m;
    }

	h ^= h >> 13;
	h *= m;
	h ^= h >> 15;
	return h;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值