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:

Google Cloud Platform'u kullanma deneyiminizi nasıl değerlendirirsiniz?
Bu eğitimi nasıl kullanacaksınız?
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.

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:

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

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

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.

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

Batıya giden otobüsler

İ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

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
- Cloud Bigtable hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Diğer Google Cloud Platform özelliklerini kendiniz deneyin. Eğiticilerimize göz atın.
- OpenTSDB entegrasyonuyla zaman serisi verilerini nasıl izleyeceğinizi öğrenin.