sqoop teradata连接器问题-错误:用户没有对数据库的create table访问权限

vvppvyoh  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(395)

在尝试从teradata视图导入表时,我遇到了teradata connector for sqoop的问题。我只能查看。
但不知何故,当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)

请帮忙。

uhry853o

uhry853o1#

cloudera connector for teradata 1.1.1不支持从视图导入,如《用户指南》的“限制”部分所述。
连接器将尝试创建临时表,以便提供all或nothing语义,我认为这就是异常的原因。如果您在主数据库上没有这样的权限,则可以指示连接器在您有足够权限的任何其他数据库中创建临时表。请查看用户指南了解更多说明。

f87krz0w

f87krz0w2#

当我尝试使用 --split-by 参数和自由形式查询 --query 争论。然后我换了 --split-by--num-mappers 1 ,强制sqoop在一个进程中运行它。然后那个错误就消失了。
我是这么想的 --split-by 将尝试在单个Map程序进程可能无法创建的位置创建临时文件/视图。
以下是我正在使用的模板:

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"
1tuwyuhd

1tuwyuhd3#

如果您指定了 split.by.partition 方法,并且您的表没有分区,或者 --staging-force ,teradata连接器将在默认情况下在连接url中的指定db中创建一个stage表。
来自cloudera文档:
如果输入表没有分区,连接器将创建一个分区的暂存表,并执行insert into select查询,将数据从源表移到暂存表中。随后,每个Map器从一个分区传输数据,从而产生一个amp操作。使用单个放大器,可以使用大量Map器来获得最佳性能。可用的永久空间量必须与源表和执行select查询所需的假脱机空间量一样大。如果您的表已经分区,则不会创建额外的暂存表。但是,可以使用--staging force参数强制连接器重新划分数据,以获得更好的性能。在不强制重新划分数据的情况下,此方法会打开所有amp操作,因此应该使用20到30个Map器。如果源表是pi表,而split by列是表的主键,那么连接器将创建单个amp操作,并且可以使用大量Map器。
要解决这个问题,您必须避免转移,或者切换到 split.by.value 或者 split.by.hash 或者可以为临时表指定不同的db( --staging-database )你在这上面 CREATE TABLE 许可。
此外,考虑连接器将尝试在您有自由形式查询时创建一个视图( --query )还有多个Map绘制者。解决问题 CREATE VIEW 指定的权限错误 --table <TABLE_NAME> 如果加载整个表,仍然可以指定哪些列( --columns )还有where过滤器( --where ),或者必须使用 --num-mappers 1 .
我个人认为应该有一个属性来启用/禁用视图的创建。如果正在执行导入数据工作流,则不需要创建视图和暂存表。

相关问题