Sqoop 作业因 Oracle 导入的 KiteSDK 验证错误而失败

Posted

技术标签:

【中文标题】Sqoop 作业因 Oracle 导入的 KiteSDK 验证错误而失败【英文标题】:Sqoop job fails with KiteSDK validation error for Oracle import 【发布时间】:2016-02-08 18:35:27 【问题描述】:

我正在尝试运行 Sqoop 作业以从 Oracle 数据库加载并以 Parquet 格式加载到 Hadoop 集群。这项工作是增量的。

Sqoop 版本是 1.4.6。 Oracle 版本是 12c。 Hadoop 版本是 2.6.0(发行版是 Cloudera 5.5.1)。

Sqoop 命令是(这会创建作业并执行它):

$ sqoop job -fs hdfs://<HADOOPNAMENODE>:8020 \
--create myJob \
-- import \
--connect jdbc:oracle:thin:@<DBHOST>:<DBPORT>/<DBNAME> \
--username <USERNAME> \
-P \
--as-parquetfile \
--table <USERNAME>.<TABLENAME> \
--target-dir <HDFSPATH>  \
--incremental append  \
--check-column <TABLEPRIMARYKEY>

$ sqoop job --exec myJob

执行错误:

16/02/05 11:25:30 ERROR sqoop.Sqoop: Got exception running Sqoop:
org.kitesdk.data.ValidationException: Dataset name
05112528000000918_2088_<USERNAME>.<TABLENAME>
is not alphanumeric (plus '_')
    at org.kitesdk.data.ValidationException.check(ValidationException.java:55)
    at org.kitesdk.data.spi.Compatibility.checkDatasetName(Compatibility.java:103)
    at org.kitesdk.data.spi.Compatibility.check(Compatibility.java:66)
    at org.kitesdk.data.spi.filesystem.FileSystemMetadataProvider.create(FileSystemMetadataProvider.java:209)
    at org.kitesdk.data.spi.filesystem.FileSystemDatasetRepository.create(FileSystemDatasetRepository.java:137)
    at org.kitesdk.data.Datasets.create(Datasets.java:239)
    at org.kitesdk.data.Datasets.create(Datasets.java:307)
    at org.apache.sqoop.mapreduce.ParquetJob.createDataset(ParquetJob.java:107)
    at org.apache.sqoop.mapreduce.ParquetJob.configureImportJob(ParquetJob.java:80)
    at org.apache.sqoop.mapreduce.DataDrivenImportJob.configureMapper(DataDrivenImportJob.java:106)
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:260)
    at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:668)
    at org.apache.sqoop.manager.OracleManager.importTable(OracleManager.java:444)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:497)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
    at org.apache.sqoop.tool.JobTool.execJob(JobTool.java:228)
    at org.apache.sqoop.tool.JobTool.run(JobTool.java:283)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:236)

故障排除步骤:

0) HDFS 稳定,其他 Sqoop 作业正常运行,Oracle 源数据库已启动并且连接已测试。

1) 我尝试在 Oracle 中创建同义词,这样我就可以简单地将 --table 选项设置为:

--table TABLENAME(没有用户名)

这给了我一个错误,表名不正确。 --table 选项需要完整的 USERNAME.TABLENAME。

错误:

16/02/05 12:04:46 ERROR tool.ImportTool: Imported Failed: There is no column found in the target table <TABLENAME>. Please ensure that your table name is correct.

2) 我确定这是 Parquet 问题。我删除了 --as-parquetfile 选项,工作成功

3) 我想知道这是否是由增量选项引起的。我删除了 --incremental append 和 --check-column 选项,并且工作成功。这让我很困惑。

4) 我用 mysql 尝试了这项工作,它成功

有没有人遇到过类似的情况?有没有办法(或者甚至是可取的)禁用 Kite 验证?似乎数据集是用点(“。”)创建的,然后 Kite SDK 抱怨 - 但这是我的一个假设,因为我对 Kite SDK 不太熟悉。

提前致谢,

何塞

【问题讨论】:

【参考方案1】:

已解决。与 Oracle 12c 的 JDBC 连接似乎存在一个已知问题。使用特定的 OJDBC6(而不是 7)就可以了。仅供参考 - OJDBC 安装在 /usr/share/java/ 中,符号链接创建在 /installpath.../lib/sqoop/lib/

【讨论】:

能否提供sqoop作业中的用法?【参考方案2】:

作为reported by用户@Remya Senan

破坏参数

--hive-table my_hive_db_name.my_hive_table_name

分成单独的参数

--hive-database my_hive_db_name
--hive-table my_hive_table_name

帮我搞定了


我的环境是

Sqoop v1.4.7

Hive 2.3.3

提示:我在emr-5.19.0

【讨论】:

【参考方案3】:

当我在 CHD5.8 上 sqoop 将所有表作为 parquet 文件导入时,我也遇到了这个错误。通过查看错误消息,我觉得此实现不支持名称中带有“-”的目录。基于这种理解,我从目录名称中删除了“-”并重新运行了 sqoop 导入命令,一切正常。希望这会有所帮助!

【讨论】:

以上是关于Sqoop 作业因 Oracle 导入的 KiteSDK 验证错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop - 使用 Oozie 导入 Hive 失败

Sqoop 导入映射器失败,但 sqoop 作业显示正在运行

sqoop安装及使用

hue下 sqoop使用query报错

通过 oozie 从 sqoop 作业增量导入不会更新 sqoop 元存储中的 incremental.last.value

sqoop 从oracle抽数据是 sql怎么写