环境
- Hive集群A
- Hive集群B
- 跳转机一台
数据迁移需求
本次迁移数据100G,15亿条,数据流转方向从集群A经过跳转机到集群B,通过HDFS拉取和重新建表导入的方式完成数据库迁移。
迁移过程记录
- 当前操作在集群A
- 通过执行
desc formatted
,查看并记录数据库的:①存储位置,②文件存储压缩格式,③表字段; - 对迁移的数据库执行
count(*)
操作,记录数据量,整体把握,最后做校验;
- 当前操作在跳转机
- 获取
1.②
位置之后,通过hdfs hds -du -h
命令检查原始表数据在HDFS中的存储大小,确认是否能拉取到跳转机; - 执行
df -h
检查跳转机可用存储空间,执行hdfs dfs -get
命令,将存储的数据库源文件从集群A的HDFS拉取到跳转机本地; - 执行
ls | wc -l
命令,检查拉取的数据库源文件数量,此步骤操作是为了校验文件数量; - 如果不是压缩存储的文件,比如
CSV
,请执行head
命令,查看源文件首行是否包含表字段,如果包含表字段,需要在建表时添加TBLPROPERTIES ('skip.header.line.count'='1')
; - 执行
hdfs dfs -put
命令,将数据库源文件上传至集群B的HDFS,并执行hdfs hds -du -h
检查存储大小是否一致,请提前mkdir
准备好存储目录;
- 当前操作在集群B
- 根据
1.③
编辑建表语句并执行,根据压缩存储格式的不同,MapReduce在执行时的输入输出结果也不同;
不指定格式 | |
---|---|
InputFormat | org.apache.hadoop.hive.ql.io.RCFileInputFormat |
OutputFormat | org.apache.hadoop.hive.ql.io.RCFileOutputFormat |
指定TEXTFILE格式 | |
---|---|
InputFormat | org.apache.hadoop.mapred.TextInputFormat |
OutputFormat | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat |
本次迁移方案数据源文件为.snappy.parquet
压缩存储格式,新建的表为TEXTFILE
格式,指定了分隔符为,
;
- 通过beeline执行
LOAD DATA INPATH 'hdfs location' into table table_name
命令,将HDFS中的数据源文件导入Hive表,至此完成迁移; - 若对存储格式在后续有新的需求,可以在完成导入后,通过创建新的附带存储格式的表,再执行
insert overwrite table table_name_new select * from table_name_old;
命令,完成Hive存储格式的转换; - 对于数据完整性、一致性的考虑:可以在完成后再次执行
count(*)
,校验数据量,此方法是为了避免出现因格式不同,忽略CSV首行字段问题,或者建表语句错误,剔除了有效数据导致数据缺失的危险行为。