Hologres 外部テーブルを使用して MaxCompute データをクエリする際に発生する一般的なエラーと、その解決策について説明します。
トラブルシューティングの前に
特定のエラーを調査する前に、次の診断情報を収集してください:
-
クエリログの確認:
hologres.hg_query_logをクエリして、失敗したクエリとその詳細を確認してください。 -
実行エンジンの特定: クエリログの
engine_typeフィールドを確認してください。Hologres は、外部テーブルのクエリを処理するために 2 つのエンジンを使用します:-
HQE (Hologres クエリエンジン) :外部テーブルへのアクセスを高速化します。
-
SQE (標準クエリエンジン) :フォールバックエンジンです。
-
-
Hologres バージョンの確認: 多くの修正には特定のバージョンが必要です。
SELECT hg_version();を実行して確認してください。
背景情報
Hologres と MaxCompute の比較
|
観点 |
MaxCompute |
Hologres |
|
シナリオ |
DWD および DWS レイヤー向けの ETL 処理 |
ADS レイヤー向けの対話型クエリとリアルタイムデータ配信 |
|
ユーザー操作 |
非同期ジョブ実行 |
同期クエリ |
|
クラスタリソース |
共有クラスタ、SaaS として提供 |
専用クラスタ、PaaS として提供 |
|
実行エンジン |
ジョブ実行モデルです。ステージは必要に応じてリソースを要求し、中間結果をディスクに永続化します。 |
メモリ常駐実行とユーザースペーススケジューリングを備えた MPP アーキテクチャです。中間結果のディスク書き込みはありません。 |
|
スケジューリング |
プロセスレベルです。実行時にリソースが動的に割り当てられます。 |
スレッドレベルです。起動時にリソースが事前割り当てされます。 |
|
拡張性 |
実質的に無制限 |
複雑なクエリでは、複数ノード間のデータシャッフルを回避します |
|
ストレージ形式 |
列指向 |
行指向、列指向、および行列ハイブリッド |
|
ストレージコスト |
Pangu をベースとしており、低コストです。 |
Pangu をベースとしていますが、キャッシュと高速化のために SSD を使用するため、比較的高コストです。 |
|
インターフェイス標準 |
MaxCompute SQL (Hive に類似) |
PostgreSQL |
外部テーブルと内部テーブルの比較
-
外部テーブルは、データをローカルに保存せずに MaxCompute から直接アクセスします。インデックスはなく、計算は CPU のみで実行します。QPS が低い小規模データセットに最適です。
-
内部テーブルは、データを Hologres に保存し、すべてのインデックスをサポートします。複雑なクエリ、頻繁な更新、または高 QPS のシナリオでは、データをインポートしてください。
権限エラー
MaxCompute テーブルに対する SELECT 権限の不足
You have NO privilege 'odps:Select' on {table}
または:
You have NO privilege 'MaxCompute:Select' on {table}
原因:アカウントに MaxCompute テーブルの SELECT 権限がありません。
解決策:MaxCompute 管理者に依頼して、テーブルに対する SELECT 権限を付与してもらいます。詳細については、「MaxCompute permissions」をご参照ください。
クロスプロジェクトテーブルに対する SELECT 権限の不足
You have NO privilege 'odps:Select' on {table}
このエラーは、パッケージベースのアクセス制御を使用している場合でも、クロスプロジェクトの MaxCompute テーブルをクエリすると発生します。
原因:クロスプロジェクトのシナリオでは、認可のためにどの MaxCompute プロジェクトコンテキストを使用するかを Hologres が把握する必要があります。
解決策:クエリの前に、現在のプロジェクト名を設定してください:
-- Hologres V0.8+ の場合:
set hg_experimental_odps_current_project_name = 'holoprojectname';
-- Hologres V0.7 の場合:
set seahawks.seahawks_internal_current_odps_project = 'holoprojectname';
列レベルの機密ラベル不一致
The sensitive label of column '{column}' is 2, but your effective label is 0
原因:アカウントが MaxCompute テーブルの一部の列にのみ権限を持っています。Hologres V0.8 より前のバージョンは、列レベルの権限を完全にはサポートしていませんでした。
解決策:次のいずれかを実施してください:
-
V0.8 以降にアップグレードする (推奨) :これらのバージョンでは、列レベルの権限が正しく処理されます。
-
クエリを変更する:アカウントがアクセスできる列のみを含むようにします。
-
権限を申請する:すべての列に対する権限を付与してもらいます。「MaxCompute permissions」をご参照ください。
-
回避策として実行パスを変更する:クエリの前に GUC (Grand Unified Configuration) パラメーターを設定します。この方法は、古いバージョンの Hologres を対象としています。
set hg_experimental_enable_odps_executor = on;
set hg_experimental_enable_query_master = on;
新しいバージョンを使用していてもこのエラーが発生する場合は、不具合の可能性があります。代わりに、新しいバージョン向けの次の GUC パラメーターを使用してください。
set hg_experimental_enable_MaxCompute_executor = on;
set hg_experimental_enable_query_master = on;
LIST 権限の不足 (HoloWeb または DataStudio)
You have NO privilege 'odps:List' on {project}
原因:HoloWeb または DataStudio で外部テーブルを作成するには、利用可能なテーブルを表示するために MaxCompute の List 権限が必要です。
解決策:
-
MaxCompute 管理者に依頼して、
List権限を付与してもらいます。「MaxCompute permissions」をご参照ください。 -
または、
CREATE FOREIGN TABLESQL 文を使用して外部テーブルを直接作成します。この方法ではList権限は不要です。詳細については、「Accelerate queries of MaxCompute data based on foreign tables」をご参照ください。
IP ホワイトリストによるアクセス拒否
Access denied by project ip white list
原因:対象の MaxCompute プロジェクトで IP ホワイトリストが有効になっており、HoloWeb サーバーの IP アドレス (エラーメッセージの sourceIP) がリストに含まれていません。
解決策:エラーメッセージに含まれる sourceIP を、対象の MaxCompute プロジェクトの IP ホワイトリストに追加してください。
HoloWeb から MaxCompute パーティションテーブルをインポートする際に残存する一時外部テーブル
HoloWeb から MaxCompute パーティションテーブルをワンクリックインポートすると、次のエラーで停止します:
ERROR: relation "tmp_foreign_XXX" already exists
tmp_foreign_XXX は、エラーメッセージに表示される一時外部テーブルの名前です。
原因:HoloWeb は、ワンクリックインポート中にソースデータを読み取るため、tmp_foreign_XXX という名前の一時外部テーブルを作成します。インポートが失敗した、または中断された場合、一時外部テーブルがデータベースに残ります。その後のインポートでは同名のテーブルがすでに存在するため、失敗します。
解決策:
-
残存している一時外部テーブルにデータが残っているかを確認してください。
tmp_foreign_XXXは、エラーメッセージに表示されたテーブル名に置き換えてください。SELECT * FROM tmp_foreign_XXX LIMIT 1; -
結果に応じて対処してください:
-
行が返されない、またはデータがすでに宛先テーブルに到達している場合は、残存テーブルを削除してください:
DROP TABLE tmp_foreign_XXX; -
行が残っている場合は、データが宛先テーブルに到達していることを確認してから、残存テーブルを削除してください。
-
-
HoloWeb で MaxCompute パーティションテーブルのワンクリックインポートを再度実行してください。
MaxCompute プロジェクトにアカウントが存在しない
You don't exist in project {project}
原因:アカウントが、指定された MaxCompute プロジェクトのメンバーとして追加されていません。
解決策:エラーに表示されているプロジェクト名が正しいことを確認してください。正しい場合は、MaxCompute 管理者に依頼してアカウントをプロジェクトに追加してもらいます。詳細については、「Permissions overview」をご参照ください。
暗号化ロールの認可不足
query next from foreign table executor failed validate userinfo
原因:Hologres に AliyunHologresEncryptionDefaultRole ロールが付与されていません。このエラーは、付与から 3 時間未満の場合にキャッシュの影響で断続的に発生することもあります。
解決策:アカウントに AliyunHologresEncryptionDefaultRolePolicy ポリシーを付与してください。詳細については、「Query encrypted MaxCompute data」をご参照ください。
データ形式と互換性のエラー
ORC ファイルではない
status { code: SERVER_INTERNAL_ERROR message: "hos_exception: Invalid argument: not an ORC file" }
原因:データがまだ ORC 形式になっていないため、ストリーミングロードの実行中は、Hologres 外部テーブルで MaxCompute テーブルにアクセスできません。
解決策:SQL 文の前に次の GUC パラメーターを追加してください:
set hg_experimental_enable_access_odps_with_table_api = on;
set hg_experimental_enable_access_odps_orc_via_holo = off;
DECIMAL 型の ORC スキーマ不一致
Open ORC file failed for schema mismatch. Reader schema
原因:MaxCompute の ORC テーブルにおける DECIMAL のストレージ形式が変更されています。通常、新しい DECIMAL フィールドの追加、またはカナリア構成の変更後に発生します。
解決策:
-
MaxCompute で次のコマンドを実行し、データを再インポートしてください:
set MaxCompute.storage.orc.enable.binary.decimal = false;
-
または、MaxCompute テーブルで
DECIMAL型をDOUBLE型に変更し、データを更新してください。
タイムスタンプのオーバーフロー
Timestamp overflow detected while converting timestamp from orc VectorBatch to arrow
原因:MaxCompute テーブルに、ナノ秒精度で Tunnel を使用してロードされた TIMESTAMP データが含まれています。Hologres はこの精度をサポートしていません。
解決策:
-
MaxCompute で
TIMESTAMP型をDATETIME型に変換してください。 -
または、Hologres インスタンスを V1.1.70 以降にアップグレードしてください。
スキーマエボリューションが有効になっていない
failed to import foreign schema: Failed to get MaxCompute table: Not enable schema evolution
原因:MaxCompute テーブルのスキーマが変更 (列の追加または削除) され、Hologres が読み取れないスキーマエボリューション状態になっています。
解決策:
-
Hologres インスタンスを V1.3 以降にアップグレードしてください。
-
MaxCompute テーブルのスキーマ変更後に、IMPORT FOREIGN SCHEMA を実行して外部テーブルのスキーマを更新してください。
-
エラーが解消しない場合は、MaxCompute テーブルを再作成してから外部テーブルを再作成してください。
トランザクションテーブル (ACID) がサポートされていない
failed to import foreign schema: Failed to get MaxCompute table: Not enable acid table
原因:MaxCompute テーブルがトランザクションテーブル (ACID) です。
解決策:テーブルを標準の MaxCompute テーブルに変換してください。トランザクションテーブルはサポートされていません。
リソース制限エラー
パーティション制限の超過 (512)
Specified partitions count in MaxCompute table: exceeds the limitation of 512
または:
Build desc failed: Exceeds the partition limitation of 512, current match {n} partitions
原因:デフォルトでは、Hologres は外部テーブルのクエリあたり最大 512 パーティションをスキャンします。
多段パーティションの MaxCompute テーブルでは、パーティション数は最も粒度の細かいパーティション単位で決まります。
解決策:
-
クエリにパーティションフィルターを追加して、スキャンするパーティション数を減らしてください。
-
データを内部テーブルにインポートしてください。内部テーブルにはパーティション制限がありません。詳細については、「Import data from MaxCompute using SQL」をご参照ください。
-
GUC パラメーターでパーティション制限を調整してください。デフォルトは 512、最大は 1024 です。この値を高くしすぎると、クエリ性能が低下する可能性があります。
-- V1.1 以降の場合:
set hg_foreign_table_max_partition_limit = 128;
-- V0.10 の場合:
set hg_experimental_foreign_table_max_partition_limit = 128;
スキャンサイズ制限の超過 (200 GB)
Build desc failed: Exceeds the scan limitation of 200 GB, current scan {n} GB
原因:デフォルトでは、Hologres は外部テーブルのデータスキャンをクエリあたり 200 GB に制限します。この制限は、保存データの総量ではなく、スキャン対象のパーティションに適用されます。
解決策:
-
フィルターを追加してアクセスするパーティションを減らし、スキャンデータを 200 GB 未満に抑えてください。
-
クエリの前にデータを Hologres にインポートしてください。詳細については、「Import data from MaxCompute using SQL」をご参照ください。
-
(非推奨) スキャン制限を引き上げてください。値は必要なサイズ (GB) に置き換えてください。過度に引き上げると性能が低下し、メモリ不足 (OOM) エラーが発生する可能性があります。
set hg_experimental_foreign_table_max_scan_size = 400;
リソース枯渇 (サーバーがビジー)
Request denied, may caused by server busy
原因:外部テーブルのクエリリソースが枯渇しています。
解決策:
-
SQL を最適化する:詳細については、「Optimize query performance for MaxCompute foreign tables」をご参照ください。
-
並列度 (DOP) を下げる: DOP は、実行ノードあたり外部テーブルデータの読み取り並行性を制御します。デフォルト:256、範囲:0~1024。高すぎるとメモリ不足 (OOM) エラーのリスクがあり、低すぎると性能が低下します。
-- 現在の DOP を確認:
show hg_foreign_table_executor_max_dop;
-- 現在値の半分に設定 (例):
set hg_foreign_table_executor_max_dop = 18;
-
データを内部テーブルにインポートする:内部テーブルはインデックスをサポートするため、クエリ性能が向上します。詳細については、「Import data from MaxCompute using SQL」をご参照ください。
インポート中のメモリ制限超過
Query executor exceeded total memory limitation {limit}: {used} bytes used
原因:クエリが計算用メモリ制限を超過しました。Hologres の各ノードには 64 GB のメモリがあり、およそ 3 つ (計算、キャッシュ、メタデータ) に分割されています。
解決策:次の手順を順に試してください:
-
実行計画の確認:
explain analyze <sql>;を実行して行数を確認してください。一部のテーブルで統計情報が更新されていない場合、オプティマイザーが最適でない結合順序を選択することがあります。関係するすべてのテーブルに対してanalyze <tablename>;を実行し、統計情報を更新してください。 -
バッチサイズの削減: ワイドテーブルや行サイズが大きい場合、バッチあたりのメモリを使い切ることがあります。次のようにバッチあたりの行数を減らしてください:
set hg_experimental_query_batch_size = 1024; -- デフォルト:8192 insert into holo_table select * from mc_table; -
インポート時の DOP の削減: データインポートのシナリオでは、
hg_foreign_table_executor_max_dopパラメーターはデフォルトでインスタンスの CU 数に設定されます。この値はクエリのパフォーマンスに影響を与える可能性があるため、インポート中は次のように小さい値に設定してください:set hg_foreign_table_executor_max_dop = 8; insert into holo_table select * from mc_table; -
データの重複排除:
insert on conflictを使用している場合、重複が多いとメモリ負荷が増加します。インポート前に MaxCompute で重複を排除してください。詳細については、「Merge multiple rows of data into a single row」をご参照ください。 -
Hologres のアップグレード: V1.1.24 以降では、Hologres が計算用メモリの割り当てを動的に調整します。詳細については、「Instance upgrade」をご参照ください。
-
インスタンスのスケールアップ: ほかの方法で解決しない場合は、インスタンスリソースを増やしてください。詳細については、「Upgrade」をご参照ください。
非サポート機能
CFile テーブルタイプがサポートされていない
query next from foreign table executor failed, GetRecordBatch() is not implemented
原因:MaxCompute テーブルが CFile タイプであり、デフォルトのアクセスパスでは Hologres はサポートしていません。
解決策:SQL 文の前に次の GUC パラメーターを追加してください:
set hg_experimental_enable_access_odps_with_table_api = on;
ストリーミングトンネルのデータを読み取れない
Query next from foreign table executor failed, not implemented
原因:MaxCompute テーブルがストリーミングトンネル (tunnel.createStreamUploadSession) を使用してロードされています。このデータを読み取るには、特定の GUC パラメーターが必要です。
解決策 (Hologres V1.3 以降):クエリの前に次のパラメーターを追加してください:
set hg_experimental_enable_access_odps_with_table_api = on;
set hg_experimental_enable_access_odps_orc_via_holo = off;
V1.3 より前のバージョン向けの回避策:MaxCompute でストリーミングロードを停止してから、データをマージしてください:
set odps.merge.task.mode = sql;
set odps.merge.lock.expire.time = 0;
ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;
MaxCompute ビューがサポートされていない
Build desc failed: failed to check permission: Currently not supported table type "view"
原因:Hologres は、MaxCompute ビューを外部テーブルとしてサポートしていません。
接続とインフラストラクチャのエラー
メタデータ取得の失敗 (Pangu)
Build desc failed: failed to get foreign table split: MaxCompute-0010000: System internal error - get input pangu dir meta fail
原因:MaxCompute から読み取るための Hologres 設定が速やかに更新されませんでした。
解決策:数分待ってから再試行してください。問題が解消しない場合は、テクニカルサポートにお問い合わせください。
スモールファイルが原因で RPC 接続がクローズされた
Build desc failed: failed to get foreign table split: ERPC_ERROR_CONNECTION_CLOSED
原因:MaxCompute テーブルにスモールファイルが多すぎるため、メタデータ要求が 1 GB の RPC 制限を超えています。
解決策:
-
MaxCompute でスモールファイルをマージしてください:
set MaxCompute.merge.task.mode = sql;
set MaxCompute.merge.lock.expire.time = 0;
ALTER TABLE <tablename> [PARTITION] MERGE SMALLFILES;
-
この問題が修正されている Hologres V0.10.21 以降にアップグレードしてください。詳細については、「Instance upgrade」をご参照ください。
-
データ量が少ない場合は、データを Hologres にインポートしてください。問題が解消しない場合は、MaxCompute テクニカルサポートにお問い合わせください。
暗号化された MaxCompute データへのアクセス失敗
status { code: SERVER_INTERNAL_ERROR message: "hos_exception: IO error: Failed to execute pangu open normal file, err: PanguParameterInvalidException" }
原因:HQE は、Pangu 上の暗号化された MaxCompute データにアクセスできません。
解決策:暗号化データにアクセスできる SQE に実行エンジンを切り替えてください。データベースレベルで設定します (新しい接続に適用):
ALTER DATABASE <dbname> SET hg_experimental_enable_access_odps_orc_via_holo = false;
または、セッションレベルで設定してください:
SET hg_experimental_enable_access_odps_orc_via_holo = false;
パフォーマンスチューニング
外部テーブルのスキーマエボリューション後のクエリ低速化
原因:Hologres はデフォルトで HQE を使用し、外部テーブルのクエリを高速化します。MaxCompute のスキーマ変更後、Hologres はより低速な SQE にフォールバックします。
解決策:
-
hologres.hg_query_logをクエリして、低速なクエリを特定してください。 -
engine_typeフィールドを確認してください。SQEと表示されている場合、性能低下はエンジンのフォールバックが原因です。 -
Hologres で、更新後のスキーマを用いて影響を受けた外部テーブルを再作成してください。
外部テーブルのクエリ低速化 (一般)
SQL 文を最適化してください。詳細については、「Optimize query performance for MaxCompute foreign tables」をご参照ください。
GUC パラメーターのクイックリファレンス
このドキュメントで参照している GUC パラメーター:
|
パラメーター |
デフォルト |
範囲 |
最小バージョン |
目的 |
|
|
-- |
on/off |
V1.3 |
CFile タイプおよびストリーミングロードされたテーブルへのアクセス |
|
|
on |
on/off |
-- |
外部テーブルの実行エンジンを HQE から SQE に切り替えます。暗号化データの場合は |
|
|
512 |
1~1024 |
V1.1 |
クエリあたりにスキャンする最大パーティション数 |
|
|
512 |
-- |
V0.10 |
|
|
|
200 (GB) |
-- |
-- |
クエリあたりの最大データスキャンサイズ |
|
|
256 |
0~1024 |
-- |
単一ノードで外部テーブルから読み取るための DOP |
|
|
8192 |
-- |
-- |
インポート時にバッチあたり読み取る行数 |
|
|
-- |
on/off |
-- |
SQE 実行パスを強制 (古いバージョン) |
|
|
-- |
on/off |
-- |
SQE 実行パスを強制 (新しいバージョン) |
|
|
-- |
on/off |
-- |
列レベル権限の回避策としてクエリマスターを有効化 |
|
|
-- |
project name |
V0.8 |
クロスプロジェクトアクセス用に MaxCompute プロジェクトコンテキストを設定 |
|
|
-- |
project name |
V0.7 |
|