如何数据重跑

离线任务,数据重跑是很正常的事情,比如程序跑着跑着就挂掉了,比如跑出来的数据不正确,需要检查后重跑
但是重跑的时候,需要注意的地方是,会不会有数据已经写入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 ‘表名’

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

相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页