Topik ini menjelaskan perubahan DataHub dalam rilis terbaru, dengan fokus pada prinsip dan implementasi serialisasi batch serta peningkatan performa dan pengurangan biaya yang dihasilkan. Serialisasi batch memberikan manfaat signifikan bagi sisi layanan dan pengguna DataHub, termasuk pengurangan konsumsi sumber daya, peningkatan performa, dan penurunan biaya secara drastis.
Detail pembaruan
Dukungan untuk kompresi zstd
DataHub kini mendukung Zstandard (zstd) mulai versi terbaru. Dibandingkan dengan LZ4 dan Deflate, zstd menawarkan performa yang lebih baik.
Zstd adalah algoritma kompresi berperforma tinggi yang dikembangkan oleh Facebook dan dirilis sebagai open-source pada tahun 2016. Algoritma ini unggul dalam hal kecepatan kompresi dan rasio, sehingga sangat cocok untuk skenario penggunaan DataHub.
Transformasi serialisasi
Serialisasi batch diperkenalkan di DataHub sebagai metode pengaturan data. Istilah "batch" tidak merujuk pada metode serialisasi tertentu, melainkan melibatkan enkapsulasi sekunder dari data yang telah diserialisasi. Sebagai contoh, 100 catatan data perlu dikirim dalam satu batch. Seratus catatan ini diserialisasi untuk menghasilkan buffer, yang kemudian dikompres menggunakan algoritma kompresi. Header ditambahkan ke buffer terkompresi untuk mencatat ukuran, jumlah catatan, algoritma kompresi, informasi CRC, dan detail lainnya. Buffer akhir dengan header tambahan ini mewakili satu batch data lengkap.
Manfaat serialisasi batch meliputi:
Efektif dalam mengurangi data kotor.
Mengurangi overhead CPU server backend dan meningkatkan performa pemrosesan data.
Mengurangi latensi dalam operasi baca dan tulis.
Setelah buffer batch dikirim ke server, karena klien telah melakukan validasi menyeluruh, server hanya perlu memverifikasi hasil CRC dalam data untuk memastikan integritas buffer. Setelah buffer divalidasi, server dapat langsung menyimpannya ke disk tanpa operasi tambahan seperti serialisasi, deserialisasi, kompresi, dekompresi, atau validasi lebih lanjut. Optimalisasi ini meningkatkan performa server lebih dari 80%. Dengan mengompres beberapa entri data bersama-sama, rasio kompresi juga meningkat, menghasilkan penghematan biaya penyimpanan.
Perbandingan biaya
Untuk memverifikasi manfaat dari serialisasi batch, data berikut digunakan dalam uji perbandingan:
Sekitar 200 kolom data terkait iklan digunakan untuk pengujian, dengan rasio nilai null dalam data uji berkisar antara 20% hingga 30%.
Setiap 1.000 entri data membentuk satu batch.
Apache Avro digunakan untuk serialisasi batch.
Sebelum pembaruan, LZ4 digunakan secara default untuk kompresi data. Setelah pembaruan, zstd menjadi opsi default untuk kompresi data.
Tabel berikut menampilkan hasil pengujian.
Ukuran data asli (satuan: byte) | Ukuran data terkompresi menggunakan LZ4 (satuan: byte) | Ukuran data terkompresi menggunakan zstd (satuan: byte) | |
Serialisasi Protobuf | 11.506.677 | 3.050.640 | 1.158.868 |
Serialisasi batch | 11.154.596 | 2.931.729 | 1.112.693 |
Kami membandingkan pengurangan biaya dari dua dimensi penagihan DataHub: penyimpanan dan trafik. Item yang dapat ditagih lainnya terutama bertujuan mencegah penyalahgunaan dan umumnya dapat diabaikan dalam kasus normal.
Biaya Penyimpanan: Saat DataHub menggunakan serialisasi Protobuf, data dalam penyimpanan tidak dikompresi, tetapi hanya dikompresi selama transmisi melalui HTTP. Setelah menerapkan mode serialisasi batch+zstd, ukuran penyimpanan berkurang dari 11.506 KB menjadi 1.112 KB, yang berarti biaya penyimpanan berkurang sekitar 90%.
Biaya Trafik: Saat DataHub menggunakan mode Protobuf+LZ4, ukuran data adalah 3.050 KB. Dengan mode serialisasi batch+zstd, ukuran data menjadi 1.112 KB, yang berarti biaya trafik berkurang sekitar 60%.
Tabel di atas menampilkan hasil pengujian berdasarkan data sampel. Hasil pengujian aktual dapat bervariasi tergantung pada data. Anda dapat melakukan pengujian sesuai dengan kebutuhan bisnis Anda.
Menggunakan serialisasi batch
Catatan penggunaan
Keuntungan utama penulisan batch adalah untuk mengumpulkan catatan data dalam batch. Jika klien tidak dapat mengumpulkan catatan data dalam batch atau jumlah catatan data dalam batch kecil, peningkatan mungkin gagal memenuhi harapan Anda.
Untuk kenyamanan pengguna, kami menyediakan kompatibilitas antara berbagai metode baca dan tulis guna memastikan transisi yang lebih lancar. Data yang ditulis dalam batch tetap dapat dibaca dalam mode aslinya, begitu juga sebaliknya. Namun, jika data ditulis dalam batch, disarankan agar data tersebut juga dikonsumsi dalam batch. Otherwise, the performance may be deteriorated.
Prasyarat
Fitur multi-version schema harus diaktifkan.
Client library versi 1.4 atau lebih baru digunakan.
Hanya DataHub SDK for Java yang didukung.
Mengaktifkan fitur skema multi-versi
Mengaktifkan fitur skema multi-versi di konsol
Informasi topik yang telah dibuat di konsol tidak dapat dimodifikasi. Untuk menggunakan serialisasi batch, aktifkan opsi Enable Multi-version saat membuat topik. Untuk detail lebih lanjut tentang pembuatan topik, lihat Mengelola topik.

Mengaktifkan fitur skema multi-versi menggunakan SDK
public static void createTopicWithOption() {
try {RecordSchema recordSchema = new RecordSchema() {{
this.addField(new Field("field1", FieldType.STRING));
this.addField(new Field("field2", FieldType.BIGINT));
}};
TopicOption option = new TopicOption();
// Aktifkan fitur skema multi-versi.
option.setEnableSchemaRegistry(true);
option.setComment(Constant.TOPIC_COMMENT);
option.setExpandMode(ExpandMode.ONLY_EXTEND);
option.setLifeCycle(Constant.LIFE_CYCLE);
option.setRecordType(RecordType.TUPLE);
option.setRecordSchema(recordSchema);
option.setShardCount(Constant.SHARD_COUNT);
datahubClient.createTopic(Constant.PROJECT_NAME, Constant.TOPIC_NAME, option);
LOGGER.info("create topic successful");
} catch (ResourceAlreadyExistException e) {
LOGGER.info("topic already exists, please check if it is consistent");
} catch (ResourceNotFoundException e) {
// project not found
e.printStackTrace();
throw e;
} catch (DatahubClientException e) {
// other error
e.printStackTrace();
throw e;
}
}Konfigurasikan serialisasi batch
Jika server mendukung protokol transmisi batch, DataHub menggunakan serialisasi batch secara default. Namun, jika server tidak mendukung protokol ini—misalnya, server tidak menggunakan versi terbaru Apsara Stack atau menggunakan versi sebelum Apsara Stack V3.16—DataHub secara otomatis beralih ke metode serialisasi asli. Klien menyesuaikan metode serialisasi secara otomatis tanpa memerlukan konfigurasi tambahan. Dalam contoh berikut, client library 1.4.1 digunakan. Sistem juga secara otomatis memilih algoritma kompresi yang lebih baik. Jika menggunakan versi client library setelah 1.4, zstd dipilih sebagai opsi default.
Tambahkan dependensi Maven
<dependency>
<groupId>com.aliyun.datahub</groupId>
<artifactId>aliyun-sdk-datahub</artifactId>
<version>2.25.3</version>
</dependency>
<dependency>
<groupId>com.aliyun.datahub</groupId>
<artifactId>datahub-client-library</artifactId>
<version>1.4.3</version>
</dependency>Konfigurasikan serialisasi batch
ProducerConfig config = new ProducerConfig(endpoint, accessId, accessKey);
DatahubProducer producer = new DatahubProducer(projectName, topicName, config);
RecordSchema schema = producer.getTopicSchema();
List<RecordEntry> recordList = new ArrayList<>();
// Untuk mencapai performa yang lebih baik, kami sarankan Anda menambahkan sebanyak mungkin catatan ke recordList.
// Atur ukuran recordList dalam rentang 512 KB hingga 1 MB jika memungkinkan.
for (int i = 0; i < 1000; ++i) {
RecordEntry record = new RecordEntry();
TupleRecordData data = new TupleRecordData(schema);
// Anggap skema berikut digunakan: {"fields":[{"name":"f1", "type":"STRING"},{"name":"f2", "type":"BIGINT"}]}
data.setField("f1", "value" + i);
data.setField("f2", i);
record.setRecordData(data);
// Opsional. Tambahkan atribut kustom.
record.addAttribute("key1", "value1");
recordList.add(record);
}
try {
// Tulis data berulang kali sebanyak 1.000 kali.
for (int i = 0; i < 1000; ++i) {
try {
String shardId = datahubProducer.send(recordList);
LOGGER.info("Write shard {} success, record count:{}", shardId, recordList.size());
} catch (DatahubClientException e) {
if (!ExceptionChecker.isRetryableException(e)) {
LOGGER.info("Write data fail", e);
break;
}
// Jalankan pernyataan sleep untuk mencoba menulis ulang data.
Thread.sleep(1000);
}
}
} finally {
// Nonaktifkan sumber daya terkait produser.
datahubProducer.close();
}Apa yang harus dilakukan selanjutnya
Jika Anda mengalami masalah atau memiliki pertanyaan saat menggunakan DataHub, ajukan tiket atau bergabung dengan grup DingTalk 33517130.