1. บทนำ
ใน Codelab นี้ คุณจะใช้เครื่องมือการตรวจสอบของ Cloud Bigtable เพื่อสร้างงานศิลปะที่หลากหลายผ่านการเขียนและการอ่านข้อมูลด้วย Cloud Dataflow และไคลเอ็นต์ Java HBase
คุณจะได้เรียนรู้วิธีการ
- โหลดข้อมูลจำนวนมากไปยัง Bigtable โดยใช้ Cloud Dataflow
- ตรวจสอบอินสแตนซ์และตาราง Bigtable ในขณะที่ข้อมูลได้รับการนำเข้า
- ค้นหา Bigtable โดยใช้งาน Dataflow
- สำรวจเครื่องมือหลัก Visualizer ที่ใช้ค้นหาฮอตสปอตตามการออกแบบสคีมาของคุณ
- สร้างงานศิลปะโดยใช้เครื่องมือแสดงข้อมูลผ่านภาพหลัก
คุณจะให้คะแนนประสบการณ์การใช้งาน Cloud Bigtable อย่างไร
คุณจะใช้บทแนะนำนี้อย่างไร
2. สร้างฐานข้อมูล Bigtable
Cloud Bigtable คือบริการฐานข้อมูล NoSQL Big Data ของ Google และเป็นฐานข้อมูลเดียวกับที่ขับเคลื่อนบริการหลักหลายอย่างของ Google ซึ่งรวมถึง Search, Analytics, Maps และ Gmail เหมาะสำหรับการใช้งานภาระงานเชิงวิเคราะห์ขนาดใหญ่และสร้างแอปพลิเคชันที่มีเวลาในการตอบสนองต่ำ อ่านข้อมูลเบื้องต้นเกี่ยวกับ Cloud Bigtable Codelab เพื่อดูข้อมูลเบื้องต้นอย่างละเอียด
สร้างโปรเจ็กต์
ก่อนอื่นให้สร้างโปรเจ็กต์ใหม่ ใช้ Cloud Shell ในตัว ซึ่งเปิดได้โดยคลิก "เปิดใช้งาน Cloud Shell" ที่มุมบนขวา
ตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้เพื่อให้คัดลอกและวางคำสั่ง Codelab ได้ง่ายขึ้น
BIGTABLE_PROJECT=$GOOGLE_CLOUD_PROJECT INSTANCE_ID="keyviz-art-instance" CLUSTER_ID="keyviz-art-cluster" TABLE_ID="art" CLUSTER_NUM_NODES=1 CLUSTER_ZONE="us-central1-c" # You can choose a zone closer to you
Cloud Shell มาพร้อมกับเครื่องมือที่คุณจะใช้ใน Codelab นี้ เครื่องมือบรรทัดคำสั่ง gcloud อินเทอร์เฟซบรรทัดคำสั่ง cbt และ Maven ที่ติดตั้งไว้แล้ว
เปิดใช้ Cloud Bigtable API โดยการเรียกใช้คำสั่งนี้
gcloud services enable bigtable.googleapis.com bigtableadmin.googleapis.com
สร้างอินสแตนซ์โดยการเรียกใช้คำสั่งต่อไปนี้
gcloud bigtable instances create $INSTANCE_ID \ --cluster=$CLUSTER_ID \ --cluster-zone=$CLUSTER_ZONE \ --cluster-num-nodes=$CLUSTER_NUM_NODES \ --display-name=$INSTANCE_ID
หลังจากสร้างอินสแตนซ์แล้ว ให้สร้างไฟล์การกำหนดค่า cbt แล้วสร้างกลุ่มตารางและคอลัมน์โดยเรียกใช้คำสั่งต่อไปนี้
echo project = $GOOGLE_CLOUD_PROJECT > ~/.cbtrc echo instance = $INSTANCE_ID >> ~/.cbtrc cbt createtable $TABLE_ID cbt createfamily $TABLE_ID cf
3. เรียนรู้: การเขียนไปยัง Bigtable ด้วย Dataflow
พื้นฐานการเขียน
เมื่อเขียนไปยัง Cloud Bigtable คุณต้องระบุออบเจ็กต์การกำหนดค่า CloudBigtableTableConfiguration
ออบเจ็กต์นี้ระบุรหัสโปรเจ็กต์และรหัสอินสแตนซ์สำหรับตารางของคุณ รวมถึงชื่อของตารางด้วย
CloudBigtableTableConfiguration bigtableTableConfig = new CloudBigtableTableConfiguration.Builder() .withProjectId(PROJECT_ID) .withInstanceId(INSTANCE_ID) .withTableId(TABLE_ID) .build();
จากนั้นไปป์ไลน์จะส่งผ่านออบเจ็กต์ HBase Mutation
ได้ ซึ่งอาจรวมถึง Put และ Delete
p.apply(Create.of("hello", "world")) .apply( ParDo.of( new DoFn<String, Mutation>() { @ProcessElement public void processElement(@Element String rowkey, OutputReceiver<Mutation> out) { long timestamp = System.currentTimeMillis(); Put row = new Put(Bytes.toBytes(rowkey)); row.addColumn(...); out.output(row); } })) .apply(CloudBigtableIO.writeToTable(bigtableTableConfig));
งาน LoadData Dataflow
หน้าถัดไปจะแสดงวิธีเรียกใช้งาน LoadData แต่เราจะพูดถึงส่วนสำคัญของไปป์ไลน์
ในการสร้างข้อมูล คุณจะต้องสร้างไปป์ไลน์ที่ใช้คลาส GenerateSequence (คล้ายกับ for Loop) เพื่อเขียนแถวจำนวนหนึ่งที่มีข้อมูลแบบสุ่มจำนวน 2-3 เมกะไบต์ คีย์แถวจะเป็นการเว้นวรรคและย้อนกลับหมายเลขลำดับ ดังนั้น 250
จะกลายเป็น 0000000052
LoadData.java
String numberFormat = "%0" + maxLength + "d"; p.apply(GenerateSequence.from(0).to(max)) .apply( ParDo.of( new DoFn<Long, Mutation>() { @ProcessElement public void processElement(@Element Long rowkey, OutputReceiver<Mutation> out) { String paddedRowkey = String.format(numberFormat, rowkey); // Reverse the rowkey for more efficient writing String reversedRowkey = new StringBuilder(paddedRowkey).reverse().toString(); Put row = new Put(Bytes.toBytes(reversedRowkey)); // Generate random bytes byte[] b = new byte[(int) rowSize]; new Random().nextBytes(b); long timestamp = System.currentTimeMillis(); row.addColumn(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes("C"), timestamp, b); out.output(row); } })) .apply(CloudBigtableIO.writeToTable(bigtableTableConfig));
4. สร้างข้อมูลลงใน Bigtable และตรวจสอบการไหลเข้า
คำสั่งต่อไปนี้จะเรียกใช้งานโฟลว์ข้อมูลที่สร้างข้อมูล 40GB ในตารางของคุณ ซึ่งมากเพียงพอให้ Key Visualizer เปิดใช้งานได้
เปิดใช้ Cloud Dataflow API
gcloud services enable dataflow.googleapis.com
รับรหัสจาก GitHub และเปลี่ยนเป็นไดเรกทอรี
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/bigtable/beam/keyviz-art
สร้างข้อมูล (สคริปต์จะใช้เวลาประมาณ 15 นาที)
mvn compile exec:java -Dexec.mainClass=keyviz.LoadData \ "-Dexec.args=--bigtableProjectId=$BIGTABLE_PROJECT \ --bigtableInstanceId=$INSTANCE_ID --runner=dataflow \ --bigtableTableId=$TABLE_ID --project=$GOOGLE_CLOUD_PROJECT"
ตรวจสอบการนำเข้า
คุณตรวจสอบงานได้ใน Cloud Dataflow UI นอกจากนี้ คุณยังดูโหลดบนอินสแตนซ์ Cloud Bigtable ได้ด้วย UI การตรวจสอบ
ใน UI ของ Dataflow คุณจะเห็นกราฟงานและเมตริกงานต่างๆ รวมถึงองค์ประกอบที่ประมวลผลแล้ว, vCPU ปัจจุบันและอัตราการส่งข้อมูล
Bigtable มีเครื่องมือการตรวจสอบมาตรฐานสำหรับการดำเนินการอ่าน/เขียน พื้นที่เก็บข้อมูลที่ใช้ อัตราข้อผิดพลาด และอื่นๆ ในระดับอินสแตนซ์ คลัสเตอร์ และตาราง นอกจากนี้ Bigtable ยังมี Key Visualizer ที่แจกแจงการใช้งานของคุณตามคีย์แถวที่เราจะใช้เมื่อสร้างข้อมูลแล้วอย่างน้อย 30 GB
5. เรียนรู้: การอ่านจาก Bigtable ที่มี Dataflow
หลักพื้นฐานในการอ่าน
เมื่ออ่านจาก Cloud Bigtable คุณต้องระบุออบเจ็กต์การกำหนดค่า CloudBigtableTableScanConfiguration
ซึ่งคล้ายกับ CloudBigtableTableConfiguration
แต่คุณระบุแถวที่จะสแกนและอ่านได้
Scan scan = new Scan(); scan.setCacheBlocks(false); scan.setFilter(new FirstKeyOnlyFilter()); CloudBigtableScanConfiguration config = new CloudBigtableScanConfiguration.Builder() .withProjectId(options.getBigtableProjectId()) .withInstanceId(options.getBigtableInstanceId()) .withTableId(options.getBigtableTableId()) .withScan(scan) .build();
จากนั้นใช้การดำเนินการนี้เพื่อเริ่มไปป์ไลน์
p.apply(Read.from(CloudBigtableIO.read(config))) .apply(...
อย่างไรก็ตาม หากคุณต้องการอ่านเป็นส่วนหนึ่งของไปป์ไลน์ คุณสามารถส่ง CloudBigtableTableConfiguration
ไปยัง doFn
ที่ขยาย AbstractCloudBigtableTableDoFn
ได้
p.apply(GenerateSequence.from(0).to(10)) .apply(ParDo.of(new ReadFromTableFn(bigtableTableConfig, options)));
จากนั้นเรียก super()
พร้อมการกำหนดค่าของคุณและ getConnection()
เพื่อรับการเชื่อมต่อแบบกระจาย
public static class ReadFromTableFn extends AbstractCloudBigtableTableDoFn<Long, Void> { public ReadFromTableFn(CloudBigtableConfiguration config, ReadDataOptions readDataOptions) { super(config); } @ProcessElement public void processElement(PipelineOptions po) { Table table = getConnection().getTable(TableName.valueOf(options.getBigtableTableId())); ResultScanner imageData = table.getScanner(scan); } }
งาน ReadData Dataflow
สำหรับ Codelab นี้ คุณจะต้องอ่านจากตารางทุกๆ วินาที จึงจะเริ่มไปป์ไลน์ด้วยลำดับที่สร้างขึ้นซึ่งจะทริกเกอร์ช่วงการอ่านหลายช่วงตามเวลาไฟล์ CSV ที่ป้อน
บางครั้งคุณอาจจะต้องคำนวณช่วงแถวที่จะสแกนเมื่อเวลาดังกล่าว แต่คุณสามารถคลิกที่ชื่อไฟล์เพื่อดูซอร์สโค้ดได้หากคุณต้องการเรียนรู้เพิ่มเติม
ReadData.java
p.apply(GenerateSequence.from(0).withRate(1, new Duration(1000))) .apply(ParDo.of(new ReadFromTableFn(bigtableTableConfig, options)));
ReadData.java
public static class ReadFromTableFn extends AbstractCloudBigtableTableDoFn<Long, Void> { List<List<Float>> imageData = new ArrayList<>(); String[] keys; public ReadFromTableFn(CloudBigtableConfiguration config, ReadDataOptions readDataOptions) { super(config); keys = new String[Math.toIntExact(getNumRows(readDataOptions))]; downloadImageData(readDataOptions.getFilePath()); generateRowkeys(getNumRows(readDataOptions)); } @ProcessElement public void processElement(PipelineOptions po) { // Determine which column will be drawn based on runtime of job. long timestampDiff = System.currentTimeMillis() - START_TIME; long minutes = (timestampDiff / 1000) / 60; int timeOffsetIndex = Math.toIntExact(minutes / KEY_VIZ_WINDOW_MINUTES); ReadDataOptions options = po.as(ReadDataOptions.class); long count = 0; List<RowRange> ranges = getRangesForTimeIndex(timeOffsetIndex, getNumRows(options)); if (ranges.size() == 0) { return; } try { // Scan with a filter that will only return the first key from each row. This filter is used // to more efficiently perform row count operations. Filter rangeFilters = new MultiRowRangeFilter(ranges); FilterList firstKeyFilterWithRanges = new FilterList( rangeFilters, new FirstKeyOnlyFilter(), new KeyOnlyFilter()); Scan scan = new Scan() .addFamily(Bytes.toBytes(COLUMN_FAMILY)) .setFilter(firstKeyFilterWithRanges); Table table = getConnection().getTable(TableName.valueOf(options.getBigtableTableId())); ResultScanner imageData = table.getScanner(scan); } catch (Exception e) { System.out.println("Error reading."); e.printStackTrace(); } } /** * Download the image data as a grid of weights and store them in a 2D array. */ private void downloadImageData(String artUrl) { ... } /** * Generates an array with the rowkeys that were loaded into the specified Bigtable. This is * used to create the correct intervals for scanning equal sections of rowkeys. Since Bigtable * sorts keys lexicographically if we just used standard intervals, each section would have * different sizes. */ private void generateRowkeys(long maxInput) { ... } /** * Get the ranges to scan for the given time index. */ private List<RowRange> getRangesForTimeIndex(@Element Integer timeOffsetIndex, long maxInput) { ... } }
6. กำลังสร้างผลงานชิ้นเอก
ตอนนี้คุณเข้าใจวิธีโหลดข้อมูลลงใน Bigtable และอ่านจาก Dataflow แล้ว คุณสามารถเรียกใช้คำสั่งสุดท้ายซึ่งจะสร้างภาพโมนาลิซาภายใน 8 ชั่วโมง
mvn compile exec:java -Dexec.mainClass=keyviz.ReadData \ "-Dexec.args=--bigtableProjectId=$BIGTABLE_PROJECT \ --bigtableInstanceId=$INSTANCE_ID --runner=dataflow \ --bigtableTableId=$TABLE_ID --project=$GOOGLE_CLOUD_PROJECT"
คุณสามารถใช้ที่เก็บข้อมูลที่มีรูปภาพที่มีอยู่ได้ หรือคุณจะสร้างไฟล์อินพุตจากรูปภาพใดๆ ของคุณเองด้วยเครื่องมือนี้ แล้วอัปโหลดไปยังที่เก็บข้อมูล GCS สาธารณะก็ได้
ชื่อไฟล์สร้างขึ้นจาก gs://keyviz-art/[painting]_[hours]h.txt
เช่น gs://keyviz-art/american_gothic_4h.txt
ตัวเลือกการวาดภาพ:
- american_gothic
- mona_lisa
- pearl_earring
- persistence_of_memory
- starry_night
- sunday_afternoon
- the_scream
ตัวเลือกชั่วโมง: 1, 4, 8, 12, 24, 48, 72, 96, 120, 144
ทำให้ที่เก็บข้อมูลหรือไฟล์ GCS เป็นแบบสาธารณะโดยให้บทบาท Storage Object Viewer
แก่ allUsers
เมื่อเลือกรูปภาพแล้ว ก็เพียงแค่เปลี่ยนพารามิเตอร์ --file-path
ในคำสั่งนี้
mvn compile exec:java -Dexec.mainClass=keyviz.ReadData \ "-Dexec.args=--bigtableProjectId=$BIGTABLE_PROJECT \ --bigtableInstanceId=$INSTANCE_ID --runner=dataflow \ --bigtableTableId=$TABLE_ID --project=$GOOGLE_CLOUD_PROJECT \ --filePath=gs://keyviz-art/american_gothic_4h.txt"
7. กลับมาตรวจสอบภายหลัง
รูปภาพขนาดเต็มอาจใช้เวลา 2-3 ชั่วโมงกว่าจะเคลื่อนไหว แต่หลังจากผ่านไป 30 นาที คุณควรเริ่มเห็นกิจกรรมในโปรแกรมแสดงข้อมูลผ่านภาพคีย์ มีพารามิเตอร์หลายอย่างที่คุณสามารถใช้ได้ ได้แก่ การซูม ความสว่าง และเมตริก คุณสามารถซูม โดยใช้ล้อเลื่อนของเมาส์ หรือลากรูปสี่เหลี่ยมผืนผ้าบนตารางกริดแสดงข้อมูลภาพแป้น
ความสว่างจะเปลี่ยนขนาดของรูปภาพ ซึ่งจะเป็นประโยชน์หากคุณต้องการดูข้อมูลโดยละเอียดของบริเวณที่ร้อนมาก
และยังปรับเมตริกที่จะแสดงได้อีกด้วย มีไคลเอ็นต์ OP, ไบต์ที่อ่าน และไคลเอ็นต์ไบต์การเขียน เป็นต้น "ไคลเอ็นต์สำหรับไบต์ที่อ่าน" ทำให้ภาพดูลื่นไหลขณะ "Ops" จะสร้างภาพที่มีเส้นมากขึ้นซึ่งทำให้บางภาพดูเท่มาก
8. ดำเนินการให้เสร็จสิ้น
ล้างข้อมูลเพื่อหลีกเลี่ยงการเรียกเก็บเงิน
คุณควรลบอินสแตนซ์เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud Platform สำหรับทรัพยากรที่ใช้ใน Codelab นี้
gcloud bigtable instances delete $INSTANCE_ID
หัวข้อที่ครอบคลุม
- การเขียนไปยัง Bigtable ด้วย Dataflow
- การอ่านจาก Bigtable ด้วย Dataflow (เมื่อเริ่มไปป์ไลน์ ในระหว่างไปป์ไลน์)
- การใช้เครื่องมือการตรวจสอบ Dataflow
- การใช้เครื่องมือการตรวจสอบ Bigtable ซึ่งรวมถึง Key Visualizer
ขั้นตอนถัดไป
- อ่านเพิ่มเติมเกี่ยวกับวิธีสร้างอาร์ตเวิร์กจาก Key Visualizer
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Cloud Bigtable ในเอกสารประกอบ
- ลองใช้ฟีเจอร์อื่นๆ ของ Google Cloud Platform ด้วยตัวคุณเอง ดูวิดีโอบทแนะนำ