1. Pengantar
Codelab ini adalah panduan bagi siapa saja yang memigrasikan kueri dari Apache Cassandra ke Google Cloud Bigtable.
Dalam codelab ini, Anda akan
- Menggunakan emulator Cloud Bigtable
- Mempelajari kasus penggunaan deret waktu
- Membuat tabel dan grup kolom
- Pelajari Java Cloud Bigtable yang setara dengan CQL Insert, Update, Select, dan Delete
Bagaimana Anda menilai pengalaman Anda menggunakan Google Cloud Platform?
Bagaimana Anda akan menggunakan tutorial ini?
2. Siapkan
Anda akan melihat contoh {i>dataset<i} yang berisi beberapa baris saja agar Anda dapat memahami konsep inti dengan cepat.
Cassandra
Kueri Cassandra yang setara akan ditampilkan di setiap langkah. Jadi, jangan ragu untuk mengikuti cluster lokal jika Anda mau, atau Anda dapat dengan cepat menyiapkan cluster Cassandra klik untuk men-deploy dan SSH ke dalamnya.
Jika Anda mengikutinya, buat keyspace dan gunakan. Strategi replikasi tidak penting di sini.
cqlsh> create keyspace mykeyspace with replication = {'class':'SimpleStrategy','replication_factor' : 2}; cqlsh> use mykeyspace;
Cloud Bigtable
Anda memerlukan instance Cloud Bigtable untuk tabel Anda. Anda dapat menyiapkan instance lokal secara gratis menggunakan emulator. Anda tidak perlu membuat keyspace di Cloud Bigtable. Replikasi Anda ditangani oleh konfigurasi instance Anda.
Gunakan perintah berikut untuk memulai emulator:
gcloud beta emulators bigtable start
Kemudian, di jendela atau tab shell lain, tetapkan variabel lingkungan emulator dengan perintah ini:
$(gcloud beta emulators bigtable env-init) #Sets BIGTAB`LE_EMULATOR_HOST
Kemudian, buat project Java yang akan Anda gunakan untuk menjalankan contoh kode, dan impor klien Cloud Bigtable dengan Maven, Gradle, atau SBT. Kemudian, di file Java baru, buat koneksi ke klien data.
BigtableDataSettings settings =
BigtableDataSettings.newBuilder().setProjectId(projectId).setInstanceId(instanceId).build();
try {
dataClient = BigtableDataClient.create(settings);
} catch (Exception e) {
System.out.println("Error during data client connection: \n" + e.toString());
}
3. Pembuatan tabel
Dalam tabel Cassandra dan Cloud Bigtable, setiap baris memiliki kunci yang terkait dengannya. Kunci Cassandra memiliki kunci partisi dan kolom pengelompokan yang dapat terpisah atau tumpang-tindih. Keseluruhan kunci Cloud Bigtable digunakan untuk pemisahan (partisi) dan pengurutan. Kedua sistem ini sangat mirip dalam hal konstruksi kunci utama/baris. Kedua sistem pada dasarnya merupakan daftar yang diurutkan secara leksikografis, dengan kunci bertindak sebagai bentuk utama distribusi baris di antara node. Dalam sebagian besar kasus, Anda dapat menggunakan kembali kunci yang sama untuk Cloud Bigtable.
Dalam codelab ini, Anda akan menggunakan Cloud Bigtable untuk menyimpan data deret waktu tentang ponsel dan tablet (berbeda dengan tablet Bigtable). Berikut adalah petunjuk untuk membuat tabel.
Cassandra
cqlsh:mykeyspace> create table mobileTimeSeries ( deviceid text, devicetype text, date date, connected_cell map<timestamp,Boolean>, os_build text, os_name text, PRIMARY KEY((devicetype, deviceid), date));
Cloud Bigtable
Anda dapat membuat tabel dan grup kolom menggunakan klien Java, tetapi cara termudah adalah menggunakan perintah berikut dengan alat cbt:
cbt createtable mobile-time-series families=stats_summary
Cloud Bigtable adalah database NoSQL, sehingga Anda tidak perlu menentukan skema saat pembuatan tabel, tetapi Anda perlu memikirkan kueri yang akan dijalankan dan mengoptimalkan kunci baris untuk kueri tersebut.
Strategi yang paling umum untuk migrasi kunci adalah mengambil semua kunci partisi dan kolom pengelompokan, lalu menggabungkannya untuk membentuk string yang merepresentasikan kunci baris Cloud Bigtable. Kami biasanya merekomendasikan penggunaan kunci berbasis string karena membantu men-debug distribusi kunci melalui Key Visualizer. Anda dapat menggunakan pemisah seperti hash '#' di antara nilai kolom untuk membantu keterbacaan.
Dalam contoh ini, kita akan menggunakan rowkey "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD]"
4. Menyisipkan
Sisipkan cukup mirip antara Cassandra dan Cloud Bigtable. Di sini, Anda akan menyisipkan satu baris, lalu beberapa baris menggunakan rowkey "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD]".
Cassandra
Single
cqlsh:mykeyspace> insert into mobileTimeSeries (deviceid, devicetype, date, connected_cell, os_build) values ('4c410523', 'phone',toDate(now()), {toTimeStamp(now()): true}, 'PQ2A.190405.003');
Batch
cqlsh:mykeyspace> BEGIN BATCH insert into mobileTimeSeries (deviceid, devicetype, date, os_name, os_build) values ('a0b81f74', 'tablet', '2019-01-01', 'chromeos', '12155.0.0-rc1'); insert into mobileTimeSeries (deviceid, devicetype, date, os_name, os_build) values ('a0b81f74', 'tablet', '2019-01-02','chromeos', '12145.0.0-rc6'); APPLY BATCH;
Cloud Bigtable
Single
Buat mutasi dengan baris kunci dan data yang ingin Anda gunakan, lalu terapkan mutasi dengan klien data. Anda akan menambahkan baris data ponsel beserta informasi tentang koneksi seluler dan sistem operasinya.
try {
System.currentTimeMillis();
long timestamp = (long) 1556712000 * 1000; // Timestamp of June 1, 2019 12:00
String rowKey = "phone#4c410523#20190501";
ByteString one = ByteString.copyFrom(new byte[] {0, 0, 0, 0, 0, 0, 0, 1});
RowMutation rowMutation =
RowMutation.create(tableId, rowKey)
.setCell(
COLUMN_FAMILY_NAME,
ByteString.copyFrom("connected_cell".getBytes()),
timestamp,
one)
.setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "PQ2A.190405.003");
dataClient.mutateRow(rowMutation);
} catch (Exception e) {
System.out.println("Error during Write: \n" + e.toString());
}
Batch
Tentukan beberapa mutasi pada objek bulkMutation, lalu gunakan klien data untuk menerapkan semua mutasi dengan satu panggilan API. Anda akan menambahkan data selama beberapa hari tentang nama dan versi sistem operasi tablet seluler.
try {
long timestamp = (long) 1556712000 * 1000; // Timestamp of June 1, 2019 12:00
BulkMutation bulkMutation =
BulkMutation.create(tableId)
.add(
"tablet#a0b81f74#20190501",
Mutation.create()
.setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "chromeos")
.setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "12155.0.0-rc1"))
.add(
"tablet#a0b81f74#20190502",
Mutation.create()
.setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "chromeos")
.setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "12155.0.0-rc6"));
dataClient.bulkMutateRows(bulkMutation);
} catch (Exception e) {
System.out.println("Error during WriteBatch: \n" + e.toString());
}
5. Pembaruan
Di sini Anda akan memperbarui sel yang belum ditulis, kemudian menulis nilai baru ke sel dengan tetap mempertahankan versi sebelumnya.
Cassandra
Menambahkan sel
cqlsh:mykeyspace> UPDATE mobileTimeSeries SET os_name = 'android' WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';
Memperbarui sel
cqlsh:mykeyspace> UPDATE mobileTimeSeries SET connected_cell = connected_cell + {toTimeStamp(now()): false} WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';
Cloud Bigtable
Di Cloud Bigtable, Anda bisa memperlakukan update sama seperti operasi tulis.
Menambahkan sel
Fungsi ini sama dengan menulis sel, hanya saja Anda memberikan kolom yang belum pernah Anda tulis sebelumnya. Di sini Anda akan menambahkan nama sistem operasi ke baris telepon.
try {
long timestamp = (long) 1556713800 * 1000; // Timestamp of June 1, 2019 12:30
String rowKey = "phone#4c410523#20190501";
RowMutation rowMutation =
RowMutation.create(tableId, rowKey)
.setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "android");
dataClient.mutateRow(rowMutation);
} catch (Exception e) {
System.out.println("Error during update: \n" + e.toString());
}
Memperbarui sel
Di sini, Anda akan menambahkan data baru tentang status koneksi seluler ponsel. Anda dapat menggunakan versi sel untuk menyimpan sebagian data deret waktu dengan mudah. Cukup berikan stempel waktu untuk penulisan Anda dan Anda akan menambahkan versi baru untuk sel. Untuk membersihkan data Anda, Anda dapat menggunakan pembersihan sampah memori untuk menghapus versi setelah nomor atau jangka waktu tertentu.
try {
long timestamp = (long) 1556713800 * 1000; // Timestamp of June 1, 2019 12:30
String rowKey = "phone#4c410523#20190501";
ByteString zero = ByteString.copyFrom(new byte[] {0, 0, 0, 0, 0, 0, 0, 0});
RowMutation rowMutation =
RowMutation.create(tableId, rowKey)
.setCell(
COLUMN_FAMILY_NAME,
ByteString.copyFrom("connected_cell".getBytes()),
timestamp,
zero);
dataClient.mutateRow(rowMutation);
} catch (Exception e) {
System.out.println("Error during update2: \n" + e.toString());
}
6. Pilihan
Sekarang, Anda akan mengambil data yang telah Anda tulis ke dalam tabel. Saat memigrasikan pernyataan tertentu CQL, Anda perlu mempertimbangkan beberapa aspek pernyataan tertentu seperti kolom, memfilter klausa tempat, serta membatasi dan menggabungkan fungsi seperti kelompokkan menurut. Di sini, Anda hanya akan melihat dua pernyataan pemilihan sederhana untuk mendapatkan ide dasar, tetapi Anda dapat melihat dokumentasi untuk informasi lebih lanjut tentang cara memilih. Di Cloud Bigtable, ada dua jenis operasi pengambilan: Get dan Scan. Fungsi GET mengambil satu baris, sedangkan pemindaian akan mengambil rentang baris.
Cassandra
Single
cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-04';
Beberapa
cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='tablet' AND deviceid = 'a0b81f74' AND date >= '2019-09-04';
Cloud Bigtable
Lajang
Menggunakan pencarian baris untuk mendapatkan data tentang ponsel tertentu pada tanggal yang ditentukan yang semuanya ada dalam satu baris. Ini akan mengembalikan setiap versi nilai dengan stempel waktu, sehingga Anda akan melihat dua baris untuk connected_cell pada stempel waktu yang berbeda.
try {
String rowKey = "phone#4c410523#20190501";
Row row = dataClient.readRow(tableId, rowKey);
for (RowCell cell : row.getCells()) {
System.out.printf(
"Family: %s Qualifier: %s Value: %s Timestamp: %s%n",
cell.getFamily(),
cell.getQualifier().toStringUtf8(),
cell.getValue().toStringUtf8(),
cell.getTimestamp());
}
} catch (Exception e) {
System.out.println("Error during lookup: \n" + e.toString());
}
Beberapa
Menggunakan pemindaian rentang untuk melihat data sebulan pada tablet seluler tertentu yang tersebar di beberapa baris. Anda dapat menggunakan filter dengan filter ini untuk mendapatkan versi data tertentu atau memfilter nilai saja.
try {
Query query = Query.create(tableId).range("tablet#a0b81f74#201905", "tablet#a0b81f74#201906");
ServerStream<Row> rowStream = dataClient.readRows(query);
for (Row row : rowStream) {
System.out.println("Row Key: " + row.getKey().toStringUtf8());
for (RowCell cell : row.getCells()) {
System.out.printf(
"Family: %s Qualifier: %s Value: %s Timestamp: %s%n",
cell.getFamily(),
cell.getQualifier().toStringUtf8(),
cell.getValue().toStringUtf8(),
cell.getTimestamp());
}
}
} catch (Exception e) {
System.out.println("Error during scan: \n" + e.toString());
}
7. Penghapusan
Di sini Anda akan menghapus data yang Anda masukkan ke dalam tabel. Pertama, hapus satu baris, lalu beberapa baris dihapus.
CQL Cassandra memungkinkan penghapusan baris tunggal serta penghapusan rentang jika semua kolom utama ditentukan. Anda dapat melakukannya menggunakan Bigtable dengan memindai rentang lalu melakukan penghapusan tingkat baris. Perhatikan bahwa Anda akan mendapatkan hasil yang sama, tetapi akan memiliki lebih banyak operasi karena setiap penghapusan akan menjadi operasinya sendiri.
Cassandra
Single
cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='phone' and deviceid = '4c410523';
Beberapa
cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='tablet' and deviceid = 'a0b81f74';
Cloud Bigtable
Single
Di sini, Anda akan menghapus data untuk ponsel dan tanggal tertentu. Gunakan tombol baris untuk menghapus baris satu per satu.
try {
String rowKey = "phone#4c410523#20190501";
RowMutation mutation = RowMutation.create(tableId, rowKey).deleteRow();
dataClient.mutateRow(mutation);
} catch (Exception e) {
System.out.println("Error during Delete: \n" + e.toString());
}
Beberapa
Di sini, Anda akan menghapus semua data untuk tablet seluler tertentu. Untuk memigrasikan kueri CQL yang menghapus beberapa baris, Anda harus melakukan pemindaian, lalu menghapus setiap baris menggunakan kumpulan kunci baris yang dihasilkan.
try {
Query query = Query.create(tableId).prefix("tablet#a0b81f7");
ServerStream<Row> rowStream = dataClient.readRows(query);
BulkMutation bulkMutation = BulkMutation.create(tableId);
for (Row row : rowStream) {
bulkMutation.add(row.getKey(), Mutation.create().deleteRow());
}
dataClient.bulkMutateRows(bulkMutation);
} catch (Exception e) {
System.out.println("Error during DeleteMultiple: \n" + e.toString());
}
8. Menyelesaikan
Pembersihan
Cassandra
Jika Anda telah membuat cluster Cassandra untuk mengikuti pembuatan ini, jangan ragu untuk menghapusnya seperti biasa.
Cloud Bigtable
Jika membuat tabel pada instance Cloud Bigtable yang ada, Anda dapat menghapusnya dengan perintah cbt
cbt deletetable mobile-time-series
Jika menggunakan emulator, Anda dapat menghentikan emulator untuk menghapus semua pekerjaan, dengan mengetik CTRL-C di terminal tempat Anda memulainya.
Langkah berikutnya
- Pelajari Cloud Bigtable lebih lanjut dalam dokumentasi.
- Coba codelab Cloud Bigtable yang lebih mendalam
- Cobalah sendiri fitur Google Cloud Platform lainnya. Lihat tutorial kami.
- Pelajari cara memantau data deret waktu dengan integrasi OpenTSDB