Increment_Backup_To_Hive:一个增量备份关系数据库到 hive 的 PHP 脚本工具

2017-09-05 14:50:18 +08:00
 gouchaoer

Increment_Backup_To_Hive

一个增量备份关系数据库(MySQL, PostgreSQL, SQL Server, SQLite, Oracle 等)到 hive 的 php 脚本工具

原理

由于 sqoop 可定制性太差,本工具针对增量备份场景,备份某张表时只需要用户填写几个关键参数,就能自动化生成 hive 表,把脚本加入 cron 就能实现每天增量备份了。增量备份时,脚本主要根据表的自增主键来查询新增数据,然后把新增的数据按照 hive 表的格式导出成文本,最后调用 hive 命令直接把文本导入 hive 内部。支持压缩表+多分区+字段增减。

环境

  1. 脚本内部会调用 hive 命令,所以必须运行在安装 hive 的 Linux 主机上。你需要安装 PHP5.4 以上的版本,推荐安装 PHP7.x
  2. 使用PDO扩展来查询关系数据库,你需要确认你的 PHP 安装了PDO扩展以及对应数据库适配器。MySQL 需要PDO+pdo_mysql+mysqlnd扩展,PostgreSQL 需要PDO+pdo_pgsql+pgsql扩展,SQL Server 需要PDO+pdo_dblib等。用php -m来查看你是否安装了对应扩展

用法

参数意义

 (a),假如 created_date 字段代表插入时间,类型为 TIMESTAMP,按照天分区
 $ROW_CALLBACK_PARTITIONS = [
 'partition_day' => function(Array $row)
 {
	 $created_date = empty($row['created_date'])?'0000-00-00 00:00:00':$row['created_date'];	 
	 $partition = substr($created_date, 0, 10);
	 return $partition;
 }
 ];
 
 (b),多分区情况下,假如 created_date 字段代表插入时间,类型为 INT,按照月分区;假如 province 字段代表省,按照省分区
 $ROW_CALLBACK_PARTITIONS = [
 
 'partition_month' => function(Array $row)
 {
	 $created_date = empty($row['created_date'])? 0:$row['created_date'];
	 $created_date_str = date('Y-m-d H:i:s', $created_date)
	 $partition = substr($created_date, 0, 7);
	 return $partition;
 },
 'partition_province' => function(Array $row)
 {
    $province = empty($row['province'])? "default":$row['province'];
	return $province;
 }
 ];
 
 (c),表中没有分区字段,现在按照备份时间进行按天分区
 $ROW_CALLBACK_PARTITIONS = [
 'partition_day' => function(Array $row)
 {
	 $created_date = time()
	 $created_date_str = date('Y-m-d H:i:s', $created_date)
	 $partition = substr($created_date, 0, 7);
	 return $partition;
 }
 ];
(a),假如数据源表有"id, tel, birthday"这 3 个字段,你修改了自动生成的 hive 建表文件,把`tel`字段进行加密,把 birthday 改成 birth_year 字段,你的 hive 字段为"id, tel, birth_year"。
$ROW_CALLBACK_CHANGE=function (Array $row)
 {
  	//$row 数组为:['id'=>1, 'tel'=>'15888888888', 'birthday'=>'1990-01-01'];
 	$row['tel'] = my_encrypt_fun($row['tel']);
 	$row['birth_year']= substr($row['birthday'], 0, 4);
 	unset($row['birthday'];
 	//$row 数组为:['id'=>1, 'tel'=>'encrypted content', 'birth_year'=>'1990'];和 hive 表结构一致
 	return $row;
 }

注意

github

https://github.com/gouchaoer/Increment_Backup_To_Hive

1961 次点击
所在节点    PHP
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/388322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX