haveged入れたらOracle DBに対するsqoop importでConnection resetが出なくなった

Oracle DBに対してsqoop importするときに下記のようにurandomを使うのは割と一般的な話かなと思います。

sqoop import -D mapreduce.map.java.opts="-Djava.security.egd=file:/dev/../dev/urandom" ...

sqoopのマニュアルにも書いてありますね。
https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_oracle_connection_reset_errors

この辺も参考になるかも
ORACLEと接続するJavaで作ったバッチ処理が動かないときの対処方法

どうやらOracleJDBCドライバが内から呼び出しているSecureRandomクラスでのシード生成で時間がかかってコネクションが切れてしまうっぽいです。

この設定をしているにもかかわらず、下記のようなエラーが出るようになってちょっと困ってました。ただ5分後のリトライでは成功していたのでなんか気持ち悪いなと思いつつ放置していました。

java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:215)
    at org.apache.sqoop.manager.OracleManager.makeConnection(OracleManager.java:322)
    at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)
    at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:685)
    at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:708)
    at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:243)
    at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:226)
    at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:347)
    at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1298)
    at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1110)
    at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:96)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:396)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:506)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:222)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:231)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:240)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at oracle.net.ns.DataPacket.send(DataPacket.java:210)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:321)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:268)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:190)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:107)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:407)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416)
    ... 24 more

そんなおりに見つけたこのブログ
/dev/random のエントロピーが足りないときは Haveged を使う - tokuhirom's blog

エントロピーってなんじゃらほいとか思いつつ、すでにインストールしていたnode_exporterのnode_entropy_available_bitsをみたら確かにConnection resetが起きた時間帯のエントロピーが0に近い。

havege入れたら下記のようにエントロピーが急増しました。

havege入れて1週間ぐらい経ちましたがまだConnection resetは起きてないです。

たぶん最初はバッチの数が少なかったからエントロピーが足りてたんだと思います。
あとsqoopを実行するバッチサーバーはひとつなので足りなくなりがちだったのかなとも思います。