1. Pengantar
Dalam codelab ini, Anda akan diperkenalkan dengan cara menggunakan Cloud Bigtable dengan klien Java HBase.
Anda akan mempelajari cara
- Menghindari kesalahan umum dalam desain skema
- Mengimpor data dalam file urutan
- Membuat kueri data Anda
Setelah selesai, Anda akan memiliki beberapa peta yang menampilkan data bus New York City. Misalnya, Anda akan membuat peta panas perjalanan bus di Manhattan ini:

Bagaimana penilaian Anda terhadap pengalaman menggunakan Google Cloud Platform?
Bagaimana Anda akan menggunakan tutorial ini?
2. Tentang set data
Anda akan melihat set data tentang bus di New York City. Ada lebih dari 300 rute bus dan 5.800 kendaraan yang mengikuti rute tersebut. Set data kami adalah log yang mencakup nama tujuan, ID kendaraan, lintang, bujur, perkiraan waktu kedatangan, dan waktu kedatangan terjadwal. Set data terdiri dari snapshot yang diambil setiap sekitar 10 menit selama Juni 2017.
3. Desain skema
Untuk mendapatkan performa terbaik dari Cloud Bigtable, Anda harus berhati-hati saat mendesain skema. Data di Cloud Bigtable diurutkan secara otomatis secara leksikografis, jadi jika Anda mendesain skema dengan baik, kueri untuk data terkait akan sangat efisien. Cloud Bigtable memungkinkan kueri menggunakan pencarian titik berdasarkan row key atau pemindaian rentang baris yang menampilkan serangkaian baris yang berdekatan. Namun, jika skema Anda tidak dirancang dengan baik, Anda mungkin harus menggabungkan beberapa pencarian baris, atau lebih buruk lagi, melakukan pemindaian tabel penuh, yang merupakan operasi yang sangat lambat.
Merencanakan kueri
Data kami memiliki berbagai informasi, tetapi untuk codelab ini, Anda akan menggunakan lokasi dan tujuan bus.
Dengan informasi tersebut, Anda dapat menjalankan kueri berikut:
- Mendapatkan lokasi satu bus selama satu jam tertentu.
- Mendapatkan data selama satu hari untuk jalur bus atau bus tertentu.
- Menemukan semua bus dalam persegi panjang di peta.
- Mendapatkan lokasi saat ini dari semua bus (jika Anda menyerap data ini secara real time).
Kumpulan kueri ini tidak dapat dilakukan secara bersamaan dengan optimal. Misalnya, jika Anda mengurutkan menurut waktu, Anda tidak dapat melakukan pemindaian berdasarkan lokasi tanpa melakukan pemindaian tabel menyeluruh. Anda perlu memprioritaskan berdasarkan kueri yang paling sering Anda jalankan.
Untuk codelab ini, Anda akan berfokus pada pengoptimalan dan eksekusi kumpulan kueri berikut:
- Mendapatkan lokasi kendaraan tertentu selama satu jam.
- Dapatkan lokasi seluruh jalur bus selama lebih dari satu jam.
- Dapatkan lokasi semua bus di Manhattan dalam satu jam.
- Dapatkan lokasi terbaru semua bus di Manhattan dalam satu jam.
- Dapatkan lokasi seluruh jalur bus selama sebulan.
- Dapatkan lokasi seluruh jalur bus dengan tujuan tertentu selama satu jam.
Mendesain kunci baris
Untuk codelab ini, Anda akan menggunakan set data statis, tetapi Anda akan mendesain skema untuk skalabilitas. Anda akan mendesain skema yang memungkinkan Anda melakukan streaming lebih banyak data bus ke dalam tabel dan tetap berperforma baik.
Berikut adalah skema yang diusulkan untuk kunci baris:
[Perusahaan bus/Rute bus/Stempel waktu dibulatkan ke bawah hingga jam/ID kendaraan]. Setiap baris memiliki data per jam, dan setiap sel menyimpan beberapa versi data yang diberi stempel waktu.
Untuk codelab ini, Anda akan menggunakan satu family kolom agar lebih sederhana. Berikut adalah contoh tampilan data. Data diurutkan berdasarkan kunci baris.
Kunci baris | 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. Membuat instance, tabel, dan grup
Selanjutnya, Anda akan membuat tabel Cloud Bigtable.
Pertama, buat project baru. Gunakan Cloud Shell bawaan, yang dapat Anda buka dengan mengklik tombol "Activate Cloud Shell" di sudut kanan atas.

Tetapkan variabel lingkungan berikut untuk mempermudah penyalinan dan penempelan perintah codelab:
INSTANCE_ID="bus-instance" CLUSTER_ID="bus-cluster" TABLE_ID="bus-data" CLUSTER_NUM_NODES=3 CLUSTER_ZONE="us-central1-c"
Cloud Shell dilengkapi dengan alat yang akan Anda gunakan dalam codelab ini, yaitu alat command line gcloud, antarmuka command line cbt, dan Maven, yang sudah diinstal.
Aktifkan Cloud Bigtable API dengan menjalankan perintah ini.
gcloud services enable bigtable.googleapis.com bigtableadmin.googleapis.com
Buat instance dengan menjalankan perintah berikut:
gcloud bigtable instances create $INSTANCE_ID \
--cluster=$CLUSTER_ID \
--cluster-zone=$CLUSTER_ZONE \
--cluster-num-nodes=$CLUSTER_NUM_NODES \
--display-name=$INSTANCE_ID
Setelah membuat instance, isi file konfigurasi cbt, lalu buat tabel dan grup kolom dengan menjalankan perintah berikut:
echo project = $GOOGLE_CLOUD_PROJECT > ~/.cbtrc echo instance = $INSTANCE_ID >> ~/.cbtrc cbt createtable $TABLE_ID cbt createfamily $TABLE_ID cf
5. Mengimpor data
Impor sekumpulan file urutan untuk codelab ini dari gs://cloud-bigtable-public-datasets/bus-data dengan langkah-langkah berikut:
Aktifkan Cloud Dataflow API dengan menjalankan perintah ini.
gcloud services enable dataflow.googleapis.com
Jalankan perintah berikut untuk mengimpor tabel.
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/*
Memantau impor
Anda dapat memantau tugas di UI Cloud Dataflow. Selain itu, Anda dapat melihat beban pada instance Cloud Bigtable dengan UI pemantauannya. Seluruh proses impor akan memakan waktu 5 menit.
6. Mendapatkan kode
git clone https://github.com/googlecodelabs/cbt-intro-java.git cd cbt-intro-java
Beralih ke Java 11 dengan menjalankan perintah berikut:
sudo update-java-alternatives -s java-1.11.0-openjdk-amd64 && export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
7. Melakukan pencarian
Kueri pertama yang akan Anda lakukan adalah pencarian baris sederhana. Anda akan mendapatkan data untuk bus di jalur M86-SBS pada 1 Juni 2017 dari pukul 00.00 hingga 01.00. Kendaraan dengan ID NYCT_5824 berada di jalur bus tersebut pada saat itu.
Dengan informasi tersebut, dan mengetahui desain skema (Perusahaan bus/Rute bus/Stempel waktu yang dibulatkan ke bawah hingga jam/ID kendaraan), Anda dapat menyimpulkan bahwa kunci barisnya adalah:
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));
Hasilnya harus berisi lokasi terbaru bus dalam satu jam tersebut. Namun, Anda ingin melihat semua lokasi, jadi tetapkan jumlah maksimum versi pada permintaan get.
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));
Di Cloud Shell, jalankan perintah berikut untuk mendapatkan daftar lintang dan bujur bus tersebut selama satu jam:
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=lookupVehicleInGivenHour
Anda dapat menyalin dan menempelkan garis lintang dan bujur ke Aplikasi MapMaker untuk memvisualisasikan hasilnya. Setelah beberapa lapisan, Anda akan diminta untuk membuat akun gratis. Anda dapat membuat akun atau menghapus lapisan yang ada. Codelab ini menyertakan visualisasi untuk setiap langkah, jika Anda hanya ingin mengikutinya. Berikut hasil untuk kueri pertama ini:

8. Menjalankan pemindaian
Sekarang, mari kita lihat semua data untuk jalur bus selama satu jam tersebut. Kode pemindaian terlihat sangat mirip dengan kode pengambilan. Anda memberi pemindai posisi awal, lalu menunjukkan bahwa Anda hanya menginginkan baris untuk jalur bus M86-SBS dalam satu jam yang ditunjukkan oleh stempel waktu 1496275200000.
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);
Jalankan perintah berikut untuk mendapatkan hasilnya.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanBusLineInGivenHour

Aplikasi Map Maker dapat menampilkan beberapa daftar sekaligus, sehingga Anda dapat melihat bus mana yang merupakan kendaraan dari kueri pertama yang Anda jalankan.

Modifikasi yang menarik untuk kueri ini adalah melihat seluruh data bulanan untuk jalur bus M86-SBS, dan hal ini sangat mudah dilakukan. Hapus stempel waktu dari filter awalan dan baris awal untuk mendapatkan hasilnya.
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);
Jalankan perintah berikut untuk mendapatkan hasilnya. (Akan ada daftar panjang hasil.)
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanEntireBusLine
Jika menyalin hasilnya ke MapMaker, Anda dapat melihat peta panas rute bus. Blob oranye menunjukkan perhentian, dan blob merah cerah adalah awal dan akhir rute.

9. Memperkenalkan filter
Selanjutnya, Anda akan memfilter bus yang menuju ke timur dan bus yang menuju ke barat, lalu membuat peta panas terpisah untuk masing-masing bus.
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);
Jalankan perintah berikut untuk mendapatkan hasil bagi bus yang menuju ke timur.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=filterBusesGoingEast
Untuk mendapatkan bus yang menuju ke barat, ubah string di valueFilter:
BusQueries.java
SingleColumnValueFilter valueFilter =
new SingleColumnValueFilter(
COLUMN_FAMILY_NAME,
Bytes.toBytes("DestinationName"),
CompareOp.EQUAL,
Bytes.toBytes("Select Bus Service Westside West End AV"));
Jalankan perintah berikut untuk mendapatkan hasil bus yang menuju ke barat.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=filterBusesGoingWest
Bus menuju ke timur

Bus menuju ke barat

Dengan membandingkan kedua peta panas, Anda dapat melihat perbedaan rute dan perbedaan kecepatan. Salah satu interpretasi data adalah bahwa di rute yang menuju ke barat, bus lebih sering dihentikan, terutama saat memasuki Central Park. Di bus yang menuju ke timur, Anda tidak akan melihat banyak titik kemacetan.
10. Melakukan pemindaian multi-rentang
Untuk kueri terakhir, Anda akan membahas kasus saat Anda tertarik dengan banyak jalur bus di suatu area:
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);
Jalankan perintah berikut untuk mendapatkan hasilnya.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanManhattanBusesInGivenHour

11. Selesaikan
Membersihkan untuk menghindari tagihan
Agar tidak menimbulkan biaya pada akun Google Cloud Platform Anda untuk resource yang digunakan dalam codelab ini, Anda harus menghapus instance.
gcloud bigtable instances delete $INSTANCE_ID
Yang telah kita bahas
- Desain skema
- Menyiapkan instance, tabel, dan grup
- Mengimpor file urutan dengan Dataflow
- Membuat kueri dengan pencarian, pemindaian, pemindaian dengan filter, dan pemindaian multi-rentang
Langkah berikutnya
- Pelajari Cloud Bigtable lebih lanjut dalam dokumentasi.
- Coba sendiri fitur Google Cloud Platform lainnya. Lihat tutorial kami.
- Pelajari cara memantau data deret waktu dengan integrasi OpenTSDB