本トピックでは、MaxCompute データ転送タスク (新バージョン) におけるよくある問題とその解決策について説明します。
「User does not exist」エラー
MaxCompute データ転送タスク (新バージョン) の実行記録に ODPS-0420095: Access Denied - Authorization Failed [4002], You don't exist in project ****. Context ID:11111-1111-111-1111-11111111. --->Tips: Pricipal:INVALID$v4_11111111111; You don't exist in project **** というエラーが表示された場合、ターゲットユーザーが MaxCompute ワークスペースに追加されていないか、追加方法が間違っていることを示します。この問題を解決するには、ユーザーを再度追加して権限付与を完了してください。詳細については、「デフォルトロールに MaxCompute へのデータ書き込みを承認する (同一アカウント内のデータ転送)」または「カスタムロールに MaxCompute へのデータ書き込みを承認する (同一アカウント内のデータ転送)」をご参照ください。
「RAM role has no permission」エラー
MaxCompute データ転送タスク (新バージョン) の実行記録に ODPS-0420095: Access Denied - Authorization Failed [4019], You have NO privilege 'odps:Describe' on {acs:odps:*:projects/****/tables/****}. Context ID:111111-1111-11111-1111-1111111. --->Tips: Pricipal:INVALID$v4_111111111 というエラーが表示された場合、RAM ロールが MaxCompute ワークスペースのメンバーとして追加された際に、必要な権限が不足していることを示します。この問題を解決するには、RAM ロールに必要な権限を再度付与してください。詳細については、「デフォルトロールに MaxCompute へのデータ書き込みを承認する (同一アカウント内のデータ転送)」または「カスタムロールに MaxCompute へのデータ書き込みを承認する (同一アカウント内のデータ転送)」をご参照ください。
FAILED: mismatched input エラー
RAM ユーザーが RAM ロールを MaxCompute ワークスペースのメンバーとして追加する際に FAILED: mismatched input エラーが発生した場合、お使いのアカウントに ADD USER などのステートメントを実行する権限がないことを示します。この問題を解決するには、Alibaba Cloud アカウントまたは以下のポリシーを持つ RAM ユーザーを使用して ADD USER などのステートメントを実行してください。この一度限りの操作の後、RAM ユーザーを使用して ADD USER のようなステートメントを実行しても、このエラーは発生しなくなります。
{
"Version": "1",
"Statement": [
{
"Action": "ram:CreateServiceLinkedRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"ram:ServiceName": "usermgmt.odps.aliyuncs.com"
}
}
}
]
}
ユーザー権限の不足
現在のユーザーが RAM ロールを MaxCompute ワークスペースのメンバーとして追加する際に FAILED: ODPS-0130013:Authorization exception - Authorization Failed [4003], You have NO privilege to do the PROJECT SECURITY OPERATION for {acs:odps:*:projects/****/authorization/users}. Context ID:1111-11111-1111-1111-11111. エラーが発生した場合、そのユーザーに MaxCompute でのプロジェクトセキュリティ操作に必要な権限がないことを示します。この問題を解決するには、ユーザーに管理者ロールを割り当ててください。詳細については、「MaxCompute と DataWorks の権限関係」をご参照ください。
以下の手順に従って、ユーザーに管理者ロールを割り当ててください。
-
MaxCompute コンソールにログインしてください。
-
ページの左上隅で、リージョンを選択してください。
-
プロジェクト管理 ページで、対象のプロジェクトを見つけ、管理 列の [管理] をクリックしてください。
-
ロールの権限 タブをクリックしてください。
-
管理者ロールを見つけ、メンバー管理 列の [メンバーの管理] をクリックしてください。
-
メンバー管理 パネルで、[追加するアカウント名] フィールドにアカウント名を入力してください。
-
メンバー管理 ダイアログボックスで、OK をクリックします。対象のアカウントを選択し、右矢印 (>) をクリックして 追加済みアカウント リストに移動させ、OK をクリックします。
「SlotExceeded」および「io: read/write on closed pipe」エラー
MaxCompute データ転送タスク (新バージョン) のタスク実行記録に以下のいずれかのエラーが表示された場合、現在のデータ転送の同時実行数が MaxCompute のスロットクォータを超えている可能性があります。
SlotExceeded: Your slot quota is exceeded. Region: cn-shanghai Project: xxx Slot Quota Exceeded. Total: xxx, Acquired: xxx
maxcompute error ClientError: io: read/write on closed pipe
この問題の発生確率を減らすには、パーティション分割フィールドとして __receive_time__ を使用してください。このフィールドはサーバー側の受信時刻に基づいています。同じ受信時間枠内のログは同じパーティションに書き込まれるため、複数のパーティションへの同時書き込みを回避し、スロットの消費を削減できます。パーティション分割フィールドは、MaxCompute データ転送タスク (新バージョン) を作成する際に変更できます。
ログ時間によるパーティション分割
MaxCompute データ転送タスク (新バージョン) を作成する際に、MaxComputeパーティション列 を [__partition_time__] に設定して、ログ時間でデータをパーティション分割できます。[MaxCompute パーティションキー列] の設定では、__partition_time__ と __receive_time__ は、それぞれログ時間と受信時間から計算されるシステム定義のパーティションフィールドです。プラスアイコン (+) をクリックしてカスタムパーティションキー列を追加し、http_method や operation など、Simple Log Service (SLS) の既存フィールドにマッピングすることもできます。
__partition_time__ フィールドは、SLS の __time__ フィールドの値に基づいて計算されます。指定されたタイムゾーンとパーティション時間形式に基づいて時間文字列が生成されます。MaxCompute の単一テーブルのパーティション制限を超えないようにするため、MaxCompute は日付ベースのパーティションキー列の値を 1,800 秒 (30 分) 間隔に揃えます。詳細については、「__partition_time__ フィールド」をご参照ください。
MaxCompute のパーティション列: __partition_time__ と __receive_time__
__partition_time__ はログ時間に基づいています。__partition_time__ の値は、ログの __time__ フィールドから計算されます。__time__ はログから取得されるため、ターゲットパーティションは収集の遅延やクライアントクロックスキューの影響を受ける可能性があります。
|
シナリオ |
受信時刻 |
ターゲットパーティション |
原因 |
|
通常のログ A |
10:00 |
|
ログ時刻が受信時刻と同じです。 |
|
遅延したログ B |
10:00 |
|
ログ時刻が受信時刻より早いです。 |
|
クロックスキューのあるクライアントからのログ C |
10:00 |
|
ログ時刻が受信時刻より遅いです。 |
同じ受信時間枠内のログが複数のパーティションに分散されると、以下の問題が発生する可能性があります。
-
履歴パーティションが遅延到着データを継続的に受信するため、パーティションが完了したかどうかを判断するのが困難になります。
-
クライアントのタイムスタンプが異常なログが未来のパーティション範囲に書き込まれるため、未来のパーティションが予期せず早く出現する可能性があります。
-
パーティションの境界が不明確になり、データライフサイクル管理がより複雑になるため、下流のタスクスケジューリングが難しくなります。
__receive_time__ はサーバー側の受信時刻に基づいています。SLS はログを受信する際にこのフィールドを書き込むため、その値は収集の遅延、クライアントクロックスキュー、またはログ時間の解析例外の影響を受けません。上記の例では、3 つのログはすべて 10:00 に受信され、p=10:00 に書き込まれます。
__receive_time__ を使用すると、以下の利点があります。
-
同じ受信時間枠内のログは同じパーティションに書き込まれ、パーティションの境界は明確なままです。
-
パーティションの進行状況が実際のデータ転送の進行状況と一致するため、パーティションの完了性を判断しやすくなります。
-
履歴パーティションが繰り返しバックフィルされる可能性が低いため、下流のタスクスケジューリングがより予測可能になります。
__receive_time__ をパーティション分割フィールドとして使用することを推奨します。リアルタイムデータシナリオでは、__partition_time__ と __receive_time__ には通常、大きな違いはありません。データ遅延やクライアントクロックスキューがある本番環境では、__receive_time__ を使用することで、より安定したパーティション分割動作を実現できます。
MaxCompute テーブルパーティションの表示
show partitions <table-name>; コマンドを実行して、テーブルのパーティションを表示できます。このコマンドでは、 <table-name> をお使いのテーブル名に置き換えてください。
ログ時間データの転送
MaxCompute データ転送タスク (新バージョン) を作成する際に、[MaxCompute 共通列] セクションに MaxCompute通常列 フィールドを追加できます。[__time__] フィールドは、秒単位の UNIX タイムスタンプ形式のログ時間を表します。
たとえば、[__time__] フィールドを、お使いの MaxCompute テーブルの c14 のような宛先列にマッピングできます。
Null のフィールド値
この問題は通常、データ型の不一致、型変換の失敗、またはソースログのフィールド欠落が原因で発生します。
-
データ型の不一致または変換の失敗に対処するには、「ダーティデータの処理」をご参照ください。
-
データ型形式の要件については、「安定性と制限」をご参照ください。
IP ホワイトリスト有効化後のタスク失敗
MaxCompute プロジェクトで IP アドレスホワイトリスト (たとえば、クラシックネットワークの IP アドレスホワイトリスト) を有効にすると、データ転送タスクが失敗し、次のようなエラーメッセージが表示されることがあります。
error:RequestId=202211181752058538dc0b0018****, ErrorCode=NoPermission, ErrorMessage=Access denied by project ip white list: sourceIP:'192.168.x.x' is not in white list. project: slstest-1 from:
errorType:odps.OdpsError
jobId:****-****
IP アドレスホワイトリストが原因で発生した失敗を解決するには、MaxCompute で以下のコマンドを実行してください。
-
MaxCompute コンソール にログインしてください。
-
ページの左上隅で、プロジェクトのあるリージョンを選択してください。
-
MaxCompute の左側メニューで、 を選択してください。
-
DataWorks で、以下の手順を実行してください。DataWorks の使用方法の詳細については、「上級:ベストセラー製品カテゴリの分析」をご参照ください。
-
現在の IP アドレスホワイトリストの設定を照会してください。
setproject; select 1; -
次のコマンドを使用して、サービスホワイトリストを更新します。このコマンドは既存の値を上書きするため、既存のサービスを保持したい場合は、カンマ区切りでリストに含める必要があります。
setproject odps.security.ip.whitelist.services=AliyunLogSLRService,AliyunLogDefaultService; -
設定が完了したら、次のコマンドを実行して新しいホワイトリストの設定を確認してください。
setproject; select 1;setprojectコマンドを実行すると、システムはプロジェクトの設定プロパティを返します。odps.security.ip.whitelist.servicesとodps.security.outbound.destinationプロパティの値を確認してください。odps.output.field.formatter= odps.project.longtimetmpfile.max.remain.days=30 odps.project.longtimetmpfile.min.remain.days=3 odps.project.maintenance.alarm={"storage.warning.ratio":"85","storage.warning.receiver":"","storage.critical.receiver":"","storage.critical.ratio":"95"} odps.project.maintenance.window= odps.schema.evolution.enable=false odps.schema.model.enabled=false odps.security.enabledownloadprivilege=false odps.security.ip.whitelist= odps.security.ip.whitelist.services=AliyunLogSLRService,AliyunLogDefaultService odps.security.outbound.destination= odps.security.vpc.whitelist= odps.session.flag.authority=false odps.spark.kube.mode=false odps.sql.acid.table.enable=true odps.sql.allow.cartesian=false odps.sql.allow.fullscan=false odps.sql.auto.mv.quota.gb=-1 odps.sql.cfile2.field.maxsize=8192
-