迁移Spark1.5的Carbondata数据到Spark2x的Carbondata中
迁移方案概览
本次迁移目标是将Spark1.5的CarbonData表数据迁移到Spark2x的CarbonData表中。
执行本操作前需要将spark1.5的carbondata表入库业务中断,将数据一次性迁移至spark2x的carbondata表,完成迁移后使用spark2x进行业务操作。
迁移思路:
- 先通过Spark1.5将历史数据迁移至中间表。
- 再通过Spark2x将中间表的数据迁移至目标表,然后将目标表名修改为原表名。
- 迁移完成后使用Spark2x操作CarbonData表中的数据。
具体迁移方案和命令
历史数据迁移
- 中断CarbonData的数据入库业务,用Spark1.5的spark-beeline,查看CarbonData表当前最新的Segment的ID和时间,并记录此Segment的ID。
show segments for table dbname.tablename;
- 用创建原CarbonData表的用户,执行Spark1.5的spark-beeline,创建ORC(或PARQUET)格式的中间表,然后将原CarbonData表中的数据导入该中间表,导入完成后即可恢复CarbonData表的业务。
创建ORC表:
CREATE TABLE dbname.mid_tablename_orc STORED AS ORC as select * from dbname.tablename;
创建PARQUET表:
CREATE TABLE dbname.mid_tablename_parq STORED AS PARQUET as select * from dbname.tablename;
其中dbname指数据库名,tablename指原CarbonData表名。
- 用创建原CarbonData表的用户,执行Spark2x的spark-beeline;然后通过旧表的建表语句,创建新的CarbonData表。
创建新表的语句中,字段顺序和类型必须和旧表的完全一致,如此才能保留原表的索引列等结构,且可以避免后续插入数据时因用到了 select * 而出错。
通过Spark1.5的spark-beeline命令查看旧表的建表语句:SHOW CREATE TABLE dbname.tablename;
创建新CarbonData表,名称为:dbname.new_tablename
- 用创建原CarbonData表的用户,执行Spark2x的spark-beeline,将2中创建的ORC(或PARQUET)格式的中间表的数据,加载到3创建的新表中。此步骤可能耗时较长(200G数据耗时约2小时)。加载数据的命令以ORC格式的中间表举例:
insert into dbname.new_tablename select *
from dbname. mid_tablename_orc;
- 用创建原CarbonData表的用户,执行Spark2x的spark-beeline,对新表的数据进行查询检验,确认数据无误后,将原CarbonData表修改为其他名称,再将新CarbonData表修改为原CarbonData表的名称。
ALTER TABLE dbname.tablename RENAME TO dbname.old_tablename;
ALTER TABLE dbname.new_tablename RENAME TO dbname.tablename;
- 迁移完成。此时即可通过Spark2x对新表进行查询、重建二级索引等操作。