Sqoop从Postgres同步数据至Hive转ORC格式报错问题求助
根因说明
你遇到的三个报错分别对应三类已知问题:
- 第一次报错:Hive默认新建的ORC托管表自动开启事务属性,Sqoop底层的MapReduce任务不支持写入事务型Hive表
- 第二次报错:Hive 3.x默认开启
hive.strict.managed.tables配置,要求所有托管表必须开启事务,手动关闭事务后不符合校验规则 - 第三次报错:HDP版本自带的Sqoop版本较低,没有
--hcatalog-external-table参数,命令无法识别
可行解决方案
方案1:直接调整Sqoop命令自动建表(适合单表快速同步)
注意修正嵌套引号的转义问题,同时临时关闭Hive严格托管表校验,命令示例如下:
sqoop import \ --hcatalog-home /usr/hdp/current/hive-webhcat \ --connect jdbc:postgresql://<你的PostgreSQL地址>/<数据库名> \ --username user \ --password pwd \ --table <PostgreSQL源表名> \ --hcatalog-database default \ --hcatalog-table <Hive目标表名> \ --hcatalog-storage-stanza "stored as orcfile tblproperties (\"transactional\"=\"false\")" \ --create-hcatalog-table \ --hiveconf hive.strict.managed.tables=false \ -m 1
方案2:提前建表再同步(适合多表批量同步,稳定性更高)
第一步先在Hive中提前创建外部ORC表,完全控制表属性,建表语句示例:
CREATE EXTERNAL TABLE IF NOT EXISTS default.<Hive表名> ( -- 字段定义和PostgreSQL源表一一对应,做好类型适配 id INT, content STRING, update_time TIMESTAMP ) STORED AS ORC TBLPROPERTIES ("transactional"="false");
第二步执行Sqoop同步,无需额外的建表、属性配置参数:
sqoop import \ --hcatalog-home /usr/hdp/current/hive-webhcat \ --connect jdbc:postgresql://<你的PostgreSQL地址>/<数据库名> \ --username user \ --password pwd \ --table <PostgreSQL源表名> \ --hcatalog-database default \ --hcatalog-table <Hive目标表名> \ -m 1
补充注意事项
- 生产环境不要明文写密码,可以用
--password-file <HDFS密码文件路径>参数替代,提升安全性 - 数据量大的场景可以调大
-m参数的值,同时指定--split-by <拆分字段>,提升同步并行度 - 多表同步可以改用
sqoop import-all-tables,搭配--exclude-tables参数过滤不需要同步的表,减少重复代码
内容的提问来源于stack exchange,提问作者ram_23
相关产品推荐
相关产品推荐

