Saat melakukan debug program Realtime Compute for Apache Flink yang menggunakan konektor di IntelliJ IDEA, JAR konektor bawaan tidak menyertakan kelas waktu proses. Hal ini menyebabkan ClassNotFoundException selama waktu proses—contohnya:
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)
Untuk mengatasinya, tambahkan JAR uber konektor ke classpath dan konfigurasikan JAR ClassLoader di IntelliJ IDEA.
Sebelum memulai
-
Hapus pipeline.classpaths sebelum menerapkan ke cloud. Konfigurasi ini hanya untuk debugging lokal. Membiarkannya dalam JAR yang dikompilasi akan menyebabkan error saat Anda mengunggah ke Realtime Compute for Apache Flink.
-
Konektor MaxCompute pada versi framework yang lebih lama dari 1.17-vvr-8.0.11-1: Gunakan JAR uber
1.17-vvr-8.0.11-1untuk debugging lokal. Saat membuat JAR untuk penerapan di cloud, sertakan versi lama dari JAR uber konektor dan hapus opsi konektor yang hanya didukung oleh versi framework yang lebih baru. -
Konektor MySQL: Selain langkah-langkah di bawah, konfigurasikan dependensi Maven seperti yang dijelaskan dalam Debug MySQL DataStream.
-
Konektivitas jaringan: Aplikasi Flink Anda harus dapat menjangkau sistem hulu dan hilir. Jalankan layanan tersebut secara lokal pada jaringan yang sama, atau pastikan Flink dapat menjangkau layanan cloud Anda melalui Internet dan tambahkan Alamat IP publik perangkat Anda ke daftar putih layanan tersebut.
Langkah 1: Tambahkan connector uber JAR
JAR konektor bawaan merupakan JAR tipis yang tidak menyertakan kelas runtime pihak ketiga. JAR uber menggabungkan semua dependensi runtime, yang diperlukan untuk debugging lokal.
Unduh JAR uber konektor dari repositori Maven Central. Misalnya, jika Anda menggunakan konektor MaxCompute versi 1.17-vvr-8.0.11-1, unduh ververica-connector-odps-1.17-vvr-8.0.11-1-uber.jar dari direktori repositori Maven Central.
Setelah mengunduh, atur parameter pipeline.classpaths ke path lokal JAR uber saat mendapatkan environment eksekusi.
| Format jalur | Contoh |
|---|---|
| JAR tunggal | file:///path/to/a-uber.jar |
| Beberapa JAR (dipisahkan titik koma) | file:///path/to/a-uber.jar;file:///path/to/b-uber.jar |
| Path Windows (sertakan huruf drive) | file:///D:/path/to/a-uber.jar;file:///E:/path/to/b-uber.jar |
Untuk program DataStream:
Configuration conf = new Configuration();
conf.setString("pipeline.classpaths", "file://<absolute-path-to-uber-jar>");
StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment(conf);
Untuk program Table API:
Configuration conf = new Configuration();
conf.setString("pipeline.classpaths", "file://<absolute-path-to-uber-jar>");
EnvironmentSettings envSettings =
EnvironmentSettings.newInstance().withConfiguration(conf).build();
TableEnvironment tEnv = TableEnvironment.create(envSettings);
Ganti <absolute-path-to-uber-jar> dengan path lokal JAR uber yang telah diunduh.
Langkah 2: Konfigurasikan JAR ClassLoader di IntelliJ IDEA
JAR ClassLoader memungkinkan Flink memuat kelas runtime konektor selama eksekusi lokal. Unduh JAR yang sesuai dengan versi Ververica Runtime (VVR) Anda:
| Versi VVR | Unduh |
|---|---|
| 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.x | ververica-classloader-1.20-vvr-11.2-SNAPSHOT.jar |
Setelah mengunduh, tambahkan JAR tersebut ke konfigurasi run di IntelliJ IDEA:
-
Buka file program di IntelliJ IDEA.
-
Klik ikon hijau di sebelah kiri kelas entri untuk membuka menu.
-
Pilih Modify Run Configuration....
-
Klik Modify options.
-
Pada daftar drop-down Add Run Options, pilih Modify classpath di bagian Java. Bagian Modify classpath akan muncul.
-
Pada bagian Modify classpath, klik +, pilih Include, lalu pilih JAR ClassLoader yang telah diunduh.
-
(Wajib untuk VVR 11.1 dan versi setelahnya) Tambahkan
--add-opens java.base/jdk.internal.loader=ALL-UNNAMEDsebagai opsi JVM. -
Simpan konfigurasi.
Jika muncul error yang menunjukkan kelas Flink umum tidak ditemukan, klik Modify options dan pilih Add dependencies with "provided" scope to classpath.
Debug Pekerjaan Table API (VVR 11.1 dan versi setelahnya)
Mulai dari VVR 11.1, konektor Realtime Compute for Apache Flink tidak lagi sepenuhnya kompatibel dengan paket flink-table-common milik Apache Flink. Menjalankan pekerjaan Table API dapat menghasilkan:
java.lang.ClassNotFoundException: org.apache.flink.table.factories.OptionUpgradabaleTableFactory
Untuk mengatasinya, perbarui pom.xml Anda: ganti org.apache.flink:flink-table-common dengan com.alibaba.ververica:flink-table-common, menggunakan versi yang sesuai.