Redshift Serverless周りのエラーパターン
Redshift Serverlessを少し使ってみて数点ハマったので、誰かの助けになることを願ってメモを残します。
随時追記予定です。
COPY文でのデータソースのサイズ上限
4MB程度らしいです。
超えている場合、クエリ実行時に以下のようなログが出ます。
The total size of the json object exceeds the max limit of 4194304 bytes
という文字列が含まれます。
{'CreatedAt': datetime.datetime(2022, 12, 8, 15, 26, 32, 239000, tzinfo=tzlocal()), 'Duration': -1, 'Error': 'ERROR: The total size of the json object exceeds the max limit of 4194304 bytes\n Detail: \n -----------------------------------------------\n error: The total size of the json object exceeds the max limit of 4194304 bytes\n code: 8001\n context: <ここにデータの中身>', 'HasResultSet': False, 'Id': '2b80dc30-4542-4596-b426-51f494b82b7b', 'QueryString': "\n COPY test3 FROM 's3://gbiz-info-raw-json-dev/test_5.ndjson'\n REGION 'ap-northeast-1' IAM_ROLE ''\n FORMAT JSON 'noshred';\n ", 'RedshiftPid': 1073758309, 'RedshiftQueryId': ***, 'ResultRows': -1, 'ResultSize': -1, 'Status': 'FAILED', 'UpdatedAt': datetime.datetime(2022, 12, 8, 15, 27, 11, 881000, tzinfo=tzlocal()), 'WorkgroupName': 'form-sales-tagger-workgroup', 'ResponseMetadata': {'RequestId': 'f0240e7c-e0a2-44cc-a692-70e1bbc85f8a', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'f0240e7c-e0a2-44cc-a692-70e1bbc85f8a', 'content-type': 'application/x-amz-json-1.1', 'content-length': '1170', 'date': 'Thu, 08 Dec 2022 15:27:12 GMT'}, 'RetryAttempts': 0}}
対策
データソースのサイズを適当に分割します。
json配列を入力とする場合の分割方法例については↓こちらの記事で紹介しています。
SUPER型のレコードサイズ上限
1MB程度らしいです。
超えている場合、クエリ実行時に以下のようなログが出ます。
エラー文に Load into table '<redshiftの書き込み先テーブル名>' failed. Check 'sys_load_error_detail' system table for details.
という文字列が含まれます。
{'CreatedAt': datetime.datetime(2022, 12, 10, 1, 47, 0, 694000, tzinfo=tzlocal()), 'Duration': -1, 'Error': "ERROR: Load into table '<redshiftの書き込み先テーブル名>' failed. Check 'sys_load_error_detail' system table for details.", 'HasResultSet': False, 'Id': 'beb6d66c-78a4-4c78-b3ae-a97a1913437c', 'QueryString': "\n COPY test3 FROM *** \n REGION 'ap-northeast-1' IAM_ROLE ''\n FORMAT JSON 'noshred';\n ", 'RedshiftPid': 1073815659, 'RedshiftQueryId': 3402565, 'ResultRows': -1, 'ResultSize': -1, 'Status': 'FAILED', 'UpdatedAt': datetime.datetime(2022, 12, 10, 1, 47, 1, 788000, tzinfo=tzlocal()), 'WorkgroupName': 'form-sales-tagger-workgroup', 'ResponseMetadata': {'RequestId': 'f4d75421-08a8-410b-b422-581c33905510', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'f4d75421-08a8-410b-b422-581c33905510', 'content-type': 'application/x-amz-json-1.1', 'content-length': '570', 'date': 'Sat, 10 Dec 2022 01:47:01 GMT'}, 'RetryAttempts': 0}}
詳細確認
ちなみに、Check 'sys_load_error_detail' system table for details.
と出ていましたが、Redshift Serverlessのクエリエディタv2で以下を実行すると、テーブル形式でエラーが出たクエリの詳細が表示される。
SELECT * FROM sys_load_error_detail
ORDER BY start_time DESC;
error_messageというカラムにメッセージがでており、自分の場合は以下でした。
Exceeded 1048470 bytes
AWSのSUPER型のドキュメントにもサイズ上限についての言及があります。
SUPER データ型は、個々の SUPER フィールドまたはオブジェクトに対して最大 1 MB のデータのみをサポートします。詳細については、「Amazon Redshift 半構造化データの取り込みとクエリ」を参照してください。
redshiftクエリ同時実行数
実行中のクエリの数が上限数を超えるとエラー
raise error_class(parsed_response, operation_name)
botocore.errorfactory.ActiveStatementsExceededException: An error occurred (ActiveStatementsExceededException) when calling the ExecuteStatement operation: Active statements exceeded the allowed quota (200).
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/tmp/runscript.py", line 215, in <module>
handle_errors()
File "/tmp/runscript.py", line 38, in handle_errors
raise e_type(e_value).with_traceback(new_stack)
TypeError: __init__() missing 1 required positional argument: 'operation_name'
適当にsleepを入れて回避します。
ループなどで短時間の間にRedshiftに多量のクエリを投げている場合が多いと思います。クエリが完了することを確認してから次のクエリを投げるように対応するのが現実的と思います。
Discussion