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

1. บทนำ

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

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

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

ในโค้ดแล็บนี้ คุณจะเรียกใช้การค้นหา 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 ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

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

จาก Google Cloud Console ให้คลิกไอคอน 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. กำหนดเวิร์กโฟลว์เพื่อเรียกใช้การค้นหาหลายรายการ

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

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

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

คุณต้องตรวจสอบว่าได้เปิดใช้ 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 อย่างเพื่อเปลี่ยนขั้นตอนแบบอนุกรมเป็นขั้นตอนแบบขนาน

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

- 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 เท่า