Hadoop Sqoop因密码文件参数而失败

Hadoop Sqoop因密码文件参数而失败,hadoop,hive,hdfs,sqoop,cloudera,Hadoop,Hive,Hdfs,Sqoop,Cloudera,我有一个sqoop脚本,它将数据从SAP HANA摄取到Hive。当我将password作为参数“-password password$$”时,sqoop脚本运行良好,但为了保护密码,我将其放在名为sap.password的文件中,并使用参数“-password file/dev/configs/sap.password”,但sqoop脚本返回一个执行选项 以下是我的sqoop脚本和发生的异常: sqoop import --connect jdbc:sap://hostname?curren

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

以下是我的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错误管理器。SqlManager:执行语句时出错:
com.sap.db.jdbc.exceptions.jdbc40.SQLInvalidAuthorizationSpecException:[10]:身份验证失败
com.sap.db.jdbc.exceptions.jdbc40.SQLInvalidAuthorizationSpecException:[10]:身份验证失败
位于com.sap.db.jdbc.exceptions.jdbc40.SQLInvalidAuthorizationSpecException.createException(SQLInvalidAuthorizationSpecException.java:40)
位于com.sap.db.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:290)
位于com.sap.db.jdbc.exceptions.SQLExceptionSapDB.generateDatabaseException(SQLExceptionSapDB.java:174)
位于com.sap.db.jdbc.packet.ReplyPacket.buildExceptionChain(ReplyPacket.java:100)
位于com.sap.db.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:1141)
位于com.sap.db.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:888)
位于com.sap.db.util.security.AbstractAuthenticationManager.connect(AbstractAuthenticationManager.java:43)
位于com.sap.db.jdbc.ConnectionSapDB.openSession(ConnectionSapDB.java:586)
位于com.sap.db.jdbc.ConnectionSapDB.doConnect(ConnectionSapDB.java:436)
位于com.sap.db.jdbc.ConnectionSapDB(ConnectionSapDB.java:195)
位于com.sap.db.jdbc.ConnectionSapDBFinalize。(ConnectionSapDBFinalize.java:13)
位于com.sap.db.jdbc.Driver.connect(Driver.java:255)
位于java.sql.DriverManager.getConnection(DriverManager.java:664)
位于java.sql.DriverManager.getConnection(DriverManager.java:247)
位于org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:903)
位于org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:59)
位于org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:762)
位于org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:785)
位于org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:288)
位于org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:259)
位于org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:245)
位于org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:333)
位于org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1879)
位于org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1672)
位于org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
位于org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:515)
位于org.apache.sqoop.tool.ImportTool.run(ImportTool.java:633)
位于org.apache.sqoop.sqoop.run(sqoop.java:146)
位于org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
位于org.apache.sqoop.sqoop.runSqoop(sqoop.java:182)
位于org.apache.sqoop.sqoop.runTool(sqoop.java:233)
位于org.apache.sqoop.sqoop.runTool(sqoop.java:242)
位于org.apache.sqoop.sqoop.main(sqoop.java:251)
19/11/14 05:47:08错误工具。导入工具:导入失败:java.io.IOException:没有要为ClassWriter生成的列
位于org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1678)
位于org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
位于org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:515)
位于org.apache.sqoop.tool.ImportTool.run(ImportTool.java:633)
位于org.apache.sqoop.sqoop.run(sqoop.java:146)
位于org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
位于org.apache.sqoop.sqoop.runSqoop(sqoop.java:182)
位于org.apache.sqoop.sqoop.runTool(sqoop.java:233)
位于org.apache.sqoop.sqoop.runTool(sqoop.java:242)
位于org.apache.sqoop.sqoop.main(sqoop.java:251)

请检查密码文件权限。发件人:

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


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

请使用下面所述的sqoop docs警告条款重新创建密码文件

参考:

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

例如:要存储密码,请在下面使用

echo -n "secret" > password.file
另外,请尝试使用列表数据库或列表表或eval来测试与密码文件的连接,而不是sqoop import

echo -n "secret" > password.file