このトピックでは、外部テーブルに関するよくある質問への回答を提供します。
カスタムエクストラクタが DATETIME 型のデータフィールドを含む非構造化データを読み取るときにエラー ODPS-0123131 が表示される場合はどうすればよいですか。
問題の説明
カスタムエクストラクタが非構造化データを読み取るとき、データフィールドが DATETIME 型 (例: 2019-11-11 06:43:36) の場合、次のエラーメッセージが表示されます。
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.IllegalArgumentException at java.sql.Date.valueOf(Date.java:143) at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194) at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153) at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)原因
コードの指定された位置にある
java.sql.Date.valueOf()関数内のDate.valueOf(parts[i])は、"yyyy-[m]m-[d]d"などの STRING 型のパラメーターのみをサポートしています。この関数は DATETIME 型のパラメーターをサポートしていません。解決策
Joda-Time 依存関係を導入し、インポート情報をコードに追加します。
-- Joda-Time 依存関係を導入します。 <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> -- インポート情報を追加します。 import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat;DateTimeFormat.forPattern()関数を追加して、DATETIME 型のフィールドを読み取り用に STRING 型に変換します。record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));
例
MaxCompute クライアントでエクストラクタプロジェクトをパッケージ化することによって生成された JAR ファイルをアップロードします。
add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar/Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jarは、生成された JAR ファイルを格納するためのローカルディレクトリです。MaxCompute クライアントで Joda-Time サードパーティ JAR ファイルをアップロードします。
add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar/Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jarは、Joda-Time サードパーティ JAR ファイルを格納するためのローカルディレクトリです。OSS の指定されたディレクトリにテストデータをアップロードします。この例では、ファイル名は
video_play_log.txtです。サンプルデータ:5c661071dba64d5080c91da085ff1073^Music-Click-Fast Forward^26.12.04.68^2019-11-11 06:43:36外部テーブルからデータを読み取ります。
select * from <project_name>.video_play_log;返された結果:
+------+-------+---+----------------+ | uuid | action | ip | time | +------+-------+---+----------------+ | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast Forward | 26.12.04.68 | 2019-11-11 06:43:36 | +------+-------+---+----------------+
MaxCompute を使用して OSS 外部テーブルにアクセスするときにローカルテストに合格した UDF をアップロードした後、メモリオーバーフローエラーが発生します。どうすればよいですか。
問題の説明
MaxCompute を使用して OSS 外部テーブルにアクセスするときにローカルテストに合格した UDF をアップロードした後、次のエラーメッセージが表示されます。
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap space次の構成を追加した後、実行時間は増加しますが、エラーは持続します。
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096;原因
外部テーブルには過剰な数のオブジェクトがあり、大きなメモリ領域を占有しています。さらに、オブジェクトにパーティションが指定されていません。
解決策
少量のデータをクエリします。
オブジェクトにパーティションを指定して、メモリ使用量を削減します。
外部テーブルを使用して OSS データを処理するときに「インラインデータが許容最大サイズを超えています」というエラーメッセージが表示される場合はどうすればよいですか。
問題の説明
MaxCompute が OSS データを処理すると、エラーメッセージ
Inline data exceeds the maximum allowed sizeが表示されます。原因
OSS ストレージは各オブジェクトのサイズを制限します。オブジェクトのサイズが 3 GB を超えると、エラーが発生します。
解決策
次のプロパティの構成を変更して、実行計画を調整します。これらのプロパティは、各リデューサーが OSS 外部テーブルに書き込むことができるデータのサイズを管理するために使用されます。これにより、OSS ストレージオブジェクトのサイズが 3 GB を超えないようにすることができます。
set odps.sql.mapper.split.size=256; # 各マッパーによって読み取られるデータのサイズを調整します。単位: MB。 set odps.stage.reducer.num=100; # Reduce フェーズでのワーカーの数を調整します。
MaxCompute で OSS 外部テーブルを使用して JSON データを読み取るにはどうすればよいですか。
MaxCompute で OSS 外部テーブルを使用して JSON データを読み取る方法の詳細については、「MaxCompute で OSS 外部テーブルから JSON データを読み取る」をご参照ください。
OSS 外部テーブルを使用して複数の小さなファイルを 1 つのファイルとしてエクスポートするにはどうすればよいですか。
LogView ログの SQL 実行プランの最後のステップで、リデューサーまたはジョイナーが使用されているかどうかを確認します。最後のステップでリデューサーが使用されている場合は、set odps.stage.reducer.num=1; コマンドを実行します。最後のステップでジョイナーが使用されている場合は、set odps.stage.joiner.num=1; コマンドを実行します。
MaxCompute を使用して Hologres データを直接読み取るときに ODPS-0130071 エラーが報告される場合はどうすればよいですか。
問題の説明
Hologres データを直接読み取ると、「ODPS-0130071 等しいサイズに分割できませんでした...最大数: 7777」というエラーメッセージが報告されます。例:
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777原因
MaxCompute が Hologres データを直接読み取るとき、デフォルトのマッパ分割戦略 (入力データサイズ/分割サイズ 256 MB) を使用します。これにより、マッパーの数が最大制限の 7777 を超えます。
説明この制限は、ユーザーが多数のマッパーを生成するタスクを直接送信することを防ぐために設けられています。これは、Hologres ファイルまたはネットワーク接続の安定性に影響を与える可能性があります。
解決策
次のパラメーターを構成することで、この問題を解決できます。
SET odps.external.holo.mapper.instances=10000; --並列実行の上限を 10000 に引き上げます。 SET odps.sql.mapper.split.size=512; --分割サイズを 512 MB に増やして、タスクの同時実行性を調整します。
外部テーブルに基づいて SQL ジョブが低速で実行される場合はどうすればよいですか。
外部テーブルに基づいて SQL ジョブを実行すると、次のいずれかの理由により、ジョブの実行速度が遅くなる可能性があります。
OSS 外部テーブルからの GZIP 圧縮ファイルの読み取りが遅い
問題の説明
OSS 外部テーブルが作成されます。データソースは OSS 内の GZIP 圧縮ファイルであり、ファイルサイズは 200 GB です。データの読み取り中に実行が遅くなります。
原因
計算を実行するために使用されるマッパーの数が非常に少ないため、SQL ステートメントの実行が遅くなります。
解決策
構造化データの場合、odps.sql.mapper.split.size パラメーターを構成して、単一のマッパーによって読み取られるデータ量を調整し、SQL ステートメントの実行を高速化できます。
set odps.sql.mapper.split.size=256; # 各マッパーによって読み取られるテーブルデータのサイズを調整します。単位: MB。非構造化データの場合、OSS 外部テーブルのディレクトリに 1 つの OSS ファイルのみが格納されているかどうかを確認する必要があります。1 つの OSS ファイルのみが存在する場合、非構造化データは圧縮モードでは分割できないため、1 つのマッパーのみを生成できます。これにより、データ処理が遅くなります。OSS 外部テーブルのディレクトリにある大きな OSS ファイルを小さなファイルに分割することをお勧めします。これにより、外部テーブルを読み取るために生成されるマッパーの数が増加し、読み取り速度が向上します。
MaxCompute SDK を使用した外部テーブルでのデータ検索が遅い
問題の説明
MaxCompute SDK が外部テーブルのデータを低速で検索します。
解決策
外部テーブルはフル検索のみをサポートしています。検索速度が遅くなります。検索には、外部テーブルではなく MaxCompute 内部テーブルを使用することをお勧めします。
Tablestore 外部テーブルからのデータクエリが遅い
問題の説明
Tablestore 外部テーブルからデータが低速でクエリされます。同じビジネスデータが Tablestore 外部テーブルにリアルタイムで書き込まれ、MaxCompute 内部テーブルに定期的に書き込まれ、2 つのテーブルのスキーマとデータ量が同じである場合、MaxCompute 内部テーブルのデータをクエリするのに必要な時間は、Tablestore 外部テーブルのデータをクエリするのに必要な時間よりもはるかに短くなります。
解決策
データが複数回計算される可能性があります。その結果、データクエリが遅くなります。このシナリオでのクエリの効率を向上させるには、必要なデータを MaxCompute 内部テーブルにインポートしてから、内部テーブルのデータをクエリできます。この方法は、データをクエリするたびに Tablestore からデータを読み取るよりも効率的です。
OSS 外部表からデータを読み取るときに「サーバーに接続できませんでした」エラーが報告される場合はどうすればよいですか。
問題の説明
OSS 外部表からデータを読み取ると、次のエラーが報告されます:
ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server。原因
原因 1: OSS 外部表の作成時に使用した
oss_locationパラメーターのoss_endpointが、内部エンドポイントではなくパブリックエンドポイントを指しています。原因 2: OSS 外部表の作成時に使用した
oss_locationパラメーターのoss_endpointが、異なるリージョンのエンドポイントを指しています。
解決策
原因 1 の場合:
外部表作成ステートメントの
oss_locationパラメーターのoss_endpointを確認します。パブリックエンドポイントを使用している場合は、対応する内部エンドポイントに変更します。パラメーターの詳細については、「パラメーター」をご参照ください。たとえば、インドネシア (ジャカルタ) リージョンで外部表を作成するために
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....を使用している場合は、内部エンドポイントoss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/....に変更します。原因 2 の場合:
外部表作成ステートメントの
oss_locationパラメーターのoss_endpointが、アクセスするリージョンのエンドポイントに対応していることを確認します。異なるリージョンの OSS エンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
OSS 外部表を作成するときに「ネットワークに到達できません (接続に失敗しました)」エラーが報告される場合はどうすればよいですか。
問題の説明
OSS 外部表を作成すると、次のエラーが報告されます:
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed)。原因
OSS 外部表を作成するとき、
oss_locationパラメーターのoss_endpointが、内部エンドポイントではなくパブリックエンドポイントを指しています。解決策
外部表作成ステートメントの
oss_locationパラメーターのoss_endpointが内部エンドポイントを指していることを確認します。パブリックエンドポイントを使用している場合は、内部エンドポイントに変更します。パラメーターの詳細については、「パラメーター」をご参照ください。たとえば、中国 (北京) リージョンで外部表を作成するために
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....を使用している場合は、内部エンドポイントoss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/....に変更します。