分享

解决hive sqoop 问题 Io exception: Connection timed out的三种方法介绍

howtodown 2014-4-27 14:53:12 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 10401
问题导读:
1.方法一如何修改数据库配置?
2.修改什么代码,来避免这种情况发生?
3.第三种方法与hadoop心跳有什么相似之处?





当从数据库 读数据的时候 有可能会 Connection timed out, 这是由于sqoop会缓存 connection的原因, 当要load 数据到hive的时候 会再次访问oracle数据库,但是这个时候缓存的 数据库连接对象已经超时了或者被数据库中断了,解决方法有三个:

方法一:

修改oracle数据库配置:

Sqlnet.ora: SQLNET.INBOUND_CONNECT_TIMEOUT=180
Listener.ora: INBOUND_CONNECT_TIMEOUT_listener_name=120

方法二:
先看sqoop 源码片段

  @Override
  public Connection getConnection() throws SQLException {
    if (null == this.connection) {
      this.connection = makeConnection();
    }

    return this.connection;
  }


第一次获取数据库连接的时候将连接保存,下次直接判断this.connection是否存在 若存在复用, 如果这个时候缓存的 连接超时了就会报错:(Io exception: Connection timed out)


  @Override
  public Connection getConnection() throws SQLException {
    if (null == this.connection) {
      this.connection = makeConnection();
    }

    return this.connection;
  }



每次都直接创建就避免了问题

  @Override
  public Connection getConnection() throws SQLException {
  //  if (null == this.connection) {
      this.connection = makeConnection();
  //  }

    return this.connection;
  }

方法三:
起个线程 每三十秒(oracle  默认连接超时时间应该是60秒)发送个简单的请求防止超时

总结:
个人感觉第一种方法:更简单些



已有(1)人评论

跳转到指定楼层
june_fu 发表于 2015-3-9 00:00:55
qoop会缓存 connection的原因导致;第二种方法要修改sqoop远吗咯。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条