このトピックでは、Javaで記述されたMaxComputeユーザー定義関数 (UDF) に関するよくある質問に対する回答を提供します。
クラスまたは依存関係に関連する問題
MaxCompute UDFを呼び出すと、クラスまたは依存関係に関する次の問題が発生する可能性があります。
問題1: エラーメッセージ
ClassNotFoundExceptionまたは[一部の依存関係が見つかりません]が表示されます。原因:
原因1: UDFの作成時に指定されたJARファイルが無効です。
原因2: UDFが依存する1つ以上のJARファイルがMaxComputeにアップロードされていません。 たとえば、必要なサードパーティパッケージはアップロードされません。
原因3: UDFが作成されたMaxComputeプロジェクトでUDFが呼び出されません。 たとえば、MaxCompute UDFは開発プロジェクトで作成され、本番プロジェクトで呼び出されます。
原因4: 必要なファイルが存在しないか、リソースタイプが無効です。 たとえば、アップロードされたファイルのタイプはPYですが、UDFコードの
get_cache_fileで指定されたファイルタイプはfileです。
解決策:
原因1の解決策: JARファイルの内容を確認し、JARファイルに必要なすべてのクラスが含まれていることを確認します。 次に、リソースをJARファイルに再パッケージ化し、そのファイルをMaxComputeプロジェクトにアップロードします。 リソースをファイルにパッケージ化してMaxComputeプロジェクトにアップロードする方法の詳細については、「Javaプログラムのパッケージ化、パッケージのアップロード、MaxCompute UDFの作成」をご参照ください。
原因2の解決策: 必要なサードパーティパッケージをリソースとしてMaxComputeプロジェクトにアップロードします。 次に、UDFの作成時にこのパッケージをリソースリストに追加します。 リソースをアップロードしてUDFを作成する方法の詳細については、「リソースの追加」および「UDFの作成」をご参照ください。
原因3の解決策: MaxComputeクライアントで、MaxCompute UDFが呼び出されるプロジェクトに対して
list functions;コマンドを実行します。 次に、コマンド出力にMaxCompute UDFが表示され、MaxCompute UDFのクラスと必要なリソースが有効であることを確認します。原因4の解決策: MaxComputeクライアントで、
desc関数 <function_name>;コマンドを実行します。 次に、コマンド出力のリソースリストに必要なファイルがすべて表示されていることを確認します。 アップロードされたファイルのタイプがget_cache_fileで指定されたファイルタイプと一致しない場合は、add <file_type> <file_name>;コマンドを実行して必要なファイルを追加します。
問題2: エラーメッセージ
NoClassDefFoundErrorまたはNoSuchMethodErrorが表示されるか、エラーコードがODPS-0123055表示されます。原因:
原因1: アップロードされたJARパッケージに含まれるサードパーティライブラリのバージョンが、MaxComputeの組み込みサードパーティライブラリのバージョンと異なる。
原因2: Javaサンドボックスの使用が制限されています。 詳細情報
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")がジョブインスタンスのStderrに表示されます。 この問題は、Javaサンドボックスの制限によって発生します。 分散モードで実行されるMaxCompute UDFは、Javaサンドボックスによって制限されます。 Javaサンドボックスの制限の詳細については、「Javaサンドボックス」をご参照ください。
解決策:
原因1の解決策:
maven-shade-pluginを使用してバージョンの不一致を解決し、インポートパスを変更します。 次に、JARファイルを再度パッケージ化し、パッケージをMaxComputeプロジェクトにアップロードします。 JARファイルをパッケージ化してパッケージをアップロードする方法の詳細については、「Javaプログラムのパッケージ化、パッケージのアップロード、MaxCompute UDFの作成」をご参照ください。原因2の解決策: 詳細については、「Javaサンドボックスの制限に関する問題」をご参照ください。
Javaサンドボックスの制限に関連する問題
問題1: MaxCompute UDFを呼び出して、ローカルファイルへのアクセス、インターネットへのアクセス、分散ファイルシステムへのアクセス、またはJavaスレッドを作成するとエラーが発生します。
原因: デフォルトでは、MaxComputeではUDFを使用してネットワーク内のリソースにアクセスすることはできません。
解決策: ビジネス要件に基づいて、ネットワーク接続申請フォームに記入して送信します。 MaxComputeテクニカルサポートチームは、ネットワーク接続を確立するために連絡します。 申請フォームへの記入方法の詳細については、「ネットワーク接続プロセス」をご参照ください。
パフォーマンス関連の問題
MaxCompute UDFを呼び出すと、次のパフォーマンスの問題が発生する可能性があります。
問題1: エラーメッセージ
kInstanceMonitorTimeoutが表示されます。原因: MaxCompute UDFのデータ処理がタイムアウトします。 デフォルトでは、UDFがデータを処理する期間は制限されています。 ほとんどの場合、UDFは1800秒以内に一度に1024行のデータを処理する必要があります。 この期間は、ワーカーが実行される合計期間ではなく、UDFが一度にデータレコードの小さなバッチを処理する期間です。 ほとんどの場合、MaxCompute SQLは1秒あたり10,000行以上のデータを処理できます。 この制限は、MaxCompute UDFの無限ループを防ぐことのみを目的としています。 無限ループが発生すると、CPUリソースが長時間占有されます。
解決策:
MaxComputeが大量のデータを処理する必要がある場合は、MaxCompute UDFのJavaクラスメソッドで
ExecutionContext.claimAliveを呼び出してタイマーをリセットします。MaxCompute UDFコードのロジックを最適化します。 最適化後、MaxCompute UDFを呼び出す前に、セッションレベルで次のパラメーターを設定して、MaxCompute UDFの操作を調整できます。 このようにして、データ処理が加速される。
パラメーター
説明
set odps.function.timeout=xxx;UDFを実行するためのタイムアウト期間。 デフォルト値: 1800 (秒単位)。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。 有効な値: 1 ~ 3600
set odps.stage.mapper.split.size=xxx;Mapワーカーの入力データ量。 デフォルト値: 256 単位:MB。 ビジネス要件に基づいて、このパラメーターの値を減らすことができます。
set odps.sql.exe cutionengine.batch.rowcount=xxx;MaxComputeが一度に処理できる行数。 デフォルト値: 1024。 ビジネス要件に基づいて、このパラメーターの値を減らすことができます。
問題2: エラーメッセージ
errMsg:SigKill(OOM)またはOutOfMemoryErrorが表示されます。原因: MaxComputeは、Map、Reduce、Joinの3段階でジョブを実行します。 MaxComputeが大量のデータを処理する場合、各ステージでの各インスタンスのデータ処理に時間がかかります。
解決策:
fuxiまたはruntimeコードでエラーが報告された場合は、次のリソースパラメーターを設定してデータ処理を高速化できます。パラメーター
説明
set odps.stage.mapper.mem=xxx;Mapワーカーのメモリサイズ。 デフォルト値: 1024。 単位:MB。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。
set odps.stage.reducer.mem=xxx;Reduceワーカーのメモリサイズ。 デフォルト値: 1024。 単位:MB。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。
set odps.stage.joiner.mem=xxx;Joinワーカーのメモリサイズ。 デフォルト値: 1024。 単位:MB。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。
set odps.stage.mapper.split.size=xxx;Mapワーカーの入力データ量。 デフォルト値: 256 単位:MB。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。
set odps.stage.reducer.num=xxx;Reduceワーカーの数。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。
set odps.stage.joiner.num=xxx;Joinワーカーの数。 ビジネス要件に基づいて、このパラメーターの値を増やすことができます。
Javaコードでこのエラーが報告された場合は、上記のパラメーターを調整し、
set odps.sql.udf.jvm.memory=xxx;コマンドを実行して、Java仮想マシン (JVM) のメモリサイズを増やします。
パラメーターの詳細については、「SET操作」をご参照ください。
UDTF関連の問題
Java UDTFを呼び出すと、次の問題が発生する可能性があります。
問題1: エラーメッセージ
セマンティック分析例外-UDTFでSELECT句の1つの式のみがサポートされていますがUDTFを呼び出すと表示されます。原因: UDTFが呼び出されるSELECTステートメントで、列または式が指定されています。 次のサンプルコードは、誤ったSQL文を示しています。
select b.*, 'x', udtffunction_name(v) from table lateral view udtffunction_name(v) b as f1, f2;解決策: SELECTステートメントでJava UDTFをLateral Viewで使用できます。 例:
select b.*, 'x' from table lateral view udtffunction_name(v) b as f1, f2;
問題2: エラーメッセージ
セマンティック分析例外-2つのエイリアスを期待しますが、0がありますが表示されます。原因: UDTFが呼び出されるSELECTステートメントで、出力列のエイリアスが指定されていません。
解決策:
AS句を使用して、Java UDTFが呼び出されるSELECTステートメントの出力列のエイリアスを指定できます。 例:select udtffunction_name(paramname) as (col1, col2);