1. Giriş
Bu codelab'de Cloud Bigtable'ı Java HBase istemcisiyle birlikte kullanmayı öğreneceksiniz.
Neler öğreneceksiniz?
- Şema tasarımında yaygın hatalardan kaçınma
- Sıra dosyasındaki verileri içe aktarma
- Verilerinizi sorgulama
İşiniz bittiğinde, İstanbul otobüs verilerini gösteren çeşitli haritanız olacak. Örneğin, Manhattan'daki otobüs gezilerine ait şu ısı haritasını oluşturursunuz:
Google Cloud Platform'u kullanma deneyiminizi nasıl değerlendirirsiniz?
Bu eğiticiden nasıl yararlanacaksınız?
2. Veri kümesi hakkında
New York otobüsleriyle ilgili bir veri kümesine bakacaksınız. 300'den fazla otobüs rotası ve bu rotaları izleyen 5.800 araç var. Veri kümemiz; varış noktası adı, araç kimliği, enlem, boylam, beklenen varış saati ve planlanan varış zamanını içeren bir günlüktür. Veri kümesi, Haziran 2017 için yaklaşık 10 dakikada bir alınan 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'da veriler sözlüksel olarak otomatik olarak sıralanır. Bu nedenle, şemanızı iyi tasarlarsanız ilgili verileri sorgulamak çok verimli olur. Cloud Bigtable, satır anahtarına göre nokta aramaları veya bitişik bir satır kümesi döndüren satır aralığı taramaları kullanan sorgulara olanak tanır. Ancak şemanız iyi düşünülmezse birden çok satır aramasını bir araya getirirken veya daha da kötüsü, son derece yavaş işlemler olan tam tablo taramaları yaparken bulabilirsiniz.
Sorguları planlayın
Verilerimizde çeşitli bilgiler bulunur ancak bu codelab için otobüsün konumunu ve hedefini kullanacaksınız.
Bu bilgilerle şu sorguları gerçekleştirebilirsiniz:
- Belirli bir saat içindeki tek bir otobüsün konumunu öğrenin.
- Bir otobüs hattı veya belirli bir otobüsle ilgili bir günlük verilere ulaşın.
- Dikdörtgen içindeki tüm otobüsleri haritada bulabilirsiniz.
- Tüm otobüslerin mevcut konumlarını öğrenin (bu verileri gerçek zamanlı olarak aktarıyorsanız).
Bu sorgu kümesinin tamamı en iyi şekilde birlikte yapılamaz. Örneğin, zamana göre sıralama yapıyorsanız tam tablo taraması yapmadan konuma dayalı tarama yapamazsınız. En sık çalıştırdığınız sorgulara göre öncelik belirlemeniz gerekiyor.
Bu codelab'de aşağıdaki sorgu gruplarını optimize etmeye ve yürütmeye odaklanacaksınız:
- Bir saatten uzun bir süre içinde belirli bir aracın konumunu alma.
- Bir saat içinde bir otobüs hattının tamamının yerlerini öğrenin.
- İzmir'deki tüm otobüslerin konumlarını bir saat içinde bul.
- Bir saat içinde Manhattan'daki tüm otobüslerin en son konumlarını öğrenin.
- Ay boyunca bir otobüs hattının tamamının konumlarını öğrenin.
- Bir saatten uzun bir süre boyunca belirli bir varış noktasına sahip bir otobüs hattının tamamını görün.
Satır anahtarını tasarlama
Bu codelab'de statik bir veri kümesiyle çalışacaksınız ancak ölçeklenebilirlik için bir şema tasarlayacaksınız. Tabloya daha fazla veri yolu verisi aktarmanıza ve iyi performans göstermeye devam etmenize olanak tanıyan bir şema tasarlayacaksınız.
Satır anahtarı için önerilen şemayı burada görebilirsiniz:
[Otobüs şirketi/Otobüs hattı/Saate yuvarlanmış zaman damgası/Araç kimliği]. Her satırda bir saatlik veri vardır ve her hücrede verilerin zaman damgalı birden çok sürümü bulunur.
Bu codelab'de işleri basitleştirmek için tek bir sütun ailesi kullanacaksınız. Aşağıda, verilerin nasıl göründüğüne dair örnek bir görünüm verilmiştir. 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
Şimdi bir Cloud Bigtable tablosu oluşturacaksınız.
İlk olarak yeni bir proje oluşturun. "Cloud Shell'i etkinleştir"i tıklayarak açabileceğiniz yerleşik Cloud Shell'i kullanın. düğmesini tıklayın.
Codelab komutlarının kopyalanıp yapıştırılmasını kolaylaştırmak için aşağıdaki ortam değişkenlerini ayarlayı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 halihazırda yüklüdür.
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 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
Aşağıdaki adımları uygulayarak bu codelab için gs://cloud-bigtable-public-datasets/bus-data
üzerinden bir dizi dosyası içe aktarı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 aktarmayı izleme
İşi Cloud Dataflow kullanıcı arayüzünde izleyebilirsiniz. Ayrıca izleme kullanıcı arayüzü ile Cloud Bigtable örneğinizdeki yükü görüntüleyebilirsiniz. İçe aktarma işleminin tamamı 5 dakika sürer.
6. Kodu alın
git clone https://github.com/googlecodelabs/cbt-intro-java.git cd cbt-intro-java
Şu 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
Gerçekleştireceğiniz ilk sorgu, basit bir satır aramasıdır. Bir otobüsün verilerini 1 Haziran 2017 tarihinde 00:00 ile 01:00 saatleri arasında M86-SBS hattında alacaksınız. O dönemde otobüs hattında NYCT_5824
kimliğine sahip bir araç var.
Bu bilgilere dayanarak ve şema tasarımını (Otobüs şirketi/Otobüs hattı/Saate yuvarlanmış Zaman Damgası/Araç Kimliğine yuvarlanmış) sahip olduğunuzda, satır anahtarının şu şekilde olduğu sonucunu çı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çta, otobüsün o saat içindeki en son konumu bulunmalıdır. Ancak tüm konumları görmek istediğinizden, get isteğinde maksimum sürüm sayısını belirleyin.
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));
Söz konusu otobüsün bir saat içindeki enlem ve boylam değerlerini almak için Cloud Shell'de 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 enlem ve boylam değerlerini Harita Oluşturucusu Uygulaması'na kopyalayıp yapıştırabilirsiniz. Birkaç katmandan sonra ücretsiz bir hesap oluşturmanız istenir. Bir hesap oluşturabilir veya sadece sahip olduğunuz mevcut katmanları silebilirsiniz. Yalnızca ilerlemek istiyorsanız bu codelab'de her adım için bir görsel yer alır. İlk sorgunun sonucu şudur:
8. Tarama yap
Şimdi, o saat için otobüs hattıyla ilgili tüm verileri görüntüleyelim. Tarama kodu, get koduna oldukça benzer. Tarayıcıya bir başlangıç konumu verir ve daha sonra, M86-SBS otobüs hattı için yalnızca 1496275200000 zaman damgasıyla belirtilen bir saat içinde satır istediğinizi belirtirsiniz.
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şturucusu uygulamasında aynı anda birden fazla liste görüntülenebilir. Böylece, çalıştırdığınız ilk sorguda hangi otobüslerin araç olduğunu görebilirsiniz.
Bu sorguda yapılan ilginç bir değişiklik, M86-SBS otobüs hattına ait tüm ayın verilerini görüntülemektir. Bu işlemi yapmak çok kolaydır. Sonucu almak için başlangıç satırındaki ve önek filtresindeki zaman damgasını 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 olacaktır.)
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanEntireBusLine
Sonuçları Harita Oluşturucusu'na kopyalarsanız, otobüs rotasının ısı haritasını görüntüleyebilirsiniz. Turuncu lekeler durakları, parlak kırmızı lekeler ise rotanın başlangıcı ve sonudur.
9. Filtreleri kullanma
Ardından doğuya ve batıya giden otobüsleri filtreleyecek ve 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
Otobüslerin batıya gitmesini sağlamak için valueFilter'deki 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 doğru giden otobüsler
Batıya doğru giden otobüsler
İki ısı haritasını karşılaştırarak rotalardaki farklılıkları ve ilerleme hızındaki farklılıkları görebilirsiniz. Verilerden biri de batıya doğru rota üzerinde, otobüslerin özellikle de Central Park'a girerken daha fazla durduğudur. Doğuya doğru giden otobüslerde de pek fazla dar geçit noktası görmezsiniz.
10. Çok aralıklı tarama gerçekleştirme
Son sorguda, bir bölgedeki çok sayıda otobüs hattıyla ilgileniyorsanız 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. Sonlandır
Ücret almamak için yer açın
Bu codelab'de kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirilmesini önlemek amacıyla örneğinizi silmeniz gerekir.
gcloud bigtable instances delete $INSTANCE_ID
İşlediklerimiz
- Şema tasarımı
- Örnek, tablo ve aile oluşturma
- Dizi dosyalarını Dataflow ile içe aktarma
- Arama, tarama, filtreyle tarama ve çok aralıklı tarama ile sorgulama
Sonraki adımlar
- Belgelerden Cloud Bigtable hakkında daha fazla bilgi edinin.
- Diğer Google Cloud Platform özelliklerini kendiniz deneyin. Eğiticilerimize göz atın.
- OpenTSDB entegrasyonuyla zaman serisi verilerini nasıl izleyeceğinizi öğrenin