如何数据重跑
作者:互联网
离线任务,数据重跑是很正常的事情,比如程序跑着跑着就挂掉了,比如跑出来的数据不正确,需要检查后重跑
但是重跑的时候,需要注意的地方是,会不会有数据已经写入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 ‘表名’
这样做完之后,我们就可以开始重跑昨天的数据了
标签:web,快照,HBaseSnapshotAdmin,如何,重跑,import,hbase,数据 来源: https://blog.csdn.net/weixin_42411818/article/details/100849862