このトピックでは、外部テーブルに関するよくある質問 (FAQ) に回答します。
カテゴリ | よくある質問 |
Object Storage Service (OSS) 外部テーブル | |
Hologres 外部テーブル | |
パフォーマンスの問題 |
ODPS-0123131 エラー:カスタムエクストラクタによる DATETIME 型の読み取り
問題
カスタムエクストラクタを使用して非構造化データを読み取る際、データフィールドが
2019-11-11 06:43:36のような DATETIME 型の場合、以下のエラーが報告されます。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)原因
コード
Date.valueOf(parts[i])において、java.sql.Date.valueOf()関数は"yyyy-[m]m-[d]d"形式の STRING パラメーターのみをサポートし、DATETIME パラメーターはサポートしていません。解決策
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.XX.XX^2019-11-11 06:43:36外部テーブルからデータを読み取ります。
select * from <project_name>.video_play_log;+------+-------+---+----------------+ | uuid | action | ip | time | +------+-------+---+----------------+ | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast forward | 26.12.XX.XX | 2019-11-11 06:43:36 | +------+-------+---+----------------+
OSS 外部テーブル上の UDF でのメモリオーバーフロー
問題
UDF (ユーザー定義関数) を使用して 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;原因
外部テーブルに含まれるオブジェクトファイルが多すぎることが原因で、大量のメモリが消費されます。さらに、パーティションが設定されていません。
解像度
より少量のデータをクエリします。
パーティションを使用して、各クエリでスキャンされるデータ量を減らします。
エラー:「Inline data exceeds maximum allowed size」
問題
Object Storage Service (OSS) のデータを処理する際に、
Inline data exceeds the maximum allowed sizeというエラーが発生します。原因
MaxCompute が OSS 外部テーブルにデータを書き込む際、操作上のサイズ制限を超える単一ファイルを作成しようとすることがあります。
解像度
実行計画を制御するために、次のプロパティを調整します。これにより、OSS 外部テーブルに書き込まれる個々のファイルがサイズ制限を超えないようにします。
-- 各マッパーが読み取るデータ量を調整します。単位:MB SET odps.sql.mapper.split.size=256; -- reduce フェーズのワーカー数を調整します。 SET odps.stage.reducer.num=100;
OSS 外部テーブルを使用した JSON データの読み取り
手順については、「OSS 外部テーブルを使用した JSON データの読み取り」をご参照ください。
OSS 外部テーブルを使用した小規模ファイルのマージ
Logview ログを使用して、SQL 実行計画の最後のオペレーターが Reducer か Joiner かを確認します。Reducer の場合は set odps.stage.reducer.num=1; 文を実行します。Joiner の場合は set odps.stage.joiner.num=1; 文を実行します。
ODPS-0130071 エラー:MaxCompute からの Hologres データの読み取り
問題
Hologres から直接データを読み取る際に、「ODPS-0130071 Failed to split to equal size...max count: 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 のデフォルトのマッパー分割戦略 (入力データ量 / split.size = 256 MB) により、同時実行マッパー数が最大制限の 7,777 を超えるために発生します。
説明この制限は、ユーザーが多数のマッパーを生成するジョブを送信し、Hologres の安定性やネットワーク接続に影響を与えるのを防ぐためのものです。
解決策
以下のパラメーターを設定することで、このエラーを解決できます。
-- マッパーの同時実行数制限を増やします。最大値は 10,000 です。 SET odps.external.holo.mapper.instances=10000; -- 分割サイズを増やすことで、タスクの同時実行数を調整します。最大値は 512 MB です。 SET odps.sql.mapper.split.size=512;
外部テーブルでの SQL ジョブの低速化
外部テーブルでの SQL ジョブが遅くなる一般的な理由がいくつかあります:
OSS 外部テーブルからの GZ 圧縮ファイルの読み取りが遅い
問題
OSS 外部テーブルから大規模な圧縮ファイル (例:200 GB の GZ ファイル) を読み取るのが遅い。
原因
GZ のような圧縮形式は分割不可能なため、MaxCompute は単一のマッパーしか使用できず、ジョブが遅くなります。
解決策
パフォーマンスを向上させるには、大きな圧縮ファイルを OSS 内の複数の小さなファイルに分割します。これにより、MaxCompute は複数のマッパーを並行して使用できるようになり、読み取りスループットが向上します。
-- 各マッパーのデータ分割サイズを MB 単位で設定します。 SET odps.sql.mapper.split.size=256;非構造化データの場合、Object Storage Service (OSS) 外部テーブルのパスにファイルが 1 つしか含まれていないか確認します。圧縮された非構造化データは分割できないため、ファイルが 1 つしかない場合、生成されるマッパーは 1 つだけになり、処理が遅くなります。OSS 外部テーブルのパスにある大きな OSS ファイルを小さなファイルに分割します。これにより、マッパーの数が増え、読み取り速度が向上します。
SDK を使用した MaxCompute 外部テーブルでのデータクエリが遅い
問題
SDK を使用して MaxCompute 外部テーブルからデータをクエリするのが遅い。
解決策
外部テーブルはフルテーブルスキャンのみをサポートしているため、処理が遅くなることがあります。代わりに MaxCompute 内部テーブルを使用することを推奨します。
Tablestore 外部テーブルからのデータクエリが遅い
問題
Tablestore 外部テーブルに対するクエリが、同じデータを含む MaxCompute 内部テーブルに対する同等のクエリよりも大幅に遅い。
解像度
外部テーブルのクエリにはリモートでのデータ読み取りが含まれるため、このパフォーマンスの違いは想定内です。パフォーマンスを向上させるには、まずデータを MaxCompute 内部テーブルにインポートしてからクエリを実行します。
OSS 外部テーブルでの「Couldn't connect to server」エラー
問題
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 外部テーブルの
CREATE TABLE文のoss_locationパラメーターを確認する必要があります。oss_endpointがパブリックエンドポイントである場合は、内部エンドポイントに変更してください。パラメーターの詳細については、「パラメーターの説明」をご参照ください。たとえば、インドネシア (ジャカルタ) リージョンで
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....エンドポイントを使用して外部テーブルを作成する場合、対応する内部エンドポイントoss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/....に変更する必要があります。原因 2 の場合:
OSS 外部テーブルの CREATE TABLE 文の
oss_locationパラメーターにあるoss_endpointが、アクセスしたいリージョンのエンドポイントであることを確認する必要があります。OSS クラシックネットワークのドメイン名の詳細については、「リージョンとエンドポイント」をご参照ください。
テーブル作成時の「Network is unreachable (connect failed)」エラー
問題
Object Storage Service (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 外部テーブルの
CREATE TABLE文を確認し、oss_locationパラメーターで指定されたoss_endpointが内部エンドポイントであることを確認する必要があります。パブリックエンドポイントである場合は、内部エンドポイントに変更する必要があります。パラメーターの詳細については、「パラメーターの説明」をご参照ください。たとえば、中国 (北京) リージョンで
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....エンドポイントを使用して外部テーブルを作成する場合、対応する内部エンドポイントoss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/....に変更する必要があります。