如何数据重跑

离线任务,数据重跑是很正常的事情,比如程序跑着跑着就挂掉了,比如跑出来的数据不正确,需要检查后重跑
但是重跑的时候,需要注意的地方是,会不会有数据已经写入hbase了,或者hive的当天分区是否已经存在数据了

hive有数据的话,这点倒不用太在意,因为在导数据之前,我们通常会先删除当天的文件数据(不删会报错):

hadoop fs -rm -r /user/hive/warehouse/web.db/表的名字/year=year/month=month/day=day
set hive.merge.mapfiles=false;INSERT OVERWRITE TABLE web.表的名字 PARTITION(year=year, month=month, day=day) SELECT tmp.* FROM web_tmp.临时表名字  tmp;  # 这种方式也是avro数据转成parquet数据格式的一种方式

那么hbase呢?
可能会有人想,不是有多个版本吗?但是你怎么去恢复呢?这时候就可以利用hbase的特性了,也就是快照了
每次或者说是每天跑完数据后就创建一个快照,那么如何创建快照呢?

import org.apache.hadoop.hbase.TableName
import org.apache.hadoop.hbase.client.Connection
import org.slf4j.LoggerFactory
import resource._


object HBaseSnapshotAdmin {
  private val logger = LoggerFactory.getLogger(classOf[HBaseSnapshotAdmin])
}

class HBaseSnapshotAdmin(conn: Connection) {

  import HBaseSnapshotAdmin._

  // 创建hbase的快照
  def takeSnapshot(snapshotName: String, tableName: String): Unit = {
    for (admin <- managed(conn.getAdmin)) {
      val table = TableName.valueOf(HbaseConnectionFactory.hbaseTableNamespace, tableName)

      admin.disableTable(table)

      // check if snapshot with the name already exists
      val snapshots = admin.listSnapshots(snapshotName)

      if (!snapshots.isEmpty) {   // 如果有这个快照,先删除掉
        logger.warn(s"Snapshot ${snapshotName} already exists, deleting it and take the latest snapshot again.")
        admin.deleteSnapshot(snapshotName)
      }
    // 再创建
      admin.snapshot(snapshotName, table)
      // 在启动table
      admin.enableTable(table)
    }

    logger.info(s"Successfully took a snapshot ${snapshotName} for table ${tableName}.")
  }
}

如何使用呢?

val snapshotAdmin = new HBaseSnapshotAdmin(HbaseConnectionFactory.getHbaseConn)
    val targetUserTable = System.getProperty("web.etl.hbase.UserTableName", "web-user")
    snapshotAdmin.takeSnapshot(s"${targetUserTable}_snapshot-$dateStr", targetUserTable)

好了,创建完毕,怎么恢复呢?
shell操作: 1.disable ‘表名’ 2.restore_snapshot ‘快照名’ 3.enable ‘表名’

这样做完之后,我们就可以开始重跑昨天的数据了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值