sqoop无法导出parquet文件到mysql

1.问题描述


在CDH集群中我们需要将Hive表的数据导入到RDBMS数据库中,使用Sqoop工具可以方便的将Hive表数据抽取到RDBMS数据库中,在使用Sqoop抽取Hive Parquet表时作业执行异常。

Sqoop抽数脚本:

sqoop export \
--connect jdbc:mysql://localhost:3306/test_db \
--username root \
--password 123456 \
--table mytest_parquet \
--export-dir /user/hive/warehouse/mytest_parquet \
-m 1

 

异常日志:

Sqoop: org.kitesdk.data.DatasetNotFoundException: Descriptor location does not exist: hdfs://nameservice1/user/hive/warehouse/mytest_parquet/.metadata
Exception: Descriptor location does not exist: hdfs://nameservice1/user/hive/warehouse/mytest_parquet/.metadata
        at org.kitesdk.FileSystemMetadataProvider.checkExists(FileSystemMetadataProvider.java:562)
        at org.kitesdk.FileSystemMetadataProvider.find(FileSystemMetadataProvider.java:605)
        at org.kitesdk.ileSystemMetadataProvider.load(FileSystemMetadataProvider.java:114)
        at org.kitesdk.FileSystemDatasetRepository.load(FileSystemDatasetRepository.java:197)
        at org.kitesdk.data.Datasets.load(Datasets.java:108)
        at org.kitesdk.data.Datasets.load(Datasets.java:140)        

 

2.解决方法


1.将Sqoop抽数脚本修改为如下:

sqoop export \
--connect jdbc:mysql://ip-172-31-22-86.ap-southeast-1.compute.internal:3306/test_db \
--username testuser \
--password password \
--table mytest_parquet \
--hcatalog-database default \
--hcatalog-table mytest_parquet --num-mappers 1

参数说明:

--table:MySQL库中的表名

--hcatalog-database:Hive中的库名

--hcatalog-table:Hive库中的表名,需要抽数的表

--num-mappers:执行作业的Map数

作业执行成功。

3.总结


目前通过Sqoop从Hive的parquet抽数到关系型数据库的时候会报kitesdk找不到文件的错,这是Sqoop已知的问题,参考SQOOP-2907:

https://issues.apache.org/jira/browse/SQOOP-2907

该jira目前并没有修复,如果要实现该功能,需要参考第二章的做法,使用hcatalog参数指定到Hive表。

posted @ 2018-09-12 10:56  君子笑而不语  阅读(2612)  评论(0编辑  收藏  举报