IntelliJ IDEA でコネクタを使用する Realtime Compute for Apache Flink プログラムをデバッグすると、デフォルトのコネクタ JAR はランタイムクラスを省略しています。このため、実行時に ClassNotFoundException が発生します。以下に例を示します:
Caused by: java.lang.ClassNotFoundException: com.alibaba.ververica.connectors.odps.newsource.split.OdpsSourceSplitSerializer
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
これを解決するには、コネクタの uber JAR をクラスパスに追加し、IntelliJ IDEA でクラスローダー JAR を設定します。
事前準備
-
クラウドにデプロイする前に
pipeline.classpathsを削除してください。 この設定はローカルデバッグ専用です。コンパイルされた JAR にこの設定を残したまま Realtime Compute for Apache Flink にアップロードすると、エラーが発生します。 -
フレームワークバージョンが
1.17-vvr-8.0.11-1より前の MaxCompute コネクタの場合: ローカルデバッグには1.17-vvr-8.0.11-1の uber JAR を使用します。クラウドデプロイ用に JAR をビルドする際は、古いバージョンのコネクタ uber JAR を含めて、新しいフレームワークバージョンでのみサポートされるコネクタオプションはすべて削除してください。 -
MySQL コネクタ: 以下の手順に加えて、「MySQL DataStream のデバッグ」で説明されているように Maven の依存関係を設定してください。
-
ネットワーク接続: Flink アプリケーションは、アップストリームおよびダウンストリームシステムに到達できる必要があります。これらのサービスを同じネットワーク上でローカルに実行するか、Flink がインターネット経由でクラウドサービスに到達できることを確認し、デバイスのパブリック IP アドレスをそれらのサービスの許可リストに追加してください。
ステップ 1:コネクタの uber JAR の追加
デフォルトのコネクタ JAR は、サードパーティのランタイムクラスを除外する thin JAR です。uber JAR は、ローカルデバッグに必要なすべてのランタイムの依存関係をバンドルします。
Maven セントラルリポジトリからコネクタの uber JAR をダウンロードしてください。たとえば、バージョン 1.17-vvr-8.0.11-1 の MaxCompute コネクタを使用している場合、Maven セントラルリポジトリのディレクトリから ververica-connector-odps-1.17-vvr-8.0.11-1-uber.jar をダウンロードしてください。
ダウンロード後、実行環境を取得する際に、pipeline.classpaths パラメーターを uber JAR のローカルパスに設定してください。
| パス形式 | 例 |
|---|---|
| 単一の JAR | file:///path/to/a-uber.jar |
| 複数の JAR (セミコロン区切り) | file:///path/to/a-uber.jar;file:///path/to/b-uber.jar |
| Windows パス (ドライブ文字を含む) | file:///D:/path/to/a-uber.jar;file:///E:/path/to/b-uber.jar |
DataStream プログラムの場合:
Configuration conf = new Configuration();
conf.setString("pipeline.classpaths", "file://<uber-jarへの絶対パス>");
StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment(conf);
Table API プログラムの場合:
Configuration conf = new Configuration();
conf.setString("pipeline.classpaths", "file://<uber-jarへの絶対パス>");
EnvironmentSettings envSettings =
EnvironmentSettings.newInstance().withConfiguration(conf).build();
TableEnvironment tEnv = TableEnvironment.create(envSettings);
<absolute-path-to-uber-jar> を、ダウンロードした uber JAR のローカルパスに置き換えてください。
ステップ 2:IntelliJ IDEA でのクラスローダー JAR の設定
クラスローダー JAR を使用すると、Flink はローカル実行中にコネクタのランタイムクラスをロードできます。お使いの Ververica Runtime (VVR) バージョンに一致する JAR をダウンロードしてください:
| VVR バージョン | ダウンロード |
|---|---|
| VVR 6.x | ververica-classloader-1.15-vvr-6.0-SNAPSHOT.jar |
| VVR 8.x | ververica-classloader-1.17-vvr-8.0-SNAPSHOT.jar |
| VVR 11.2 | ververica-classloader-1.20-vvr-11.2-SNAPSHOT.jar |
ダウンロード後、IntelliJ IDEA で JAR を実行構成に追加してください:
-
IntelliJ IDEA でプログラムファイルを開いてください。
-
エントリクラスの左側にある緑色のアイコンをクリックして、メニューを展開してください。
-
[Modify Run Configuration...] を選択してください。
-
[Modify options] をクリックしてください。
-
[Add Run Options] ドロップダウンリストで、[Java] セクションの [Modify classpath] を選択してください。[Modify classpath] セクションが表示されます。
-
[Modify classpath] セクションで [+] をクリックし、[Include] を選択して、ダウンロードしたクラスローダー JAR を選択してください。
-
(VVR 11.1 以降で必須) JVM オプションとして
--add-opens java.base/jdk.internal.loader=ALL-UNNAMEDを追加してください。 -
設定を保存してください。
共通の Flink クラスが欠落していることを示すエラーが発生した場合は、[Modify options] をクリックし、[Add dependencies with "provided" scope to classpath] を選択してください。
Table API ジョブのデバッグ (VVR 11.1 以降)
VVR 11.1 以降、Realtime Compute for Apache Flink のコネクタは、Apache Flink の flink-table-common パッケージと完全な互換性がなくなりました。Table API ジョブを実行すると、以下のエラーが発生する場合があります:
java.lang.ClassNotFoundException: org.apache.flink.table.factories.OptionUpgradabaleTableFactory
これを解決するには、pom.xml を更新し、org.apache.flink:flink-table-common を、正しいバージョンの com.alibaba.ververica:flink-table-common に置き換えてください。