このトピックでは、MaxCompute MapReduceに関するよくある質問に対する回答を提供します。
MaxComputeでMapReduceジョブの入力ソースとしてビューを使用できますか。
いいえ、MaxComputeでMapReduceジョブの入力ソースとして使用できるのはテーブルのみです。
MapReduceジョブの結果はどのモードでテーブルまたはパーティションに書き込まれますか?
MapReduceジョブの結果は、上書きモードでテーブルまたはパーティションに書き込まれます。
シェルファイルを呼び出してMapReduceジョブを実行できますか?
いいえ、Javaサンドボックスの制限により、シェルファイルを呼び出してMapReduceジョブを実行することはできません。 Javaサンドボックスの制限の詳細については、「Javaサンドボックス」をご参照ください。
リデューサーのセットアップメソッドを呼び出して、入力テーブルからデータを読み取ることはできますか?
いいえ、リデューサーのセットアップメソッドを呼び出して入力テーブルからデータを読み取ることはできません。 ただし、リデューサーのセットアップメソッドを呼び出して、キャッシュされたテーブルからデータを読み取ることができます。
マッパーは、テーブルの複数のパーティションからのデータを入力としてサポートしますか?
マッパーは、テーブルの複数のパーティションからのデータを入力としてサポートします。 同じテーブルのパーティションは、別々のテーブルと見なされます。
マッパーはデータレコードからパーティションフィールドを読み取ることができますか?
マッパーはデータレコードからパーティションフィールドを読み取ることができません。 次のコードを使用して、パーティションフィールドを取得できます。 コードでは、PartitionSpecはパーティション情報を指定します。
PartitionSpec ps = context.getInputTableInfo().getPartitionSpec();
String area = ps.get("area"); ラベルとパーティションの関係は何ですか?
ラベルは、出力データが書き込まれるパーティションを識別するために使用されます。
MaxCompute MapReduceはマップのみのジョブをサポートしていますか。
はい、MaxCompute MapReduceはマップのみのジョブをサポートしています。 MaxCompute MapReduceでマップのみのジョブを実行する場合は、job.setNumReduceTasks(0) を使用してレデューサーの数を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)などの中間結果を生成するために使用されます。 マッパーによって生成される中間結果は、ネットワーク接続を使用してリデューサーに送信する必要があります。 フィールドのデータタイプを推論するための関連テーブルは提供されない。 したがって、フィールドのデータ型はシリアル化のために宣言する必要があります。 フィールドのデータ型は、MaxComputeでサポートされているデータ型である必要があります。job.setMapOutputKeySchema(SchemaUtils.fromString("id:string")); job.setMapOutputValueSchema(SchemaUtils.fromString("size:bigint"));write(Record record)を使用して、最終結果を出力テーブルに書き込みます。 関連するテーブルは、フィールドのデータ型を推測するために提供される。 したがって、フィールドのデータ型を宣言する必要はありません。
-libjarsパラメーターと-classpathパラメーターの両方を使用して、MaxCompute MapReduceでMapReduceプログラムのJARパッケージを指定する必要があるのはなぜですか。
ローカルクライアントは、ジョブ設定などのリモート実行を伴う操作を実行します。 したがって、ローカルエグゼキュータとリモートエグゼキュータの2つのエグゼキュータが使用されます。
リモートエグゼキュータは、-libjarsパラメーター (-libjars mapreduce-examples.jarなど) で指定されたパッケージを読み込みます。 ローカルのエグゼキュータは、-classpath lib/mapreduce-examples.jarなどの-classpathパラメーターで指定されたパッケージを読み込みます。
MaxCompute MapReduceでHadoop MapReduceのソースコードを直接使用できますか?
いいえ。MaxCompute MapReduceでHadoop MapReduceのソースコードを直接使用することはできません。 MaxCompute MapReduceが提供するAPIは、Hadoop MapReduceが提供するAPIとは異なりますが、全体的なスタイルは似ています。 MaxCompute MapReduceでHadoop MapReduceのソースコードを実行する場合は、MaxCompute MapReduce SDKを使用してHadoop MapReduceのソースコードを変更し、コードをコンパイルする必要があります。
MaxCompute MapReduceを使用してデータをソートする方法を教えてください。
次のサンプルコードは、MaxCompute MapReduceを使用してデータをソートする方法を示しています。
// Specify the fields whose values you want to sort. In this example, the fields are i1 and i2.
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// Specify how to sort the values of the two fields. In this example, the values of the i1 field are sorted in ascending order, and the values of the i2 field are sorted in descending order.
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC }); 次のサンプルコードは、setOutputKeySortOrderメソッドの使用方法を示しています。
public void setOutputKeySortOrder(JobConf.SortOrder[] order)
Description: The setOutputKeySortOrder method is used to specify the order in which the values of the key column are sorted.
Parameter: The order parameter specifies the order in which the values of the key column are sorted. Valid values: ASC and DESC. ASC indicates the ascending order, and DESC indicates the descending order. MapReduceジョブのバックアップの目的は何ですか?
バックアップは、MapReduceジョブのデータ処理を高速化するために使用されます。 MaxComputeは、MapReduceジョブのステータスを検出します。 MapReduceジョブが大量のデータを処理する必要がある場合、MaxComputeはジョブのバックアップジョブを作成します。 2つのジョブは、同じデータを処理するために並行して実行される。 最初に完了したジョブの結果が使用されます。 ジョブが過度に大量のデータを処理する必要がある場合、元のジョブとそのバックアップジョブが指定された期間内に完了しない可能性があるため、バックアップは期待どおりに機能しません。
MapReduceプログラムを開発するときに、MaxComputeクライアントで複数のリソースを渡すにはどうすればよいですか。
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){
//TO DO MaxComputeでMapReduceジョブのログを生成する方法を教えてください。
MaxComputeでMapReduceジョブのログを生成するには、次のいずれかの方法を使用することを推奨します。
コードで
System.out.printlnを使用して、MaxComputeでMapReduceジョブのログを生成します。 ログはLogviewのstdoutにエクスポートされます。MapReduceジョブの実行時にエラーが発生した場合、MaxComputeクライアントはエラー情報を返します。 ログを生成しなくても、エラー情報を表示できます。
一般的なロギングを使用する場合、ログはLogviewのstderrにエクスポートされます。 stderrでログを表示できます。
結果テーブルに2つのMapReduceジョブの重複データが含まれていますか?
はい。結果テーブルには、2つのMapReduceジョブの重複データが含まれています。 結果テーブルからデータをクエリすると、2つの重複レコードが取得されます。
Hadoop MapReduceでは、分散データ処理用に複数のノードを選択できます。 1つのノードは1つのマシンを表す。 MaxCompute MapReduceで分散データ処理を実行するときにノードを設定する方法を教えてください。
Hadoop MapReduceと比較して、MaxCompute MapReduceでノードを設定する必要はありません。
MaxComputeでMapReduceジョブを実行すると、基盤となるMaxComputeコンポーネントによって、アルゴリズムに基づいて使用するシャードが決定されます。
コンバイナを使用しない場合、データ出力は正常です。 コンバイナを使用した後、リデューサに入力データは提供されません。 これはなぜですか。
この問題は、リデューサーによって生成された各レコードを、マッパーによって生成されたキーと値のペアにマッピングできないために発生します。
MaxComputeでマップのみのジョブを実行する場合、出力テーブルのスキーマを指定できません。 これはなぜですか。
テーブルを作成するときに、CREATE tableステートメントで出力テーブルのスキーマを指定する必要があります。 したがって、MaxComputeでマップのみのジョブを実行すると、テーブルスキーマを指定することなく、データが出力テーブルに直接書き込まれます。
ローカルMaxComputeサーバーを呼び出してMapReduceジョブを実行するにはどうすればよいですか?
ほとんどの場合、MapReduceジョブを実行するには、MaxComputeクライアントでjarコマンドを実行する必要があります。 jarコマンドの構文の詳細については、「MapReduceジョブの送信」をご参照ください。
ローカルのMaxComputeサーバーを呼び出して、シミュレートされたMapReduceプログラムのMapReduceジョブを実行するには、次の手順を実行します。
パッケージの依存関係を設定します。
SDKパッケージに加えて、依存関係パッケージが必要です。 依存関係パッケージは、MaxComputeクライアントのlibフォルダーにあります。 libフォルダーには、SDK JARパッケージも含まれています。 JARパッケージをインポートするときは、すべてのJARパッケージを最新バージョンのMaxComputeクライアントのlibフォルダーにインポートすることを推奨します。
MapReduceプログラムのJARパッケージをアップロードします。
ローカルテストに合格したMapReduceプログラムをJARファイルにパッケージ化し、パッケージをアップロードします。 この例では、JARパッケージの名前はmr.jarです。 リソースをアップロードする方法の詳細については、「リソース操作」をご参照ください。
実行モードを指定します。
JobConfを設定します。 次のサンプルコードは、JobConfの設定方法を示しています。
//Configure the connection information of MaxCompute. Account account = new AliyunAccount(accessid, accesskey); Odps odps = new Odps(account); odps.setEndpoint(endpoint); odps.setDefaultProject(project); //Obtain the session. SessionState ss = SessionState.get(); ss.setOdps(odps); ss.setLocalRun(false); //Set LocalRun to false. This value indicates that the MapReduce job runs on the server. If local debugging is required, set LocalRun to true. //Code that includes JobConf configurations Job job = new Job(); String resource = "mr.jar"; job.setResources(resource); **This step is similar to jar -resources mr.jar. //Common MapReduce code job.setMapperClass(XXXMapper.class); job.setReducerClass(XXXReducer.class);JobConfを設定したら、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 8MB Bigint -9223372036854775807 ~ 9223372036854775807 Boolean True/False Double -1.0 10308 ~ 1.0 10308 Date 0001-01-01 00:00:00 ~ 9999-12-31 23:59:59
MaxComputeでMapReduceジョブを実行したときに「Resource not found」というエラーメッセージが表示された場合はどうすればよいですか?
MapReduceジョブを送信するときは、-resourcesパラメーターを設定して、必要なリソースを指定する必要があります。 複数のリソースをコンマ (,) で区切ります。
MaxComputeでMapReduceジョブを実行したときに「Class Not Found」というエラーメッセージが表示された場合はどうすればよいですか?
MaxCompute MapReduceを実行すると、次のいずれかの原因により、「Class Not Found」というエラーメッセージが表示されます。
-classpathパラメーターの値が無効です。 完全なパッケージ名は、-classpathパラメーターで指定する必要があります。srcフォルダ内の不完全なソースコードは、JARファイルにパッケージ化されます。
MaxComputeでMapReduceジョブを実行したときにエラーODPS-0010000が返された場合はどうすればよいですか?
問題の説明
MaxComputeでMapReduceジョブを実行すると、次のエラーメッセージが表示されます。
ODPS-0010000: System internal error - get input pangu dir meta fail.原因
パーティションが作成されないか、パーティションにデータが挿入されません。
解決策
MapReduceジョブを実行する前にパーティションを作成します。
MaxComputeでMapReduceジョブを実行したときに「テーブルが見つかりません」というエラーメッセージが表示された場合はどうすればよいですか?
問題の説明
MaxComputeでMapReduceジョブを実行すると、次のエラーメッセージが表示されます。
Exception in thread "main" com.aliyun.odps.OdpsException: Table not found: project_name.table_name.原因
出力テーブルが格納されているプロジェクトの名前が無効であるか、出力テーブルが存在しません。
解決策
MaxCompute MapReduceのTableInfoビルダーには、ProjectNameとTableNameの2つのパラメーターがあります。 2つのパラメーターを設定して、出力テーブルが格納されているプロジェクトの名前と出力テーブルの名前を指定できます。
MaxComputeでMapReduceジョブを実行したときにエラーODPS-0123144が返された場合はどうすればよいですか?
問題の説明
MaxComputeでMapReduceジョブを実行すると、次のエラーメッセージが表示されます。
FAILED: ODPS-0123144: Fuxi job failed - WorkerRestar原因
クラスターのセカンダリノードでのデータコンピューティングがタイムアウトします。 その結果、1次ノードは、2次ノードに障害があるとみなす。 タイムアウト時間は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')原因
ローカル実行マップのデフォルト値は100であり、調整する必要があります。
解決策
-Dodps.mapred.local.map.max.tasks=200設定を追加できます。
MaxComputeでMapReduceジョブを実行したときに、"Exceed maximum read times per resource" というエラーメッセージが表示された場合はどうすればよいですか?
問題の説明
MaxComputeでMapReduceジョブを実行すると、次のエラーメッセージが表示されます。
ODPS-0730001: Exceed maximum read times per resource原因
リソースファイルの読み込み回数が多すぎます。
解決策
リソースの読み取り方法を示すコードロジックを確認します。 ほとんどの場合、リソースはセットアップメソッドが呼び出されたときに一度だけ読み取られます。 リソースがMapまたはReduceステージで何度も読み取られないようにコードを変更します。
MaxComputeでMapReduceジョブを実行するときに、Reduceステージの前にOOMエラーが発生した場合はどうすればよいですか?
原因
大量のデータがメモリにダウンロードされます。
解決策
コンバイナーを使用したり、使用するコンバイナーの512に
odps.mapred.map.min.split.sizeを設定したりしないでください。
MaxComputeでMapReduceジョブを実行したときにOOMエラーが発生した場合はどうすればよいですか?
この問題は、メモリ不足が原因で発生します。 この問題に対処するには、Java仮想マシン (JVM) パラメーターodps.stage.mapper.jvm.memおよびodps.stage.reducer.jvm.memの値を調整します。 たとえば、odps.stage.mapper.jvm.memを2 GBを示す2048に設定できます。
MaxComputeでMapReduceジョブの小さな構成ファイルを読み込むためにリデューサーを使用しているときに、エラーメッセージ "java.lang.OutOfMemoryError" が表示された場合はどうすれば600か?
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開発者エディションのプロジェクトでは、ユーザー定義関数 (UDF) を呼び出すことができるPyODPSジョブとMaxCompute SQLジョブのみがサポートされています。 MapReduceジョブやSparkジョブなどの他のジョブはサポートされていません。
解決策
プロジェクトの仕様をアップグレードします。 詳細については、「課金方法の切り替え」をご参照ください。
MaxComputeリソースがMapReduceジョブによって参照されているときに多数のエラーが発生した場合はどうすればよいですか。
問題の説明
MaxComputeリソースがMapReduceジョブによって参照されると、次のエラーメッセージが表示されます。
Caused by: com.aliyun.odps.OdpsException: java.io.FileNotFoundException: temp/mr_XXXXXX/resource/meta.user.group.config (Too many open files)原因
1つのジョブで参照されるリソースの数は256を超えることはできません。 それ以外の場合は、エラーが返されます。 各テーブルまたはアーカイブファイルは1つのリソースと見なされます。 1つのジョブで参照されるリソース数の制限の詳細については、「制限」をご参照ください。
解決策
1つのジョブで参照されるリソースの数を調整します。
Mavenアセンブリを使用して、サードパーティのクラスを含むMapReduceプログラムのJARパッケージを作成します。 MapReduceジョブを実行すると、サードパーティのクラスが見つからないことを示すエラーメッセージが表示されます。 どうすればよいですか。
分散環境で実行されるMaxCompute MapReduceは、Javaサンドボックスの制限を受けます。 MapReduceジョブのメインプログラムは制限の対象ではありません。 Javaサンドボックスの制限の詳細については、「Javaサンドボックス」をご参照ください。
JSONデータのみを処理する場合は、Gsonを使用することを推奨します。 この方法では、JARパッケージにGsonクラスを含める必要はありません。 オープンソースのJavaコンポーネントは、SimpleDateFormatなどの文字列を日付値に変換するために使用される複数のクラスを提供します。
MaxComputeでHadoop MapReduceジョブを実行すると、添え字の範囲外のエラーが発生します。 どうすればよいですか。
MaxCompute MapReduceを使用してジョブコードを記述することを推奨します。 また、ジョブコードの記述には、MaxCompute MapReduceではなくMaxComputeでSparkを使用することを推奨します。