このページでは、MaxCompute SDK for Java に関する代表的な質問とその回答を紹介します。
MaxCompute SDK for Java パッケージのダウンロード方法
Maven から SDK パッケージをダウンロードします。たとえば、MapReduce SDK for Java を取得する場合は、Maven Central で odps-sdk-mapred を検索し、バージョン タブに移動して、目的のバージョン横にあるダウンロードアイコンをクリックします。
利用可能なパッケージの完全な一覧については、「Java SDK」をご参照ください。
MaxCompute SDK for Java を使用した SQL フラグの設定方法
DataWorks コンソールまたは MaxCompute クライアント (odpscmd) でフラグを設定する方法(たとえば、ステートメントの前に set odps.sql.type.system.odps2=true; を追加)は、SDK 経由で SQL を送信する際には機能しません。代わりに、SQLTask.setProperty() を使用します。
// SQLTask オブジェクトを作成
SQLTask task = new SQLTask();
task.setName("foobar");
task.setQuery("select ...");
// フラグマップを構築
Map<String, String> settings = new HashMap<>();
settings.put("odps.sql.type.system.odps2", "true");
// 必要に応じて他のフラグも追加
// 重要な手順:マップを JSON 文字列としてシリアル化し、タスクに設定
task.setProperty("settings", new JSONObject(settings).toString());
// タスクを送信
Instance instance = odps.instances().create(task);LogView を使用した Java SDK エラーのトラブルシューティング方法
LogView インターフェイスの generateLogView メソッドを使用します。
Instance i = SQLTask.run(odps, sql);
String logview = odps.logview().generateLogView(i, 7 * 24);返された URL をブラウザで開き、ジョブの実行詳細を確認してエラーの原因を特定します。
Java 業務コードからの SQL ジョブ実行方法
Java コード内で MaxCompute SDK for Java を直接呼び出します。セットアップ手順およびコード例については、「Java SDK」をご参照ください。
SQLTask クエリから 10,000 件を超えるレコードを取得する方法
SQLTask では結果が最大 10,000 件に制限されます。完全なデータセットを取得するには、クエリ結果を MaxCompute テーブルに書き込み、その後 Tunnel 詳細については、「SQL 結果のエクスポート方法」をご参照ください。 コマンドを使用してテーブルをダウンロードします。
SQLTask の結果セット制限について
SQLTask.getResult() を呼び出すと、結果セットは 10,000 件 で制限されます。
Instance instance = SQLTask.run(odps, "SQL ステートメント");
instance.waitForSuccess();
List<Record> records = SQLTask.getResult(instance);より大規模なデータセットの場合には、代わりに Tunnel SDK を使用してデータをエクスポートしてください。
SQLTask と DownloadSession の違い
| SQLTask | DownloadSession | |
|---|---|---|
| 目的 | SQL ステートメントを実行し、結果を返す | 既存のテーブルからデータをダウンロードする |
| 結果件数制限 | デフォルトで 10,000 件 | 上限なし |
結果がメモリに収まる範囲でのアドホッククエリには SQLTask を使用します。テーブル全体または大規模なデータセットのエクスポートが必要な場合には DownloadSession を使用します。
MaxCompute SDK for Java 使用時のジョブ実行時間の長さを解消する方法
主に以下の 2 つの原因が考えられます。
インスタンスの LogView URL が取得できない
instance.waitForSuccess() を呼び出した後、ジョブが完了するまで呼び出し元がブロックされます。ジョブの実行が遅い場合、その原因を把握できません。すべてのインスタンスについて LogView URL を取得することで、リアルタイムでジョブの状況を確認できます。
Instance i = SQLTask.run(odps, sql);
String logview = odps.logview().generateLogView(i, 7 * 24);
System.out.println("LogView: " + logview);
i.waitForSuccess();あるいは、MaxCompute クライアント (odpscmd) で WAIT <instance_id> コマンドを実行して、実行中のインスタンスの LogView URL を取得することもできます。詳細については、「インスタンスの LogView」をご参照ください。
RestClient のリトライが失敗している(エラーが非表示)
テーブルアクセス操作によって RestClient のリトライが繰り返される場合、リトライログを取得しない限り根本原因が隠されたままになります。各リトライ試行をログ出力するため、RetryLogger 抽象クラスを実装します。実装方法の詳細については、「エラーログの返却」をご参照ください。
java.lang.ClassNotFoundException の対処方法
このエラーは、通常、ローカル環境で依存関係が不足しているか、重複していることを意味します。プロジェクトの構成を確認してください。
すべての必須依存関係が正しく宣言・解決されていることを確認します。
重複するパッケージのインポートを削除します。
MaxCompute で MapReduce ジョブを実行中にこのエラーが発生した場合は、-resources パラメーターを使用して必要な依存関係が含まれているかを確認してください。
OpenJDK 64-Bit Server VM warning: Insufficient space for shared memory の対処方法
JVM の一時ファイルを格納するために使用されるディレクトリの空き容量が不足しています。df コマンドを実行して該当ディレクトリの空き容量を確認し、十分な空き領域を確保してください。