Jawaban atas pertanyaan umum mengenai tugas sinkronisasi batch, termasuk masalah konektivitas, pengaturan resource, data kotor, dan error spesifik plugin.
Ikhtisar
Gunakan kata kunci dalam tabel berikut untuk menemukan masalah dan solusinya.
Konektivitas jaringan
Mengapa uji konektivitas sumber data berhasil, tetapi tugas sinkronisasi batch gagal dengan error koneksi sumber data?
-
Jika uji konektivitas sebelumnya berhasil, lakukan uji ulang untuk memastikan kelompok sumber daya dan database saat ini terhubung (dan tidak ada perubahan di sisi database).
-
Periksa apakah kelompok sumber daya yang lulus uji konektivitas sama dengan yang digunakan untuk menjalankan tugas.
Periksa kelompok sumber daya yang digunakan oleh tugas:
-
Jika tugas berjalan di kelompok sumber daya default, log berisi informasi berikut: running in Pipeline[basecommon_ group_xxxxxxxxx]
-
Jika tugas berjalan di grup sumber daya eksklusif untuk Integrasi Data, log berisi informasi berikut: running in Pipeline[basecommon_S_res_group_xxx]
-
Jika tugas berjalan di kelompok sumber daya serverless, log berisi informasi berikut: running in Pipeline[basecommon_Serverless_res_group_xxx]
-
Jika tugas kadang-kadang gagal selama penjadwalan dini hari tetapi berhasil setelah dijalankan ulang, periksa beban database pada saat error terjadi.
Tugas sinkronisasi batch kadang berhasil dan kadang gagal
Jika tugas sinkronisasi batch kadang-kadang gagal, penyebabnya kemungkinan konfigurasi daftar putih yang tidak lengkap. Periksa apakah daftar putih database telah dikonfigurasi secara lengkap.
Saat menggunakan grup sumber daya eksklusif untuk Integrasi Data:
-
Jika sebelumnya Anda menambahkan alamat IP antarmuka jaringan elastis (ENI) dari grup sumber daya eksklusif untuk Integrasi Data ke daftar putih sumber data, dan grup sumber daya tersebut telah diskalakan, perbarui daftar putih sumber data untuk menyertakan alamat IP ENI dari grup sumber daya yang telah diskalakan.
-
Untuk menghindari pembaruan daftar putih setiap kali grup sumber daya diskalakan, kami menyarankan Anda menambahkan Blok CIDR dari vSwitch yang terkait dengan grup sumber daya eksklusif untuk Integrasi Data sebagai daftar putih database. Untuk informasi lebih lanjut, lihat Tambahkan daftar putih.
Saat menggunakan kelompok sumber daya serverless: lihat Konektivitas jaringan kelompok sumber daya serverless untuk memeriksa konfigurasi daftar putih kelompok sumber daya dan memastikan jaringan dikonfigurasi dengan benar.
Jika daftar putih telah dikonfigurasi dengan benar, periksa apakah beban database terlalu tinggi, yang dapat menyebabkan koneksi terputus.
Pengaturan resource
Tugas sinkronisasi batch gagal dengan error: [TASK_MAX_SLOT_EXCEED]:Unable to find a gateway that meets resource requirements. 20 slots are requested, but the maximum is 16 slots.
Tugas sinkronisasi batch gagal dengan error: OutOfMemoryError: Java heap space
Untuk mengatasi error ini:
-
Jika konfigurasi plugin mendukung parameter seperti batchsize atau maxfilesize, kurangi nilai yang sesuai.
Anda dapat memeriksa apakah setiap plugin mendukung parameter tersebut. Buka topik Sumber data dan reader/writer yang didukung dan klik plugin yang sesuai untuk melihat detail parameter.
-
Kurangi konkurensi.
-
Jika Anda menyinkronkan file, seperti file OSS, kurangi jumlah file yang dibaca.
-
Di bagian Running Resources konfigurasi tugas, tingkatkan nilai Resource Usage (CU) secara tepat. Atur nilai CU dengan hati-hati untuk menghindari memengaruhi tugas lain yang sedang berjalan.
Konflik eksekusi instans
Tugas sinkronisasi batch gagal dengan error: Duplicate entry 'xxx' for key 'uk_uk_op'
-
Pesan error: Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'cfc68cd0048101467588e97e83ffd7a8-0' for key 'uk_uk_op'.
-
Penyebab kemungkinan: Integrasi Data tidak mengizinkan instans berbeda dari node yang sama (yaitu, tugas sinkronisasi dengan konfigurasi JSON yang sama) berjalan secara bersamaan. Misalnya, jika tugas sinkronisasi berjalan dengan jadwal 5 menit, dan keterlambatan hulu menyebabkan instans 00:00 dan 00:05 dipicu pada 00:05, salah satu instans tidak dapat dimulai. Hal ini juga dapat terjadi ketika Anda mengisi kembali data atau menjalankan ulang instans saat instans tugas masih berjalan.
-
Solusi: Atur waktu eksekusi instans agar tidak bertabrakan. Untuk tugas yang dijadwalkan dengan interval per jam atau per menit, kami menyarankan Anda mengatur dependensi diri sendiri sehingga instans saat ini dimulai hanya setelah instans dari siklus sebelumnya selesai. Untuk konfigurasi di Data Studio lama, lihat Dependensi diri sendiri. Untuk konfigurasi di Data Studio baru, lihat Konfigurasi dependensi diri sendiri.
Waktu eksekusi habis
Tugas sinkronisasi batch dengan MongoDB sebagai sumber gagal dengan error: MongoDBReader$Task - operation exceeded time limitcom.mongodb.MongoExecutionTimeoutException: operation exceeded time limit.
-
Detail error: Selama tugas sinkronisasi data, tugas gagal dengan error berikut: MongoDBReader$Task - operation exceeded time limitcom.mongodb.MongoExecutionTimeoutException: operation exceeded time limit.
-
Penyebab kemungkinan: Tarikan data penuh terlalu besar.
-
Solusi:
Tugas sinkronisasi batch dengan sumber data MySQL gagal dengan error timeout koneksi: Communications link failure
-
Error baca
-
Gejala:
Saat membaca data, terjadi error berikut: Communications link failure The last packet successfully received from the server was 7,200,100 milliseconds ago. The last packet sent successfully to the server was 7,200,100 milliseconds ago. - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
-
Penyebab kemungkinan:
Database mengeksekusi kueri SQL secara lambat, menyebabkan timeout baca MySQL.
-
Solusi:
-
Periksa apakah kondisi filter where dikonfigurasi dan pastikan kolom filter diindeks.
-
Periksa apakah tabel sumber berisi terlalu banyak data. Jika ya, bagi tugas menjadi beberapa tugas.
-
Periksa log untuk menemukan pernyataan SQL yang menyebabkan pemblokiran dan konsultasikan dengan administrator basis data untuk menyelesaikan masalah.
-
Error tulis
-
Gejala:
Saat menulis data, terjadi error berikut: Caused by: java.util.concurrent.ExecutionException: ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] Error occurs when execute on GROUP 'xxx' ATOM 'dockerxxxxx_xxxx_trace_shard_xxxx': Communications link failure The last packet successfully received from the server was 12,672 milliseconds ago. The last packet sent successfully to the server was 12,013 milliseconds ago. More...
-
Penyebab kemungkinan:
Kueri lambat menyebabkan SocketTimeout. SocketTimeout default untuk koneksi TDDL adalah 12 detik. Jika pernyataan SQL membutuhkan waktu lebih dari 12 detik untuk dieksekusi di MySQL, error 4614 dilaporkan. Error ini dapat terjadi sesekali ketika volume data besar atau server sibuk.
-
Solusi:
Bagaimana cara troubleshooting tugas sinkronisasi batch yang membutuhkan waktu lama untuk berjalan?
Penyebab kemungkinan 1: Eksekusi memakan waktu terlalu lama
-
Pernyataan pre-SQL atau post-SQL (seperti preSql dan postSql) membutuhkan waktu terlalu lama untuk dieksekusi di database, menyebabkan tugas berjalan lambat.
-
Kunci pemisah tidak dikonfigurasi dengan benar, menyebabkan tugas berjalan lambat.
Sinkronisasi batch menggunakan kunci pemisah (splitPk) untuk membagi data dan memulai tugas konkuren untuk sinkronisasi data guna meningkatkan efisiensi. (Periksa dokumentasi untuk setiap plugin spesifik untuk menentukan apakah kunci pemisah perlu dikonfigurasi.)
Solusi 1:
-
Jika pernyataan pre-SQL atau post-SQL dikonfigurasi, gunakan kolom yang diindeks untuk penyaringan data.
-
Jika kunci pemisah didukung, konfigurasikan dengan benar. Contoh berikut menggunakan konfigurasi kunci pemisah plugin MySQL Reader:
-
Kami menyarankan Anda menggunakan kunci utama tabel sebagai splitPk karena kunci utama biasanya terdistribusi merata, yang membantu menghindari hotspot data di shard yang dihasilkan.
-
Saat ini, splitPk hanya mendukung pembagian data berbasis integer dan tidak mendukung string, floating-point, tanggal, atau tipe lainnya. Jika Anda menentukan tipe yang tidak didukung, sinkronisasi saluran tunggal digunakan.
-
Jika splitPk dibiarkan kosong atau tidak ditentukan, sinkronisasi data menggunakan saluran tunggal untuk menyinkronkan data tabel.
Penyebab kemungkinan 2: Menunggu resource eksekusi tugas Integrasi Data
Solusi 2: Jika log menunjukkan status WAIT yang berkepanjangan, grup sumber daya eksklusif untuk Integrasi Data yang digunakan oleh tugas saat ini tidak memiliki konkurensi yang cukup untuk menjalankan tugas. Untuk detail penyebab dan solusi, lihat Troubleshoot masalah konkurensi kelompok sumber daya.
Catatan
Karena tugas sinkronisasi batch didispatch dari kelompok sumber daya penjadwalan ke kelompok sumber daya eksekusi Integrasi Data, satu tugas sinkronisasi batch mengonsumsi satu resource penjadwalan. Jika tugas sinkronisasi batch berjalan dalam periode yang panjang tanpa melepaskan resource, hal ini dapat memblokir tidak hanya tugas sinkronisasi batch lain tetapi juga jenis tugas terjadwal lainnya.
Apa yang harus dilakukan ketika tugas sinkronisasi data diperlambat oleh pemindaian tabel penuh karena klausa WHERE yang tidak diindeks?
-
Contoh skenario
SQL yang dieksekusi adalah sebagai berikut:
SELECT bid,inviter,uid,createTime FROM `relatives` WHERE createTime>='2016-10-2300:00:00' AND reateTime<'2016-10-24 00:00:00';
Eksekusi dimulai pada 2016-10-25 11:01:24.875 dan hasil mulai dikembalikan pada 2016-10-25 11:11:05.489. Program sinkronisasi menunggu database mengembalikan hasil kueri SQL, dan MaxCompute harus menunggu waktu yang lama sebelum eksekusi dapat dilanjutkan.
-
Analisis akar penyebab
Kolom createTime dalam klausa WHERE tidak diindeks, menyebabkan pemindaian tabel penuh.
-
Solusi
Kami menyarankan klausa where menggunakan kolom yang diindeks untuk meningkatkan kinerja. Anda juga dapat menambahkan indeks sesuai kebutuhan.
Ganti kelompok sumber daya
Bagaimana cara mengganti kelompok sumber daya eksekusi untuk tugas sinkronisasi batch?
Data Studio lama:
Anda dapat memodifikasi kelompok sumber daya yang digunakan untuk debugging di halaman detail tugas sinkronisasi batch di DataStudio. Anda juga dapat mengubah kelompok sumber daya eksekusi tugas Integrasi Data yang digunakan selama penjadwalan di Operation Center. Untuk informasi lebih lanjut, lihat Ganti kelompok sumber daya Integrasi Data.
Data Studio baru:
Anda dapat memodifikasi kelompok sumber daya yang digunakan untuk debugging tugas Integrasi Data di DataStudio. Anda juga dapat mengubah kelompok sumber daya eksekusi tugas Integrasi Data yang digunakan selama penjadwalan di Operation Center. Untuk informasi lebih lanjut, lihat Ganti kelompok sumber daya Integrasi Data.
Data kotor
Bagaimana cara troubleshooting dan melokalisasi data kotor?
Data kotor: Catatan yang gagal ditulis ke sumber data tujuan karena pengecualian.
Dampak data kotor: Data kotor tidak ditulis ke tujuan. Anda dapat mengontrol apakah data kotor diizinkan dan menentukan jumlah maksimum catatan data kotor yang diizinkan. Secara default, Integrasi Data mengizinkan data kotor. Anda dapat menentukan ambang batas data kotor saat mengonfigurasi tugas sinkronisasi. Untuk informasi lebih lanjut, lihat Konfigurasi kontrol saluran dalam mode wizard.
-
Jika tugas mengizinkan data kotor: Tugas terus berjalan saat data kotor dihasilkan, tetapi data kotor dibuang dan tidak ditulis ke tujuan.
-
Mengontrol jumlah catatan data kotor yang diizinkan:
-
Jika jumlah data kotor yang diizinkan diatur ke 0, tugas gagal dan keluar saat data kotor dihasilkan.
-
Jika jumlah data kotor yang diizinkan diatur ke x, tugas gagal dan keluar saat jumlah data kotor melebihi x. Jika jumlah data kotor kurang dari x, tugas terus berjalan, tetapi data kotor dibuang dan tidak ditulis ke tujuan.
Analisis skenario data kotor:
-
Skenario 1:
-
Pesan error: {"message":"Dirty data encountered when writing to the ODPS destination table: An error occurred in the data of field [3]. Please check the data and make corrections, or you can increase the threshold to ignore this record.","record":[{"byteSize":0,"index":0,"type":"DATE"},{"byteSize":0,"index":1,"type":"DATE"},{"byteSize":1,"index":2,"rawData":0,"type":"LONG"},{"byteSize":0,"index":3,"type":"STRING"},{"byteSize":1,"index":4,"rawData":0,"type":"LONG"},{"byteSize":0,"index":5,"type":"STRING"},{"byteSize":0,"index":6,"type":"STRING"}]}.
-
Cara menangani: Log menunjukkan kolom data kotor. Kolom ketiga abnormal.
-
Data kotor dilaporkan oleh writer. Periksa pernyataan DDL untuk tabel tujuan. Ukuran kolom yang ditentukan untuk tabel ODPS lebih kecil daripada ukuran data aktual kolom MySQL yang sesuai.
-
Prinsip sinkronisasi data: Data dari sumber data harus dapat ditulis ke sumber data tujuan (tipe sumber dan tujuan harus cocok, dan definisi ukuran kolom harus cocok). Secara khusus, tipe data sumber harus cocok dengan tipe data tujuan. Misalnya, data VARCHAR dari sumber tidak dapat ditulis ke kolom INT di tujuan. Ukuran kolom tujuan harus cukup besar untuk mengakomodasi ukuran data aktual kolom sumber yang dipetakan. Data sumber tipe LONG, VARCHAR, dan DOUBLE dapat disimpan dalam tipe yang lebih luas seperti string atau text di tujuan.
-
Jika pesan error data kotor tidak jelas, salin seluruh catatan data kotor dari log, periksa datanya, dan bandingkan dengan tipe data tujuan untuk mengidentifikasi kolom mana yang tidak sesuai.
Contoh:
{"byteSize":28,"index":25,"rawData":"ohOM71vdGKqXOqtmtriUs5QqJsf4","type":"STRING"}
byteSize: jumlah byte; index: 25, kolom ke-26; rawData: nilai aktual; type: tipe data.
-
Skenario 2:
-
Pesan error: DataX melaporkan data kotor saat membaca nilai null dari MySQL.
-
Cara menangani: Periksa apakah tipe data kolom sumber dengan nilai null cocok dengan tipe kolom tujuan yang dipetakan. Ketidakcocokan tipe menyebabkan error. Misalnya, menulis null tipe string ke kolom tujuan tipe int menghasilkan error.
-
Skenario 3:
-
Pesan error: Tipe bidang sumber dan tujuan tidak kompatibel. Misalnya, bidang sumber Simple Log Service (SLS) dibaca sebagai STRING, tetapi kolom tujuan yang dipetakan didefinisikan sebagai INT atau tipe non-string lainnya.
-
Cara menangani: Integrasi Data memvalidasi tipe bidang sebelum menulis data. Jika tipe bidang sumber tidak kompatibel dengan tipe bidang tujuan, catatan diidentifikasi sebagai data kotor dan dicegat, dan tidak pernah ditulis ke tujuan. Pastikan tipe bidang sumber dan tujuan sama atau kompatibel. Misalnya, ubah bidang tujuan menjadi VARCHAR untuk menerima nilai, atau konversi tipe data sebelum sinkronisasi.
Catatan
Pemicu MySQL di tabel tujuan tidak dapat menyelesaikan jenis data kotor ini. Integrasi Data mencegat catatan dengan tipe bidang yang tidak kompatibel sebelum mencapai basis data tujuan, sehingga tidak terjadi INSERT atau UPDATE di tabel tujuan dan pemicu tidak pernah diaktifkan. Pastikan kompatibilitas tipe bidang saat Anda mengonfigurasi tugas sinkronisasi di DataWorks.
Bagaimana cara melihat data kotor?
Anda dapat melihat log tugas dan klik Detail log url di log untuk mendapatkan log waktu proses dan informasi data kotor secara detail.
DI Submit at : 2023-01-04 00:21:05
DI Start at : 2023-01-04 00:21:07
DI Finish at : 2023-01-04 07:00:05
2023-01-04 07:00:06 : Use "cdp job -log xxx" for more detail.
2023-01-04 07:00:06 :Detail log url: https://di-cn-chengdu.data.aliyun.com/web/di/insxxx
Exit with SUCCESS.
2023-01-04 07:00:06 [INFO] Sandbox context cleanup temp file success.
2023-01-04 07:00:06 [INFO] Data synchronization ended with return code: [0].
2023-01-04 07:00:06 INFO ============================================================
Jika jumlah data kotor melebihi batas selama tugas sinkronisasi batch, apakah data yang sudah tersinkronisasi dipertahankan?
Tugas mengakumulasi jumlah catatan data kotor selama eksekusi. Setelah jumlah melebihi ambang batas data kotor yang dikonfigurasi, tugas segera dihentikan.
-
Pertahanan data: Data yang berhasil ditulis ke tujuan sebelum tugas dihentikan dipertahankan. Tidak ada rollback yang dilakukan.
-
Kebijakan toleransi nol: Saat ambang batas data kotor diatur ke 0, sistem menerapkan kebijakan toleransi nol. Artinya, tugas gagal dan berhenti segera setelah mendeteksi catatan data kotor pertama.
Bagaimana cara menangani error data kotor yang disebabkan oleh pengaturan format encoding atau karakter rusak?
-
Pesan error:
Jika data berisi karakter emoji, error data kotor dapat terjadi selama sinkronisasi: [13350975-0-0-writer] ERROR StdoutPluginCollector - Dirty data {"exception":"Incorrect string value: '\\xF0\\x9F\\x98\\x82\\xE8\\xA2...' for column 'introduction' at row 1","record":[{"byteSize":8,"index":0,"rawData":9642,"type":"LONG"}],"type":"writer"} .
-
Penyebab kemungkinan:
-
Encoding database tidak diatur ke utf8mb4, yang menyebabkan error saat menyinkronkan karakter emoji.
-
Data sumber itu sendiri berisi karakter rusak.
-
Encoding database dan klien tidak konsisten.
-
Encoding browser berbeda, menyebabkan kegagalan pratinjau atau karakter rusak.
-
Solusi:
Pilih solusi yang sesuai berdasarkan penyebab karakter rusak:
-
Jika data asli berisi karakter rusak, perbaiki data sebelum menjalankan tugas sinkronisasi.
-
Jika format encoding database dan klien tidak konsisten, modifikasi format encoding terlebih dahulu.
-
Jika encoding browser tidak konsisten dengan encoding database atau klien, satukan format encoding sebelum melakukan pratinjau data.
Anda dapat mencoba hal berikut:
-
Untuk sumber data yang ditambahkan dalam format JDBC, modifikasi utf8mb4 sebagai berikut: jdbc:mysql://xxx.x.x.x:3306/database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45.
-
Untuk sumber data yang ditambahkan berdasarkan ID instans, tambahkan berikut ke nama database: database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45.
-
Modifikasi format encoding database ke utf8mb4. Misalnya, modifikasi format encoding database RDS di konsol RDS.
Catatan
Perintah untuk mengatur format encoding sumber data RDS: set names utf8mb4. Perintah untuk memeriksa format encoding database RDS: show variables like 'char%'.
Sinkronisasi ke MaxCompute gagal atau memotong data karena satu bidang melebihi batas ukuran 8 MB
-
Skenario: Saat Anda menyinkronkan data ke MaxCompute (ODPS), tugas gagal atau data yang ditulis terpotong karena bidang sumber melebihi 8 MB.
-
Penyebab: Untuk tugas sinkronisasi yang menggunakan MaxCompute sebagai tujuan, MaxCompute (ODPS) Writer memberlakukan batas ukuran 8 MB per bidang.
-
Solusi:
-
Di pengaturan lanjutan konfigurasi MaxCompute (ODPS) Writer, atur kebijakan penanganan bidang kelebihan panjang (overLengthRule) untuk menentukan cara menangani bidang yang terlalu besar: potong bidang menjadi 8 MB, atur bidang ke NULL, atau tulis bidang apa adanya tanpa pemotongan.
-
Untuk skenario yang melibatkan objek besar, seperti file atau log, simpan data mentah di Object Storage Service (OSS) dan simpan hanya URL di database. Kemudian gunakan DataWorks untuk menyinkronkan URL alih-alih objek besar itu sendiri.
-
Sebagai langkah pra-pemrosesan, bagi bidang yang terlalu besar menjadi beberapa sub-bidang yang lebih kecil di sumber, misalnya menjadi segmen 7 MB. Sinkronkan sub-bidang secara terpisah dan gabungkan kembali di tujuan.
Catatan
Batas ukuran bidang 8 MB dan pengaturan lanjutan overLengthRule berlaku untuk MaxCompute (ODPS) Writer. Tujuan sinkronisasi lain mungkin menerapkan batas yang berbeda.
Retensi nilai default
Apakah Integrasi Data mempertahankan properti, seperti nilai default dan kendala not-null, saat membuat tabel tujuan?
Saat membuat tabel tujuan, DataWorks hanya mempertahankan nama kolom, tipe data, dan komentar dari tabel sumber. Nilai default, kendala (termasuk kendala not-null dan indeks) tidak dipertahankan.
Kunci pemisah
Dapatkah kunci utama komposit digunakan sebagai kunci pemisah dalam tugas sinkronisasi batch?
Tugas sinkronisasi batch tidak mendukung penggunaan kunci utama komposit sebagai kunci pemisah.
Sinkronisasi inkremental gagal dengan error DBUtilErrorCode-04, yang menunjukkan bahwa kolom kunci utama tidak valid
-
Skenario: Tugas sinkronisasi inkremental gagal dengan error yang menunjukkan bahwa kolom kunci pemisah (splitPk) yang dikonfigurasi tidak valid.
-
Penyebab kemungkinan: Konfigurasi kunci pemisah tidak memenuhi persyaratan. Misalnya, beberapa kolom dikonfigurasi sebagai kunci pemisah, tipe data kolom yang dikonfigurasi tidak didukung, atau kolom yang dikonfigurasi tidak ada di tabel.
-
Solusi:
-
Segarkan pemetaan tabel sumber untuk melihat kolom kunci pemisah yang disarankan sistem secara otomatis.
-
Pastikan hanya satu kolom yang dikonfigurasi sebagai kunci pemisah dan tipe data kolom tersebut adalah tipe integer. Seperti yang dijelaskan sebelumnya dalam dokumen ini, splitPk hanya mendukung pembagian data berbasis integer dan tidak mendukung string, floating-point, tanggal, atau tipe lainnya.
-
Jika kolom yang disarankan secara otomatis tidak memenuhi kondisi ini, ubah secara manual kunci pemisah menjadi satu kolom tipe integer yang memenuhi persyaratan.
Untuk informasi lebih lanjut tentang bagaimana kunci pemisah memengaruhi kinerja sinkronisasi, lihat Bagaimana cara troubleshooting tugas sinkronisasi batch yang membutuhkan waktu lama untuk berjalan?
Serangan SSRF
Tugas memiliki serangan SSRF Tugas memiliki serangan SSRF Bagaimana cara menanganinya?
P: Bagaimana cara menangani error "Task have SSRF attacks"?
Penyebab: Untuk memastikan keamanan cloud, DataWorks melarang tugas mengakses alamat jaringan internal cloud melalui alamat IP publik. Saat URL dalam konfigurasi plugin (seperti HTTP Reader) mengarah ke alamat IP internal atau nama domain VPC, pemeriksaan keamanan ini dipicu.
Pendekatan yang benar:
Solusi: Untuk tugas yang mengakses sumber data internal, hentikan penggunaan kelompok sumber daya bersama dan beralih ke kelompok sumber daya serverless yang aman (disarankan) atau grup sumber daya eksklusif untuk Integrasi Data.
Penulisan tanggal
Bagaimana cara mempertahankan milidetik atau menentukan format tanggal-waktu kustom saat menulis data tanggal-waktu ke teks?
Beralih tugas sinkronisasi ke mode skrip dan tambahkan konfigurasi berikut di bagian setting halaman konfigurasi tugas:
"common": {
"column": {
"dateFormat": "yyyyMMdd",
"datetimeFormatInNanos": "yyyyMMdd HH:mm:ss.SSS"
}
}
Di mana:
-
dateFormat menentukan format tanggal yang digunakan saat mengonversi data tipe DATE sumber (tanpa waktu) ke teks.
-
datetimeFormatInNanos menentukan format tanggal yang digunakan saat mengonversi data tipe DATETIME/TIMESTAMP sumber (dengan waktu) ke teks. Anda dapat menentukan presisi hingga milidetik.
MaxCompute
Catatan untuk menambahkan baris atau kolom dalam pemetaan kolom saat membaca data tabel MaxCompute (ODPS)
-
Anda dapat memasukkan konstanta. Nilai harus diapit tanda kutip tunggal, seperti 'abc' dan '123'.
-
Anda dapat menggunakan parameter penjadwalan, seperti '${bizdate}'. Untuk informasi tentang cara menggunakan parameter penjadwalan, lihat Konfigurasi parameter penjadwalan.
-
Anda dapat memasukkan kolom partisi untuk disinkronkan, seperti pt.
-
Jika nilai yang dimasukkan tidak dapat diurai, tipe ditampilkan sebagai 'Custom'.
-
Fungsi ODPS tidak didukung.
-
Jika kolom yang ditambahkan secara manual ditampilkan sebagai Custom (misalnya, kolom partisi MaxCompute atau kolom LogHub yang tidak ditampilkan dalam pratinjau data), hal ini tidak memengaruhi eksekusi tugas aktual.
Bagaimana cara menyinkronkan kolom partisi saat membaca data tabel MaxCompute (ODPS)?
Di daftar pemetaan kolom, klik Add atau Create Field di bawah kolom tabel sumber, masukkan nama kolom partisi (seperti pt), dan konfigurasikan pemetaan ke kolom tabel tujuan.
Bagaimana cara menyinkronkan data dari beberapa partisi saat membaca data tabel MaxCompute (ODPS)?
Tentukan informasi partisi untuk data yang akan dibaca.
-
Konfigurasi partisi ODPS mendukung wildcard shell Linux: * cocok dengan nol atau lebih karakter, dan ? cocok dengan karakter tunggal apa pun.
-
Secara default, partisi yang ditentukan harus ada. Jika partisi tidak ada, tugas gagal. Jika Anda ingin tugas berhasil meskipun partisi tidak ada, atur When partitions do not exist, ke: abaikan partisi yang tidak ada dan jalankan tugas secara normal. Atau, beralih ke mode skrip dan tambahkan "successOnNoPartition": true di bagian Parameter ODPS.
Misalnya, jika tabel terpartisi test memiliki empat partisi: pt=1,ds=hangzhou, pt=1,ds=shanghai, pt=2,ds=hangzhou, dan pt=2,ds=beijing, konfigurasi untuk membaca partisi berbeda adalah sebagai berikut:
-
Untuk membaca data dari partisi pt=1,ds=hangzhou, atur informasi partisi ke "partition":"pt=1,ds=hangzhou".
-
Untuk membaca data dari semua partisi di bawah pt=1, atur informasi partisi ke "partition":"pt=1,ds=*".
-
Untuk membaca data dari semua partisi tabel test, atur informasi partisi ke "partition":"pt=*,ds=*".
Anda juga dapat mengatur kondisi untuk mengambil data partisi berdasarkan kebutuhan Anda (operasi berikut memerlukan mode skrip):
-
Untuk menentukan partisi maksimum, tambahkan konfigurasi berikut: /*query*/ ds=(select MAX(ds) from DataXODPSReaderPPR).
-
Untuk menyaring berdasarkan kondisi, tambahkan kondisi yang relevan dengan konfigurasi /*query*/ pt+expression. Misalnya, /*query*/ pt>=20170101 and pt<20170110 mengambil semua data dari partisi pt dari 20170101 (inklusif) hingga 20170110 (eksklusif).
Catatan
/*query*/ menunjukkan bahwa konten setelahnya dikenali sebagai kondisi WHERE.
Cara mengimplementasikan penyaringan kolom, pengubahan urutan, dan pengisian null untuk MaxCompute
Dengan mengonfigurasi MaxCompute Writer, Anda dapat mengimplementasikan operasi penyaringan kolom, pengubahan urutan, dan pengisian null yang tidak didukung oleh MaxCompute itu sendiri. Misalnya, untuk mengimpor semua kolom, konfigurasikan "column": ["*"].
Jika tabel MaxCompute memiliki tiga kolom a, b, dan c, dan Anda ingin menyinkronkan hanya kolom c dan b, konfigurasikan daftar kolom sebagai "column": ["c","b"]. Ini berarti kolom pertama dan kedua dari Reader diimpor ke kolom c dan b tabel MaxCompute, dan kolom a yang baru disisipkan di tabel MaxCompute diatur ke null.
Menangani error konfigurasi kolom MaxCompute
Untuk memastikan keandalan penulisan data dan menghindari masalah kualitas data yang disebabkan oleh kehilangan data kolom tambahan, MaxCompute Writer melaporkan error jika kolom tambahan ditulis. Misalnya, jika tabel MaxCompute memiliki kolom a, b, dan c, dan MaxCompute Writer mencoba menulis lebih dari tiga kolom, error dilaporkan.
Sinkronisasi batch gagal saat tabel tujuan MaxCompute berisi kolom tipe JSON
-
Skenario: Tugas sinkronisasi batch yang menulis ke MaxCompute (ODPS) gagal, dan troubleshooting menunjukkan bahwa tabel tujuan berisi kolom tipe JSON.
-
Penyebab kemungkinan: MaxCompute Writer mungkin tidak mendukung penulisan ke kolom tujuan tipe JSON dalam semua kasus.
-
Solusi: Periksa skema tabel tujuan MaxCompute untuk mengonfirmasi apakah berisi kolom tipe JSON. Jika iya, coba salah satu metode berikut:
-
Ubah tipe kolom menjadi STRING di sisi MaxCompute, misalnya dengan menjalankan ALTER TABLE ADD COLUMN atau perubahan skema setara.
-
Kecualikan kolom tipe JSON dari pemetaan bidang sehingga tidak ditulis selama sinkronisasi.
Catatan konfigurasi partisi MaxCompute
MaxCompute Writer hanya mendukung penulisan ke partisi tingkat terakhir dan tidak mendukung routing partisi berdasarkan kolom. Jika tabel memiliki tiga tingkat partisi, Anda harus menentukan partisi tingkat ketiga secara tepat dalam konfigurasi partisi. Misalnya, untuk menulis data ke partisi tingkat ketiga, konfigurasikan sebagai pt=20150101, type=1, biz=2. Anda tidak dapat mengonfigurasinya sebagai pt=20150101, type=1 atau pt=20150101.
Rerun dan failover tugas MaxCompute
MaxCompute Writer memastikan idempotensi penulisan dengan mengonfigurasi "truncate": true. Saat penulisan gagal dan dijalankan ulang, MaxCompute Writer menghapus data sebelumnya dan mengimpor data baru, memastikan konsistensi data setelah setiap rerun. Jika tugas terganggu karena pengecualian lain selama eksekusi, atomisitas data tidak dijamin. Data tidak dikembalikan atau dijalankan ulang secara otomatis. Manfaatkan fitur idempotensi untuk menjalankan ulang tugas dan memastikan kelengkapan data.
Catatan
Saat truncate diatur ke true, semua data di partisi atau tabel yang ditentukan dihapus. Gunakan pengaturan ini dengan hati-hati.
Membaca data tabel MaxCompute (ODPS) gagal dengan error: The download session is expired.
-
Pesan error:
Code:DATAX_R_ODPS_005:Failed to read ODPS data, Solution:[Please contact the ODPS administrator]. RequestId=202012091137444331f60b08cda1d9, ErrorCode=StatusConflict, ErrorMessage=The download session is expired.
-
Penyebab kemungkinan:
Saat sinkronisasi batch membaca data MaxCompute, menggunakan perintah tunnel MaxCompute untuk mengunggah dan mengunduh data. Sesi Tunnel memiliki masa aktif sisi server 24 jam. Oleh karena itu, jika tugas sinkronisasi batch berjalan lebih dari 24 jam, tugas gagal. Untuk informasi lebih lanjut tentang tunnel, lihat Ikhtisar Tunnel.
-
Solusi:
Tingkatkan konkurensi tugas sinkronisasi batch dan rencanakan volume data secara tepat untuk memastikan tugas selesai dalam 24 jam.
Menulis ke MaxCompute (ODPS) gagal dengan error blok: Error writing request body to server
-
Pesan error:
Code:[OdpsWriter-09], Description:[Failed to write data to the ODPS destination table.]. - Failed to write block:0 to the ODPS destination table, uploadId=[202012081517026537dc0b0160354b]. Please contact the ODPS administrator for assistance. - java.io.IOException: Error writing request body to server。
-
Penyebab kemungkinan:
-
Penyebab kemungkinan 1: Pengecualian tipe data, artinya data sumber tidak sesuai dengan spesifikasi tipe data ODPS. Misalnya, menulis nilai 4.2223 ke tipe data decimal(18,10) di ODPS.
-
Kemungkinan Penyebab 2: Blok ODPS atau pengecualian komunikasi.
-
Solusi:
Konversi tipe data dan gunakan data yang sesuai dengan spesifikasi tipe data.
Sinkronisasi batch seluruh database ke MaxCompute gagal dengan error: cdc mode not supported
-
Skenario: Tugas sinkronisasi batch seluruh database ke MaxCompute gagal dengan ErrorCode=MethodNotAllowed, ErrorMessage=cdc mode not supported.
-
Penyebab kemungkinan: Atribut transaksional atau change data capture (CDC) dari tabel tujuan MaxCompute mungkin tidak cocok dengan mode penulisan yang digunakan oleh tugas sinkronisasi.
-
Solusi: Periksa apakah tabel tujuan dibuat dengan atribut CDC atau transaksional yang tidak kompatibel dengan mode penulisan tugas sinkronisasi saat ini. Jika Anda tidak yakin tentang atribut tabel, hubungi dukungan teknis untuk konfirmasi lebih lanjut.
Mengapa kelompok sumber daya Serverless tidak tersedia saat memilih kelompok sumber daya Tunnel untuk tujuan MaxCompute?
-
Skenario: Saat Anda mengonfigurasi tugas sinkronisasi batch dengan MaxCompute sebagai tujuan, pemilih kelompok sumber daya Tunnel di konfigurasi tujuan tidak mencantumkan kelompok sumber daya Serverless yang telah dibeli.
-
Penyebab: Kelompok sumber daya Tunnel dan kelompok sumber daya yang menjalankan tugas sinkronisasi, seperti kelompok sumber daya Serverless, adalah dua item konfigurasi independen dengan tujuan berbeda. Kelompok sumber daya Tunnel hanya digunakan untuk transmisi unggah dan unduh data MaxCompute, dan secara default menggunakan resource transmisi publik, yaitu kuota Tunnel MaxCompute. Kelompok sumber daya yang menjalankan tugas hanya digunakan untuk menjalankan tugas sinkronisasi itu sendiri, termasuk membaca sumber, memproses data, dan penjadwalan. Karena kedua konfigurasi ini memiliki tujuan berbeda, keduanya independen dan tidak dapat saling menggantikan.
Catatan
Opsi dalam pemilih kelompok sumber daya Tunnel berasal dari kuota transmisi Tunnel MaxCompute yang tersedia untuk akun Anda. Opsi ini tidak dapat saling menggantikan dengan kelompok sumber daya yang menjalankan tugas sinkronisasi.
MySQL
Bagaimana cara menangani karakter Cina yang rusak saat menyinkronkan ke tabel MySQL dengan set karakter utf8mb4?
Tambahkan sumber data menggunakan string koneksi. Kami menyarankan memodifikasi URL JDBC menjadi: jdbc:mysql://xxx.x.x.x:3306/database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45. Untuk informasi lebih lanjut, lihat Tambahkan sumber data MySQL.
Menulis ke/membaca dari MySQL gagal dengan error: Application was streaming results when the connection failed. Consider raising value of 'net_write_timeout/net_read_timeout' on the server.
-
Penyebab error:
-
net_read_timeout: DataX membagi data MySQL menjadi beberapa pernyataan SELECT berukuran sama berdasarkan SplitPk. Selama eksekusi, salah satu pernyataan SQL melebihi waktu eksekusi maksimum yang diizinkan di sisi RDS.
-
net_write_timeout: Timeout untuk menunggu pengiriman blok ke klien diatur terlalu kecil.
-
Solusi:
Tambahkan parameter ke koneksi URL sumber data, atur net_write_timeout/net_read_timeout ke nilai yang lebih besar, atau sesuaikan parameter di konsol RDS.
-
Saran perbaikan:
Jika tugas dapat dijalankan ulang, atur tugas untuk dijalankan ulang secara otomatis saat error.
Contoh: jdbc:mysql://192.168.1.1:3306/lizi?useUnicode=true&characterEncoding=UTF8&net_write_timeout=72000
Sinkronisasi batch ke MySQL gagal dengan error: [DBUtilErrorCode-05]ErrorMessage: Code:[DBUtilErrorCode-05]Description:[Failed to write data to the configured destination table.]. - com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed
Penyebab error:
Parameter MySQL wait_timeout defaultnya 8 jam. Jika data masih diambil saat timeout ini tercapai, tugas sinkronisasi terganggu.
Solusi:
Modifikasi file konfigurasi MySQL my.cnf (atau my.ini di Windows). Tambahkan parameter di bawah modul MySQL (dalam detik): wait_timeout=2592000 interactive_timeout=2592000. Kemudian restart dan login ke MySQL, dan jalankan pernyataan berikut untuk memverifikasi: show variables like '%wait_time%'.
Membaca database MySQL gagal dengan error: The last packet successfully received from the server was 902,138 milliseconds ago
Penggunaan CPU normal tetapi penggunaan memori tinggi dapat menyebabkan koneksi terputus.
Jika Anda memastikan bahwa tugas dapat dijalankan ulang secara otomatis, kami menyarankan Anda mengaktifkan Auto Rerun on Error. Untuk informasi lebih lanjut, lihat Konfigurasi auto rerun.
PostgreSQL
Membaca data PostgreSQL gagal dengan error: org.postgresql.util.PSQLException: FATAL: terminating connection due to conflict with recovery
-
Skenario: Saat alat sinkronisasi batch menyinkronkan data PostgreSQL, terjadi error berikut: org.postgresql.util.PSQLException: FATAL: terminating connection due to conflict with recovery
-
Penyebab kemungkinan: Error ini terjadi karena waktu tarik data dari database terlalu lama. Tingkatkan nilai max_standby_archive_delay dan max_standby_streaming_delay. Untuk informasi lebih lanjut, lihat Standby Server Events.
Sinkronisasi real-time dari AWS PostgreSQL ke MaxCompute gagal dengan error hak istimewa REPLICATION yang hilang
-
Skenario: Tugas sinkronisasi real-time dari AWS PostgreSQL ke MaxCompute gagal karena pengguna PostgreSQL sumber tidak memiliki hak istimewa REPLICATION.
-
Penyebab kemungkinan: Pengguna PostgreSQL sumber tidak memiliki hak istimewa REPLICATION. Di beberapa instans AWS RDS PostgreSQL yang dikelola, atribut ini tidak dapat diberikan menggunakan ALTER ROLE.
-
Solusi: Sinkronisasi batch (offline, terjadwal) tidak memerlukan hak istimewa REPLICATION. Jika Anda tidak dapat memberikan hak istimewa REPLICATION di instans AWS PostgreSQL Anda, gunakan tugas sinkronisasi batch dengan jadwal periodik sebagai gantinya dari sinkronisasi real-time sebagai solusi sementara.
Terjadi deviasi zona waktu setelah menyinkronkan kolom timestamp PostgreSQL ke kolom DATETIME MaxCompute
-
Skenario: Setelah Anda menyinkronkan kolom timestamp PostgreSQL (tanpa zona waktu) ke kolom DATETIME MaxCompute, nilai yang dihasilkan bergeser, misalnya 2 jam, dibandingkan dengan nilai yang diharapkan.
-
Penyebab kemungkinan: Tipe timestamp PostgreSQL (tanpa zona waktu) menyimpan nilai waktu lokal apa adanya. Tipe DATETIME MaxCompute menyimpan nilai dalam UTC dan mengonversinya untuk ditampilkan berdasarkan zona waktu proyek atau sesi. Perbedaan perilaku penyimpanan dan konversi ini dapat menyebabkan deviasi zona waktu.
-
Solusi:
-
Periksa apakah zona waktu server PostgreSQL, yang dapat Anda kueri dengan menjalankan SHOW timezone;, cocok dengan zona waktu proyek MaxCompute. Anda dapat melihat zona waktu proyek di halaman Informasi Dasar proyek MaxCompute.
-
Jika zona waktu berbeda, konfigurasikan zona waktu di pengaturan lanjutan tugas sinkronisasi batch. Atur zona waktu tugas sinkronisasi agar cocok dengan zona waktu server PostgreSQL sehingga nilai timestamp diurai dalam zona waktu tersebut sebelum ditulis ke MaxCompute, yang menghilangkan deviasi.
Ketidaksesuaian zona waktu antara sumber dan tujuan biasanya muncul sebagai offset tetap N jam di setiap bidang waktu. Misalnya, kedua ujung diatur ke Asia/Bangkok tetapi nilai yang disinkronkan berbeda 1 jam, atau kelompok sumber daya berjalan di Jerman dan default ke Europe/Berlin sementara bisnis Anda memerlukan nilai disimpan dalam UTC. Dalam kasus seperti ini, pilih zona waktu yang ingin Anda gunakan di pengaturan lanjutan tugas.
Catatan
Mengubah zona waktu penjadwalan tidak memengaruhi zona waktu yang digunakan oleh proses Integrasi Data. Kedua pengaturan ini independen. Jika kolom tanggal masih mengembalikan nilai yang tidak diharapkan setelah Anda menyesuaikan zona waktu penjadwalan, atur zona waktu secara eksplisit di pengaturan lanjutan tugas sinkronisasi batch juga.
Pengaturan zona waktu defaultnya GMT+8. Biarkan apa adanya saat bidang waktu disinkronkan dengan benar, dan atur ke zona waktu yang diharapkan bisnis Anda hanya saat terjadi offset waktu. Dalam mode skrip, pengaturan ini setara dengan konfigurasi berikut:
"common":{"column":{"timeZone":"Asia/Bangkok"}}
Bagaimana cara menggunakan fungsi TO_TIMESTAMP untuk ekstraksi berbasis waktu inkremental dalam tugas sinkronisasi batch PostgreSQL?
-
Skenario: Saat Anda mengonfigurasi kondisi WHERE atau pernyataan querySql kustom untuk sinkronisasi inkremental dari PostgreSQL, Anda perlu mengonversi parameter waktu berformat string menjadi timestamp untuk perbandingan.
-
Solusi: Gunakan fungsi PostgreSQL standar TO_TIMESTAMP alih-alih fungsi MySQL STR_TO_DATE, karena PostgreSQL dan MySQL menggunakan dialek SQL berbeda untuk mengonversi string tanggal dan waktu. Contoh:
TO_TIMESTAMP('${start_time}', 'YYYYMMDDHH24')
TO_TIMESTAMP('${end_time}', 'YYYYMMDDHH24')
TO_TIMESTAMP mengonversi string dalam format yang ditentukan menjadi objek timestamp, yang kemudian dapat Anda gunakan untuk menyaring baris dalam rentang waktu di kondisi WHERE atau pernyataan querySql.
Oracle
Sinkronisasi batch dari Oracle gagal dengan error: ORA-00932: inconsistent datatypes di klausa WHERE
-
Skenario: Saat tugas sinkronisasi batch membaca data dari Oracle dengan kondisi WHERE, tugas gagal dengan ORA-00932: inconsistent datatypes.
-
Penyebab kemungkinan: Klausa WHERE secara langsung membandingkan kolom DATE Oracle dengan nilai NUMBER, misalnya literal tanggal yang ditulis sebagai angka biasa. Perbandingan ini menyebabkan ketidakcocokan tipe data di Oracle.
-
Solusi: Konversi eksplisit nilai tanggal numerik ke tipe DATE sebelum perbandingan. Misalnya, gunakan TO_DATE('20250611', 'YYYYMMDD') atau literal DATE '2025-06-11' di kondisi WHERE alih-alih membandingkan kolom dengan angka biasa.
RDS
Sinkronisasi batch gagal saat sumber adalah Amazon RDS dengan error: Host is blocked
Saat menghubungkan ke Amazon RDS dan menerima error Host is blocked, nonaktifkan pemeriksaan kesehatan load balancer Amazon. Setelah dinonaktifkan, masalah pemblokiran tidak akan terjadi lagi.
MongoDB
Error saat menambahkan sumber data MongoDB dengan pengguna root
Saat menambahkan sumber data MongoDB, gunakan pengguna yang dibuat di database yang berisi tabel untuk disinkronkan. Pengguna root tidak didukung.
Misalnya, jika Anda ingin mengimpor tabel name, dan tabel name berada di database test, nama database harus test, dan Anda perlu menggunakan username pengguna yang dibuat di database test.
Bagaimana cara menggunakan timestamp di parameter kueri untuk mengimplementasikan sinkronisasi inkremental saat membaca MongoDB?
Anda dapat menggunakan node assignment untuk terlebih dahulu mengonversi nilai tipe tanggal ke timestamp, lalu meneruskan nilai tersebut sebagai parameter input untuk tugas sinkronisasi data MongoDB.
Zona waktu bergeser 8 jam setelah menyinkronkan MongoDB ke sumber data tujuan. Bagaimana cara menanganinya?
Atur zona waktu di konfigurasi MongoDB Reader. Untuk informasi lebih lanjut, lihat MongoDB Reader.
Catatan yang diperbarui di sumber selama pembacaan data MongoDB tidak disinkronkan ke tujuan. Bagaimana cara menanganinya?
Anda dapat menjalankan ulang tugas setelah penundaan tanpa mengubah kondisi kueri, yaitu menunda waktu eksekusi tugas sambil mempertahankan konfigurasi tidak berubah.
Apakah MongoDB Reader peka terhadap huruf besar/kecil?
Saat membaca data, Column.name yang dikonfigurasi pengguna peka terhadap huruf besar/kecil. Konfigurasi yang salah menyebabkan data baca menjadi null. Misalnya:
-
Data sumber MongoDB:
{
"MY_NAME": "zhangsan"
}
-
Konfigurasi kolom tugas sinkronisasi:
{
"column":
[
{
"name": "my_name"
}
]
}
Karena huruf besar/kecil konfigurasi kolom tidak cocok dengan data sumber, pembacaan data gagal.
Bagaimana cara mengonfigurasi timeout MongoDB Reader?
Parameter konfigurasi timeout adalah cursorTimeoutInMs, yang defaultnya 600000 ms (10 menit). Parameter ini menentukan total waktu yang dihabiskan Server MongoDB untuk mengeksekusi kueri, tidak termasuk waktu transfer data. Jika pembacaan data penuh besar, error berikut dapat terjadi: MongoDBReader$Task - operation exceeded time limitcom.mongodb.MongoExecutionTimeoutException: operation exceeded time limit.
Membaca MongoDB gagal dengan error: no master
Saat ini, tugas sinkronisasi DataWorks tidak mendukung pembacaan data dari node sekunder. Jika Anda mengonfigurasi node sekunder untuk pembacaan, error berikut terjadi: no master.
Membaca MongoDB gagal dengan error: MongoExecutionTimeoutException: operation exceeded time limit
Sinkronisasi batch membaca dari MongoDB gagal dengan error: DataXException: operation exceeded time limit
Tingkatkan konkurensi tugas dan BatchSize baca.
Tugas sinkronisasi MongoDB gagal dengan error: no such cmd splitVector
Sinkronisasi batch MongoDB gagal dengan error: Setelah menerapkan pembaruan, bidang (immutable) '_id' ditemukan telah diubah menjadi _id: "2"
Redis
Menulis ke Redis dalam mode hash gagal dengan error: Code:[RedisWriter-04], Description:[Dirty data]. - source column number is in valid!
-
Penyebab:
Saat Redis menggunakan mode hash untuk penyimpanan, atribut dan nilai hash harus muncul berpasangan. Misalnya: odpsReader: "column":[ "id", "name", "age", "address" ]. Di tujuan, jika RedisWriter dikonfigurasi sebagai: "keyIndexes":[ 0, 1], maka di Redis, id dan name berfungsi sebagai kunci, age berfungsi sebagai atribut, dan address berfungsi sebagai nilai dalam tipe hash. Jika hanya dua kolom dikonfigurasi di sumber ODPS, mode hash tidak dapat digunakan untuk penyimpanan Redis, dan pengecualian ini dilemparkan.
-
Solusi:
Jika Anda hanya ingin menggunakan dua kolom, konfigurasikan mode String Redis untuk penyimpanan. Jika Anda harus menggunakan mode hash, konfigurasikan minimal tiga kolom di sisi sumber.
OSS
Bagaimana cara menangani data kotor saat membaca file CSV dengan pemisah multi-karakter?
-
Gejala:
Saat mengonfigurasi tugas sinkronisasi batch untuk membaca data dari penyimpanan file seperti OSS atau FTP, jika file dalam format CSV dan menggunakan beberapa karakter sebagai pemisah kolom (seperti |,, ##, atau ;;), tugas mungkin gagal dengan error data kotor. Di log waktu proses, Anda akan melihat error IndexOutOfBoundsException bersama dengan data kotor.
-
Analisis akar penyebab:
Reader csv bawaan ("fileFormat": "csv") di DataWorks memiliki keterbatasan saat memproses pemisah multi-karakter, yang menyebabkan pembagian kolom tidak akurat untuk baris data.
-
Solusi:
-
Mode wizard: Ganti tipe teks ke teks dan tentukan secara eksplisit pemisah multi-karakter.
-
Mode skrip: Ubah "fileFormat": "csv" menjadi "fileFormat": "text" dan atur pemisah dengan benar: "fieldDelimiter":"<multi-char delimiter>", "fieldDelimiterOrigin":"<multi-char delimiter>".
Apakah ada batas jumlah file saat membaca file OSS?
Sinkronisasi batch itu sendiri tidak membatasi jumlah file yang dibaca oleh plugin OSS Reader. Batasan utama berasal dari resource CU yang dikonsumsi oleh tugas. Membaca terlalu banyak file sekaligus dapat dengan mudah menyebabkan error kehabisan memori. Oleh karena itu, kami tidak menyarankan mengonfigurasi parameter object sebagai: *, untuk mencegah error OutOfMemoryError: Java heap space .
Bagaimana cara menghapus string acak dari nama file saat menulis ke OSS?
OSS Writer menulis nama file dengan mensimulasikan direktori menggunakan nama objek. OSS memiliki batasan pada nama objek. Saat menggunakan "object": "datax", objek yang ditulis dimulai dengan datax, dengan akhiran string acak ditambahkan. Jumlah file ditentukan oleh jumlah tugas pemisah aktual.
Jika Anda tidak memerlukan akhiran UUID acak, konfigurasikan "writeSingleObject" : "true". Untuk informasi lebih lanjut, lihat deskripsi parameter writeSingleObject di dokumentasi OSS Writer.
Membaca data OSS gagal dengan error: AccessDenied The bucket you access does not belong to you.
Hive
Sinkronisasi batch ke Hive lokal gagal dengan error: Could not get block locations.
-
Analisis akar penyebab:
Parameter mapred.task.timeout mungkin diatur terlalu rendah, menyebabkan Hadoop menghentikan tugas dan membersihkan direktori sementara, membuat data sementara tidak tersedia.
-
Solusi:
Di bagian sumber data tugas sinkronisasi batch, jika Hive read methods diatur ke Read Data Based on Hive JDBC (Supports Conditional Filtering), atur nilai parameter mapred.task.timeout di Session Configuration, misalnya, mapred.task.timeout=600000.
DataHub
Bagaimana cara menangani kegagalan penulisan saat volume data dalam satu penulisan ke DataHub melebihi batas?
-
Pesan error:
ERROR JobContainer - Exception when job runcom.alibaba.datax.common.exception.DataXException: Code:[DatahubWriter-04], Description:[Failed to write data.]. - com.aliyun.datahub.exception.DatahubServiceException: Record count 12498 exceed max limit 10000 (Status Code: 413; Error Code: TooLargePayload; Request ID: 20201201004200a945df0bf8e11a42)
-
Penyebab kemungkinan:
Error terjadi karena volume data yang dikirimkan DataX ke DataHub dalam satu batch melebihi batas DataHub. Parameter konfigurasi utama yang memengaruhi volume data yang dikirimkan ke DataHub adalah:
-
maxCommitSize: Menentukan ukuran data buffer terakumulasi. Saat data terakumulasi mencapai maxCommitSize (dalam MB), data dikirimkan ke tujuan dalam satu batch. Defaultnya 1 MB (1.048.576 byte).
-
batchSize: Menentukan jumlah catatan data buffer terakumulasi untuk DataX-On-Flume. Saat jumlah catatan terakumulasi mencapai batchSize, data dikirimkan ke tujuan dalam satu batch.
-
Solusi:
Kurangi nilai parameter maxCommitSize dan batchSize.
LogHub
Kolom memiliki data di LogHub tetapi kosong setelah sinkronisasi
Plugin ini peka terhadap huruf besar/kecil untuk nama kolom. Periksa konfigurasi kolom LogHub Reader.
Data hilang saat membaca dari LogHub
Integrasi Data menggunakan waktu saat data masuk LogHub. Periksa konsol LogHub untuk memverifikasi apakah kolom metadata receive_time berada dalam rentang waktu yang dikonfigurasi untuk tugas.
Kolom yang dibaca selama pemetaan kolom LogHub tidak sesuai dengan ekspektasi
Jika ini terjadi, edit secara manual konfigurasi kolom di UI.
Mengapa nilai __time__ yang dibaca berada di luar rentang waktu yang dikonfigurasi, atau mengapa jumlah catatan dari konsol untuk rentang waktu yang sama berbeda dari tugas sinkronisasi?
Waktu mulai dan waktu akhir yang dikonfigurasi dalam tugas sinkronisasi batch digunakan oleh Reader untuk memanggil API SLS GetCursor untuk menentukan kursor awal dan akhir. Waktu ini digunakan untuk menentukan rentang baca berdasarkan waktu penerimaan sisi server SLS. Tugas benar-benar membaca data dalam rentang kursor, yang tidak setara dengan penyaringan berdasarkan kolom output __time__.
Kolom output __time__ berasal dari log.getTime() dari setiap entri log, yang merepresentasikan waktu log sendiri. Kueri konsol SLS biasanya menggunakan rentang waktu kueri, pernyataan kueri, dan kolom indeks untuk statistik, umumnya berdasarkan waktu log __time__. Oleh karena itu, meskipun tugas sinkronisasi dan konsol menggunakan nilai waktu yang sama, rentang __time__ atau jumlah catatan mungkin berbeda jika kedua sisi menggunakan metrik waktu yang berbeda.
Skenario umum:
-
Saat pengumpulan atau pengiriman log tertunda, log historis diisi kembali, atau jam klien tidak akurat, waktu log __time__ mungkin lebih awal atau lebih lambat daripada waktu penerimaan sisi server SLS. Tugas sinkronisasi menentukan kursor berdasarkan waktu penerimaan sisi server, sedangkan konsol mengkueri berdasarkan __time__, yang mungkin menghasilkan hasil berbeda.
-
Saat data ditulis ke LogStore lain melalui transformasi data SLS, jika pernyataan transformasi tidak secara eksplisit mengatur __time__, __time__ log target biasanya mempertahankan waktu log sumber daripada waktu eksekusi transformasi. Dalam kasus ini, tugas sinkronisasi mungkin membaca batch data ini dalam rentang waktu saat transformasi menulis ke LogStore target. Namun, saat mengkueri konsol LogStore target berdasarkan waktu eksekusi transformasi atau rentang waktu saat ini, log ini mungkin tidak ditemukan. Anda perlu mengkueri berdasarkan rentang waktu aktual __time__ log.
-
Saat pernyataan kueri konsol, kolom indeks, rentang waktu, dan pernyataan penyaringan aturan (SPL) dalam tugas sinkronisasi tidak konsisten, jumlah catatan mungkin berbeda meskipun metrik waktu sama.
Saran troubleshooting:
-
Verifikasi apakah rentang waktu kueri konsol, pernyataan kueri, kolom indeks, dan waktu mulai/akhir serta pernyataan penyaringan aturan (SPL) dalam tugas sinkronisasi konsisten.
-
Sertakan kedua __time__ (waktu log) dan __tag__:__receive_time__ (bidang yang dapat diamati untuk waktu penerimaan sisi server SLS, yang memerlukan bidang ini ada di tag log) dalam konfigurasi column untuk membandingkan waktu log dengan waktu penerimaan sisi server.
-
Jika data berasal dari transformasi data SLS, periksa apakah pernyataan transformasi secara eksplisit mengatur __time__, dan sesuaikan rentang waktu kueri konsol di LogStore target berdasarkan __time__ aktual.
-
Jika rekonsiliasi berdasarkan waktu log diperlukan di hilir, lakukan filter atau agregasi berdasarkan __time__ setelah data ditulis ke tujuan.
Contoh: __time__ log sumber adalah 2026-06-01 10:00:00. Tugas transformasi data SLS menulis log ini ke LogStore target pada 2026-06-12 10:00:00 tanpa secara eksplisit memodifikasi __time__. __time__ log target tetap 2026-06-01 10:00:00. Jika waktu mulai dan akhir tugas mencakup 2026-06-12 10:00:00, tugas mungkin membaca log ini. Namun, saat mengkueri konsol LogStore target sekitar 2026-06-12 10:00:00 dengan __time__ sebagai filter, log ini mungkin tidak ditemukan. Dalam kasus ini, sesuaikan waktu kueri konsol sekitar 2026-06-01 10:00:00, atau atur secara eksplisit __time__ log target selama transformasi data sesuai kebutuhan.
Mengapa kolom memiliki nilai dalam kueri konsol LogHub tetapi kosong setelah sinkronisasi?
Reader mencocokkan nama kolom dari bidang konten log yang ditarik aktual, pemetaan meta-field bawaan Reader, dan LogTag berdasarkan konfigurasi column. Nama kolom peka terhadap huruf besar/kecil. Jika tidak ditemukan kecocokan, null dikeluarkan tanpa error.
Penyebab umum meliputi:
-
Nama kolom yang dikonfigurasi di column memiliki huruf besar/kecil berbeda dari kunci bidang log asli.
-
Konsol menampilkan alias dari analisis kueri, bidang indeks, atau bidang yang diperluas JSON, yang berbeda dari kunci log asli yang sebenarnya diambil Reader.
-
Kolom sebenarnya berasal dari LogTag dan perlu dikonfigurasi sebagai __tag__:<tagKey>.
-
Setelah mengonfigurasi pernyataan penyaringan aturan (SPL) atau transformasi, nama bidang output tidak sepenuhnya cocok dengan konfigurasi column.
Saat troubleshooting, pertama-tama periksa kolom tabel sumber dan pratinjau data di halaman visual untuk mengonfirmasi bidang yang sebenarnya diidentifikasi Reader. Dalam mode skrip, Anda juga dapat sementara mengatur column ke ["*"] untuk melihat kunci bidang konten log aktual yang diambil Reader, lalu konfigurasikan column berdasarkan kunci asli.
Lindorm
Saat menggunakan mode bulk Lindorm untuk menulis data, apakah data historis diganti setiap kali?
Perilakunya sama dengan logika penulisan API: data di baris dan kolom yang sama ditimpa, dan data lain tetap tidak berubah.
Elasticsearch
Bagaimana cara mengkueri semua kolom di indeks ES?
Ambil pemetaan indeks ES menggunakan perintah curl dan ekstrak semua kolom dari pemetaan.
-
Perintah shell untuk mengkueri:
//es7
curl -u username:password --request GET 'http://esxxx.elasticsearch.aliyuncs.com:9200/indexname/_mapping'
//es6
curl -u username:password --request GET 'http://esxxx.elasticsearch.aliyuncs.com:9200/indexname/typename/_mapping'
-
Mengambil kolom dari hasil:
{
"indexname": {
"mappings": {
"typename": {
"properties": {
"field1": {
"type": "text"
},
"field2": {
"type": "long"
},
"field3": {
"type": "double"
}
}
}
}
}
}
Kolom dan definisi atribut di bawah properties dalam respons adalah semua kolom indeks. Misalnya, indeks di atas berisi tiga kolom: field1, field2, dan field3.
Bagaimana cara mengonfigurasi nama indeks saat menyinkronkan data dari ES ke sumber data lain dengan nama indeks harian berbeda?
Anda dapat menambahkan parameter penjadwalan tanggal ke konfigurasi indeks untuk secara otomatis menghitung string indeks berdasarkan tanggal berbeda, memungkinkan perubahan otomatis nama indeks Elasticsearch Reader. Konfigurasi melibatkan tiga langkah: mendefinisikan parameter tanggal, mengonfigurasi parameter indeks, dan menyebarkan serta menjalankan tugas.
-
Definisikan parameter tanggal: Di pengaturan jadwal tugas sinkronisasi, tambahkan parameter untuk mendefinisikan parameter tanggal. Konfigurasi var1 berikut merepresentasikan waktu eksekusi tugas (hari ini), dan var2 merepresentasikan tanggal bisnis (hari sebelumnya).
-
Konfigurasikan parameter indeks: Beralih tugas ke mode skrip dan konfigurasikan indeks Elasticsearch Reader menggunakan format: ${variable_name}, seperti yang ditunjukkan di bawah.
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "elasticsearch",
"parameter": {
"retryCount": 30,
"scroll": "10m",
"column": [
"col18",
"col17"
],
"index": "esstress_1_${var1}_${var2}",
"pageSize": 100,
"sort": {
"_id": "asc"
},
-
Sebarkan dan jalankan tugas: Setelah verifikasi, kirim dan sebarkan tugas ke Operation Center, dan jalankan sebagai jadwal periodik atau tugas pengisian kembali data.
-
Klik tombol Running with Parameters untuk langsung menjalankan tugas untuk verifikasi. Running with parameters menggantikan parameter sistem penjadwalan yang digunakan dalam konfigurasi tugas. Setelah eksekusi, periksa log untuk memverifikasi apakah indeks yang disinkronkan sesuai ekspektasi.
Catatan
Saat running with parameters, masukkan nilai parameter secara langsung untuk pengujian penggantian.
-
Jika langkah sebelumnya diverifikasi sesuai ekspektasi, konfigurasi tugas selesai. Klik Save lalu Commit untuk mengirimkan tugas sinkronisasi ke lingkungan produksi.
Untuk ruang kerja mode standar, klik Deploy untuk membuka Deployment Center untuk menyebarkan tugas sinkronisasi ke lingkungan produksi.
-
Hasil: Berikut menunjukkan konfigurasi dan hasil indeks waktu proses aktual.
Konfigurasi indeks skrip: "index": "esstress_1_${var1}_${var2}".
Indeks waktu proses diselesaikan menjadi: esstress_1_20230106_20230105.
],
"full":false,
"gmtCreate":"2022-07-18 14:47:18",
"gmtModified":"2022-07-18 14:47:18",
"index":"esstress_1_20230106_20230105",
"instanceId":"es-cn-2r42se1je001zwmt0",
"ownerId":"1224800975333052",
"pageSize":100,
"password":"********",
"privateNetworkIpWhiteList":[
"0.0.0.0/0"
],
Bagaimana cara Elasticsearch Reader menyinkronkan properti bidang Object atau Nested? (Misalnya, sinkronkan object.field1)
Untuk menyinkronkan properti bidang objek, Anda hanya dapat menggunakan mode skrip. Dalam mode skrip, konfigurasikan multi sebagai berikut, dan tentukan kolom menggunakan format attribute.sub-attribute.
"multi":{
"multi":true
}
Lihat contoh berikut untuk konfigurasi:
#Contoh:
##Data di Elasticsearch
"hits": [
{
"_index": "mutiltest_1",
"_type": "_doc",
"_id": "7XAOOoMB4GR_1Dmrrust",
"_score": 1.0,
"_source": {
"level1": {
"level2": [
{
"level3": "testlevel3_1"
},
{
"level3": "testlevel3_2"
}
]
}
}
}
]
##Konfigurasi Reader
"parameter": {
"column": [
"level1",
"level1.level2",
"level1.level2[0]"
],
"multi":{
"multi":true
}
}
##Hasil Writer: 1 baris dengan 3 kolom, urutan kolom sesuai konfigurasi reader
COLUMN VALUE
level1: {"level2":[{"level3":"testlevel3_1"},{"level3":"testlevel3_2"}]}
level1.level2: [{"level3":"testlevel3_1"},{"level3":"testlevel3_2"}]
level1.level2[0]: {"level3":"testlevel3_1"}
Setelah menyinkronkan data tipe string dari ODPS ke ES, tanda kutip tampak hilang di kedua sisi. Bagaimana cara menanganinya? Dapatkah string tipe JSON dari sumber disinkronkan sebagai objek ES NESTED?
-
Tanda kutip ganda ekstra yang ditampilkan sebelum dan sesudah karakter adalah masalah tampilan di Kibana. Data aktual tidak memiliki tanda kutip ganda di awal dan akhir. Gunakan perintah curl atau Postman untuk melihat data aktual. Perintah curl untuk mengambil data adalah sebagai berikut:
//es7
curl -u username:password --request GET 'http://esxxx.elasticsearch.aliyuncs.com:9200/indexname/_mapping'
//es6
curl -u username:password --request GET 'http://esxxx.elasticsearch.aliyuncs.com:9200/indexname/typename/_mapping'
-
Anda dapat mengonfigurasi tipe kolom tulis ES sebagai nested untuk menyinkronkan data string tipe JSON dari ODPS ke ES dalam format nested. Contoh berikut menyinkronkan kolom name ke ES dalam format nested.
-
Konfigurasi sinkronisasi: Konfigurasikan tipe name sebagai nested.
-
Hasil sinkronisasi: name adalah tipe objek nested.
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "test",
"_type": "_doc",
"_id": "bb5oqoUBlqHPyI16REEQ",
"_score": 1.0,
"_source": {
"name": [
{
"fields1": "value"
}
]
}
}
]
}
Data sumber adalah string "[1,2,3,4,5]". Bagaimana cara menyinkronkannya ke ES sebagai array?
Ada dua metode konfigurasi untuk menulis tipe array ke ES. Pilih metode sinkronisasi yang sesuai berdasarkan format data sumber.
-
Tulis ke ES sebagai tipe array dengan mengurai data sumber sebagai JSON. Misalnya, jika data sumber adalah "[1,2,3,4,5]", konfigurasikan json_array=true untuk mengurai data sumber dan menulisnya ke kolom ES sebagai array. Konfigurasikan ColumnList dengan json_array=true.
-
Tulis ke ES sebagai tipe array dengan mengurai data sumber dengan pemisah. Misalnya, jika data sumber adalah "1,2,3,4,5", konfigurasikan pemisah splitter="," untuk mengurai dan menulis data ke kolom ES sebagai array.
-
Batasan:
-
Tugas hanya mendukung satu pemisah. Splitter bersifat global unik dan tidak mendukung pemisah berbeda untuk kolom array berbeda. Misalnya, untuk kolom sumber col1="1,2,3,4,5" , col2="6-7-8-9-10", splitter tidak dapat dikonfigurasi secara terpisah untuk setiap kolom.
-
Splitter dapat dikonfigurasi sebagai ekspresi reguler. Misalnya, jika nilai kolom sumber adalah "6-,-7-,-8+,*9-,-10", Anda dapat mengonfigurasi splitter:".,." dan ini didukung dalam mode wizard.
-
Konfigurasi mode wizard: splitter: default "-,-"
-
Konfigurasi mode skrip:
"parameter" : {
"column": [
{
"name": "col1",
"array": true,
"type": "long"
}
],
"splitter":","
}
Saat menulis data ke ES, permintaan tanpa autentikasi dilakukan terlebih dahulu, tetapi autentikasi masih diperlukan, menyebabkan permintaan gagal. Akibatnya, semua data permintaan yang dikirimkan dicatat, menghasilkan volume besar log audit setiap hari. Bagaimana cara menanganinya?
-
Analisis akar penyebab:
HttpClient menetapkan bahwa setiap kali koneksi dibuat, permintaan tanpa autentikasi dilakukan terlebih dahulu. Setelah server mengembalikan persyaratan autentikasi (menentukan metode autentikasi berdasarkan respons), permintaan terautentikasi kemudian dilakukan. Karena setiap penulisan data ES memerlukan pembuatan koneksi, setiap penulisan data menghasilkan satu permintaan tanpa autentikasi, yang kemudian dicatat dalam log audit.
-
Solusi:
Tambahkan konfigurasi "preemptiveAuth":true dalam mode skrip.
Bagaimana cara menyinkronkan data ke ES sebagai tipe Date?
Ada dua metode untuk mengonfigurasi penulisan tanggal. Pilih yang sesuai berdasarkan kebutuhan Anda.
-
Tulis langsung ke kolom Date ES berdasarkan konten yang dibaca dari Reader:
-
Konfigurasikan origin:true untuk menulis konten yang dibaca langsung ke ES.
-
Konfigurasikan "format" untuk menentukan atribut format untuk kolom saat membuat pemetaan melalui penulisan ES.
"parameter" : {
"column": [
{
"name": "col_date",
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss",
"origin": true
}
]
}
-
Konversi zona waktu: Jika Anda memerlukan Integrasi Data untuk melakukan konversi zona waktu, tambahkan parameter Timezone.
"parameter" : {
"column": [
{
"name": "col_date",
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss",
"Timezone": "UTC"
}
]
}
Elasticsearch Writer gagal saat menentukan versi eksternal. Bagaimana cara menanganinya?
-
tipe:version dikonfigurasi, tetapi ES tidak mendukung menentukan versi eksternal.
"column":[
{
"name":"id",
"type":"version"
},
]
-
Solusi:
Hapus konfigurasi "type":"version". Elasticsearch Writer tidak mendukung spesifikasi versi eksternal.
Sinkronisasi batch membaca dari Elasticsearch gagal dengan error: ERROR ESReaderUtil - ES_MISSING_DATE_FORMAT, Unknown date value. please add "dataFormat". sample value:
Sinkronisasi batch membaca dari Elasticsearch gagal dengan error: com.alibaba.datax.common.exception.DataXException: Code:[Common-00].
-
Analisis akar penyebab:
Karena batasan kata kunci fastjson, indeks atau kolom mungkin berisi kata kunci seperti $ref.
-
Solusi:
Elasticsearch Reader tidak mendukung sinkronisasi indeks yang berisi kata kunci $ref di nama kolom. Untuk informasi lebih lanjut, lihat Elasticsearch Reader.
Sinkronisasi batch menulis ke Elasticsearch gagal dengan error: version_conflict_engine_exception.
-
Analisis akar penyebab:
Ini memicu mekanisme kunci optimis ES. Nomor versi saat ini seharusnya satu nilai, tetapi nomor versi yang diteruskan oleh perintah pembaruan berbeda, menyebabkan konflik versi. Selama pembaruan, orang lain menghapus data indeks.
-
Solusi:
-
Periksa apakah operasi penghapusan data sedang terjadi.
-
Ubah metode sinkronisasi tugas dari Update ke Index.
Sinkronisasi batch menulis ke Elasticsearch gagal dengan error: illegal_argument_exception.
-
Analisis akar penyebab:
Saat mengonfigurasi atribut lanjutan seperti similarity dan properties untuk kolom, other_params diperlukan agar plugin mengenalinya.
"parameter":{
"__datasource__type":"elasticsearch",
"actionType":"index",
"aliasMode":"append",
"batchSize":1024,
"cleanup":false,
"column":[
{
"name":"id",
"type":"long"
},
{
"name":"dim1_code",
"type":"keyword"
},
{
"analyzer":"china",
"name":"dim1_name",
"similarity":"len_similarity",
"type":"text"
},
{
"analyzer":"china",
"name":"dim1_val",
"similarity":"len_similarity",
"type":"text"
},
{
"name":"dim1_sort",
"type":"long"
}
-
Solusi:
Konfigurasikan other_params dalam konfigurasi kolom, dan tambahkan similarity di dalam other_params, sebagai berikut:
{"name":"dim2_name",...,"other_params":{"similarity":"len_similarity"}}
Sinkronisasi batch data kolom Array ODPS ke Elasticsearch gagal dengan error: dense_vector
-
Analisis akar penyebab:
Saat ini, sinkronisasi batch menulis ke Elasticsearch tidak mendukung tipe dense_vector. Hanya tipe berikut yang didukung:
ID,PARENT,ROUTING,VERSION,STRING,TEXT,KEYWORD,LONG,
INTEGER,SHORT,BYTE,DOUBLE,FLOAT,DATE,BOOLEAN,BINARY,
INTEGER_RANGE,FLOAT_RANGE,LONG_RANGE,DOUBLE_RANGE,DATE_RANGE,
GEO_POINT,GEO_SHAPE,IP,IP_RANGE,COMPLETION,TOKEN_COUNT,OBJECT,NESTED;
-
Solusi:
Untuk tipe yang tidak didukung oleh Elasticsearch Writer, tangani sebagai berikut:
-
Kami tidak menyarankan menggunakan Elasticsearch Writer untuk membuat pemetaan indeks. Gunakan pemetaan kustom sebagai gantinya.
-
Ubah tipe yang sesuai menjadi NESTED.
-
Modifikasi konfigurasi menjadi: dynamic = true, cleanup=false.
Mengapa konfigurasi Settings tidak berlaku saat Elasticsearch Writer membuat indeks?
-
Penyebab:
#Konfigurasi salah
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
#Konfigurasi benar
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
-
Solusi:
Settings hanya berlaku saat indeks dibuat, yang mencakup dua kasus: indeks tidak ada, atau cleanup=true. Saat cleanup=true, konfigurasi Settings tidak perlu menyertakan "index".
Dalam indeks kustom, tipe atribut nested adalah keyword, tetapi mengapa tipe menjadi keyword setelah pembuatan otomatis? (Pembuatan otomatis mengacu pada menjalankan tugas sinkronisasi dengan cleanup=true)
#Pemetaan asli
{
"name":"box_label_ret",
"properties":{
"box_id":{
"type":"keyword"
}
}
#Setelah dibangun ulang dengan cleanup=true, menjadi
{
"box_label_ret": {
"properties": {
"box_id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}}}}
}
-
Analisis akar penyebab:
Untuk tipe nested, Elasticsearch Writer hanya menggunakan pemetaan tingkat atas dan membiarkan ES menyesuaikan otomatis tipe kompleks nested. Perubahan tipe atribut menjadi text dengan penambahan fields:keyword adalah perilaku penyesuaian otomatis ES dan tidak memengaruhi penggunaan ES. Jika Anda memerlukan format pemetaan spesifik, lihat Elasticsearch Writer.
-
Solusi:
Buat pemetaan indeks ES yang diharapkan sebelum sinkronisasi, lalu atur cleanup ke false dalam tugas sinkronisasi ES dan jalankan tugas.
Kafka
endDateTime dikonfigurasi untuk menentukan rentang cutoff untuk data yang disinkronkan dari Kafka, tetapi data di luar waktu ini ditemukan di sumber data tujuan
Kafka Reader membaca data dalam batch. Dalam satu batch data, jika ada catatan yang melebihi endDateTime, sinkronisasi berhenti. Namun, data yang melebihi endDateTime dalam batch tersebut tetap ditulis ke sumber data tujuan.
-
Anda juga dapat menggunakan konfigurasi skipExceedRecord untuk menentukan apakah akan menyinkronkan data yang melebihi. Untuk penggunaan detail, lihat Kafka Reader. [Mengatur ini untuk tidak menyinkronkan tidak disarankan karena dapat menyebabkan kehilangan data.]
-
Anda dapat mengonfigurasi parameter max.poll.records Kafka untuk menentukan jumlah data yang ditarik dalam setiap batch. Dikombinasikan dengan konkurensi, Anda dapat mengontrol jumlah data yang mungkin melebihi batas. Volume data yang melebihi < max.poll.records × konkurensi.
Mengapa tugas terus berjalan tanpa membaca data atau selesai saat ada sedikit data di Kafka?
-
Analisis akar penyebab:
Saat volume data kecil atau data tidak merata, beberapa partisi Kafka mungkin tidak memiliki data baru yang masuk atau data baru mungkin tidak mencapai offset akhir yang ditentukan. Karena kondisi keluar tugas memerlukan semua partisi mencapai offset akhir yang ditentukan, partisi "idle" ini tidak dapat memenuhi kondisi, menghalangi seluruh tugas menyelesaikan secara normal.
-
Solusi:
Atur kebijakan akhir sinkronisasi ke 1 menit tanpa membaca data baru (dalam mode skrip, atur stopWhenPollEmpty ke true dan stopWhenReachEndOffset ke true). Tugas keluar setelah membaca data offset terbaru dari semua partisi, menghindari berjalan idle. Namun, catatan dengan timestamp lebih awal dari offset akhir yang dikonfigurasi yang ditulis setelah tugas berakhir tidak akan dikonsumsi.
RestAPI
RestAPI Writer gagal dengan error: The JSON string found via path:[] is not in array format
RestAPI Writer menyediakan dua mode tulis. Saat menyinkronkan beberapa catatan, atur dataMode ke multiData dan tambahkan parameter dataPath:"data.list" dalam skrip. Untuk informasi lebih lanjut, lihat RestAPI Writer.
Penting
Saat mengonfigurasi kolom, jangan tambahkan awalan "data.list".
Konfigurasi OTS Writer
Bagaimana cara mengonfigurasi OTS Writer saat menulis data ke tabel tujuan yang berisi kolom kunci utama auto-increment?
-
Konfigurasi OTS Writer harus mencakup dua persyaratan berikut:
"newVersion": "true",
"enableAutoIncrement": "true",
-
Nama kolom kunci utama auto-increment tidak boleh dikonfigurasi di OTS Writer.
-
Jumlah entri primaryKey + jumlah entri column yang dikonfigurasi di OTS Writer harus sama dengan jumlah kolom dalam data OTS Reader hulu.
Konfigurasi model deret waktu
Bagaimana memahami kolom _tag dan is_timeseries_tag dalam konfigurasi model deret waktu?
Contoh: Catatan data memiliki tiga tag: [phone=xiaomi, RAM=8G, camera=LEICA].
Nama tabel kustom
Bagaimana cara menyesuaikan nama tabel untuk tugas sinkronisasi batch?
Jika nama tabel Anda mengikuti pola reguler, seperti orders_20170310, orders_20170311, dan orders_20170312, di mana tabel dibedakan berdasarkan tanggal dan memiliki struktur yang sama, Anda dapat menggunakan parameter penjadwalan (Konfigurasi tugas sinkronisasi dalam mode skrip) untuk menyesuaikan nama tabel dan secara otomatis membaca data tabel hari sebelumnya dari database sumber setiap pagi hari.
Misalnya, jika hari ini 15 Maret 2017, sistem secara otomatis mengimpor data dari tabel orders_20170314 di database sumber, dan seterusnya.
Dalam mode skrip, ubah nama tabel sumber menjadi variabel, seperti orders_${tablename}. Karena tabel dibedakan berdasarkan tanggal dan Anda perlu membaca data hari sebelumnya setiap hari, tetapkan nilai variabel dalam konfigurasi parameter tugas sebagai tablename=${yyyymmdd}.
Menambahkan kolom ke tabel
Bagaimana cara menangani penambahan kolom (modifikasi) di tabel sumber untuk sinkronisasi batch?
Buka halaman konfigurasi tugas sinkronisasi, modifikasi pemetaan kolom untuk memperbarui kolom yang berubah dalam konfigurasi tugas, lalu kirim ulang dan jalankan tugas agar perubahan berlaku.
Masalah konfigurasi tugas
Bagaimana cara menangani situasi di mana saya tidak dapat melihat semua tabel saat mengonfigurasi node sinkronisasi batch?
Saat mengonfigurasi node sinkronisasi batch, bagian Sumber secara default hanya menampilkan 25 tabel pertama dari sumber data yang dipilih. Jika ada lebih banyak tabel, Anda dapat memasukkan nama tabel untuk mencari atau menggunakan mode skrip untuk pengembangan.
Kata kunci nama tabel/kolom
Bagaimana cara menangani kegagalan tugas sinkronisasi yang disebabkan oleh konflik kata kunci dalam nama tabel atau kolom?
-
Penyebab error: Konfigurasi kolom berisi kata kunci yang dicadangkan, atau konfigurasi kolom berisi kolom yang dimulai dengan angka.
-
Solusi: Beralih tugas sinkronisasi Integrasi Data ke mode skrip dan escape kolom khusus dalam konfigurasi kolom. Untuk mengonfigurasi tugas dalam mode skrip, lihat Konfigurasi tugas sinkronisasi dalam mode skrip.
-
Karakter escape untuk MySQL adalah `keyword`.
-
Karakter escape untuk Oracle dan PostgreSQL adalah "keyword".
-
Karakter escape untuk SQL Server adalah [keyword].
Contoh MySQL:
{
"stepType": "mysql",
"parameter": {
"envType": 0,
"datasource": "wpw_test_mysql",
"column": [
"id",
"`order`",
"`add`"
],
"connection": [
{
"datasource": "wpw_test_mysql",
"table": [
"abc"
]
}
-
Mengambil sumber data MySQL sebagai contoh:
-
Jalankan pernyataan berikut untuk membuat tabel bernama aliyun: create table aliyun (`table` int ,msg varchar(10));
-
Jalankan pernyataan berikut untuk membuat view dan memberikan alias ke kolom tabel: create view v_aliyun as select `table` as col1,msg as col2 from aliyun;
Catatan
-
table adalah kata kunci MySQL. Selama sinkronisasi data, kode yang digabungkan menyebabkan error. Buat view dan berikan alias ke kolom tabel.
-
Kami tidak menyarankan menggunakan kata kunci sebagai nama kolom tabel.
-
Setelah menjalankan pernyataan di atas, gunakan view v_aliyun alih-alih tabel aliyun saat mengonfigurasi tugas sinkronisasi.
Pemetaan kolom
Tugas sinkronisasi batch gagal dengan error: plugin xx tidak menentukan kolom
Error ini mungkin terjadi karena pemetaan kolom tugas sinkronisasi tidak dikonfigurasi dengan benar, atau plugin tidak memiliki kolom yang dikonfigurasi dengan benar.
-
Periksa apakah pemetaan kolom dikonfigurasi.
-
Periksa apakah plugin memiliki kolom yang dikonfigurasi dengan benar.
Sumber data tidak terstruktur: Bagaimana cara menangani masalah di mana kolom tidak dapat dipetakan setelah mengklik pratinjau data?
-
Gejala:
Saat Anda mengklik Preview Data, muncul pesan serupa berikut, menunjukkan bahwa ukuran byte kolom melebihi batas.
Pesan error adalah "Maximum column length of 1,000 exceeded in column 6 in record 1. Set the SafetySwitch property to false if you're expecting column lengths greater than 100,000 characters to avoid this error."
-
Penyebab: Untuk mencegah OOM, layanan sumber data memeriksa panjang kolom saat memproses permintaan pratinjau data. Jika satu kolom melebihi 1000 byte, pesan di atas muncul. Pesan ini tidak memengaruhi eksekusi tugas aktual. Anda dapat mengabaikan error ini dan menjalankan tugas sinkronisasi batch secara langsung.
Catatan
Jika file ada dan konektivitas normal, situasi berikut juga dapat menyebabkan pratinjau data gagal:
-
Satu baris dalam file melebihi batas ukuran byte 10 MB. Dalam kasus ini, tidak ada data yang ditampilkan, mirip dengan pesan di atas.
-
Satu baris dalam file melebihi batas jumlah kolom 1000 kolom. Dalam kasus ini, hanya 1000 kolom pertama yang ditampilkan, dengan pesan ditunjukkan di kolom ke-1001.
Ubah TTL
Apakah TTL tabel yang tersinkronisasi hanya dapat dimodifikasi menggunakan pernyataan ALTER?
TTL diatur di tingkat tabel. Tidak ada opsi TTL dalam konfigurasi tugas sinkronisasi.
Agregasi fungsi
Saat menyinkronkan melalui API, apakah mendukung penggunaan fungsi sisi sumber (seperti MaxCompute) untuk agregasi? Misalnya, tabel sumber memiliki kolom a dan b sebagai kunci utama Lindorm
Sinkronisasi berbasis API tidak mendukung penggunaan fungsi sisi sumber. Proses data menggunakan fungsi sisi sumber terlebih dahulu sebelum mengimpor.