すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:MapReduce のよくある質問

最終更新日:Aug 22, 2026

このトピックでは、MapReduce の使用に関するよくある質問 (FAQ) について説明します。

カテゴリ

よくある質問

機能に関する問い合わせ

MapReduce の開発

一般的なエラー

ビューを MapReduce の入力ソースとして使用できますか?

いいえ、できません。テーブルである必要があります。

MapReduce が結果をテーブルまたはパーティションに書き込む際、データは上書きされますか、それとも追加されますか?

テーブルまたはパーティション内の既存データが上書きされます。

MapReduce でシェルファイルを呼び出すことはできますか?

いいえ、できません。この操作は Java サンドボックスによって制限されています。詳細については、「Java サンドボックス」をご参照ください。

reduce.setup で入力テーブルからデータを読み取ることはできますか?

キャッシュテーブルからは読み取れますが、入力テーブルからは読み取れません。

マッパーは同じテーブルの複数パーティションからの入力をサポートしていますか?

マッパーは、単一テーブル内の複数パーティションからの入力をサポートしています。各パーティションは独立したテーブルとして扱うことができます。

マッパーは Record からパーティションのフィールド情報を直接読み取ることができますか?

マッパーは Record からパーティションのフィールド情報を取得できません。ただし、次のコードを使用できます。PartitionSpec はパーティション情報を提供します。

PartitionSpec ps = context.getInputTableInfo().getPartitionSpec();
String area = ps.get("area");        

ラベルとパーティションの関係は何ですか?

ラベルは、異なる出力に適用されるタグです。出力のソースを識別するのに役立ちます。

MapReduce ジョブに Map 関数のみを含めることはできますか?

はい、可能です。MapReduce は Map のみのジョブをサポートしています。Map のみのジョブでは、job.setNumReduceTasks(0) を使用して Reducer の数を明示的に 0 に設定する必要があります。

マッパーの入力テーブルの各レコードを、列名で読み取ることはできますか?

はい、できます。入力テーブルの各レコードは、record.get(i) のような順序番号、または record.get("size") のような列名で読み取ることができます。

write(Record key, Record value)write(Record record)の違い

  • write(Record key, Record value) は、key.set("id", v1),value.set("size", v2) などの中間結果を出力します。 Map 関数によって生成された中間結果は、ネットワーク経由で Reduce 関数に送信されます。 型推論に関連付けられたテーブルがないため、シリアル化のためにフィールドの型を宣言する必要があります。 出力フィールドの型は MaxCompute データ型です。

    job.setMapOutputKeySchema(SchemaUtils.fromString("id:string"));  
    job.setMapOutputValueSchema(SchemaUtils.fromString("size:bigint"));               
  • write(Record record): 結果をシンクテーブルに出力します。型推論のためにテーブルが関連付けられているため、フィールドの型を宣言する必要はありません。

MaxCompute MapReduce で、Libjars とクラスパスという 2 つの JAR を指定する必要があるのはなぜですか?

ローカルクライアントはジョブ設定やその他のリモート実行を伴う操作を実行します。したがって、1 つの Executor がローカルクライアントで実行され、もう 1 つがリモートサーバーで実行されます。

リモートエグゼキューターが読み込むリモートのクラスパスは -libjars mapreduce-examples.jar です。ローカルエグゼキューターはローカルのクラスパスを読み込むため、-classpath lib/mapreduce-examples.jar も指定する必要があります。

Hadoop MapReduce のソースコードを MaxCompute MapReduce で直接使用できますか?

いいえ、できません。MaxCompute MapReduce API は Hadoop MapReduce API とは異なりますが、プログラミングスタイルは似ています。Hadoop のソースコードを変更し、MaxCompute MapReduce SDK でコンパイルしてから、MaxCompute でコードを実行する必要があります。

MapReduce でソートを実装するにはどうすればよいですか?

ソートには次のコードを使用できます。

// ソート列を設定します。この例では、データは i1 と i2 フィールドでソートされます。
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// 列のソート順を設定します。この例では、i1 は昇順、i2 は降順でソートされます。
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC });        

以下に setOutputKeySortOrder メソッドの使用方法を示します。

public void setOutputKeySortOrder(JobConf.SortOrder[] order)
機能:キー列のソート順を設定します。
パラメーター:order は列のソート順を指定します。有効な値は ASC (昇順) と DESC (降順) です。       

MapReduce における Backups とは何ですか?

Backups はパフォーマンスチューニング機能です。MaxCompute はタスクを監視します。タスクのワークロードが重い場合、MaxCompute はそのタスクのバックアップジョブを開始します。2 つのジョブは同じデータを処理し、最初に完了したジョブの結果が使用されます。この機能は Backups と呼ばれます。ただし、タスクが非常に大きい場合、元のタスクもバックアップジョブも完了できないため、Backups は効果的でない可能性があります。

MapReduce ジョブを開発する際、コマンドラインで複数のリソースを渡すにはどうすればよいですか?

リソースはカンマ (,) で区切ることができます。たとえば、 jar -resource resource1,resource2,.. のように指定します。

main メソッドでテーブルが空かどうかを判断するにはどうすればよいですか?

テーブルが空かどうかを判断するには、次のコードを使用できます。

Odps odps=SessionState.get().getOdps();
Table table=odps.tables().get('tableName');
RecordReader recordReader=table.read(1);
if(recordReader.read()==null){
// TODO      

MaxCompute MapReduce で、ログ出力用の Java コードを設定するにはどうすればよいですか?

以下のいずれかの方法を使用できます。

  • コード内でログを出力するには、System.out.println を使用します。ログは Logview の stdout に出力されます。

  • 例外が発生すると、クライアントは例外メッセージを返します。ログ情報を出力する必要はありません。

  • 共通のロギングを使用します。ログは stderr に出力され、Logview で表示できます。

2 回の MapReduce 計算後、シンクテーブルに重複データは保持されますか?

はい、保持されます。データをクエリすると、同一のレコードが 2 つ取得されます。

Hadoop では、分散処理用に複数のノードを選択できます。MaxCompute MapReduce で分散処理用のノードを設定するにはどうすればよいですか?

ノードを自分で構築して割り当てる必要はありません。これは MaxCompute の利点の 1 つです。

MapReduce ジョブを実行すると、MaxCompute の基盤システムがアルゴリズムに基づいて使用するデータパーティションを決定します。

コンバイナなしでは出力は正常ですが、コンバイナを使用すると Reduce 関数が入力を受け取らないのはなぜですか?

この問題は、Reduce 関数によって出力される単一レコードが、Map 関数によって出力されるキーと値のペアと一致しないことが原因で発生します。

MapOnly ジョブで、プログラムが出力テーブルのスキーマ形式を指定しないのはなぜですか?

出力テーブルのスキーマは、事前に作成し、create table ステートメントを実行するときに指定する必要があります。MapOnly プログラムは、スキーマを指定する必要はなく、データを直接出力できます。

ローカルで MaxCompute サーバーを呼び出して MapReduce ジョブを実行するにはどうすればよいですか?

通常、コマンドラインインターフェイスで jar コマンドを実行することで、MaxCompute JAR パッケージを実行できます。詳細については、「MapReduce ジョブをサブミットする」をご参照ください。

パッケージをプロジェクトに統合して、プログラムからジョブを実行することもできます。手順は次のとおりです:

  1. パッケージの依存関係を設定します。

    基本的な SDK に加えて、他の依存パッケージが必要です。これらはクライアントツールの lib フォルダーにあります。lib フォルダーには SDK JAR パッケージも含まれています。最新のクライアントツールの lib フォルダーからすべての JAR パッケージをインポートすることを推奨します。

  2. JAR パッケージをアップロードします。

    ローカルテストに合格した MapReduce プログラムを JAR ファイルにパッケージ化してアップロードします。たとえば、JAR ファイルの名前が mr.jar であるとします。詳細については、「リソース操作」をご参照ください。

  3. 実行モードを設定します。

    JobConf を設定します。以下に設定例を示します:

    // MaxCompute への接続情報を設定します。
    Account account = new AliyunAccount(accessid, accesskey);
    Odps odps = new Odps(account);
    odps.setEndpoint(endpoint);
    odps.setDefaultProject(project);
    // セッションを取得します。
    SessionState ss = SessionState.get();
    ss.setOdps(odps);
    ss.setLocalRun(false);  // サーバーでジョブを実行するには、値を false に設定します。ローカルでジョブをデバッグするには、値を true に設定します。
    // JobConf を設定するコード。
    Job job = new Job();
    String resource = "mr.jar";
    job.setResources(resource); // この手順は 'jar -resources mr.jar' コマンドと同様です。
    // 以下のコードは、標準的な MapReduce のルールに従います。
    job.setMapperClass(XXXMapper.class);
    job.setReducerClass(XXXReducer.class);                            

    設定が完了したら、MapReduce ジョブを直接実行できます。

MaxCompute MapReduce ジョブ実行時の BufferOverflowException エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    FAILED: ODPS-0123131:User defined function exception - Traceback:
         java.nio.BufferOverflowException
         at java.nio.DirectByteBuffer.put(Unknown Source)
         at com.aliyun.odps.udf.impl.batch.TextBinary.put(TextBinary.java:35)   
  • 原因:

    一度に書き込まれるデータ量が大きすぎるため、バッファオーバーフローが発生します。

  • 解決策:

    MaxCompute で単一フィールドに書き込めるデータ型には、以下の制限があります。

    String      8 MB
    Bigint      -9223372036854775807 to 9223372036854775807
    Boolean     True/False
    Double      -1.0E+308 to 1.0E+308
    Date        0001-01-01 00:00:00 to 9999-12-31 23:59:59                  

MaxCompute MapReduce ジョブ実行時の "Resource not found" エラーの解決方法

ジョブをサブミットする際は、-resources パラメーターを使用して、必要なリソースを指定します。複数のリソースは、コンマ (,) で区切ることができます。

MaxCompute MapReduce ジョブ実行時の "Class Not Found" エラーの解決方法

MapReduce ジョブの実行時に、以下の 2 つの状況でこのエラーが発生します。

  • classpath パラメーターのクラス名は正しくありません。完全なパッケージ名を指定する必要があります。

  • JAR のパッケージ化に誤りがある場合。パッケージ化時に SRC ディレクトリ内のすべてのソースコードを選択してください。

MaxCompute MapReduce ジョブ実行時の ODPS-0010000 エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    ODPS-0010000: System internal error - get input pangu dir meta fail.
  • 原因:

    このエラーは、パーティションが作成される前、またはそのデータの準備が整う前にパーティションを使用しようとしたために発生します。

  • 解決策:

    MapReduce ジョブを実行する前に、パーティションを作成する必要があります。

MaxCompute MapReduce ジョブ実行時の "Table not found" エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    Exception in thread "main" com.aliyun.odps.OdpsException: Table not found: project_name.table_name.
  • 原因:

    宛先プロジェクトが正しくないか、宛先テーブルが存在しません。

  • 解決策:

    MapReduce インターフェイスの Table Info Builder には、ProjectName と TableName が必要です。これら 2 つのパラメーターを正しいプロジェクト名とテーブル名に設定してください。

MaxCompute MapReduce ジョブ実行時の ODPS-0123144 エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    FAILED: ODPS-0123144: Fuxi job failed - WorkerRestar
  • 原因:

    このエラーは、クラスター内のセカンダリノードが計算中にタイムアウトしたために発生します。プライマリノードはセカンダリノードが故障したとみなし、エラーを報告します。タイムアウト期間は 10 分であり、ユーザーが設定することはできません。

  • 解決策:

    このエラーの一般的な原因は、Reduce 関数内の大きなループです。これは、ロングテールデータまたはデカルト積によって引き起こされる可能性があります。このような大きなループを最小限に抑えてください。

MaxCompute MapReduce ジョブ実行時の java.security.AccessControlException エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.ExceptionInInitializerError
     ...
    Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getProtectionDomain")
      at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)       
  • 原因:

    このエラーは、コードがサンドボックスの制限に違反しているために発生します。詳細については、「Java サンドボックス」をご参照ください。

  • 解決策:

    このエラーを解決するには、外部リソースにアクセスする必要があります。ただし、MaxCompute は現在この操作をサポートしていません。外部の処理ロジックと関連データを MaxCompute に保存してアクセスする必要があります。設定ファイルを読み取るには、「リソースファイルの使用」をご参照ください。

MaxCompute MapReduce ジョブ実行時の java.io.IOException エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    Exception in thread "main" java.io.IOException: ODPS-0740001: Too many local-run maps: 101, must be <= 100(specified by local-run parameter 'odps.mapred.local.map.max.tasks')     
  • 原因:

    local-run maps のデフォルト値は 100 で、調整する必要があります。

  • 解決策:

    -Dodps.mapred.local.map.max.tasks=200 設定を追加できます。

MaxCompute MapReduce ジョブ実行時の "Exceed maximum read times" エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    ODPS-0730001: Exceed maximum read times per resource       
  • 原因:

    リソースファイルが読み取られた回数が多すぎることが原因です。

  • 解決策:

    リソースを読み取るコードロジックを確認してください。通常、リソースは setup フェーズで 1 回だけ読み取るようにしてください。Map または Reduce フェーズでリソースを複数回読み取らないでください。

Reduce 関数が開始される前のメモリ不足エラーの解決方法

  • 原因:

    一部のデータが大きすぎて、メモリにロードされる際にオーバーフローが発生することが原因です。

  • 解決策:

    Combiner を削除したり、Combiner 内のサイズを制限したりするには、set odps.mapred.map.min.split.size=512; を使用できます。

MaxCompute MapReduce ジョブ実行時のメモリ不足エラーの解決方法

メモリ不足エラーは、通常、メモリ不足が原因で発生します。この問題は、odps.stage.mapper.jvm.mem や odps.stage.reducer.jvm.mem などの JVM メモリパラメーターを調整することで解決できます。たとえば、set odps.stage.mapper.jvm.mem = 2048 コマンドを実行して、メモリを 2 GB に設定できます。

小さな設定ファイルのロードに 600 個のレデューサーが起動する MapReduce ジョブで、java.lang.OutOfMemoryError が発生します。解決するにはどうすればよいですか?

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    java.lang.OutOfMemoryError: Java ヒープ領域
  • 原因:

    この問題は、MapReduce の使用制限が原因です。詳細については、「制限」をご参照ください。

  • 解決策:

    ネイティブ SDK の概要」の説明に従って設定を行ってください。

MaxCompute MapReduce ジョブ実行時の ODPS-0420095 エラーの解決方法

  • 症状:

    MaxCompute MapReduce ジョブを実行すると、次のエラーが返されます。

    Exception in thread "main" java.io.IOException: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - The task is not in release range: LOT
  • 原因:

    プロジェクトは MaxCompute Developer Edition のリソースを使用しています。このエディションは、MaxCompute SQL (UDF を含む) および PyODPS ジョブのみをサポートしています。MapReduce や Spark などの他のタスクはサポートしていません。

  • 解決策:

    プロジェクトの仕様をアップグレードするには、「課金方法の切り替え」をご参照ください。

MapReduce でのリソース使用時の "Too many open files" エラーの解決方法

  • 症状:

    MapReduce でリソースを使用すると、次のエラーが返されます。

     Caused by: com.aliyun.odps.OdpsException: java.io.FileNotFoundException: temp/mr_XXXXXX/resource/meta.user.group.config (Too many open files)
  • 原因:

    単一のジョブで参照できるリソースは 256 個までです。それを超えるとエラーが発生します。テーブルリソースとアーカイブリソースは、それぞれ 1 つの単位としてカウントされます。制限の詳細については、「制限」をご参照ください。

  • 解決策:

    参照するリソースの数を調整してください。

サードパーティクラスを使用した MapReduce プログラム実行時の "class not found" エラーの解決方法

MaxCompute MapReduce ジョブが分散環境で実行される場合、Java サンドボックスの制限対象となります。MapReduce ジョブのメインプログラムは、これらの制限の対象ではありません。制限の詳細については、「Java サンドボックス」をご参照ください。

JSON を処理するだけの場合は、Gson を直接使用してください。Gson クラスをパッケージ化する必要はありません。Java オープンソースコンポーネントは、SimpleDateFormat など、文字列を日付に変換する多くのメソッドを提供します。

MaxCompute でのオープンソース互換 MapReduce ジョブ実行時の "index out of bounds" エラーの解決方法

MaxCompute MapReduce インターフェイスを使用してコードを記述することを推奨します。また、必要でない限り、MapReduce ではなく Spark を使用することを推奨します。