Sqoop Teradata Connector问题 - 错误:用户没有对数据库的CREATE TABLE访问权限

时间:2013-05-31 10:58:46

标签: hadoop hdfs sqoop

当我尝试从Teradata View导入表格时,我面临着Sqoop Teradata连接器的问题。我只能访问视图。

但不知何故,当sqoop作业启动时,它试图在我正在访问的Teradata DB中创建一个表,但没有权利在该DB / schema中创建任何表

我低于错误

 13/05/31 03:40:12 ERROR tool.ImportTool: Encountered IOException running import job:     com.teradata.hadoop.exception.TeradataHadoopSQLException: com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata Database] [TeraJDBC 14.00.00.01] [Error 3524] [SQLState 42000] The user does not have CREATE TABLE access to database EDWABSVIEWS.
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:307)
    at com.teradata.jdbc.jdbc_4.statemachine.ReceiveInitSubState.action(ReceiveInitSubState.java:102)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.subStateMachine(StatementReceiveState.java:298)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:179)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:120)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementController.run(StatementController.java:111)
    at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:372)
    at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:314)
    at com.teradata.jdbc.jdbc_4.TDStatement.doNonPrepExecute(TDStatement.java:277)
    at com.teradata.jdbc.jdbc_4.TDStatement.execute(TDStatement.java:1087)
    at com.teradata.hadoop.TeradataConnection.executeDDL(TeradataConnection.java:379)
    at com.teradata.hadoop.TeradataConnection.createTable(TeradataConnection.java:1655)
    at com.teradata.hadoop.TeradataPartitionStageInputProcessor.createStageTable(TeradataPartitionStageInputProcessor.java:233)
    at com.teradata.hadoop.TeradataPartitionStageInputProcessor.setup(TeradataPartitionStageInputProcessor.java:87)
    at com.teradata.hadoop.TeradataImportJob.run(TeradataImportJob.java:36)
    at org.apache.sqoop.teradata.TeradataImportJob.doSubmitJob(TeradataImportJob.java:173)
    at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:141)
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:208)
    at org.apache.sqoop.teradata.TeradataConnManager.importTable(TeradataConnManager.java:64)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:403)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:476)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:238)

    at    com.teradata.hadoop.TeradataPartitionStageInputProcessor.createStageTable(TeradataPartitionStageInputProcessor.java:243)
    at com.teradata.hadoop.TeradataPartitionStageInputProcessor.setup(TeradataPartitionStageInputProcessor.java:87)
    at com.teradata.hadoop.TeradataImportJob.run(TeradataImportJob.java:36)
    at org.apache.sqoop.teradata.TeradataImportJob.doSubmitJob(TeradataImportJob.java:173)
    at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:141)
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:208)
    at     org.apache.sqoop.teradata.TeradataConnManager.importTable(TeradataConnManager.java:64)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:403)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:476)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:238)

请协助。

3 个答案:

答案 0 :(得分:2)

用于Teradata 1.1.1的Cloudera Connector不支持从用户指南的limitations部分中记录的视图导入。

连接器将尝试创建临时表以提供全部或全部语义,我期望这是异常的原因。如果您在主数据库上没有此类权限,则可以指示连接器在您具有足够权限的任何其他数据库中创建登台表。请查看User guide以获取进一步说明。

答案 1 :(得分:2)

如果您指定了split.by.partition方法并且您的表未被分区或者您启用了--staging-force,则TeraData连接器将默认创建一个阶段表到连接URL中的指定数据库中。

来自Cloudera文档:

  

如果输入表未分区,则连接器会创建分区的临时表,并执行INSERT到SELECT查询,以将数据从源表移动到临时表中。随后,每个映射器从一个分区传输数据,从而产生单个AMP操作。使用单个AMP,您可以使用大量映射器来获得最佳性能。可用永久空间量必须与源表一样大,以及执行SELECT查询所需的假脱机空间量。   如果您的表已经分区,则不会创建额外的临时表。但是,您可以使用--staging-force参数强制连接器重新分区数据,以获得更好的性能。在不强制重新分配数据的情况下,此方法可以打开全AMP操作,因此您应该使用20到30个映射器。如果源表是PI表,并且按列拆分是表的主键,则连接器将创建单个AMP操作,并且您可以使用大量映射器。

要解决您必须避免登台的问题,请切换到split.by.valuesplit.by.hash,或者您可以为您拥有的临时表(--staging-database)指定不同的数据库{{ 1}}权限。

此外,考虑到只要有自由格式查询(CREATE TABLE)和多个映射器,连接器就会尝试创建视图。要解决--query权限错误,您指定CREATE VIEW并加载整个表,您仍然可以指定哪些列(--table <TABLE_NAME>)和WHERE过滤器(--columns),或者你必须使用--where摆脱并行性。

我个人认为应该有一个属性来启用/禁用视图的创建。如果您正在执行“导入数据”工作流,则不应要求您创建视图和登台表。

答案 2 :(得分:0)

当我尝试使用--split-by参数和自由格式查询--query参数时,我遇到了同样的错误。然后我用--split-by替换--num-mappers 1,强制SQOOP在一个进程中运行它。然后那个错误就消失了。

我假设--split-by将尝试创建临时文件/视图,其中单个映射器进程可能不会。

这是我正在使用的模板:

sqoop import \
--connect jdbc:teradata://<host>/Database=<dbname> \
--username <username> \
--password <password> \
--hive-import \
--hive-table <hivetablename> \
--hive-drop-import-delims \
--num-mappers 1 \
--target-dir <hdfspath> \
--query "<sqlquery> and \$CONDITIONS"