从spark streaming checkpoint文件中还原数据

checkpoint的最大的弊端在于,一旦你的流式程序代码或配置改变了,或者更新迭代新功能了,这个时候,你先停旧的sparkstreaming程序,然后新的程序打包编译后执行运行,会发现两种情况:
(1)启动报错,反序列化异常

(2)启动正常,但是运行的代码仍然是上一次的程序的代码。

如果直接把上次的checkpoint删除了,可以启动的新的程序,但是如果使用的是有状态计算(updateStateByKey),那么中间的状态数据就行丢失。

有人说删除checkpoint开头的的文件,保留数据文件,如下:

hadoop fs -rm /spark/check_point/应用名/checkpoint* 

经测试,新程序确实能启动,但新程序也不会读取上次的数据文件,而是从新开始计算。还是会丢中间数据。

能不能自定义读取上次的数据文件呢,查看数据文件的格式,是可以的。代码片断如下:

  private def objectFileKryo[T](path: String, sc: SparkConf)(implicit ct: ClassTag[T]) = {
    val kryoSerializer = new KryoSerializer(sc)
    val hadoopConf = new org.apache.hadoop.conf.Configuration()
    val hdfs = org.apache.hadoop.fs.FileSystem.get(hadoopConf)
    val paths = getPath(hdfs, new org.apache.hadoop.fs.Path(path))
    val d = paths.flatMap { p =>
      {
        val r = hdfs.open(p)
        var by = ArrayBuffer[Byte]()
        while (r.available() > 0) {
          val b = r.readByte()
          by += (b)
        }
        val kryo = kryoSerializer.newKryo()
        val input = new Input()
        input.setBuffer(by.toArray)
        val array = ArrayBuffer[T]()
        while (input.available() > 0) {
          val data = kryo.readClassAndObject(input)
          val dataObject = data.asInstanceOf[T]
          array += dataObject
        }
        array
      }
    }
    d
  }

可以将读取的数据文件转化为对象,不过有个问题,读取的数据有重复的,

查看数据的时间,是不同的时间的状态数据,我们只取最新的就可以了。

val cacheState = new java.util.HashMap[String, StateBean]()

val hdfsData = objectFileKryo[(String, StateBean)](), sparkConf)

            hdfsData.foreach(f => {
                val cache = cacheState.get(f._1)
                if (cache == null) {
                  cacheState.put(f._1, f._2.cache)
                } else if (cache.time < f._2.cache.time) {
                  cacheState.put(f._1, f._2.cache)
                }
            })


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值