从 MS SQL 服务器导入 sqoop 失败,除非连接字符串中有密码

sqoop import from MS SQL Server fails unless password in connect string

详情:

Sqoop 1.4.6

已尝试位于 HDFS 和本地 FS 中的密码文件。还尝试将密码文件声明为 --password-file file:///user/username/password.file

sqoop import \
--connect 'jdbc:sqlserver://servername;database=databasename' \
--username userxxx \
--password-file password.file \
--table 'sales' \
--fields-terminated-by '|' \
--null-string '\N' \
--null-non-string '\N'  \
--hive-import

当 运行 导入 sqoop 时,我从 sql 服务器获取身份验证失败,除非我将用户名和密码放入连接字符串中。如果我尝试使用 -P 或 --password-file 验证失败。

--password-file

根据docs,

Secure way of supplying password to the database. You should save the password in a file on the users home directory with 400 permissions and specify the path to that file using the --password-file argument, and is the preferred method of entering credentials. Sqoop will then read the password from the file and pass it to the MapReduce cluster using secure means with out exposing the password in the job configuration. The file containing the password can either be on the Local FS or HDFS.

检查文件的权限,它应该在主目录中。

Sqoop 期望在 HDFS 中使用 --password-file,如果您使用本地 FS 添加 file://.

示例:--password-file file:///user/dev/database.password

-P选项

它将从控制台读取密码。使用这个你必须在命令执行时写密码。

password

只需添加您的密码即可。

还有一种更好的方法。使用 expect 脚本

创建一个脚本文件说 "script.sh" :

#!/usr/bin/expect -f
      set password "<ur password desination or file>"
      spawn sqoop <args>  # define sqoop command here
      expect "*?Enter password:*" # As ask for password as while reading from database
      send -- "$password\r"
      expect sleep 15  # or you can use "set timeout -1" for infinite waiting time
      expect eof
EOF
done

如果您遇到 spawn 命令不存在等错误。这意味着没有安装 expect。

对于centos7

yum install expect -y

和运行文件"script.sh"

如果 expect 脚本加载失败

尝试:

> /usr/bin/expect script.sh

谢谢