このトピックでは、Hologres を MaxCompute に接続する際に発生する一般的なエラーとその解決方法について説明します。
用語
次の表は、Hologres と MaxCompute を比較したものです。
比較項目
MaxCompute
Hologres
シナリオ
データウェアハウス詳細 (DWD) およびデータウェアハウスサービス (DWS) レイヤーでの抽出、変換、ロード (ETL)。
アプリケーションデータサービス (ADS) レイヤーでのインタラクティブな検索とオンラインデータサービス。
使用方法
非同期ジョブ。
同期クエリ。
クラスターリソース
SaaS (Software as a Service) モードの大規模共有クラスター。
PaaS (Platform as a Service) モードの排他的クラスター。
計算エンジン
ジョブ実行モデルを使用して、ジョブをステージに変換します。必要に応じて各ステージの計算リソースを要求し、実行中にファイルの永続化を使用します。
Massively Parallel Processing (MPP) モデルを使用して、詳細なメモリリソース管理を行います。実行エンジンはメモリ常駐であり、ユーザーモードで詳細な SQL オペレーターをスケジュールします。コンピューティングはディスクに書き込みません。
スケジューリング
プロセスレベル。リソースは実行時に必要に応じて要求および割り当てられます。
軽量スレッド。リソースは起動時に予約されます。
拡張性
ほぼ無制限。
複雑なクエリ中に複数のノード間でデータシャッフルを回避します。
ストレージフォーマット
列指向。
行指向、列指向、および行列ハイブリッド。
ストレージコスト
Pangu に基づいているため低コスト。
Pangu に基づいており、キャッシュアクセラレーションに SSD を使用するため、比較的高コスト。
インターフェース標準
MaxCompute SQL、Hive に類似。
PostgreSQL。
Hologres の外部テーブルと内部テーブルのシナリオ
外部テーブルを作成してクエリを直接高速化する
外部テーブルはデータを保存しません。データは MaxCompute に保存されます。外部テーブルにはインデックスがなく、計算は完全に CPU リソースに依存します。したがって、外部テーブルは、データ量が少なく、クエリ/秒 (QPS) が低いクエリに適しています。
データを Hologres 内部テーブルにインポートしてクエリを高速化する
内部テーブルは Hologres にデータを保存します。データ更新、複雑なクエリ、または高 QPS のクエリの場合は、データを内部テーブルにインポートする必要があります。これにより、Hologres バックエンドのパフォーマンス上の利点を最大限に活用できます。
パフォーマンスチューニング
パフォーマンスの低下:MaxCompute 外部テーブルでスキーマ進化が発生した後、クエリのパフォーマンスが大幅に低下する
原因:Hologres は、デフォルトで HQE 直接読み取りパスを使用して MaxCompute 外部テーブルのクエリを高速化します。MaxCompute 外部テーブルのスキーマが変更されると、システムは SQE パスにフォールバックします。この長いアクセスパスにより、クエリのパフォーマンスが低下します。
解決策:hologres.hg_query_log を通じて低速クエリを照会できます。engine_type が SQE の場合、MaxCompute のスキーマ進化後に SQE パスに切り替わったことがパフォーマンス低下の原因であると確認できます。この問題を解決するには、スキーマ変更が必要な MaxCompute 外部テーブルを再構築してみてください。
一般的なエラー
MaxCompute の権限:
その他のエラー:
エラー:SERVER_INTERNAL_ERROR message: GetRecordBatch() is not implemented.
エラー:Build desc failed: Exceeds the scan limitation of 200 GB, current scan xxx GB.
エラー:query next from foreign table executor failed, Not implemented.
エラー:desc のビルドに失敗しました:権限のチェックに失敗しました:テーブルタイプ "view" は現在サポートされていません。
エラー:failed to import foreign schema:Failed to get MaxCompute table:Not enable schema evolution.
エラー:failed to import foreign schema:Failed to get MaxCompute table:Not enable acid table.
データインポート時のエラー:Query executor exceeded total memory limitation xxxxx: yyyy bytes used.
エラー: orc VectorBatch から arrow へのタイムスタンプ変換中にタイムスタンプのオーバーフローが検出されました
エラー:SERVER_INTERNAL_ERROR message: GetRecordBatch() is not implemented.
MaxCompute 外部テーブルをクエリすると、次のエラーが発生します: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;
エラー:ERROR: not an ORC file
外部テーブルをクエリすると、次のエラーが発生します:ERROR: status { code: SERVER_INTERNAL_ERROR message: "hos_exception: Invalid argument: ../../../src/OrcFileMetaHelper.cc(234)-<operator()>: not an ORC file。
原因:MaxCompute テーブルは、Tunnel を使用してデータが書き込まれるストリームテーブルです。Hologres は、この状態の外部テーブルの直接読み取りをサポートしていません。
解決策:データクエリ SQL ステートメントの前に、次の GUC パラメーターを追加できます。
set hg_experimental_enable_access_odps_with_table_api=on; set hg_experimental_enable_access_odps_orc_via_holo =off;
エラー: MaxCompute テーブルで指定されたパーティション数が 512 の制限を超えています。より厳密なパーティションフィルターを追加するか、axf_MaxCompute_partition_limit を設定してください。または Build desc failed: 512 のパーティション制限を超え、現在 xxx 個のパーティションに一致しています。
原因:
Hologres は、最大 512 個のパーティションのクエリをサポートします。クエリがこの制限を超えています。
解決策:
パーティションフィルター条件を追加して、1 回のクエリが 512 パーティションを超えないようにします。
データを Hologres 内部テーブルにインポートします。内部テーブルにはパーティションの制限はありません。詳細については、「SQL を使用した MaxCompute からのデータインポート」をご参照ください。
次のコマンドを使用して、各クエリでヒットするパーティションの数を調整できます。デフォルト値は 512 で、最大値は 1024 です。クエリのパフォーマンスに影響を与える可能性があるため、この値を高く設定しすぎないでください。
-- V1.1 以降 set hg_foreign_table_max_partition_limit = 128; -- V0.10 の場合 set hg_experimental_foreign_table_max_partition_limit = xxx ;説明MaxCompute が複数レベルのパーティションで構成されている場合、パーティションのヒット数は最も細かいパーティションの粒度に基づきます。
エラー: ビルド記述の作成に失敗しました。スキャンが 200 GB の制限を超えています (現在のスキャン: xxx GB)。
原因:
Hologres では、デフォルトの最大基盤データスキャンサイズは 200 GB です。この制限は、MaxCompute パーティションのフィルタリング後のスキャンサイズに適用され、MaxCompute のデータストレージサイズとは無関係です。このエラーは、クエリがこの制限を超えたために発生します。
解決策:
フィルター条件を追加して、ヒットするパーティションを減らし、1 回のクエリのスキャンサイズを 200 GB 以内に保ちます。
MaxCompute テーブルのデータを Hologres にインポートしてから、クエリを実行します。詳細については、「SQL を使用した MaxCompute からのデータインポート」をご参照ください。
(非推奨)
set hg_experimental_foreign_table_max_scan_size = xxx.コマンドを使用して、データサイズの制限を増やすことができます。xxx は、ビジネスデータ量 (GB) に置き換えることができます (例:400)。ただし、外部テーブルのデータサイズ制限を過度に増やすと、期待されるパフォーマンスが得られず、インスタンスで Out-of-Memory (OOM) エラーが発生し、通常の利用に影響を与える可能性があります。
エラー: 外部テーブルエグゼキュータからの次のクエリに失敗しました。実装されていません。
原因:データは Streaming Tunnel を使用して MaxCompute テーブルに書き込まれます。書き込みコマンドは
tunnel.createStreamUploadSessionです。データを読み取るには、Hologres で 2 つの GUC パラメーターを有効にする必要があります。解決策:
次の 2 つの設定項目を追加できます。
説明この 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;
エラー:Build desc failed: failed to check permission: Currently not supported table type "view".
原因:MaxCompute のビューは現在サポートされていません。
エラー:Build desc failed: failed to get foreign table split:MaxCompute-0010000: System internal error - get input pangu dir meta fai.
原因:
Hologres が MaxCompute を読み取るための構成が迅速に更新されませんでした。
解決策:
数分後に操作を再試行してください。数回再試行しても操作が失敗する場合は、テクニカルサポートにお問い合わせください。
エラー:ERROR: Query:[xxx] Build desc failed: failed to get foreign table split:ERPC_ERROR_CONNECTION_CLOSED.
原因:
MaxCompute に小規模ファイルが多すぎるため、要求されたメタデータがリモートプロシージャコール (RPC) プロトコルの最大制限である 1 GB を超えています。
解決策:
次のコマンドを実行して、小規模ファイルをマージできます。
set MaxCompute.merge.task.mode=sql; set MaxCompute.merge.lock.expire.time=0; ALTER TABLE <tablename> [PARTITION] MERGE SMALLFILES;この問題は Hologres V0.10.21 以降で最適化されています。Hologres インスタンスをアップグレードできます。詳細については、「インスタンスのアップグレード」をご参照ください。
MaxCompute のテクニカルサポートに連絡して、根本的な問題を解決できます。データ量が少ない場合は、データを直接 Hologres に書き込むことができます。
エラー:ERROR: status { code: SERVER_INTERNAL_ERROR message: "hos_exception: IO error: Failed to execute pangu open normal file, err: PanguParameterInvalidException" }.
原因:
Hologres HQE は、MaxCompute Pangu からの暗号化されたデータの直接読み取りをサポートしていません。
解決策:
ALTER DATABASE <dbname> SET hg_experimental_enable_access_odps_orc_via_holo = false;コマンドを実行して、外部テーブルの実行エンジンを SQE に変更できます。SQE を使用して、暗号化された MaxCompute データにアクセスします。この構成はデータベースレベルであり、有効にするには接続を再作成する必要があります。セッションレベルで設定することもできます:SET hg_experimental_enable_access_odps_orc_via_holo = false;。
エラー: 外部スキーマのインポートに失敗しました: MaxCompute テーブルの取得に失敗しました: スキーマ進化が有効になっていません。
原因:
MaxCompute テーブルのメタデータが変更されました。
解決策:
Hologres インスタンスを V1.3 以降にアップグレードできます。アップグレードするには、Hologres DingTalk グループに参加してリクエストを送信するか、「アップグレード準備時の一般的なエラー」をご参照ください。グループへの参加方法については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
MaxCompute 外部テーブルのスキーマを更新した後 (列の追加や削除など)、IMPORT FOREIGN SCHEMA を実行して更新できます。
IMPORT FOREIGN SCHEMAを実行してもエラーが解決しない場合は、MaxCompute テーブルを再作成してから外部テーブルを再作成できます。これは、スキーマ変更後、MaxCompute がschema evolution状態になり、Hologres がこの状態のテーブルを読み取れないためです。
エラー: スキーマの不一致により ORC ファイルのオープンに失敗しました。リーダースキーマ:
原因:
MaxCompute テーブルは ORC 形式であり、DECIMAL 型のストレージ方法が変更されました。これは通常、MaxCompute に DECIMAL フィールドが追加された場合や、MaxCompute でカナリアリリースの構成変更が行われた場合に発生します。これにより、Hologres が MaxCompute から DECIMAL 型を読み取る際にエラーが発生します。
解決策:
set MaxCompute.storage.orc.enable.binary.decimal=falseコマンドを実行し、MaxCompute データを再インポートします。MaxCompute テーブルの DECIMAL 型を DOUBLE に変更してから、データを更新します。
エラー:外部スキーマのインポートに失敗しました:MaxCompute テーブルの取得に失敗しました:ACID テーブルが有効になっていません。
原因:
MaxCompute テーブルはトランザクションテーブルです。
解決策:
MaxCompute のトランザクションテーブルは現在サポートされていません。標準テーブルに変更できます。
エラー: リクエストが拒否されました。サーバーがビジー状態である可能性があります。
原因:
外部テーブルのリソースが枯渇し、CPU 使用率が大幅に超過しています。
解決策:
SQL ステートメントを最適化して、リソースをより効率的に使用できます。詳細については、「MaxCompute 外部テーブルのクエリパフォーマンスの最適化」をご参照ください。
同時実行数を減らすことができます。
show hg_foreign_table_executor_max_dop;コマンドを使用して、現在の構成を表示できます。次のコマンドを使用して、同時実行数を減らすことができます。現在の構成の半分に設定することを推奨します。
-- 構文例 set hg_foreign_table_executor_max_dop = <concurrency>; -- 使用例 set hg_foreign_table_executor_max_dop = 18;同時実行数は、単一の実行ノードが外部テーブルからデータを読み取るために使用する同時スレッドの数です。デフォルト値は 256 で、値の範囲は 0 から 1024 です。変更のリスク:同時実行数を高く設定しすぎると、インスタンスの OOM エラーが発生する可能性があります。これにより、インポートまたはクエリの失敗、さらにはインスタンスの再起動が発生し、サービスが利用できなくなる可能性があります。同時実行数を低く設定しすぎると、外部テーブルのクエリや外部テーブルから内部テーブルへのデータインポートのパフォーマンスが低下します。
データを Hologres 内部テーブルにインポートできます。内部テーブルにインデックスを作成して、クエリのパフォーマンスを向上させることができます。詳細については、「SQL を使用した MaxCompute からのデータインポート」をご参照ください。
データインポート時のエラー: クエリエグゼキュータが合計メモリ制限 xxxxx を超過: 使用バイト数 yyyy
原因:
データ量が多すぎるか、インポートロジックが複雑すぎるため、メモリ制限を超えています。インスタンスは複数のノードで構成されています。1 つのノードの標準メモリ制限は 64 GB です。ノードのメモリは 3 つの部分に分かれています:3 分の 1 がコンピューティング用、3 分の 1 がキャッシング用、3 分の 1 がメタデータ用です。このエラーは、コンピューティングメモリの制限を超えたことを示します。
解決策:
実行計画の表示
explain analyze sql;コマンドを実行して、実行計画の具体的な行数を表示できます。インポートクエリにサブクエリが含まれているが、一部のテーブルがanalyzedされていない、またはanalyzedされた後に更新されている場合、統計は不正確になります。これにより、クエリオプティマイザーが結合順序について不適切な決定を下し、高いメモリオーバーヘッドが発生する可能性があります。関与するすべての内部テーブルと外部テーブルで
analyze tablename;コマンドを実行して、統計メタデータを更新できます。これにより、クエリオプティマイザーがより最適な実行計画を生成するのに役立ちます。インポートごとの行数の設定
テーブルの列数が多く、1 行あたりのデータ量が多い場合、1 回のバッチで読み取られるデータ量は大きくなります。SQL ステートメントの前に次のパラメーターを追加して、バッチごとに読み取られる行数を制御できます。これにより、OOM の状況を効果的に減らすことができます。
set hg_experimental_query_batch_size = 1024; -- デフォルト値は 8192 です。 insert into holo_table select * from mc_table;インポートの同時実行数の削減
インポートの同時実行数を減らすことも、インポートプロセス中のメモリオーバーヘッドを効果的に削減します。同時実行数は
hg_foreign_table_executor_max_dopパラメーターによって制御され、デフォルトではインスタンスのコア数になります。インポート中に小さい値を設定して、メモリ使用量を減らすことができます。set hg_foreign_table_executor_max_dop = 8; insert into holo_table select * from mc_table;外部テーブルに過剰な重複データがないか確認します。
上記の手順を完了してもインポートが失敗し、
insert on conflictコマンドを使用している場合は、外部テーブルに重複データが多すぎないか確認してください。過剰な重複データも、インポートパフォーマンスの低下につながる可能性があります。インポートする前に MaxCompute で重複を削除できます。詳細については、「複数行のデータを 1 行にマージする」をご参照ください。動的メモリ調整のために新しいバージョンにアップグレードします。
V1.1.24 以降、Hologres はメモリを動的に調整します。システムは現在のメモリウォーターマークをリアルタイムで更新します。アイドルメモリがある場合、より多くのメモリがコンピューティングに割り当てられます。Hologres を最新バージョンにアップグレードできます。詳細については、「インスタンスのアップグレード」をご参照ください。
スケールアウト
上記の手順をすべて完了してもデータインポートが失敗する場合は、Hologres インスタンスをスケールアウトできます。詳細については、「アップグレード」をご参照ください。
エラー: ORC VectorBatch から Arrow へのタイムスタンプ変換中にタイムスタンプオーバーフローが検出されました。
原因:
MaxCompute テーブルには TIMESTAMP 型が含まれています。Tunnel を使用してデータを書き込むと、TIMESTAMP の精度がナノ秒になります。Hologres は現在、TIMESTAMP のナノ秒精度をサポートしていません。
解決策:
MaxCompute で TIMESTAMP 型を DateTime 型に変換できます。
Hologres インスタンスを V1.1.70 以降のバージョンにアップグレードできます。
エラー: xxx に対する 'MaxCompute:Select' 権限がありません。
原因:
現在のアカウントには、MaxCompute テーブルに対する SELECT 権限がありません。
解決策:
MaxCompute の管理者に連絡して、MaxCompute で現在のアカウントにテーブルの SELECT 権限を付与してもらいます。詳細については、「MaxCompute の権限」をご参照ください。
エラー: カラム 'xxx' の機密ラベルは 2 ですが、実効ラベルは 0 です。
原因:
現在のアカウントは、MaxCompute テーブルの一部のフィールドに対する権限しか持っていません。
解決策:
エラーを受け取ったアカウントが必要な権限を持つアカウントと同じであるか確認してください。アカウントに権限がない場合は、MaxCompute で必要な権限を申請するか、権限のあるフィールドのみをクエリしてください。
必要な権限があり、許可されたフィールドのみをクエリしている場合、エラーは古いインスタンスバージョンのバグが原因である可能性があります。クエリの前に次のコマンドを追加して、問題を解決できます。
set hg_experimental_enable_MaxCompute_executor=on; set hg_experimental_enable_query_master=on;
エラー:query next from foreign table executor failed validate userinfao
原因:
Hologres の AliyunHologresEncryptionDefaultRole が正しく権限付与されていませんでした。このエラーは、権限付与が 3 時間以内に行われた場合でも、キャッシングのために断続的に発生することがあります。
解決策:
アカウントに AliyunHologresEncryptionDefaultRolePolicy ロールを付与できます。詳細については、「暗号化された MaxCompute データのクエリ」をご参照ください。
外部テーブルでの低速クエリの解決方法
SQL ステートメントを最適化できます。詳細については、「MaxCompute 外部テーブルのクエリパフォーマンスの最適化」をご参照ください。
外部テーブルのクエリ時のエラー:You have NO privilege 'odps:Select' on xxx
問題
Hologres コンソールで外部テーブルを作成した後、外部テーブルをクエリすると「You have NO privilege 'odps:Select' on xxx」というエラーが報告されます。
原因
現在のアカウントには、MaxCompute テーブルに対する SELECT 権限がありません。
解決策
MaxCompute の管理者は、MaxCompute で現在のアカウントにテーブルの SELECT 権限を付与する必要があります。詳細については、「MaxCompute の権限」をご参照ください。
外部テーブルのクエリ実行エラー: 列 'xxx' の機密ラベルは 2 ですが、有効ラベルは 0 です
問題
Hologres コンソールで外部テーブルを作成した後、外部テーブルをクエリすると「The sensitive label of column 'xxx' is 2, but your effective label is 0」というエラーが報告されます。
原因
現在のアカウントは、MaxCompute テーブルの一部のフィールドに対する権限しか持っていません。
解決策
この問題を解決するには、次の 3 つの方法のいずれかを使用できます。
(推奨) Hologres DingTalk グループに参加して、現在のインスタンスを V0.8 にアップグレードするようリクエストできます。詳細については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
クエリの前に次のパラメーターを追加して、エラーを解決できます。
set hg_experimental_enable_odps_executor=on; set hg_experimental_enable_query_master=on;MaxCompute テーブルのすべてのフィールドに対する権限を取得できます。詳細については、「MaxCompute の権限」をご参照ください。
プロジェクトをまたいで MaxCompute テーブルにアクセスする際のエラー:You have NO privilege 'odps:Select' on xxx
症状
現在のアカウントはすでに MaxCompute テーブルに対するクエリ権限を持っていますが、プロジェクトをまたいでテーブルにアクセスすると「You have NO privilege 'odps:Select' on xxx」というエラーが報告されます。
原因
現在のアカウントがすでに MaxCompute テーブルに対するクエリ権限を持っているにもかかわらず、プロジェクトをまたいでテーブルにアクセスするとエラーが依然として発生する場合、MaxCompute がパッケージベースの権限付与を使用している可能性があります。この問題を解決するには、SQL ステートメントを追加する必要があります。
解決策
MaxCompute がプロジェクトベースの権限付与を使用している場合は、Hologres の SQL ステートメントの前に次のパラメーターを追加して問題を解決できます。
// V0.7 のインスタンスの場合、権限付与のために次のステートメントを実行します set seahawks.seahawks_internal_current_odps_project='holoprojectname'; // V0.8 のインスタンスの場合、権限付与のために次のステートメントを実行します set hg_experimental_odps_current_project_name = 'holoprojectname';
外部テーブルの作成時のエラー:You have NO privilege 'odps:List' on xxx
問題
Hologres コンソールの HoloWeb または DataStudio を使用して視覚的に外部テーブルを作成すると、「You have NO privilege 'odps:List' on xxx」というエラーが報告されます。
原因
現在のアカウントには、MaxCompute のすべてのテーブルを表示するための List 権限がありません。
解決策
MaxCompute の管理者は、MaxCompute で現在のアカウントに List 権限を付与する必要があります。詳細については、「MaxCompute の権限」をご参照ください。
SQL ステートメントを使用して外部テーブルを作成し、データをクエリできます。詳細については、「外部テーブルに基づいて MaxCompute データのクエリを高速化する」をご参照ください。
外部テーブルの作成時のエラー:Access denied by project ip white list: sourceIP:'xxxx' is not in white list. project: xxxx
症状
Hologres コンソールの HoloWeb を使用して外部テーブルを作成すると、「Access denied by project ip white list: sourceIP:'xxxx' is not in white list. project: xxxx」というエラーが報告されます。
原因
MaxCompute クラスターにはアクセス用の IP アドレスホワイトリストが設定されており、HoloWeb の IP アドレスがホワイトリストに含まれていません。
解決策
MaxCompute プロジェクトで IP アドレスホワイトリスト機能が有効になっている場合、ホワイトリスト内のデバイスのみがプロジェクトにアクセスできます。ホワイトリスト外のデバイスがプロジェクトにアクセスしようとすると、正しい AccessKey ID と AccessKey Secret を使用しても認証が失敗します。したがって、外部テーブルを作成するには、エラーメッセージの IP アドレスをホワイトリストに追加する必要があります。詳細については、「IP アドレスホワイトリストの設定」をご参照ください。
外部テーブルの作成時のエラー:You don't exist in project xxx
症状
外部テーブルを作成すると、「You don't exist in project xxx」というエラーが報告されます。
原因
外部テーブルの作成に使用されたアカウントには、対応する MaxCompute プロジェクトにアクセスする権限がありません。
解決策
まず、アクセスする必要のある MaxCompute プロジェクトの名前を確認します。プロジェクト名が正しくない場合は、正しいものに置き換えてください。プロジェクト名が正しいにもかかわらずエラーが解決しない場合は、MaxCompute に移動して、エラーを受け取ったアカウントに権限を付与できます。詳細については、「権限の概要」をご参照ください。
HoloWeb ページからの MaxCompute 外部テーブル作成時のエラー:パブリック IP アドレスがホワイトリストにありません。
問題
原因
解決策