Pengantar Cloud Bigtable

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:

7349d94f7d41f1d1.png

Bagaimana penilaian Anda terhadap pengalaman menggunakan Google Cloud Platform?

Pemula Menengah Mahir

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membaca dan menyelesaikan latihannya

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.

a74d156ca7862b28.png

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:

f1a1fac6051c6210.png

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

c18a4ac6522d08a2.png

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

234c1b51e3b201e.png

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.

346f52e61b3d8902.png

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

76f6f62096a6847a.png

Bus menuju ke barat

2b5771ee9046399f.png

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

7349d94f7d41f1d1.png

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