このトピックでは、JindoSDK を使用してオブジェクトストレージサービス (OSS) にアクセスするときに発生する可能性のある Reached timeout エラーの原因と解決策について説明します。
タイムアウトメッセージ
[ErrorCode] : 25201 , [ErrorType]: OSS Op Error. [ErrorMessage]: [E1008]Reached timeout=30000ms
原因を特定する方法
タイムアウトメッセージだけから原因を特定することはできません。指定されたタイムアウト期間内に OSS サーバーが応答を返さない場合は、コンテキストログまたは例外スタックを確認する必要があります。
例外スタックに基づいてコンテキストログを確認します。
例外スタックのエラーメッセージに 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 の Rename 操作は、OSS の CopyObject 操作に基づいて実装されています。このエラーは、CopyObject 操作に対する OSS 高速コピー最適化が完了していないために発生します。その結果、JindoSDK の Rename 操作がタイムアウトします。
解決策
OSS の テクニカルサポート に連絡して、
bucket.oss-cn-xxx-internal.aliyuncs.comの設定要件を確認してください。次に、OSS 高速コピー最適化の失敗の原因を確認します。高速コピー最適化は、ストレージクラスが Standard の最も一般的なオブジェクトに対してのみ実行できます。OSS オブジェクトのストレージクラスが Standard でない場合、または OSS オブジェクトが特殊なタイプの場合、高速コピー最適化は失敗する可能性があります。その結果、rename 操作がタイムアウトする可能性があります。JindoSDK を使用して、一般的なオブジェクトのみを OSS にアップロードし、Standard ストレージクラスを使用することをお勧めします。高速コピー最適化は、次のオブジェクトで失敗する可能性があります。
ストレージクラスが Standard でないオブジェクト (ストレージクラスが IA、Archive、Cold Archive のオブジェクトなど)
OSS の AppendableObject タイプのオブジェクト
MultiPart 以外の操作を呼び出してアップロードされた小さなオブジェクト
サーバー側の暗号化などの機能を使用するオブジェクト
特殊なオブジェクト (LINK、SYMLINK、DELETEMARKER タイプのオブジェクトなど)
例外スタックのエラーメッセージに InputStream または Read が表示される
エラーメッセージの例
Read from oss://xxxx with error message: [HostId]: oss-cn-zhangjiakou-internal.aliyuncs.com [ErrorMessage]: [E1008]Reached timeout=30000ms原因と解決策
JindoData 4.0.0 の SeekRead 操作には、Reached timeout エラーが発生する可能性のある欠陥があります。JindoData 4.0.0 を使用している場合は、JindoData を 4.3.X 以降のバージョンにアップグレードしてください。詳細については、「新しい EMR コンソールで EMR クラスタの JindoSDK をアップグレードする」をご参照ください。
OSS の帯域幅スロットリングがトリガーされています。この場合は、OSS の テクニカルサポート に連絡して、帯域幅スロットリングがトリガーされた理由を確認してください。
例外スタックのエラーメッセージに 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 が表示される
原因
OSS バケットでバージョン管理が有効になっています。
解決策
バージョン管理が有効になっているかどうか、または以前にバージョン管理を有効にしたかどうかを確認します。
OSS の テクニカルサポート に連絡して、OSS バケットまたはパスに 100,000 を超える削除マーカーが存在するかどうかを確認します。100,000 を超える削除マーカーが存在する場合は、追加の削除マーカーを削除します。
rm コマンド
skipTrash を含む rm コマンド
skipTrash オプションを含む rm コマンドは、2 つのステップを実行することで実行されます。getFileStatus 操作が呼び出され、次に delete 操作が呼び出されます。skipTrash オプションを含む rm コマンドを実行したときにタイムアウトエラーが発生した場合、タイムアウトエラーは getFileStatus 操作が呼び出されたときに発生します。タイムアウトエラーを修正するには、「例外スタックのエラーメッセージに getFileStatus が表示される」に記載されている手順に従ってください。
skipTrash を含まない rm コマンド
skipTrash オプションを含まない rm コマンドは、2 つのステップを実行することで実行されます。getFileStatus 操作が呼び出され、次に Rename 操作が呼び出されます。skipTrash オプションを含まない rm コマンドを実行したときにタイムアウトエラーが発生した場合は、「例外スタックのエラーメッセージに getFileStatus が表示される」および「例外スタックのエラーメッセージに rename が表示される」に記載されている手順に従ってエラーを修正してください。
skipTrash は rm コマンドのオプションです。たとえば、hadoop fs -rm -skipTrash oss://bucket/path コマンドを実行して OSS オブジェクトを削除できます。削除されたオブジェクトはごみ箱に移動されません。
ls コマンド
ls コマンドは、2 つのステップを実行することで実行されます。getFileStatus 操作が呼び出され、次に listDirectory 操作が呼び出されます。ls コマンドを実行したときにタイムアウトエラーが発生した場合、タイムアウトエラーは getFileStatus 操作が呼び出されたときに発生します。タイムアウトエラーを修正するには、「例外スタックのエラーメッセージに getFileStatus が表示される」に記載されている手順に従ってください。