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
  • 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:

7349d94f7d41f1d1.pngS

Bagaimana Anda menilai pengalaman Anda menggunakan Google Cloud Platform?

Pemula Menengah Mahir

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

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.

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, 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:

f1a1fac6051c6210.png

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

c18a4ac6522d08a2.png

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

234c1b51e3b201e.pngS

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.

346f52e61b3d8902.pngS

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

76f6f62096a6847a.pngS

Bus menuju ke barat

2b5771ee9046399f.pngS

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

7349d94f7d41f1d1.pngS

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