Cloud Bigtable'a giriş

1. Giriş

Bu codelab'de, Java HBase istemcisi ile Cloud Bigtable'ı kullanmaya giriş yapacaksınız.

Öğrenecekleriniz

  • Şema tasarımıyla ilgili yaygın hatalardan kaçınma
  • Sıra dosyasındaki verileri içe aktarma
  • Verilerinizi sorgulama

İşlemi tamamladığınızda New York City otobüs verilerini gösteren çeşitli haritalarınız olur. Örneğin, Manhattan'daki otobüs yolculuklarının ısı haritasını oluşturacaksınız:

7349d94f7d41f1d1.png

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

Yeni başlayan Orta düzey Uzman

Bu eğitimi nasıl kullanacaksınız?

Sadece okuyun Okuyun ve alıştırmaları tamamlayın

2. Veri kümesi hakkında

New York City otobüsleriyle ilgili bir veri kümesine bakacaksınız. 300'den fazla otobüs hattı ve bu hatlarda çalışan 5.800 araç vardır. Veri kümemiz; hedef adı, araç kimliği, enlem, boylam, beklenen varış zamanı ve planlanan varış zamanını içeren bir günlük kaydıdır. Veri kümesi, Haziran 2017'de yaklaşık 10 dakikada bir çekilen anlık görüntülerden oluşur.

3. Şema tasarımı

Cloud Bigtable'dan en iyi performansı elde etmek için şemanızı tasarlarken dikkatli olmanız gerekir. Cloud Bigtable'daki veriler sözlük sırasına göre otomatik olarak sıralanır. Bu nedenle, şemanızı iyi tasarlarsanız ilgili veriler için sorgu oluşturmak çok verimli olur. Cloud Bigtable, satır anahtarına göre nokta aramaları veya bitişik bir satır grubu döndüren satır aralığı taramaları kullanılarak sorgu oluşturulmasına olanak tanır. Ancak şemanız iyi düşünülmemişse birden fazla satır araması yapmanız veya daha da kötüsü, son derece yavaş işlemler olan tam tablo taramaları yapmanız gerekebilir.

Sorguları planlama

Verilerimizde çeşitli bilgiler yer alıyor ancak bu codelab'de otobüsün konumunu ve varış noktasını kullanacaksınız.

Bu bilgilerle aşağıdaki sorguları gerçekleştirebilirsiniz:

  • Belirli bir saat içinde tek bir otobüsün konumunu öğrenin.
  • Bir otobüs hattı veya belirli bir otobüs için bir günlük verileri alın.
  • Haritada bir dikdörtgen içindeki tüm otobüsleri bulma
  • Tüm otobüslerin mevcut konumlarını alın (bu verileri anlık olarak alıyorsanız).

Bu sorgu grubu, en iyi şekilde birlikte yapılamaz. Örneğin, zamana göre sıralama yapıyorsanız tam tablo taraması yapmadan konuma göre tarama yapamazsınız. En sık çalıştırdığınız sorgulara göre öncelik vermeniz gerekir.

Bu codelab'de aşağıdaki sorgu grubunu optimize etmeye ve yürütmeye odaklanacaksınız:

  • Belirli bir aracın bir saat içindeki konumlarını öğrenin.
  • Bir otobüs hattının bir saat içindeki tüm konumlarını alın.
  • Bir saat içinde Manhattan'daki tüm otobüslerin konumlarını öğrenin.
  • Manhattan'daki tüm otobüslerin en son konumlarını bir saat içinde öğrenin.
  • Bir otobüs hattının ay boyunca bulunduğu konumları öğrenin.
  • Belirli bir hedefe giden tüm otobüs hattının konumlarını bir saat içinde alın.

Satır anahtarını tasarlama

Bu codelab'de statik bir veri kümesiyle çalışacak olsanız da ölçeklenebilirlik için bir şema tasarlayacaksınız. Daha fazla otobüs verisini tabloya aktarmanıza ve yine de iyi performans göstermenize olanak tanıyan bir şema tasarlayacaksınız.

Satır anahtarı için önerilen şema aşağıda verilmiştir:

[Otobüs şirketi/Otobüs hattı/Saat cinsinden yuvarlanmış zaman damgası/Araç kimliği]. Her satırda bir saatlik veri bulunur ve her hücrede verilerin zaman damgalı birden fazla sürümü yer alır.

Bu codelab'de, işleri basit tutmak için tek bir sütun ailesi kullanacaksınız. Verilerin nasıl göründüğüne dair örnek bir görünümü aşağıda bulabilirsiniz. Veriler, satır anahtarına göre sıralanır.

Satır anahtarı

cf:VehicleLocation.Latitude

cf:VehicleLocation.Longitude

...

MTA/M86-SBS/1496275200000/NYCT_5824

40.781212 @20:52:54.0040.776163 @20:43:19.0040.778714 @20:33:46.00

-73.961942 @20:52:54.00-73.946949 @20:43:19.00-73.953731 @20:33:46.00

...

MTA/M86-SBS/1496275200000/NYCT_5840

40.780664 @20:13:51.0040.788416 @20:03:40.00

-73.958357 @20:13:51.00 -73.976748 @20:03:40.00

...

MTA/M86-SBS/1496275200000/NYCT_5867

40.780281 @20:51:45.0040.779961 @20:43:15.0040.788416 @20:33:44.00

-73.946890 @20:51:45.00-73.959465 @20:43:15.00-73.976748 @20:33:44.00

...

...

...

...

...

4. Örnek, tablo ve aile oluşturma

Ardından bir Cloud Bigtable tablosu oluşturursunuz.

Öncelikle yeni bir proje oluşturun. Sağ üst köşedeki "Cloud Shell'i etkinleştir" düğmesini tıklayarak açabileceğiniz yerleşik Cloud Shell'i kullanın.

a74d156ca7862b28.png

Aşağıdaki ortam değişkenlerini ayarlayarak codelab komutlarını kopyalayıp yapıştırmayı kolaylaştırın:

INSTANCE_ID="bus-instance"
CLUSTER_ID="bus-cluster"
TABLE_ID="bus-data"
CLUSTER_NUM_NODES=3
CLUSTER_ZONE="us-central1-c"

Cloud Shell'de bu codelab'de kullanacağınız araçlar (gcloud komut satırı aracı, cbt komut satırı arayüzü ve Maven) önceden yüklenmiş olarak gelir.

Bu komutu çalıştırarak Cloud Bigtable API'lerini etkinleştirin.

gcloud services enable bigtable.googleapis.com bigtableadmin.googleapis.com

Aşağıdaki komutu çalıştırarak bir örnek oluşturun:

gcloud bigtable instances create $INSTANCE_ID \
    --cluster=$CLUSTER_ID \
    --cluster-zone=$CLUSTER_ZONE \
    --cluster-num-nodes=$CLUSTER_NUM_NODES \
    --display-name=$INSTANCE_ID

Örneği oluşturduktan sonra cbt yapılandırma dosyasını doldurun ve ardından aşağıdaki komutları çalıştırarak bir tablo ve sütun ailesi oluşturun:

echo project = $GOOGLE_CLOUD_PROJECT > ~/.cbtrc
echo instance = $INSTANCE_ID >> ~/.cbtrc

cbt createtable $TABLE_ID
cbt createfamily $TABLE_ID cf

5. Verileri içe aktarma

Bu codelab için gs://cloud-bigtable-public-datasets/bus-data adresinden bir dizi sıra dosyası içe aktarmak için aşağıdaki adımları uygulayın:

Bu komutu çalıştırarak Cloud Dataflow API'yi etkinleştirin.

gcloud services enable dataflow.googleapis.com

Tabloyu içe aktarmak için aşağıdaki komutları çalıştırın.

NUM_WORKERS=$(expr 3 \* $CLUSTER_NUM_NODES)
gcloud beta dataflow jobs run import-bus-data-$(date +%s) \
--gcs-location gs://dataflow-templates/latest/GCS_SequenceFile_to_Cloud_Bigtable \
--num-workers=$NUM_WORKERS --max-workers=$NUM_WORKERS \
--parameters bigtableProject=$GOOGLE_CLOUD_PROJECT,bigtableInstanceId=$INSTANCE_ID,bigtableTableId=$TABLE_ID,sourcePattern=gs://cloud-bigtable-public-datasets/bus-data/*

İçe aktarma işlemini izleme

İşi Cloud Dataflow kullanıcı arayüzünde izleyebilirsiniz. Ayrıca, Cloud Bigtable örneğinizdeki yükü izleme kullanıcı arayüzü ile de görüntüleyebilirsiniz. İçe aktarma işleminin tamamlanması 5 dakika sürer.

6. Kodu alın

git clone https://github.com/googlecodelabs/cbt-intro-java.git
cd cbt-intro-java

Aşağıdaki komutları çalıştırarak Java 11'e geçin:

sudo update-java-alternatives -s java-1.11.0-openjdk-amd64 && export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

7. Arama yapma

Yapacağınız ilk sorgu, basit bir satır aramasıdır. 1 Haziran 2017'de saat 00:00-01:00 arasında M86-SBS hattındaki bir otobüsün verilerini alırsınız. Bu saatte otobüs hattında NYCT_5824 kimlikli bir araç vardır.

Bu bilgiler ve şema tasarımını (Otobüs şirketi/Otobüs hattı/Zaman damgası saat bazında yuvarlanmış/Araç kimliği) bildiğinizde satır anahtarının şu olduğunu çıkarabilirsiniz:

MTA/M86-SBS/1496275200000/NYCT_5824

BusQueries.java

private static final byte[] COLUMN_FAMILY_NAME = Bytes.toBytes("cf");
private static final byte[] LAT_COLUMN_NAME = Bytes.toBytes("VehicleLocation.Latitude");
private static final byte[] LONG_COLUMN_NAME = Bytes.toBytes("VehicleLocation.Longitude");

String rowKey = "MTA/M86-SBS/1496275200000/NYCT_5824";
Result getResult =
    table.get(
        new Get(Bytes.toBytes(rowKey))
            .addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
            .addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME));

Sonuç, otobüsün o saat içindeki en son konumunu içermelidir. Ancak tüm konumları görmek istediğiniz için get isteğinde maksimum sürüm sayısını ayarlayın.

BusQueries.java

Result getResult =
    table.get(
        new Get(Bytes.toBytes(rowKey))
            .setMaxVersions(Integer.MAX_VALUE)
            .addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
            .addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME));

Cloud Shell'de, söz konusu otobüsün bir saat içindeki enlemlerinin ve boylamlarının listesini almak için aşağıdaki komutu çalıştırın:

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=lookupVehicleInGivenHour

Sonuçları görselleştirmek için enlemleri ve boylamları kopyalayıp MapMaker Uygulaması'na yapıştırabilirsiniz. Birkaç katmandan sonra ücretsiz hesap oluşturmanız istenir. Hesap oluşturabilir veya mevcut katmanlarınızı silebilirsiniz. Bu codelab'de, yalnızca takip etmek istiyorsanız her adım için bir görselleştirme yer almaktadır. Bu ilk sorgunun sonucu:

f1a1fac6051c6210.png

8. Tarama yapma

Şimdi, otobüs hattının o saatteki tüm verilerini görüntüleyelim. Tarama kodu, kodu alma işlemine oldukça benzer. Tarayıcıya bir başlangıç konumu verip yalnızca 1496275200000 zaman damgasıyla belirtilen saat içinde M86-SBS otobüs hattına ait satırları istediğinizi belirtiyorsunuz.

BusQueries.java

Scan scan;
scan = new Scan();
scan.setMaxVersions(Integer.MAX_VALUE)
    .addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
    .addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME)
    .withStartRow(Bytes.toBytes("MTA/M86-SBS/1496275200000"))
    .setRowPrefixFilter(Bytes.toBytes("MTA/M86-SBS/1496275200000"));
ResultScanner scanner = table.getScanner(scan);

Sonuçları almak için aşağıdaki komutu çalıştırın.

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=scanBusLineInGivenHour

c18a4ac6522d08a2.png

Harita Oluşturucu uygulaması aynı anda birden fazla liste gösterebilir. Böylece, ilk sorgunuzda hangi otobüslerin araç olduğunu görebilirsiniz.

234c1b51e3b201e.png

Bu sorguda ilginç bir değişiklik yaparak M86-SBS otobüs hattının tüm aylık verilerini görüntüleyebilirsiniz. Bunu yapmak çok kolaydır. Sonucu almak için başlangıç satırından zaman damgasını ve önek filtresini kaldırın.

BusQueries.java

scan.withStartRow(Bytes.toBytes("MTA/M86-SBS/"))
    .setRowPrefixFilter(Bytes.toBytes("MTA/M86-SBS/"));

// Optionally, reduce the results to receive one version per column
// since there are so many data points.
scan.setMaxVersions(1);

Sonuçları almak için aşağıdaki komutu çalıştırın. (Uzun bir sonuç listesi gösterilir.)

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=scanEntireBusLine

Sonuçları Map Maker'a kopyalarsanız otobüs güzergahının ısı haritasını görüntüleyebilirsiniz. Turuncu noktalar durakları, parlak kırmızı noktalar ise rotanın başlangıç ve bitiş noktalarını gösterir.

346f52e61b3d8902.png

9. Filtreleri tanıtma

Ardından, doğuya ve batıya giden otobüsleri filtreleyip her biri için ayrı bir ısı haritası oluşturacaksınız.

BusQueries.java

Scan scan;
ResultScanner scanner;
scan = new Scan();
SingleColumnValueFilter valueFilter =
    new SingleColumnValueFilter(
        COLUMN_FAMILY_NAME,
        Bytes.toBytes("DestinationName"),
        CompareOp.EQUAL,
        Bytes.toBytes("Select Bus Service Yorkville East End AV"));

scan.setMaxVersions(1)
    .addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
    .addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME);
scan.withStartRow(Bytes.toBytes("MTA/M86-SBS/"))
    .setRowPrefixFilter(Bytes.toBytes("MTA/M86-SBS/"));
scan.setFilter(valueFilter);
scanner = table.getScanner(scan);

Doğuya giden otobüslerle ilgili sonuçları almak için aşağıdaki komutu çalıştırın.

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=filterBusesGoingEast

Batıya giden otobüsleri görmek için valueFilter'daki dizeyi değiştirin:

BusQueries.java

SingleColumnValueFilter valueFilter =
    new SingleColumnValueFilter(
        COLUMN_FAMILY_NAME,
        Bytes.toBytes("DestinationName"),
        CompareOp.EQUAL,
        Bytes.toBytes("Select Bus Service Westside West End AV"));

Batıya giden otobüslerle ilgili sonuçları almak için aşağıdaki komutu çalıştırın.

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=filterBusesGoingWest

Doğuya giden otobüsler

76f6f62096a6847a.png

Batıya giden otobüsler

2b5771ee9046399f.png

İki ısı haritasını karşılaştırarak rotalardaki farklılıkları ve tempodaki farklılıkları görebilirsiniz. Verilerin bir yorumuna göre, batıya doğru giden rotada otobüsler daha çok durduruluyor. Bu durum özellikle Central Park'a girerken daha belirgin. Doğuya giden otobüslerde ise pek fazla tıkanma noktası görülmüyor.

10. Çok aralıklı tarama yapma

Son sorguda, bir bölgedeki birçok otobüs hattıyla ilgilendiğiniz durumu ele alacaksınız:

BusQueries.java

private static final String[] MANHATTAN_BUS_LINES = {"M1","M2","M3",...

Scan scan;
ResultScanner scanner;
List<RowRange> ranges = new ArrayList<>();
for (String busLine : MANHATTAN_BUS_LINES) {
  ranges.add(
      new RowRange(
          Bytes.toBytes("MTA/" + busLine + "/1496275200000"), true,
          Bytes.toBytes("MTA/" + busLine + "/1496275200001"), false));
}
Filter filter = new MultiRowRangeFilter(ranges);
scan = new Scan();
scan.setFilter(filter);
scan.setMaxVersions(Integer.MAX_VALUE)
    .addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
    .addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME);
scan.withStartRow(Bytes.toBytes("MTA/M")).setRowPrefixFilter(Bytes.toBytes("MTA/M"));
scanner = table.getScanner(scan);

Sonuçları almak için aşağıdaki komutu çalıştırın.

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=scanManhattanBusesInGivenHour

7349d94f7d41f1d1.png

11. Tamamla

Ücretlerden kaçınmak için temizleme

Bu codelab'de kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirilmesini istemiyorsanız örneğinizi silmeniz gerekir.

gcloud bigtable instances delete $INSTANCE_ID

İşlediğimiz konular

  • Şema tasarımı
  • Örnek, tablo ve aile oluşturma
  • Dataflow ile sıra dosyalarını içe aktarma
  • Arama, tarama, filtreyle tarama ve çoklu aralık taramasıyla sorgulama

Sonraki adımlar