记录一下这次优化内容
对于高手来说,缓存的思想已经深入人心。但是很多初学者还是没有想到使用空间换取时间的思想。
过程
由于我们的spark程序要频繁的访问Hbase。几乎是一条数据就要读取一下,
导致我们的region压力非常大。进而想到。使用scan将数据一次性读取到内存中(brodecast),随后对内存进行访问。速度提高10倍之多。
代码如下
val conn = HbaseDao.getConnection()
//创建两个Map用于缓存从Hbase中获取的数据
val newMouldMap = new mutable.HashMap[String,ListBuffer[MouldBean]]()
val analyzeMap = new mutable.HashMap[String,ListBuffer[MouldMessage]]()
partition.foreach(x => {
val newMouldTable = conn.getTable(TableName.valueOf("newMouldTable"))
val analyzeTable = conn.getTable(TableName.valueOf("analyzeTable"))
try {
val user_id = x.user_id
var newMouldList:ListBuffer[MouldBean] = null;
//如果数据有存在的话,就从Map中获取数据。(由于采用hash算法,contains查询非常快o(1))
if(newMouldMap.contains(user_id)) {
newMouldList = newMouldMap.get(user_id).get
//否则从Hbase中查询获取。
} else {
newMouldList = new ListBuffer[MouldBean]
val newMouldGet = new Get(Bytes.toBytes(user_id)).addFamily(Bytes.toBytes("newMould"))
val result = newMouldTable.get(newMouldGet).cellScanner()
while (result.advance()) {
val cell = result.current()
val value = Bytes.toString(CellUtil.cloneValue(cell))
val mould = HbaseDao.getMouldBeanFromHbase(value)
newMouldList += mould
}
//获取完毕后,加入到缓存map中。
newMouldMap.put(user_id,newMouldList)
}
总结
此次优化虽然简单,但是也是一种常见的优化思路。欢迎各位高手批评指正。