Cloud Bigtable untuk pengguna Cassandra

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?

Pemula Menengah Mahir

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

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