BigQuery işlerini Workflows ile paralel olarak çalıştırma

1. Giriş

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows, Google Cloud veya harici hizmetleri tanımladığınız sırayla yürüten, tümüyle yönetilen bir düzenleme hizmetidir.

BigQuery, tümüyle yönetilen kurumsal bir veri ambarıdır. Makine öğrenimi, coğrafi veri analizi ve iş zekası gibi yerleşik özelliklerle terabaytlarca veriyi yönetmenize ve analiz etmenize yardımcı olur.

Bu codelab'de, herkese açık Wikipedia veri kümesine karşı bazı BigQuery sorguları çalıştıracaksınız. Ardından, Workflows düzenlemesinin bir parçası olarak birden fazla BigQuery sorgusunu seri şekilde nasıl çalıştıracağınızı öğreneceksiniz. Son olarak, iş akışlarının paralel yineleme özelliğini kullanarak sorguları paralelleştirerek 5 kata kadar hız artışı elde edeceksiniz.

Neler öğreneceksiniz?

  • Wikipedia veri kümesine karşı BigQuery sorgularını çalıştırma
  • İş akışı düzenlemesinin bir parçası olarak birden fazla sorguyu seri olarak çalıştırma
  • 5 kata kadar hız artışı için iş akışlarında paralel yineleme kullanarak sorguları nasıl paralelleştireceğinizi öğrenin.

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i Başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortamın temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

7ffe5cbb04455448.png

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Herhangi bir şey yüklemeniz gerekmez.

3. Wikipedia veri kümesini keşfedin

Öncelikle BigQuery'deki Wikipedia veri kümesini keşfedin.

Google Cloud Console'un BigQuery bölümüne gidin:

ea75ab12a7c012a4.png

bigquery-samples bölümünde, Wikipedia ile ilgili bazı veri kümeleri de dahil olmak üzere çeşitli herkese açık veri kümeleri görürsünüz:

c9484e305b8e1438.png

wikipedia_pageviews veri kümesi altında, farklı yıllara ait sayfa görüntülemeleriyle ilgili çeşitli tabloları görebilirsiniz:

c540a4162640cbb3.png

Tablolardan birini (ör. 201207) ve verileri önizleyin:

b5b2a334cd6f63c0.png

Tabloda sorgu da çalıştırabilirsiniz. Örneğin, bu sorgu en çok görüntülenen ilk 100 öğeyi seçer:

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

Sorguyu çalıştırdıktan sonra verilerin yüklenmesi yaklaşık 20 saniye sürer:

1df3877aed1653b4.png

4. Birden fazla sorgu çalıştırmak için iş akışı tanımlama

Tek bir tabloya karşı sorgu çalıştırmak kolaydır. Ancak birden fazla tabloya karşı birden fazla sorgu çalıştırmak ve sonuçları derlemek oldukça sıkıcı olabilir. Bu konuda yardımcı olması için Workflows'un iteration söz diziminden yararlanabilirsiniz.

Cloud Shell'de, birden fazla tabloya karşı birden fazla sorgu çalıştırmak için bir iş akışı oluşturmak üzere workflow-serial.yaml dosyası oluşturun:

touch workflow-serial.yaml

Daha sonra dosyayı Cloud Shell'deki düzenleyiciyle düzenleyebilirsiniz:

33bf9325b078ad8.png

workflow-serial.yaml dosyasında, ilk init adımda, tablo adlarıyla anahtarlanmış her yinelemeyi takip etmek için bir results haritası oluşturun. Ayrıca, sorgu çalıştırmak istediğiniz tabloların listesini içeren bir tables dizisi tanımlayın. Bu örnekte 5 tablo seçiyoruz:

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

Ardından, bir runQueries adımı tanımlayın. Bu adımda her tablo üzerinde yineleme yapılır ve her tablodaki en fazla sayfa görüntülemesine sahip ilk 100 başlığı bulmak için sorgu çalıştırmak üzere Workflows'ün BigQuery bağlayıcısı kullanılır. Ardından, sonuç haritasındaki her tablodan en üstteki başlığı ve görünümleri kaydeder:

    - 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}

Son adımda results haritasını döndürün:

    - returnResults:
        return: ${results}

5. İş akışlarıyla birden fazla sorgu çalıştırma

İş akışını dağıtıp çalıştırmadan önce Workflows API'nin etkin olduğundan emin olmanız gerekir. Bu özelliği Google Cloud Console'dan veya Cloud Shell'de gcloud simgesini kullanarak etkinleştirebilirsiniz:

gcloud services enable workflows.googleapis.com

İş Akışları için hizmet hesabı oluşturun:

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

Hizmet hesabının BigQuery işlerini günlüğe kaydetme ve çalıştırma rollerine sahip olduğundan emin olun:

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

İş akışını hizmet hesabıyla dağıtın:

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

Son olarak, iş akışını çalıştırmaya hazırsınız.

Cloud Console'un İş Akışları bölümünde bigquery-serial iş akışını bulun ve Execute düğmesine basın:

b6afa4747680334f.png

Alternatif olarak, iş akışını Cloud Shell'de gcloud ile de çalıştırabilirsiniz:

gcloud workflows run bigquery-serial

İş akışı yürütme işleminin yaklaşık 1 dakika sürdüğünü görürsünüz (5 tablonun her biri için 20 saniye).

Sonunda, en iyi başlıkları ve görüntülemeleri içeren her tablonun çıktısını görürsünüz:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Paralel adımlar içeren birden fazla sorguyu paralelleştirme

Önceki adımdaki iş akışı, her biri 20 saniye süren 5 sorgu çalıştırdığı için yaklaşık 1 dakika sürdü. Bunlar bağımsız sorgular olduğundan, İş Akışları'nın paralel yineleme özelliğini kullanarak bunları paralel olarak çalıştırabilirsiniz.

workflow-serial.yaml dosyasını yeni bir workflow-parallel.yaml dosyasına kopyalayın. Yeni dosyada, sıralı adımları paralel adımlara dönüştürmek için birkaç değişiklik yapacaksınız.

workflow-parallel.yaml dosyasında runQueries adımını değiştirin. Öncelikle parallel anahtar kelimesini ekleyin. Bu, for döngüsünün her yinelemesinin paralel olarak çalışmasına olanak tanır. İkinci olarak, results değişkenini shared değişkeni olarak bildirin. Bu, değişkenin bir dal tarafından yazılabilir olmasını sağlar. Her sonucu bu değişkene ekleyeceğiz.

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

Paralel iş akışını dağıtın:

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

İş akışını çalıştırın:

gcloud workflows run bigquery-parallel

İş akışı yürütmesinin yaklaşık 20 saniye sürdüğünü göreceksiniz. Bunun nedeni, 5 sorgunun da paralel olarak çalıştırılmasıdır. Yalnızca birkaç satır kod değişikliğiyle 5 kata kadar hız artışı!

Sonuç olarak, her tablodan aynı çıkışı (en iyi başlıklar ve görüntülemeler) çok daha kısa bir yürütme süresiyle elde edersiniz:

1825d49ef225c828.png

7. Tebrikler

Tebrikler, codelab'i tamamladınız. Daha fazla bilgi edinmek için Paralel adımlarla ilgili İş Akışları belgelerine göz atın.

İşlediğimiz konular

  • Wikipedia veri kümesine karşı BigQuery sorgularını çalıştırma
  • İş akışı düzenlemesinin bir parçası olarak birden fazla sorguyu seri olarak çalıştırma
  • İş akışlarında paralel yineleme kullanarak sorguları nasıl paralelleştireceğinizi ve bu sayede hızı 5 kata kadar nasıl artıracağınızı öğrenin.