การเรียกใช้งาน BigQuery ควบคู่ไปกับเวิร์กโฟลว์

1. บทนำ

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

เวิร์กโฟลว์คือบริการจัดการเป็นกลุ่มที่มีการจัดการครบวงจรซึ่งเรียกใช้ Google Cloud หรือบริการภายนอกตามลำดับที่คุณกำหนด

BigQuery คือคลังข้อมูลขององค์กรที่มีการจัดการครบวงจร ซึ่งช่วยให้คุณจัดการและวิเคราะห์ข้อมูลหลายเทราไบต์ได้ด้วยฟีเจอร์ในตัว เช่น แมชชีนเลิร์นนิง การวิเคราะห์เชิงพื้นที่ และ Business Intelligence

ใน Codelab นี้ คุณจะเรียกใช้การค้นหา BigQuery บางส่วนกับชุดข้อมูล Wikipedia สาธารณะ จากนั้นคุณจะเห็นวิธีเรียกใช้การค้นหา BigQuery หลายรายการทีละรายการในแบบอนุกรม ซึ่งเป็นส่วนหนึ่งของกลุ่มเวิร์กโฟลว์เป็นกลุ่ม สุดท้าย คุณสามารถโหลดการค้นหาพร้อมกันได้โดยใช้ฟีเจอร์การทำซ้ำพร้อมกันของเวิร์กโฟลว์เพื่อเพิ่มความเร็วถึง 5 เท่า

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเรียกใช้การค้นหา BigQuery กับชุดข้อมูล Wikipedia
  • วิธีเรียกใช้การค้นหาหลายรายการให้เป็นส่วนหนึ่งของการจัดกลุ่มเวิร์กโฟลว์เป็นกลุ่ม
  • วิธีโหลดการค้นหาพร้อมกันโดยใช้เวิร์กโฟลว์ซ้ำๆ พร้อมกันเพื่อเพิ่มความเร็วสูงสุด 5 เท่า

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้บริการหรือไม่ และไม่สามารถเปลี่ยนแปลงได้หลังจากขั้นตอนนี้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้

จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน ดังนี้

55efc1aaa7a4d3ad.png

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้

7ffe5cbb04455448.png

เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ใช้งานได้ต่อเนื่องและทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานทั้งหมดใน Codelab นี้ทำได้ในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไรเลย

3. สำรวจชุดข้อมูล Wikipedia

ขั้นแรก ให้สำรวจชุดข้อมูล Wikipedia ใน BigQuery

ไปที่ส่วน BigQuery ของ Google Cloud Console แล้วดำเนินการดังนี้

ea75ab12a7c012a4.png

ใต้ bigquery-samples คุณจะเห็นชุดข้อมูลสาธารณะต่างๆ รวมถึงชุดข้อมูลที่เกี่ยวข้องกับ Wikipedia บางส่วน ดังนี้

c9484e305b8e1438.png

ใต้ชุดข้อมูล wikipedia_pageviews คุณจะเห็นตารางต่างๆ สำหรับการดูหน้าเว็บจากปีต่างๆ ดังนี้

c540a4162640cbb3.png

คุณสามารถเลือกตารางใดตารางหนึ่ง (เช่น 201207) และดูตัวอย่างข้อมูล โดยทำดังนี้

b5b2a334cd6f63c0.png

นอกจากนี้คุณยังเรียกใช้การค้นหาในตารางได้อีกด้วย เช่น คำค้นหานี้จะเลือกชื่อภาพยนตร์/รายการทีวี 100 อันดับแรกที่มียอดดูสูงสุด

SELECT TITLE, SUM(views)
FROM bigquery-samples.wikipedia_pageviews.201207h
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100

เมื่อเรียกใช้การค้นหา การโหลดข้อมูลจะใช้เวลาประมาณ 20 วินาที

1df3877aed1653b4.png

4. กำหนดเวิร์กโฟลว์เพื่อเรียกใช้การค้นหาหลายรายการ

การเรียกใช้ข้อความค้นหาในตารางเดียวสามารถทำได้อย่างง่ายดาย อย่างไรก็ตาม การเรียกใช้การค้นหาหลายข้อความในหลายตารางและจัดเรียงผลการค้นหาอาจเป็นเรื่องที่ค่อนข้างน่าเบื่อ เวิร์กโฟลว์จะช่วยเรื่องไวยากรณ์สำหรับการปรับปรุงได้ด้วย

ภายใน Cloud Shell ให้สร้างไฟล์ workflow-serial.yaml เพื่อสร้างเวิร์กโฟลว์เพื่อเรียกใช้คำค้นหาหลายรายการกับหลายตาราง ดังนี้

touch workflow-serial.yaml

จากนั้นคุณจะแก้ไขไฟล์ด้วยตัวแก้ไขใน Cloud Shell ได้โดยทำดังนี้

33bf9325b078ad8.png

ภายในไฟล์ workflow-serial.yaml ขั้นตอนแรกของ init ให้สร้างแผนที่ results เพื่อติดตามการทำซ้ำแต่ละรายการที่ใช้ชื่อตาราง และกําหนดอาร์เรย์ tables ด้วยรายการตารางที่คุณต้องการเรียกใช้การค้นหา ในกรณีนี้ เราจะเลือก 5 ตารางดังนี้

main:
    steps:
    - init:
        assign:
            - results : {}
            - tables:
                - 201201h
                - 201202h
                - 201203h
                - 201204h
                - 201205h

ถัดไป ให้กำหนดขั้นตอน runQueries ขั้นตอนนี้จะปรับปรุงในแต่ละตาราง และใช้เวิร์กโฟลว์ เครื่องมือเชื่อมต่อ BigQuery เพื่อเรียกใช้การค้นหาเพื่อค้นหาชื่อหนังสือ 100 อันดับแรกที่มีการดูหน้าเว็บมากที่สุดในแต่ละตาราง จากนั้นจะบันทึกชื่อและมุมมองยอดนิยมจากแต่ละตารางในการแมปผลลัพธ์ ดังนี้

    - runQueries:
        for:
            value: table
            in: ${tables}
            steps:
            - runQuery:
                call: googleapis.bigquery.v2.jobs.query
                args:
                    projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    body:
                        useLegacySql: false
                        useQueryCache: false
                        timeoutMs: 30000
                        # Find the top 100 titles with most views on Wikipedia
                        query: ${
                            "SELECT TITLE, SUM(views)
                            FROM `bigquery-samples.wikipedia_pageviews." + table + "`
                            WHERE LENGTH(TITLE) > 10
                            GROUP BY TITLE
                            ORDER BY SUM(VIEWS) DESC
                            LIMIT 100"
                            }
                result: queryResult
            - returnResult:
                assign:
                    # Return the top title from each table
                    - results[table]: {}
                    - results[table].title: ${queryResult.rows[0].f[0].v}
                    - results[table].views: ${queryResult.rows[0].f[1].v}

ในขั้นตอนสุดท้าย ให้แสดงแผนที่ results:

    - returnResults:
        return: ${results}

5. เรียกใช้การค้นหาหลายรายการด้วยเวิร์กโฟลว์

คุณต้องตรวจสอบว่าได้เปิดใช้ Workflows API แล้วก่อนที่จะทำให้ใช้งานได้และเรียกใช้เวิร์กโฟลว์ คุณเปิดใช้ได้จาก Google Cloud Console หรือใช้ gcloud ใน Cloud Shell ดังนี้

gcloud services enable workflows.googleapis.com

สร้างบัญชีบริการสำหรับเวิร์กโฟลว์ โดยทำดังนี้

SERVICE_ACCOUNT=workflows-bigquery-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Workflows BigQuery service account"

ตรวจสอบว่าบัญชีบริการมีบทบาทในการบันทึกและเรียกใช้งาน BigQuery โดยทำดังนี้

PROJECT_ID=your-project-id
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/logging.logWriter \
  --role roles/bigquery.jobUser \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

ทำให้เวิร์กโฟลว์ใช้งานได้ด้วยบัญชีบริการ

gcloud workflows deploy bigquery-serial \
    --source=workflow-serial.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

ในที่สุดคุณพร้อมที่จะเรียกใช้เวิร์กโฟลว์แล้ว

ค้นหาเวิร์กโฟลว์ bigquery-serial ในส่วนเวิร์กโฟลว์ของ Cloud Console แล้วกดปุ่ม Execute:

b6afa4747680334f.png

หรือเรียกใช้เวิร์กโฟลว์ด้วย gcloud ใน Cloud Shell ก็ได้ โดยทำดังนี้

gcloud workflows run bigquery-serial

คุณควรเห็นการดำเนินการเวิร์กโฟลว์ใช้เวลาประมาณ 1 นาที (20 วินาทีสำหรับแต่ละตารางจากทั้ง 5 ตาราง)

ในตอนท้าย คุณจะเห็นเอาต์พุตจากแต่ละตารางพร้อมด้วยชื่อและมุมมองยอดนิยม ดังนี้

304d11a5bffdada4.png

baf31533d3671c9e.png

6. โหลดการค้นหาหลายรายการพร้อมกันโดยใช้ขั้นตอนคู่ขนาน

เวิร์กโฟลว์ในขั้นตอนก่อนหน้าใช้เวลาประมาณ 1 นาทีเนื่องจากเรียกใช้การค้นหา 5 รายการซึ่งใช้เวลาแต่ละรายการละ 20 วินาที เนื่องจากการค้นหาเหล่านี้เป็นการค้นหาอิสระ คุณจึงเรียกใช้พร้อมกันได้จริงๆ โดยใช้ฟีเจอร์การทำซ้ำแบบคู่ขนานของเวิร์กโฟลว์

คัดลอกไฟล์ workflow-serial.yaml ไปยังไฟล์ workflow-parallel.yaml ใหม่ คุณจะต้องทำการเปลี่ยนแปลง 2-3 รายการในไฟล์ใหม่เพื่อเปลี่ยนขั้นตอนอนุกรมเป็นขั้นตอนคู่ขนาน

เปลี่ยนขั้นตอน runQueries ในไฟล์ workflow-parallel.yaml ก่อนอื่นให้เพิ่มคีย์เวิร์ด parallel ซึ่งจะทำให้การทำซ้ำของ for Loop แต่ละครั้งทำงานขนานกัน ขั้นที่ 2 ประกาศตัวแปร results เป็นตัวแปร shared วิธีนี้จะช่วยให้ Branch เขียนตัวแปรได้ เราจะเพิ่มผลลัพธ์แต่ละรายการต่อท้ายตัวแปรนี้

- runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}

ทำให้เวิร์กโฟลว์ที่ทำงานพร้อมกันใช้งานได้

gcloud workflows deploy bigquery-parallel \
    --source=workflow-parallel.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

เรียกใช้เวิร์กโฟลว์ดังนี้

gcloud workflows run bigquery-parallel

คุณควรเห็นการดำเนินการเวิร์กโฟลว์ใช้เวลาประมาณ 20 วินาที ปัญหานี้เกิดจากการค้นหาทั้ง 5 รายการทำงานพร้อมกัน เพิ่มความเร็วสูงสุด 5 เท่าโดยเปลี่ยนโค้ดเพียงไม่กี่บรรทัด

ซึ่งท้ายที่สุดแล้ว คุณจะเห็นผลลัพธ์เดียวกันจากแต่ละตารางพร้อมด้วยชื่อและมุมมองยอดนิยม แต่ใช้เวลาดำเนินการน้อยกว่ามาก

1825d49ef225c828.png

7. ขอแสดงความยินดี

ยินดีด้วย คุณศึกษา Codelab จบแล้ว ดูข้อมูลเพิ่มเติมได้ในเอกสารเวิร์กโฟลว์ในขั้นตอนพร้อมกัน

สรุปประเด็นที่ได้พูดถึง

  • วิธีเรียกใช้การค้นหา BigQuery กับชุดข้อมูล Wikipedia
  • วิธีเรียกใช้การค้นหาหลายรายการให้เป็นส่วนหนึ่งของการจัดกลุ่มเวิร์กโฟลว์เป็นกลุ่ม
  • วิธีโหลดการค้นหาพร้อมกันโดยใช้เวิร์กโฟลว์ซ้ำๆ พร้อมกันเพื่อเพิ่มความเร็วสูงสุด 5 เท่า