Flazzo memiliki fokus utama untuk menambah nilai bisnis Anda.

Blog

Memahami pemadatan data dalam 3 menit

16938476-thumb.jpg
Blog

Memahami pemadatan data dalam 3 menit


Apa itu kompresi basis data? Pikirkan disk Anda sebagai gudang: mekanisme pemadatannya seperti tim pemilik toko (dengan keterampilan organisasi jenius seperti Marie Kondo) yang membantu menyimpan data yang masuk.

Secara khusus, data (yang merupakan kargo yang masuk dalam metafora ini) tiba di “ban berjalan”, yang tidak memungkinkan pemotongan antrean. Ini adalah bagaimana Pohon LSM (Log Structured-Merge Tree) berfungsi: Dalam penyimpanan data, data ditulis ke MemTable tambahkan saja, maka MemTables dibilas ke disk untuk membentuk file. (File-file ini memiliki nama berbeda di database berbeda. Di komunitas saya, kami menyebutnya Set baris). Sama seperti meletakkan kotak pengiriman kecil dalam wadah besar, pemadatan berarti menggabungkan beberapa file rowset kecil menjadi satu file besar, tetapi lebih dari itu. Seperti yang saya katakan, mekanisme pemadatan adalah pesulap pengorganisasian:

  • Meskipun elemen (data) dari setiap kotak (kumpulan baris) disusun secara teratur, kotak itu sendiri tidak demikian. Oleh karena itu, satu hal yang dilakukan “pengelola toko” adalah menyortir kotak (kumpulan baris) ke dalam urutan tertentu sehingga dapat ditemukan dengan cepat saat dibutuhkan (mempercepat pembacaan data).
  • Jika suatu item perlu dibuang atau diganti, karena tidak boleh ada jeda baris di treadmill (hanya tambahan), Anda hanya dapat meletakkan “catatan” (bersama dengan item pengganti) di akhir antrean di karpet untuk mengingatkan para “penjaga toko” yang nantinya akan melakukan penggantian atau pembuangan untuk Anda.
  • Jika perlu, “penjaga toko” bahkan berbaik hati untuk melakukan pra-proses kargo untuk Anda (pra-agregasi data untuk mengurangi beban komputasi saat membaca data).

Pohon LSM

Betapapun membantunya “penjaga toko”, terkadang mereka bisa menjadi pembuat onar – itulah mengapa “manajemen tim” penting. Agar mekanisme pemadatan bekerja secara efektif, Anda memerlukan perencanaan dan perencanaan yang cermat, jika tidak, Anda mungkin menghadapi penggunaan memori dan CPU yang tinggi, jika tidak OOM di backend atau kesalahan penulisan.

Secara khusus, pemadatan yang efisien ditambahkan dengan memicu tugas pemadatan dengan cepat, kelebihan memori dan CPU yang dapat dikontrol, dan penyesuaian parameter yang mudah di pihak teknisi. Ini menimbulkan pertanyaan: Bagaimana? Dalam artikel ini, saya akan menunjukkan kepada Anda cara kami, termasuk cara kami memicu, menjalankan, dan menyetel pemadatan untuk eksekusi yang lebih cepat dan hemat sumber daya.

Strategi Pemicu

Tujuan keseluruhan di sini adalah untuk memicu tugas pemadatan secara tepat waktu dengan konsumsi sumber daya sesedikit mungkin.

Pemicu aktif

Cara paling intuitif untuk memastikan pemadatan tepat waktu adalah dengan mencari kemungkinan tugas pemadatan selama penyerapan data. Setiap kali versi tablet data baru dibuat, tugas pemadatan segera dipicu, jadi Anda tidak perlu khawatir tentang penumpukan versi. Tapi itu hanya berfungsi untuk data yang baru diserap. Ini disebut Pemadatan kumulatifsebagai lawan Pemadatan dasaryang merupakan pemadatan data yang ada.

Pemindaian pasif

Pemadatan basis data dipicu oleh pemindaian pasif. Pemindaian pasif adalah tugas yang jauh lebih berat daripada pemicu aktif karena memindai semua metadata dari semua tablet data di node. Setelah mengidentifikasi semua kemungkinan tugas pemadatan, sistem mulai memadatkan untuk tablet data yang paling mendesak.

dormansi tablet

Pemindaian metadata yang sering adalah pemborosan sumber daya CPU, jadi lebih baik memperkenalkan dormansi: untuk tablet yang sudah lama tidak melakukan tugas pemadatan, sistem berhenti melihatnya untuk sementara waktu. Jika tiba-tiba terjadi penulisan data ke tablet yang menganggur, ini akan memicu pemadatan kumulatif, seperti yang disebutkan di atas, jadi jangan khawatir, Anda tidak akan melewatkan apa pun.

Kombinasi ketiga strategi ini adalah contoh perencanaan yang menguntungkan.

Eksekusi

Pemadatan vertikal untuk penyimpanan kolom

Karena penyimpanan kolom adalah masa depan database analitik, eksekusi pemadatan harus beradaptasi dengannya. Kami menyebutnya pemadatan vertikal. Saya mengilustrasikan mekanisme ini dengan gambar di bawah ini:

Pemadatan vertikal untuk penyimpanan kolom

Saya harap semua balok dan angka kecil itu tidak membuat Anda pusing. Faktanya, pemadatan vertikal dapat dipecah menjadi empat langkah sederhana:

1. Pisahkan kolom kunci dan kolom nilai. Bagilah semua kolom kunci dari kumpulan baris input dan masukkan ke dalam satu grup, dan semua kolom nilai ke dalam grup N.

2. Gabungkan Kolom Kunci. Heapsort digunakan dalam langkah ini. Produk di sini adalah kolom kunci yang digabungkan dan diurutkan serta tag urutan keseluruhan (Sumber Garis).

3. Menggabungkan Kolom Nilai. Kolom nilai digabungkan dan disusun menurut urutan masuk Sumber Garis.

4. Tulis datanya. Semua kolom disatukan dan membentuk satu set besar baris.

Sebagai teknik pendukung untuk penyimpanan kolom, pemadatan vertikal menghindari keharusan memuat semua kolom dengan setiap operasi penggabungan. Ini berarti dapat secara signifikan mengurangi penggunaan memori dibandingkan dengan pemadatan berorientasi baris tradisional.

Pemadatan segmen untuk menghindari “kemacetan”

Seperti yang dijelaskan di awal, saat mencerna data, data pertama-tama akan ditumpuk di memori hingga mencapai ukuran tertentu, kemudian dibuang ke disk dan disimpan sebagai file. Oleh karena itu, jika Anda telah menelan sejumlah besar data sekaligus, Anda akan memiliki sejumlah besar file yang baru dibuat di disk. Ini menambah beban pemindaian saat membaca data dan dengan demikian memperlambat kueri data. (Bayangkan tiba-tiba harus mencari 50 sel alih-alih 5 untuk menemukan item yang Anda butuhkan. Ini luar biasa.) Di beberapa database, ledakan file seperti itu bahkan dapat memicu mekanisme perlindungan yang menghentikan penyerapan data.

Pemadatan segmen adalah cara untuk menghindari hal ini. Ini memungkinkan Anda untuk memadatkan data saat Anda menyerapnya sehingga sistem dapat dengan cepat menyerap ukuran data yang lebih besar tanpa menghasilkan terlalu banyak file.

Berikut adalah diagram alur yang menjelaskan cara kerja pemadatan segmen:

Ini adalah diagram alur yang menjelaskan cara kerja pemadatan segmen

Pemadatan segmen akan dipicu setelah jumlah file yang baru dibuat melebihi batas tertentu (katakanlah 10). Itu dijalankan secara asinkron oleh utas gabungan khusus. Kesepuluh file akan digabungkan menjadi satu dan sepuluh file asli akan dihapus. Memadatkan segmen tidak banyak memperpanjang proses penyerapan data, tetapi dapat mempercepat kueri data secara signifikan.

Pemadatan data secara teratur

Menganalisis data deret waktu adalah skenario analitik yang semakin umum.

Data deret waktu adalah “diurutkan sejak lahir”. Itu sudah terdaftar dalam urutan kronologis, ditulis dengan kecepatan tetap, dan setiap kumpulan memiliki ukuran yang sama. Ini seperti anak yang paling tidak khawatir dalam keluarga. Hasilnya, kami memiliki metode pemadatan yang dibuat khusus untuk ini: pemadatan data yang dipesan.

Pemadatan data secara teratur

Pemadatan data yang dipesan bahkan lebih sederhana:

  • Unduh: Catat tombol Min/Max dari file rowset input.
  • Memeriksa: Periksa apakah file rowset diatur dengan benar berdasarkan tombol Min/Max dan ukuran file.
  • Menggabungkan: Tautkan erat kumpulan baris masukan ke kumpulan baris baru dan buat metadata untuk kumpulan baris baru (termasuk jumlah baris, ukuran file, kunci Min/Maks, dll.)

Melihat? Ini adalah beban kerja yang sangat rapi dan ringan yang hanya melibatkan penautan file dan pembuatan metadata. Secara statistik, hanya perlu beberapa milidetik untuk mengompresi data deret waktu dalam jumlah besar, tetapi hampir tidak menghabiskan memori.

Sejauh ini, ini tentang pengoptimalan strategis dan algoritmik untuk pemadatan, yang diterapkan oleh Apache Doris 2.0.0, database analitik terpadu. Selain itu, kami sebagai pengembang proyek open source telah menyempurnakannya dari segi teknis.

Optimasi Rekayasa

Salinan nol

Di node backend Apache Doris, data melewati beberapa lapisan: Tablet -> Rowset -> Segmen -> Kolom -> Halaman. Proses pemadatan melibatkan transfer data yang menghabiskan banyak sumber daya CPU. Jadi kami merancang logika pemadatan tanpa salinan, yang direalisasikan oleh struktur data bernama BlockView. Ini membawa peningkatan 5% lagi dalam efisiensi pemadatan.

Memuat sesuai permintaan

Dalam kebanyakan kasus, rowset tidak 100% tanpa urutan, jadi kita dapat memanfaatkan urutan parsial ini. Untuk sekelompok baris yang dipesan, Apache Doris hanya memuat yang pertama dan kemudian mulai menggabungkan. Saat bergabung, secara bertahap memuat file rowset yang dibutuhkannya. Ini adalah bagaimana mengurangi penggunaan memori.

Jadwal tidak aktif

Dalam pengalaman kami, tugas pemadatan dasar seringkali memakan banyak sumber daya dan memakan waktu, sehingga dapat dengan mudah menghambat kueri data. Doris 2.0.0 memungkinkan penjadwalan diam, mengurangi prioritas tugas pemadatan dasar dengan data besar, eksekusi lama, dan tingkat pemadatan rendah.

Optimalisasi pengaturan

Setiap insinyur data entah bagaimana telah dilecehkan oleh pengaturan dan konfigurasi yang rumit. Untuk melindungi pengguna kami dari mimpi buruk ini, kami telah menyediakan serangkaian pengaturan yang disederhanakan dengan konfigurasi default berperforma terbaik di lingkungan umum.

Kesimpulan

Beginilah cara kami memastikan pekerjaan “penjaga toko” kami yang efisien dan menguntungkan. Jika Anda bertanya-tanya bagaimana strategi dan pengoptimalan ini bekerja dalam praktiknya, kami menguji Apache Doris dengan ClickBench. Ini mencapai kecepatan pemadatan 300.000 baris/dtk; dalam skenario konkurensi tinggi, ini mempertahankan skor pemadatan yang stabil sekitar 50. Selain itu, kami berencana untuk menerapkan penyetelan otomatis dan meningkatkan keteramatan mekanisme pemadatan.