本文介绍JindoSDK访问OSS出现Reached timeout问题的解决方法。

具体报错

[ErrorCode] : 25201 , [ErrorType]: OSS Op Error. [ErrorMessage]: [E1008]Reached timeout=30000ms

解决思路

说明 单独的超时异常无法排查,一般是OSS服务端没有返回,需要查看上下文日志或异常栈。
您执行如下命令访问OSS时,可能会出现Reached timeout问题。

异常栈有Rename字样

  • 异常示例
    java.io.IOException: rename src:oss://bucket.oss-cn-xxxx-internal.aliyuncs.com/user/hive/warehouse/tmp/hive/xxxx/c185ce78-f843-4104-8dca-f5b96fc9****/hive_xxxx_00-07-51_265_5593904247532586093-47957/_tmp.-mr-10006, dst:oss://bucket.oss-cn-xxxx-internal.aliyuncs.com/user/hive/warehouse/tmp/hive/xxx/c185ce78-f843-4104-8dca-f5b96fc9****/hive_xxxx-07-21_00-07-51_265_5593904247532586093-47957/_tmp.-mr-10006.moved
    
    ,java.io.IOException: [ErrorCode] : 25201 , [ErrorType]: OSS Op Error. [ErrorMessage]: [E1008]Reached timeout=30000ms @100.118.xx.xx:80 ERROR_CODE : 1008
  • 异常原因

    JindoSDK的OSS Rename基于OSS CopyObject实现,此异常通常是CopyObject没能进行OSS内部的fastcopy优化,导致JindoSDK的rename超时。

  • 解决方法:
    可联系OSS的 技术支持, 确认 bucket.oss-cn-xxx-internal.aliyuncs.com设置要求,排查OSS内部的fastcopy优化失效原因。例如:
    • OSS Bucket默认存储类型不是标准存储。console如果存储类型不是标准存储,可能会导致OSS内部的fastcopy优化失效。DataLake的Bucket默认要使用标准类型。
    • 设置了KMS。Encryption如果Bucket设置了默认加密策略,可能会导致OSS内部的fastcopy优化失效。

异常栈有InputStream或Read字样

  • 异常示例
    Read from oss://xxxx with error message:  [HostId]: oss-cn-zhangjiakou-internal.aliyuncs.com [ErrorMessage]: [E1008]Reached timeout=30000ms
  • 异常原因和解决方法

异常栈有OutputStream、Write或Close字样

  • 异常示例
    com.aliyun.emr.fs.oss.commit.magic.JindoOssMagicOutputStream.write(JindoOssMagicOutputStream.java:146)
            ... 14 more
    Caused by: java.io.IOException: ErrorCode : 25201 , ErrorMsg: OSS Op Error.  [HostId]: oss-cn-beijing-internal.aliyuncs.com [ErrorMessage]: [E1008]Reached timeout=30000ms @100.118.xx.xx:80 ERROR_CODE : 1008
            at com.alibaba.jboot.JbootFuture.get(JbootFuture.java:179)
            at com.alibaba.jboot.JbootOssWriter.write(JbootOssWriter.java:85)
    Caused by: java.io.IOException: Close stream oss://xxx error java.io.IOException: [ErrorCode] : 25201 , [ErrorType]: OSS Op Error.  [HostId]: xxx [ErrorMessage]: [E1008]Reached timeout=30000ms @xxx ERROR_CODE : 1008
  • 异常原因和解决方法

    通常是触发了OSS的带宽流控,可联系OSS技术支持查看流控原因。

异常栈有getFileStatus字样

  • 异常原因

    通常是由于Bucket打开了多版本功能。

  • 解决方法
    1. 需确认是否打开或曾经打开过多版本功能。qaq
    2. 联系OSS技术支持,确认该Bucket或路径下是否有10万以上的DeleteMarker,如果有则需要进行清理。

rm命令

  • rm命令带skipTrash

    该命令内部会有两个执行阶段,首先会执行getFileStatus操作,然后执行delete操作。如果执行该命令出现超时问题,超时主要发生在命令内部的getFileStatus阶段,您可以通过解决getFileStatus超时的方法,解决该命令的超时问题,详情请参见上文异常栈有getFileStatus字样

  • rm命令不带skipTrash

    该命令内部会有两个执行阶段,首先会执行getFileStatus操作,然后执行Rename操作。如果执行该命令出现超时问题,您可以通过getFileStatus和Rename解决超时的方法,解决该命令超时问题,详情请参见上文异常栈有getFileStatus字样异常栈有Rename字样

说明 skipTrash是rm命令的选项,例如 hadoop fs -rm -skipTrash oss://bucket/path表示直接删除,删除文件不会进入回收站。

ls命令

ls命令内部会有两个执行阶段,首先会执行getFileStatus操作,然后执行listDirectory操作。如果执行ls命令出现超时问题,超时主要发生在内部的getFIleStatus阶段,可以通过getFIleStatus解决超时的方法,解决ls命令超时问题,详情请参见上文异常栈有getFileStatus字样