Sqoop 带钱包导入
Sqoop import with wallet
我们在 Cloudera CDH 5.8.5 中面临一些与 Sqoop v1.4.6 钱包使用相关的问题。我们的场景:
- 用户文件夹:/home/myuser
- 钱包文件夹:/home/myuser/wallet (cwallet.sso, cwallet.sso.lck, ewallet.p12, ewallet .p12.lck, sqlnet.ora, tnsnames.ora)
钱包配置好,就好像我运行
sqlplus /@MY_TNS_NAME
我可以不用密码连接到数据库。
问题出在 sqoop 上。
我可以连接到数据库并使用以下命令列出所有 tables:
export HADOOP_OPTS="-Doracle.net.tns_admin=/home/myuser/wallet -Doracle.net.wallet_location=/home/myuser/wallet"
sqoop list-tables --connect "jdbc:oracle:thin:@MY_TNS_NAME"
如果我尝试使用以下命令将 table 转储到 HDFS(按照建议 here)
export HADOOP_OPTS="-Doracle.net.tns_admin=/home/myuser/wallet -Doracle.net.wallet_location=/home/myuser/wallet"
sqoop import -D mapreduce.map.java.opts='-Doracle.net.tns_admin=. -Doracle.net.wallet_location=.' -files /home/myuser/wallet/cwallet.sso,/home/myuser/wallet/ewallet.p12,/home/myuser/wallet/sqlnet.ora,/home/myuser/wallet/tnsnames.ora -libjars "/var/lib/sqoop/oraclepki.jar,/var/lib/sqoop/osdt_cert.jar,/var/lib/sqoop/osdt_core.jar,/var/lib/sqoop/sqljdbc4.jar" --m 1 --connect "jdbc:oracle:thin:@MY_TNS_NAME" --query "SELECT * FROM MYTABLE WHERE $CONDITIONS" --target-dir '/tmp/mytabledump'
我收到这个错误:
Error: java.lang.RuntimeException: java.lang.RuntimeException:
java.sql.SQLException: encountered a problem with the Secret Store.
Check the wallet location for the presence of an open wallet
(cwallet.sso) and ensure that this wallet contains the correct
credentials using the mkstore utility: java.io.IOException:
oracle.security.crypto.core.CipherException: Invalid padding string
(or incorrect password)...
如果我 运行 在不使用钱包的情况下执行相同的命令(手动提供用户和密码),它会起作用。
似乎将钱包传递给映射器时出现了一些问题。
知道如何解决这个问题吗?
附加信息:
- ACL 允许 sqoop 用户访问 /home/myuser
- /home/myuser/wallet文件夹所有者组是sqoop主组(rwx权限)。
我们设法解决了这个问题。
问题与钱包有关。
据我所知有两种钱包。第一种类型只能在创建它的机器上使用。第二种可以多机使用
我们的问题是我们的钱包是第一种。
在 map reduce 期间,钱包分布在映射器之间,因此对于这个 "non sharable" 钱包,映射器(位于不同的机器上)无法使用它。
我们必须使用以下命令创建钱包:
mkstore -wrl "<wallet_folder>" -create
我们在 Cloudera CDH 5.8.5 中面临一些与 Sqoop v1.4.6 钱包使用相关的问题。我们的场景:
- 用户文件夹:/home/myuser
- 钱包文件夹:/home/myuser/wallet (cwallet.sso, cwallet.sso.lck, ewallet.p12, ewallet .p12.lck, sqlnet.ora, tnsnames.ora)
钱包配置好,就好像我运行
sqlplus /@MY_TNS_NAME
我可以不用密码连接到数据库。
问题出在 sqoop 上。 我可以连接到数据库并使用以下命令列出所有 tables:
export HADOOP_OPTS="-Doracle.net.tns_admin=/home/myuser/wallet -Doracle.net.wallet_location=/home/myuser/wallet"
sqoop list-tables --connect "jdbc:oracle:thin:@MY_TNS_NAME"
如果我尝试使用以下命令将 table 转储到 HDFS(按照建议 here)
export HADOOP_OPTS="-Doracle.net.tns_admin=/home/myuser/wallet -Doracle.net.wallet_location=/home/myuser/wallet"
sqoop import -D mapreduce.map.java.opts='-Doracle.net.tns_admin=. -Doracle.net.wallet_location=.' -files /home/myuser/wallet/cwallet.sso,/home/myuser/wallet/ewallet.p12,/home/myuser/wallet/sqlnet.ora,/home/myuser/wallet/tnsnames.ora -libjars "/var/lib/sqoop/oraclepki.jar,/var/lib/sqoop/osdt_cert.jar,/var/lib/sqoop/osdt_core.jar,/var/lib/sqoop/sqljdbc4.jar" --m 1 --connect "jdbc:oracle:thin:@MY_TNS_NAME" --query "SELECT * FROM MYTABLE WHERE $CONDITIONS" --target-dir '/tmp/mytabledump'
我收到这个错误:
Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLException: encountered a problem with the Secret Store. Check the wallet location for the presence of an open wallet (cwallet.sso) and ensure that this wallet contains the correct credentials using the mkstore utility: java.io.IOException: oracle.security.crypto.core.CipherException: Invalid padding string (or incorrect password)...
如果我 运行 在不使用钱包的情况下执行相同的命令(手动提供用户和密码),它会起作用。
似乎将钱包传递给映射器时出现了一些问题。 知道如何解决这个问题吗?
附加信息:
- ACL 允许 sqoop 用户访问 /home/myuser
- /home/myuser/wallet文件夹所有者组是sqoop主组(rwx权限)。
我们设法解决了这个问题。
问题与钱包有关。
据我所知有两种钱包。第一种类型只能在创建它的机器上使用。第二种可以多机使用
我们的问题是我们的钱包是第一种。
在 map reduce 期间,钱包分布在映射器之间,因此对于这个 "non sharable" 钱包,映射器(位于不同的机器上)无法使用它。
我们必须使用以下命令创建钱包:
mkstore -wrl "<wallet_folder>" -create