【问题标题】:Sqoop fails with password-file argumentSqoop 因密码文件参数而失败
【发布时间】:2020-03-10 07:37:42
【问题描述】:

我有一个将数据从 SAP HANA 摄取到 Hive 的 sqoop 脚本。当我将密码作为参数“--password Password$$”提供时,sqoop 脚本运行良好,但为了保护密码,我将其放在名为 sap.password 的文件中并使用参数“--password-file /dev/configs/ sap.password", 但是 sqoop 脚本返回一个 execption 。

下面是我的 sqoop 脚本和异常发生:

sqoop import 
--connect jdbc:sap://hostname?currentschema=SCHEMA_REF 
--driver com.sap.db.jdbc.Driver 
--username SERVICE_ACCOUNT 
--password-file /dev/configs/sap.password 
--table TABLE1
--hive-import 
--hive-overwrite 
--hive-database cdc_stg 
--hive-table HIVE_TABLE1
--as-parquetfile 
--m 1

我得到的例外是(我确定凭据是正确的):

9/11/14 05:47:08 ERROR manager.SqlManager: Error executing statement:
com.sap.db.jdbc.exceptions.jdbc40.SQLInvalidAuthorizationSpecException: [10]: authentication failed
 com.sap.db.jdbc.exceptions.jdbc40.SQLInvalidAuthorizationSpecException: [10]: authentication failed
 at com.sap.db.jdbc.exceptions.jdbc40.SQLInvalidAuthorizationSpecException.createException(SQLInvalidAuthorizationSpecException.java:40)
 at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:290)
 at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.generateDatabaseException(SQLExceptionSapDB.java:174)
 at com.sap.db.jdbc.packet.ReplyPacket.buildExceptionChain(ReplyPacket.java:100)
 at com.sap.db.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:1141)
 at com.sap.db.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:888)
 at com.sap.db.util.security.AbstractAuthenticationManager.connect(AbstractAuthenticationManager.java:43)
 at com.sap.db.jdbc.ConnectionSapDB.openSession(ConnectionSapDB.java:586)
 at com.sap.db.jdbc.ConnectionSapDB.doConnect(ConnectionSapDB.java:436)
 at com.sap.db.jdbc.ConnectionSapDB.<init>(ConnectionSapDB.java:195)
 at com.sap.db.jdbc.ConnectionSapDBFinalize.<init>(ConnectionSapDBFinalize.java:13)
 at com.sap.db.jdbc.Driver.connect(Driver.java:255)
 at java.sql.DriverManager.getConnection(DriverManager.java:664)
 at java.sql.DriverManager.getConnection(DriverManager.java:247)
 at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:903)
 at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:59)
 at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:762)
 at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:785)
 at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:288)
 at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:259)
 at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:245)
 at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:333)
 at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1879)
 at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1672)
 at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
 at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:515)
 at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:633)
 at org.apache.sqoop.Sqoop.run(Sqoop.java:146)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
 at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:182)
 at org.apache.sqoop.Sqoop.runTool(Sqoop.java:233)
 at org.apache.sqoop.Sqoop.runTool(Sqoop.java:242)
 at org.apache.sqoop.Sqoop.main(Sqoop.java:251)
19/11/14 05:47:08 ERROR tool.ImportTool: Import failed: java.io.IOException: No columns to generate for ClassWriter
 at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1678)
 at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
 at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:515)
 at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:633)
 at org.apache.sqoop.Sqoop.run(Sqoop.java:146)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
 at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:182)
 at org.apache.sqoop.Sqoop.runTool(Sqoop.java:233)
 at org.apache.sqoop.Sqoop.runTool(Sqoop.java:242)
 at org.apache.sqoop.Sqoop.main(Sqoop.java:251)

【问题讨论】:

    标签: hadoop hive hdfs sqoop cloudera


    【解决方案1】:

    请检查密码文件权限。来自Sqoop docs

    您应该将密码保存在具有 400 权限的用户主目录中的文件中

    【讨论】:

      【解决方案2】:

      我怀疑密码文件可能是用换行符创建的,因为 --password 可以正常工作,唯一的区别或更改是转换为使用密码文件。

      您能否重新创建密码文件,使用下面所述的 sqoop docs 警告条款。

      参考:SqoopUserGuide

      Sqoop 将读取密码文件的全部内容并将其用作密码。这将包括任何尾随空白字符,例如大多数文本编辑器默认添加的换行符。您需要确保您的密码文件仅包含属于您的密码的字符。在命令行中,您可以使用命令 echo 和 switch -n 来存储密码,而无需任何尾随空格字符。

      例如:在下面存储密码秘密使用。

      echo -n "secret" > password.file
      

      另外代替 sqoop import 尝试使用 list-databases 或 list-tables 或 eval 来测试与密码文件的连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 2021-09-22
        • 2014-12-31
        • 1970-01-01
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多