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?
Bu eğiticiden nasıl yararlanacaksınız?
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
- Belgelerden Cloud Bigtable hakkında daha fazla bilgi edinin.
- Daha derinlemesine Cloud Bigtable codelab'i deneyin
- Diğer Google Cloud Platform özelliklerini kendiniz deneyin. Eğiticilerimize göz atın.
- OpenTSDB entegrasyonuyla zaman serisi verilerini nasıl izleyeceğinizi öğrenin