Amazon Redshift DB開発者ガイド – データのロード処理(3).データロードに関するトラブルシューティング

redshift-db-dev-guide

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Redshift DB開発者ガイド、データロード処理の第3弾です。前回のエントリに盛り込もうと思ったのですがボリューム(文字数)の都合で断念しました。(^-^;)

第3弾はエラー発生時の解決方法やヒントについてまとめている『トラブルシューティング』にちなんだ内容です。実際実行時に数多く目にする事でしょうから、何かとこの手の情報は入り用になってくるのかな、と思います。問題解決に少しでもお役に立てるようであれば幸いです。


目次

 

データロードに関するトラブルシューティング

このセクションでは、ロード時のエラーに関するエラーの識別方法及び解決方法についての情報を提供します。

COPYコマンドで指定されたAmazon S3のバケットは、対象のクラスタと同じリージョン内にある必要があります。Amazon S3バケットとクラスタが異なるリージョンにある場合、以下のようなエラーが表示されます。

ERROR: S3ServiceException:The bucket you are attempting to access must be addressed using the specified endpoint.

以下2つのAmazon Redshiftのシステムテーブは、データロード問題に関するトラブルシューティングとして役立つ事でしょう。

  • STL_LOAD_ERRORS:特定の負荷時に発生したエラーを発見
  • STL_FILE_SCAN:特定のファイルロード時間を表示したり、特定のファイルが読まれたか

ロードエラーの検出&診断方法

1.ロードエラーに関する詳細を返すビューを作成、またはクエリを定義します。以下の例では、実際のテーブル名でテーブルIDを一致させる為にSTL_LOAD_ERRORSテーブルをSTV_TBL_PERMテーブルに結合しています。

create view loadview as
(select distinct tbl, trim(name) as table_name, query, starttime,
trim(filename) as input, line_number, colname, err_code,
trim(err_reason) as reason
from stl_load_errors sl, stv_tbl_perm sp
where sl.tbl = sp.id);

2.データに関する有用な情報を返す為に、COPYコマンドにMAXERRORSオプションを指定します。COPYでは、エラーが発生した場合にエラーメッセージ詳細がSTL_LOAD_ERRORSテーブルに記録されるようになっています。

3.エラーの詳細を見るためには、以下のようにLOADVIEWを照会します。

select * from loadview where table_name='venue';
  tbl   | table_name | query |         starttime          
--------+------------+-------+----------------------------
 100551 | venue      | 20974 | 2013-01-29 19:05:58.365391 

|     input      | line_number | colname | err_code |       reason
+----------------+-------------+-------+----------+---------------------
| venue_pipe.txt |           1 |     0 |     1214 | Delimiter not found

4.ビューが返す情報に基づき、入力ファイルやロードスクリプトの問題を修正します。幾つかの典型的なロードエラーがありますので以下に列挙します。

  • [テーブル内の入力データフィールド]と[入力データフィールド]の型のミスマッチ。
  • [テーブル]と[入力データのフィールド数]の列数の不一致。
  • 引用符のミスマッチ。Amazon Redshiftは、シングルクォート・ダブルクォート両方をサポートしていますが、これらの引用符は開始終了共に合わせる必要があります。
  • 入力ファイルの日付/時刻のデータ形式不正。
  • 入力ファイル内の範囲外の値(数値列の場合)。
  • 列の個数値の数が、圧縮符号化の制限を超過。

 

マルチバイト文字のロードエラー

CHARデータ型を持つ列は、シングルバイトのUTF-8文字のみを受け入れます。バイト値であれば127まで、またヘキサであれば7Fまで。 VARCHARデータ型を持つ列は、最大4バイトまでのマルチバイト文字を受け入れます。詳細については、Character typesをご参照ください。

ロードデータの行に無効である文字が含まれている場合、COPYコマンドはエラーを返し、エラー番号1220STL_LOAD_ERRORSシステムログテーブルの行をログとして記録します。ERR_REASONフィールドは無効なバイト文字列を含めています。

以下はCOPYコマンドがCHAR列にUTF-8文字列e0 a1 c7a4をロードしようとした時のエラーです。

Multibyte character not supported for CHAR 
(Hint: Try using  VARCHAR). Invalid char: e0 a1 c7a4

エラーがVARCHARデータ型に関連しているものの場合、エラーの理由にはエラーコードと同様に、無効となったUTF-8のヘキサシーケンス文字列を含みます。以下の例は、COPYがVARCHARフィールドにUTF-8 a4をロードしようとした時のエラーです。

String contains invalid or unsupported UTF-8 codepoints. 
Bad UTF-8 hex sequence: a4 (error 3)

以下の表は、VARCHARのロードエラーの説明及び推奨される回避策です。これらのいずれかのエラーが発生した場合、有効なUTF-8コードシーケンスで文字列を置き換えるか、文字を削除します。

エラー
コード
回避策
1. The UTF-8 byte sequence exceeds the four-byte maximum supported by VARCHAR.
(UTF-8バイトシーケンスがVARCHARでサポートされている4バイトの最大値を超えています)
2. The UTF-8 byte sequence is incomplete.
COPY did not find the expected number of continuation bytes for a multi-byte character before the end of the string.
(UTF-8バイトシーケンスは不完全です。
COPYは、文字の終わりの前に、マルチバイト文字の連続バイト数の期待値を見つけられませんでした)
3. The UTF-8 single-byte character is out of range.
The starting byte must not be 254, 255 or any character between 128 and 191 (inclusive).
(UTF-8シングルバイト文字が範囲外です。
開始バイトが254, 255または128と191(包括的な)の間の任意の文字であってはなりません)
4. The value of the trailing byte in the byte sequence is out of range.
The continuation byte must be between 128 and 191 (inclusive).
(バイトシーケンスの末尾のバイトの値が範囲外です。
継続バイトは128と191(包括的)の間でなければなりません)
5. The UTF-8 character is reserved as a surrogate.
Surrogate code points (U+D800 through U+DFFF) are invalid.
(UTF-8文字は代理として予約されています。
サロゲートコードポイント(U+D800 through U+DFFF)が無効です)
6. The character is not a valid UTF-8 character (code points 0xFDD0 to 0xFDEF).
(有効なUTF-8文字(code points 0xFDD0 to 0xFDEF)ではありません)
7. The character is not a valid UTF-8 character (code points 0xFFFE and 0xFFFF).
(有効なUTF-8文字(code points 0xFFFE and 0xFFFF)ではありません)
8. The byte sequence exceeds the maximum UTF-8 code point.
(バイトシーケンスは、最大UTF-8コードポイントを超えています)
9. The UTF-8 byte sequence does not have a matching code point.
(UTF-8バイトシーケンスが、一致するコードポイントを持っていません)

 

ロードエラーリファレンス

ファイルからのロード実行中にエラーが発生した場合、エラーを特定し可能性のある説明を探しだす為にSTL_LOAD_ERRORSテーブルを照会します。以下の表は、データのロード中に発生する可能性のある全てのエラーコードを示しています。

エラーコード エラー詳細
1200 Unknown parse error. Contact support.
(未知の解析エラー。サポートに連絡してください)
1201 Field delimiter was not found in the input file.
(フィールドの区切り文字が入力ファイル内に見つかりませんでした)
1202 Input data had more columns than were defined in the DDL.
(入力データがDDLで定義されているものよりも多い列を有しています)
1203 Input data had fewer columns than were defined in the DDL.
(入力データがDDLで定義されているものよりも少ない列を有しています)
1204 Input data exceeded the acceptable range for the data type.
(入力データがデータ型の許容範囲を超えています)
1205 Date format is invalid.
See DATEFORMAT and TIMEFORMAT strings for valid formats.
(日付書式が無効です。
有効なフォーマットはDATEFORMATとTIMEFORMATの書式をご参照ください)
1206 Timestamp format is invalid.
See DATEFORMAT and TIMEFORMAT strings for valid formats.
(タイムスタンプ書式が無効です。
有効なフォーマットはDATEFORMATとTIMEFORMATの書式をご参照ください)
1207 Data contained a value outside of the expected range of 0-9.
(データに0-9の範囲以外の値が含まれてます)
1208 FLOAT data type format error.
(Floatデータ型のフォーマットエラー)
1209 DECIMAL data type format error.
(DECIMALデータ型のフォーマットエラー)
1210 BOOLEAN data type format error.
(Booleanデータ型のフォーマットエラー)
1211 Input line contained no data.
(入力行にはデータが含まれていません)
1212 Load file was not found.
(ロードファイルが見つかりませんでした)
1213 A field specified as NOT NULL contained no data.
(NOT NULLと指定されたフィールドにデータが含まれていません)
1214 VARCHAR field error.
(VARCHARフィールドエラー)
1215 CHAR field error.
(CHARフィールドエラー)
1220 String contains invalid or unsupported UTF-8 codepoints.
(文字列に無効またはサポートされていないUTF-8コードポイントが含まれています)