李士朝
发布于

datax 写入OushuDB HDFS 60s超时问题处理

报错如下

报错详解

● 60000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel (HDFS)
○ errors

■ java.io.EOFException: Premature EOF: no length prefix available
■ DataXceiver error processing WRITE_BLOCK operation src: /IP:port dst: /IP:port java.net.SocketTimeoutException
■ java.io.InterruptedIOException: Interrupted while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/IP:port remote=/IP:port]. 60000 millis timeout left

原因分析

当前数据流向为 datax->oushudb->hdfs。向 hdfs 写入数据时,如果一段时间内数据无法到达
hdfs,hdfs 服务会根据超时机制断掉连接管道,具体表现为日志中出现上述 error 信息。本次事故是因为 datax 运行内存空间不足,处理大数据量时易发生 fullGC 问题,无法向 db 预期的传输数据,进而演化成本次问题。

问题解决办法

将 datax 配置由 1C4G 调整为 2C8G

评论(2)
  • 阿福Chris
    阿福Chris 回复
    Eason Eason 2022-06-13 14:40:03

    datax 写 OushuDB 是用“copy from stdin”的方式,调整计算资源,治标不治本,数据量大到一定程度一样会出现同样的错误。

    偶数自研的 WASP 入 OushuDB 的方式是:

    1. 数据分批入 HDFS 临时文件;
    2. 然后创建外表指向改临时文件;
    3. insert into 内表 select from 外表的方式;

    在避免这个问题的同时还能保证入库的性能。

    这个功能好,我原本以为 copy 的方式已经很不错了呢

  • Eason
    Eason 回复

    datax 写 OushuDB 是用“copy from stdin”的方式,调整计算资源,治标不治本,数据量大到一定程度一样会出现同样的错误。

    偶数自研的 WASP 入 OushuDB 的方式是:

    1. 数据分批入 HDFS 临时文件;
    2. 然后创建外表指向改临时文件;
    3. insert into 内表 select from 外表的方式;

    在避免这个问题的同时还能保证入库的性能。

test