关于spark程序编写过程中缓存的利用

记录一下这次优化内容

对于高手来说,缓存的思想已经深入人心。但是很多初学者还是没有想到使用空间换取时间的思想。

过程

由于我们的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)
            }

总结

此次优化虽然简单,但是也是一种常见的优化思路。欢迎各位高手批评指正。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值