Cassandra kullanıcıları için Cloud Bigtable

1. Giriş

Bu codelab, Apache Cassandra'dan Google Cloud Bigtable'a sorgu taşıyan herkes için hazırlanmıştır.

Bu codelab'de

  • Cloud Bigtable emülatörünü kullanma
  • Zaman serisi kullanım alanını keşfedin
  • Tablo ve sütun ailesi oluşturma
  • CQL Ekleme, Güncelleme, Seçme ve Silme işlemlerinin Cloud Bigtable Java eşdeğerlerini öğrenin

Google Cloud Platform'u kullanma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

2. Kur

Temel kavramları hızlı bir şekilde anlayabilmeniz için yalnızca birkaç satırlık örnek bir veri kümesine bakacaksınız.

Kassandra

Her adımda eşdeğer Cassandra sorguları mevcut olacaktır. Bu nedenle, dilerseniz yerel kümeyi takip edebilir veya tıklamak için hızlıca bir Cassandra kümesi dağıtabilir ve bu kümeye SSH uygulayabilirsiniz.

Takip ediyorsanız bir tuş alanı oluşturun ve kullanın. Çoğaltma stratejisi burada önemli değildir.

cqlsh> create keyspace mykeyspace with replication = {'class':'SimpleStrategy','replication_factor' : 2};
cqlsh> use mykeyspace;

Cloud Bigtable

Tablonuz için bir Cloud Bigtable örneğine ihtiyacınız olacak. emülatörü kullanarak ücretsiz bir şekilde yerel örnek oluşturabilirsiniz. Cloud Bigtable'da anahtar alanı oluşturmanız gerekmez. Çoğaltma işleminiz örnek yapılandırmanız tarafından gerçekleştirilir.

Emülatörü başlatmak için aşağıdaki komutu kullanın:

gcloud beta emulators bigtable start

Daha sonra, başka bir kabuk penceresinde veya sekmesinde şu komutla emülatör ortam değişkenini ayarlayın:

$(gcloud beta emulators bigtable env-init) #Sets BIGTAB`LE_EMULATOR_HOST

Ardından kod örneklerini çalıştırmak için kullanacağınız bir Java projesi oluşturun ve Maven, Gradle veya SBT ile Cloud Bigtable istemcisini içe aktarın. Ardından yeni bir Java dosyasında veri istemcisine bağlantı oluşturun.

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. Tablo oluşturma

Hem Cassandra hem de Cloud Bigtable tablolarında, her satırda kendisiyle ilişkilendirilmiş bir anahtar bulunur. Cassandra anahtarlarında, ayrı veya üst üste gelebilen bölüm anahtarı ve kümeleme sütunu bulunur. Cloud Bigtable anahtarlarının tamamı bölme (bölümler) ve sıralama için kullanılır. Birincil/satır anahtarı yapısı söz konusu olduğunda bu iki sistem son derece benzerdir. Her iki sistem de temelde sözlüksel olarak sıralanan listelerdir. Bu listelerde anahtarlar, düğümler arasındaki satır dağılımının ana biçimi olarak görev yapar. Çoğu durumda aynı anahtarı Cloud Bigtable için yeniden kullanabilirsiniz.

Bu codelab'de cep telefonları ve mobil tabletlerle ilgili zaman serisi verilerini depolamak için Cloud Bigtable'ı kullanacaksınız (Bigtable tabletler ile karıştırılmamalıdır). Aşağıda, tablo oluşturma talimatları verilmiştir.

Kassandra

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

Java istemcisini kullanarak tablo ve sütun ailesi oluşturabilirsiniz ancak en kolay yöntem cbt aracıyla aşağıdaki komutu kullanmaktır:

cbt createtable mobile-time-series families=stats_summary

Cloud Bigtable bir NoSQL veritabanıdır. Bu nedenle tablo oluştururken şema tanımlamanız gerekmez ancak çalıştıracağınız sorguları düşünmeniz ve satır anahtarını bunlar için optimize etmeniz gerekir.

Anahtar taşıma için en yaygın strateji, tüm bölümlendirme anahtarlarını ve kümeleme sütunlarını alıp bunları birleştirerek Cloud Bigtable satır anahtarını temsil eden bir dize oluşturmaktır. Key Visualizer üzerinden anahtar dağılımında hata ayıklamaya yardımcı olması açısından genellikle dize tabanlı anahtarların kullanılmasını öneririz. Karma "#" gibi bir ayırıcı kullanabilirsiniz değerleri girin.

Bu örnekte "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYAAGG]" satır anahtarını kullanacağız

4. Ekler

Cassandra ve Cloud Bigtable arasında, eklemeler oldukça benzerdir. Burada "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYAAGG]" satır anahtarını kullanarak bir satır, ardından birden çok satır eklersiniz.

Kassandra

Single

cqlsh:mykeyspace> insert into mobileTimeSeries (deviceid, devicetype, date, connected_cell, os_build) values ('4c410523', 'phone',toDate(now()), {toTimeStamp(now()): true}, 'PQ2A.190405.003');

Toplu

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

Kullanmak istediğiniz satır anahtarı ve verilerle bir mutasyon oluşturun, ardından bu mutasyonu veri istemcisiyle uygulayın. Bir telefon için, hücresel bağlantısı ve işletim sistemiyle ilgili bilgileri içeren bir veri satırı eklersiniz.

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());
}

Toplu

BirBulkMutation nesnesinde birden çok mutasyon tanımlayın, ardından tüm değişiklikleri tek bir API çağrısıyla uygulamak için veri istemcisini kullanın. Mobil tabletin işletim sisteminin adı ve sürümü hakkında birkaç günlük veri ekleyeceksiniz.

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. Güncellemeler

Burada, henüz yazılmış olmayan bir hücreyi günceller ve ardından önceki sürümleri de koruyarak bir hücreye yeni bir değer yazarsınız.

Cassandra

Hücre ekleme

cqlsh:mykeyspace> UPDATE mobileTimeSeries SET os_name = 'android' WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';

Hücreler güncelleniyor

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

Cloud Bigtable'da güncellemeleri yazma işlemleri ile aynı şekilde ele alabilirsiniz.

Hücre ekleme

Bu, hücre yazmayla aynıdır. Yalnızca daha önce yazmadığınız bir sütun sağlayın. Burada, telefonun satırına işletim sisteminin adını ekleyin.

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());
}

Hücreler güncelleniyor

Buraya telefonun hücresel bağlantı durumuyla ilgili yeni veriler eklersiniz. Zaman serisi verilerinizin bir bölümünü kolayca depolamak için hücre sürümlerini kullanabilirsiniz. Yazmanız için zaman damgası sağlamanız yeterlidir. Hücre için yeni bir sürüm eklersiniz. Verilerinizi temizlemek için çöp toplama özelliğini kullanarak sürümleri belirli bir sayıdan veya belirli bir süre sonra silebilirsiniz.

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. Şunları seçer:

Artık tabloya yazdığınız verileri geri alacaksınız. CQL select ifadelerini taşırken sütunlar, nerede ifadeleri filtreleme ve gruplandırma ölçütü gibi işlevleri sınırlama ve toplama gibi seçili ifadelerin çeşitli yönlerini dikkate almanız gerekir. Burada, temel fikri anlamak için iki basit seçim ifadesine bakacaksınız. Ancak, seçim yapmayla ilgili daha fazla bilgi için dokümanlara bakabilirsiniz. Cloud Bigtable'da iki tür alma işlemi vardır: Alma ve Tarama. Get Bir satır, tarama ise bir satır aralığını alır.

Cassandra

Single

cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-04';

Birden çok

cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='tablet' AND deviceid = 'a0b81f74' AND date >= '2019-09-04';

Cloud Bigtable

Tek

Belirli bir telefonla ilgili belirtilen tarihe ait verileri almak için satır arama özelliğini kullanın. Tüm bu veriler tek bir satırda toplanır. Bu, değerlerin her zaman damgalı sürümünü döndürecektir. Dolayısıyla, linked_cell'i farklı zaman damgalarında iki satır görmelisiniz.

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());
}

Birden çok

Belirli bir mobil tablete ait aylık verileri birden çok satıra yayılmış şekilde görüntülemek için aralık taraması kullanın. Verilerin yalnızca belirli sürümlerini almak veya değerlere göre filtre uygulamak için bunlarla bir filtre kullanabilirsiniz.

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. Silme işlemleri

Tablonuza eklediğiniz verileri burada silersiniz. Önce tek bir satırı, ardından birden çok satırı silersiniz.

Cassandra'nın CQL'si, tüm birincil sütunlar belirtildiğinde tek satır silme ve aralık kaldırma işlemlerine olanak tanır. Bir aralığı tarayıp satır düzeyinde silme işlemleri gerçekleştirerek bunu Bigtable ile yapabilirsiniz. Aynı sonucu alacağınızı ancak her silme işlemi kendi işlemi olacağından daha fazla işlemin olacağını unutmayın.

Kassandra

Single

cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='phone' and deviceid = '4c410523';

Birden çok

cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='tablet' and deviceid = 'a0b81f74';

Cloud Bigtable

Single

Burada belirli bir telefona ve tarihe ait verileri silersiniz. Tek seferde bir satır silmek için satır tuşunu kullanın.

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());
}

Birden çok

Burada belirli bir mobil tablete ait tüm verileri silersiniz. Birden çok satırı silen bir CQL sorgusunu taşımak için bir tarama yapmanız ve ardından ortaya çıkan satır anahtarı kümesini kullanarak her bir satırı silmeniz gerekir.

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. Tamamlanıyor

Temizleme

Cassandra

Bunu takip etmek için bir Cassandra kümesi oluşturduysanız bu kümeyi normalde yaptığınız gibi silebilirsiniz.

Cloud Bigtable

Tablonuzu mevcut bir Cloud Bigtable örneğinde oluşturduysanız cbt komutuyla silebilirsiniz

cbt deletetable mobile-time-series

Emülatörü kullandıysanız işlemi başlattığınız terminalde CTRL-C tuşlarına basarak tüm işi temizlemek için emülatörü durdurabilirsiniz.

Sonraki adımlar