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
- Impor 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 ini di Manhattan:
Bagaimana Anda menilai pengalaman Anda menggunakan Google Cloud Platform?
Bagaimana Anda akan menggunakan tutorial ini?
2. Tentang set data
Anda akan melihat {i>dataset<i} tentang bus-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 jadwal waktu kedatangan. {i>Dataset<i} terdiri dari {i>snapshot<i} yang diambil setiap 10 menit untuk Juni 2017.
3. Desain skema
Untuk mendapatkan performa terbaik dari Cloud Bigtable, Anda harus berhati-hati saat mendesain skema. Data di Cloud Bigtable otomatis diurutkan secara leksikografis, jadi jika Anda mendesain skema dengan baik, pembuatan kueri untuk data terkait akan sangat efisien. Cloud Bigtable memungkinkan kueri menggunakan pencarian titik berdasarkan kunci baris atau pemindaian rentang baris yang menampilkan kumpulan baris yang berdekatan. Namun, jika skema Anda tidak dipikirkan dengan baik, Anda mungkin mendapati diri Anda 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 itu, Anda dapat menjalankan kueri berikut:
- Mendapatkan lokasi satu bus selama jam tertentu.
- Dapatkan data sehari untuk jalur bus atau bus tertentu.
- Temukan semua bus dalam persegi panjang di peta.
- Dapatkan lokasi saat ini dari semua bus (jika Anda menyerap data ini secara real time).
Kumpulan kueri ini tidak dapat dilakukan bersama-sama secara optimal. Misalnya, jika Anda mengurutkan berdasarkan waktu, Anda tidak dapat melakukan pemindaian berdasarkan lokasi tanpa melakukan pemindaian tabel penuh. Anda perlu mengatur prioritas berdasarkan kueri yang paling sering dijalankan.
Untuk codelab ini, Anda akan berfokus pada pengoptimalan dan eksekusi kumpulan kueri berikut:
- Mendapatkan lokasi kendaraan tertentu dalam satu jam.
- Dapatkan lokasi seluruh jalur bus dalam waktu satu jam.
- Dapatkan lokasi semua bus di Manhattan dalam satu jam.
- Dapatkan lokasi terbaru dari semua bus di Manhattan dalam satu jam.
- Dapatkan lokasi seluruh jalur bus selama sebulan.
- Dapatkan lokasi seluruh jalur bus dengan tujuan tertentu lebih dari satu jam.
Mendesain row key
Untuk codelab ini, Anda akan bekerja dengan set data statis, tetapi Anda akan mendesain skema untuk skalabilitas. Anda akan merancang skema yang memungkinkan Anda melakukan streaming lebih banyak data bus ke dalam tabel dan tetap berperforma baik.
Berikut adalah skema yang diusulkan untuk row key:
[Perusahaan bus/Jalur bus/Stempel waktu dibulatkan ke bawah ke jam/ID Kendaraan]. Setiap baris memiliki data selama satu jam, dan setiap sel memiliki beberapa versi data yang diberi stempel waktu.
Untuk codelab ini, Anda akan menggunakan satu grup kolom agar semuanya tetap sederhana. Berikut adalah contoh tampilan data. Data diurutkan menurut baris kunci.
Tombol baris | cf:KendaraanLocation.latitude | cf:KendaraanLocation.Bujur | ... |
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 keluarga
Selanjutnya, Anda akan membuat tabel Cloud Bigtable.
Pertama, buat proyek 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, alat command line gcloud, antarmuka command line cbt, dan Maven, yang sudah terinstal.
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 Anda 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 kumpulan 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 pemantauan. Perlu waktu 5 menit untuk menyelesaikan seluruh impor.
6. Mendapatkan kode
git clone https://github.com/googlecodelabs/cbt-intro-java.git cd cbt-intro-java
Ubah 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 bus di jalur M86-SBS pada 1 Juni 2017 dari pukul 00.00 hingga 01.00. Pada saat itu, kendaraan dengan ID NYCT_5824
ada di jalur bus.
Dengan informasi tersebut, dan mengetahui desain skemanya (Perusahaan bus/Jalur/Stempel waktu yang dibulatkan ke bawah menjadi jam/ID Kendaraan), Anda dapat menyimpulkan bahwa kunci baris tersebut 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 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 untuk bus tersebut dalam 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 lintang dan bujur ke Aplikasi MapMaker untuk memvisualisasikan hasilnya. Setelah beberapa lapisan, Anda akan diberi tahu untuk membuat akun gratis. Anda dapat membuat akun atau cukup menghapus lapisan yang sudah ada. Codelab ini menyertakan visualisasi untuk setiap langkah, jika Anda hanya ingin mengikutinya. Berikut adalah hasil untuk kueri pertama ini:
8. Lakukan pemindaian
Sekarang, mari kita lihat semua data jalur bus untuk jam tersebut. Pindai kode terlihat sangat mirip dengan kode get. Anda memberi pemindai posisi awal dan kemudian menunjukkan bahwa Anda hanya menginginkan baris untuk jalur bus M86-SBS dalam jam yang dilambangkan dengan 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 Pencipta Peta dapat menampilkan beberapa daftar sekaligus, sehingga Anda dapat melihat bus mana yang merupakan kendaraan dari kueri pertama yang Anda jalankan.
Modifikasi yang menarik pada kueri ini adalah melihat data sepanjang bulan untuk jalur bus M86-SBS, dan ini sangat mudah dilakukan. Hapus stempel waktu dari baris awal dan filter awalan 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 hasil yang panjang.)
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. Gumpalan oranye menunjukkan perhentian, dan gumpalan merah terang adalah awal dan akhir rute.
9. Perkenalkan filter
Selanjutnya, Anda akan memfilter bus yang menuju ke arah timur dan bus yang menuju ke barat, serta membuat peta panas terpisah untuk masing-masing.
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 untuk bus yang berjalan ke arah timur.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=filterBusesGoingEast
Untuk memindahkan bus ke arah barat, ubah string dalam 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 untuk bus yang berangkat ke arah 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 serta melihat perbedaan kecepatan. Salah satu interpretasi data tersebut adalah bahwa pada rute yang menuju ke barat, bus-bus tersebut lebih sering berhenti, terutama saat memasuki Central Park. Dan di bus yang menuju ke arah timur, Anda tidak melihat banyak titik tersedak.
10. Melakukan pemindaian multi-rentang
Untuk kueri akhir, Anda akan menangani kasus saat Anda memperhatikan 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
Melakukan pembersihan untuk menghindari biaya
Agar tidak menimbulkan biaya pada akun Google Cloud Platform Anda untuk resource yang digunakan dalam codelab ini, Anda harus menghapus instance Anda.
gcloud bigtable instances delete $INSTANCE_ID
Yang telah kita bahas
- Desain skema
- Menyiapkan instance, tabel, dan keluarga
- 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.
- Cobalah sendiri fitur Google Cloud Platform lainnya. Lihat tutorial kami.
- Pelajari cara memantau data deret waktu dengan integrasi OpenTSDB