Sqoop作业因Oracle导入

时间:2016-02-08 18:35:27

标签: oracle hadoop cloudera sqoop

我正在尝试运行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源DB已启动且连接已经过测试。

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

- 表格TABLENAME(不含用户名)

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

错误:

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&amp; --check-column选项和工作成功。这让我很困惑。

4)我尝试使用MySQL的工作,成功

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

提前致谢,

3 个答案:

答案 0 :(得分:1)

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

中创建符号链接

答案 1 :(得分:0)

作为reported by用户@Remya Senan

破坏参数

Jan 23 15:09:54 foo bar
Jan 23 15:10:04 bla bla

分成单独的参数

--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

答案 2 :(得分:-1)

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