Sqoop抽数报IO Error: Connection reset

本文解决了一个在使用Sqoop将Oracle数据导入Hive表时出现的错误问题:java.sql.SQLRecoverableException: IOError: Connection reset。通过修改JRE中的java.security文件,将securerandom.source的值更改为file:/dev/../dev/urandom,该问题得以解决。

现象

在使用Sqoop从Oracle抽数据到Hive表时,有时候会遇到以下报错,

Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: Connection reset
    at org.apache.sqoop.mapreduce.db.DBInputFormat.setDbConf(DBInputFormat.java:170)
    at org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:161)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:749)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1714)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: Connection reset
    at org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:223)
    at org.apache.sqoop.mapreduce.db.DBInputFormat.setDbConf(DBInputFormat.java:168)
    ... 10 more

解决

此问题一般是由于缺少一个生成快速随机数的工具,一般可以通过在JRE中的java.security中修改securerandom.source的值为以下内容并重新登陆shell解决问题。

cd $JAVA_HOME/jre/lib/security

vi java.security

securerandom.source=file:/dev/../dev/urandom
### 解决方案 当使用 Sqoop 将 Hive 中的据导出到 MySQL 时,如果遇到错误 `Destination already exists`,这通常是因为目标表已经存在或者目标路径下的文件未被清理干净。以下是针对此问题的详细分析和解决方案: #### 错误原因 1. **目标表已存在**:在执行 `sqoop export` 命令时,默认情况下不会覆盖已有表的内容。如果目标据库中的表已经存在,则会抛出该错误。 2. **临时文件残留**:Sqoop 在导出过程中可能会生成一些中间文件。如果这些文件未被正确删除,在后续运行相同命令时可能导致冲突。 --- #### 解决方法 ##### 方法一:清空或删除目标表 可以通过 SQL 手动清空或删除目标表后再重新执行 Sqoop 导出命令。例如: ```sql TRUNCATE TABLE allowinsert; -- 或者 DROP TABLE IF EXISTS allowinsert; ``` 随后再次运行 Sqoop 导出命令即可[^1]。 ##### 方法二:设置 `--update-mode` 参 可以尝试使用更新模式来避免重复写入的问题。具体参如下: - `allowinsert`: 只允许插入新记录; - `updateonly`: 更新现有记录而不插入新的记录; - `upsert`: 同时支持更新和插入操作。 修改后的 Sqoop 命令示例: ```bash sqoop export \ --connect "jdbc:mysql://<host>:<port>/<database>?useUnicode=true&characterEncoding=utf-8" \ --username <username> \ --password <password> \ --table <target_table_name> \ --export-dir <hdfs_export_dir> \ --update-mode allowinsert \ --input-fields-terminated-by '\t' ``` 其中 `<hdfs_export_dir>` 是 HDFS 上存储据的目标路径。 ##### 方法三:指定不同的出口目录 为了避免因路径冲突引发的问题,可以在每次导出前更改 HDFS 的源路径或将旧版本的据移动至其他位置保存。例如: ```bash hdfs dfs -mv /old/path/to/data /new/path/to/data ``` 之后调整 `--export-dir` 参指向新的路径[^2]。 ##### 方法四:启用增量导出功能 对于频繁变动的据集来说,采用基于时间戳或其他唯一字段的增量同步方式更为高效合理。配置步骤可参考官方文档说明[^3]: 1. 确定作为主键使用的列名(即 merge-key); 2. 设置起始偏移量与结束条件; 3. 构建相应的 Sqoop Job 定义脚本并定期触发调度任务完成自动化处理流程。 --- ### 注意事项 - 如果仍然无法解决问题,请确认所涉及的所有权限均已被授予相应用户角色,并验证网络连通性和服务状态正常与否。 - 对于生产环境而言,建议提前做好充分测试工作以减少潜在风险影响业务连续性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值