Google Cloud için ABAP SDK'sını kullanarak SAP'te BigQuery ML tahminlerini okuma

1. Giriş

Bu codelab'de BigQuery'de bir makine öğrenimi (ML) modeli oluşturacak ve Google Cloud için ABAP SDK'yı kullanarak bu modelden tahminler alacaksınız.

Aşağıdaki Google Cloud hizmetlerinden yararlanacaksınız:

  • BigQuery
  • Cloud Shell

Ne oluşturacaksınız?

Aşağıdakileri oluşturursunuz:

  • BigQuery Machine Learning (ML) modeli.
  • BigQuery API'yi çağırmak için BigQuery İş Kullanıcısı rolüne sahip bir hizmet hesabı.
  • BigQuery API'yi çağırmak ve makine öğrenimi modelinden tahminler almak için bir ABAP programı.

2. Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi veya Google Cloud Platform için 90 günlük ücretsiz deneme hesabı oluşturun.
  • Sisteminizde yüklü SAP GUI (Windows veya Java) SAP GUI dizüstü bilgisayarınıza zaten yüklüyse Uygulama Sunucusu IP'si olarak VM'nin harici IP adresini kullanarak SAP'ye bağlanın. Mac kullanıyorsanız bu bağlantıda bulunan Java için SAP GUI'yi de yükleyebilirsiniz.

3. Başlamadan önce

6757b2fb50ddcc2d.png

  • Hesabınızın kimliğini doğrulamak ve varsayılan projeyi abap-sdk-poc olarak ayarlamak için Cloud Shell'de aşağıdaki komutları çalıştırın. Örnek olarak us-west4-b bölgesi kullanılmıştır. Gerekirse lütfen aşağıdaki komutlarda projeyi ve bölgeyi tercihinize göre değiştirin.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Google Cloud için ABAP SDK'nın yüklü olduğu bir SAP sistemine erişiminiz olmalıdır.
  • Bu uygulamalı laboratuvara devam etmeden önce 1. uygulamalı laboratuvarı (Install ABAP Platform Trial 1909 on Google Cloud Platform and Install ABAP SDK for Google Cloud) ve 2. uygulamalı laboratuvarı (Configure ABAP SDK Authentication using tokens for SAP Hosted on Compute Engine VM) tamamlamanız gerekir.
  • 1. ve 2. codelab'i tamamladıysanız Google Cloud'da bir ABAP Platform Trial 1909 Sistemi'nin yanı sıra kimlik doğrulama ve bağlantı için gerekli kurulum sağlanmış olmalıdır.
  • 1. ve 2. codelab'i tamamlamadıysanız bu codelab'de verilen adımları uygulamak için gereken tüm altyapı ve bağlantıya sahip olmazsınız. Bu nedenle, bu codelab'e devam etmeden önce 1. ve 2. codelab'i tamamlamanız gerekir.

4. Google Cloud projenizde BigQuery API V2'yi etkinleştirin

  1. Cloud Console'da sağ üst köşedeki Cloud Shell'i Etkinleştir'i tıklayın:

6757b2fb50ddcc2d.png

  1. BigQuery API'yi etkinleştirmek için Cloud Shell'de aşağıdaki komutları çalıştırın:
gcloud services enable bigquery.googleapis.com

Başarılı bir yürütmenin ardından aşağıdaki gibi bir mesaj görürsünüz.

b5f52859df2c2f56.png

Artık Google Cloud projenizde BigQuery API'yi etkinleştirmiş olmanız gerekir.

5. Güvenli BigQuery erişimi için hizmet hesabı oluşturma

BigQuery ML modelinden güvenli bir şekilde makine öğrenimi tahminleri almak için BigQuery İş Kullanıcısı ve BigQuery Veri Görüntüleyici rollerine sahip bir hizmet hesabı oluşturmanız gerekir. Bu roller, programınızın proje içinde sorgu (iş olarak) çalıştırmasına ve tablolardan veri okumasına olanak tanır. Bu rol, yalnızca iş oluşturmak ve verileri okumak için gerekli izni verir. Böylece güvenlik riskleri en aza indirilir.

Hizmet hesabı oluşturma

Gerekli role sahip bir hizmet hesabı oluşturmak için aşağıdaki adımları uygulayın:

  1. Cloud Shell terminalinde aşağıdaki komutu çalıştırın:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Şimdi önceki adımda oluşturulan hizmet hesabına gerekli rolleri ekleyin:
gcloud projects add-iam-policy-binding abap-sdk-poc --member='serviceAccount:abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com' --role='roles/bigquery.jobUser'

gcloud projects add-iam-policy-binding abap-sdk-poc --member='serviceAccount:abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com' --role='roles/bigquery.dataViewer'

Yukarıdaki komutta, Google Cloud projesi için yer tutucu olarak abap-sdk-poc kullanılır. abap-sdk-poc yerine proje kimliğinizi yazın.

  1. Rolün eklendiğini doğrulamak için IAM sayfasına gidin. Oluşturduğunuz hizmet hesabı, kendisine atanmış rolle birlikte listelenmelidir.

6. BigQuery makine öğrenimi modeli oluşturma

Bu codelab'de, Londra'da bisiklet kiralama veri kümesini kümelemek için bir k-ortalama modeli oluşturacağız. Verilerinizi kümeler halinde gruplandırmak için k-means algoritmasını uygulayabilirsiniz. Tahmini analizle ilgili olan gözetimli makine öğreniminin aksine, gözetimsiz öğrenme tanımlayıcı analizle ilgilidir. Veriye dayalı kararlar verebilmek için verilerinizi anlamanız gerekir.

Veri kümenizi oluşturma

ML modelinizi depolamak için bir BigQuery veri kümesi oluşturmak üzere aşağıdaki adımları uygulayın:

  1. Google Cloud Console'da BigQuery sayfasına gidin. BigQuery sayfasına gidin
  2. Gezgin bölmesinde proje adınızı tıklayın.
  3. 5cf3b742649f1e2c.png İşlemleri görüntüle > Veri kümesi oluştur'u tıklayın.

3fbc072041bfa313.png

  1. Veri kümesi oluştur sayfasında aşağıdakileri yapın:
  • Veri Kümesi Kimliği için bqml_tutorial değişkenini girin.
  • Konum türü olarak Çoklu bölge'yi, ardından AB (Avrupa Birliği'nde birden fazla bölge) seçeneğini belirleyin. London Bicycle Hires herkese açık veri kümesi, AB çoklu bölgesinde saklanır. Veri kümeniz aynı konumda olmalıdır.
  • Kalan varsayılan ayarları olduğu gibi bırakıp Veri kümesi oluştur'u tıklayın. Veri kümesi oluşturma sayfası.

K-ortalama modeli oluşturma

Veri kümeniz ayarlandığına göre bir sonraki adım, verileri kullanarak k-means modeli oluşturmaktır. model_type=kmeans seçeneğiyle CREATE MODEL ifadesini kullanarak k-ortalama modeli oluşturup eğitebilirsiniz.

Sorguyu çalıştırmak ve k-ortalama modeli oluşturmak için aşağıdaki adımları uygulayın:

  1. BigQuery sayfasına gidin. BigQuery'ye gitme
  2. Düzenleyici bölmesinde aşağıdaki SQL ifadesini çalıştırın:
CREATE OR REPLACE MODEL `bqml_tutorial.london_station_clusters`
  OPTIONS(model_type='kmeans', num_clusters=4) AS
WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
  IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    isweekday,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name, isweekday)
SELECT
  * EXCEPT(station_name, isweekday)
FROM
  stationstats
  1. Gezinme panelindeki Kaynaklar bölümünde proje adınızı genişletin, bqml_tutorial'ı ve ardından london_station_clusters'ı tıklayın.
  2. Şema sekmesini tıklayın. Model şeması, BigQuery ML'nin kümeleme gerçekleştirmek için kullandığı üç istasyon özelliğini listeler. Şema aşağıdaki gibi görünmelidir:

5f1feb313bd0f6a5.png

  1. Değerlendirme sekmesini tıklayın. Bu sekmede, k-ortalama modeli tarafından tanımlanan kümelerin görselleştirmeleri gösterilir. Sayısal özellikler bölümünde, çubuk grafikler her bir merkez için en önemli 10 sayısal özellik değerini gösterir. Açılır menüden hangi özelliklerin görselleştirileceğini seçebilirsiniz.

8f9b53971e33dc08.png

7. Google Cloud için ABAP SDK'yı kullanarak BigQuery ML tahminleri alma

Google Cloud tarafında ön koşulları ayarladığınıza göre, Google Cloud için ABAP SDK'yı kullanarak makine öğrenimi modelinden tahminler almak üzere SAP sisteminizdeki adımları tamamlamaya hazırsınız.

İstemci anahtarı yapılandırması oluşturma

Google Cloud için ABAP SDK, kimlik doğrulama ve bağlantıyla ilgili yapılandırma için /GOOG/CLIENT_KEY ve /GOOG/SERVIC_MAP. tablolarını kullanır.

/GOOG/CLIENT_KEY tablosundaki yapılandırmayı korumak için aşağıdaki adımları uygulayın:

  1. SAP GUI'de SPRO işlem kodunu girin.
  2. SAP Reference IMG'yi (SAP Referans IMG) tıklayın.
  3. ABAP SDK for Google Cloud > Basic Settings > Configure Client Key'i (Google Cloud için ABAP SDK'sı > Temel Ayarlar > İstemci Anahtarını Yapılandır) tıklayın.

25871e639293b9ee.png

  1. Listelenen alanlara göre aşağıdaki değerleri koruyun, diğer tüm alanları boş bırakın:

Alan

Değer

Google Cloud Anahtar Adı

BIGQUERY_ML

Google Cloud hizmet hesabı adı

abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud Kapsamı

https://www.googleapis.com/auth/cloud-platform

Proje kimliği

abap-sdk-poc

Yetkilendirme sınıfı

/GOOG/CL_AUTH_GOOGLE

BigQuery ML modelinden tahmin almak için ABAP raporu oluşturma

ABAP raporu oluşturmak için aşağıdaki adımları uygulayın:

  1. SAP GUI'nizde SE38 işlem koduna gidin ve ZDEMO_BIGQUERY_ML_PREDICT. adında bir Rapor Programı oluşturun.
  2. Açılan pop-up pencerede, aşağıdaki resimde gösterildiği gibi ayrıntıları girin:

4cb32d50427df294.png

  1. Sonraki pop-up pencerede Yerel Nesne'yi seçin veya uygun bir paket adı girin.
  2. ABAP düzenleyicide aşağıdaki kodu ekleyin:
REPORT zdemo_bigquery_ml_predict.

types:
  begin of lty_query_result,
    centroid_id     type i,
    station_name    type string,
    isweekday       type string,
    num_trips       type i,
    distance_from_city type string,
  end of lty_query_result,
  ltt_query_result type standard table of lty_query_result.

DATA:
  lv_project_id TYPE string,
  ls_input      TYPE /goog/cl_bigquery_v2=>ty_103,
  ls_output     TYPE lty_query_result,
  lt_output     TYPE ltt_query_result.

CONSTANTS:
  lc_newline TYPE c VALUE cl_abap_char_utilities=>newline.

TRY.
    "Initialize Bigquery object, pass the client key name that you have configured in /GOOG/CLIENT_KEY table
    DATA(lo_bq) = NEW /goog/cl_bigquery_v2( iv_key_name = 'BIGQUERY_ML' ).

    "Populate relevant parameters
    lv_project_id = lo_bq->gv_project_id.

    ls_input-default_dataset-project_id = 'abap-sdk-poc'.
    ls_input-default_dataset-dataset_id = 'bqml_tutorial'.

    "This query gets predictions from
    ls_input-query =
                | WITH | && lc_newline &&
                | hs AS ( | && lc_newline &&
                | SELECT | && lc_newline &&
                | h.start_station_name AS station_name, | && lc_newline &&
                | IF | && lc_newline &&
                | (EXTRACT(DAYOFWEEK | && lc_newline &&
                | FROM | && lc_newline &&
                | h.start_date) = 1 | && lc_newline &&
                | OR EXTRACT(DAYOFWEEK | && lc_newline &&
                | FROM | && lc_newline &&
                | h.start_date) = 7, | && lc_newline &&
                | "weekend", | && lc_newline &&
                | "weekday") AS isweekday, | && lc_newline &&
                | h.duration, | && lc_newline &&
                | ST_DISTANCE(ST_GEOGPOINT(s.longitude, | && lc_newline &&
                | s.latitude), | && lc_newline &&
                | ST_GEOGPOINT(-0.1, | && lc_newline &&
                | 51.5))/1000 AS distance_from_city_center | && lc_newline &&
                | FROM | && lc_newline &&
                | `bigquery-public-data.london_bicycles.cycle_hire` AS h | && lc_newline &&
                | JOIN | && lc_newline &&
                | `bigquery-public-data.london_bicycles.cycle_stations` AS s | && lc_newline &&
                | ON | && lc_newline &&
                | h.start_station_id = s.id | && lc_newline &&
                | WHERE | && lc_newline &&
                | h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP) | && lc_newline &&
                | AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ), | && lc_newline &&
                | stationstats AS ( | && lc_newline &&
                | SELECT | && lc_newline &&
                | station_name, | && lc_newline &&
                | isweekday, | && lc_newline &&
                | AVG(duration) AS duration, | && lc_newline &&
                | COUNT(duration) AS num_trips, | && lc_newline &&
                | MAX(distance_from_city_center) AS distance_from_city_center | && lc_newline &&
                | FROM | && lc_newline &&
                | hs | && lc_newline &&
                | GROUP BY | && lc_newline &&
                | station_name, isweekday ) | && lc_newline &&
                | SELECT | && lc_newline &&
                | * EXCEPT(nearest_centroids_distance) | && lc_newline &&
                | FROM | && lc_newline &&
                | ML.PREDICT( MODEL `bqml_tutorial.london_station_clusters`, | && lc_newline &&
                | ( | && lc_newline &&
                | SELECT | && lc_newline &&
                | * | && lc_newline &&
                | FROM | && lc_newline &&
                | stationstats | && lc_newline &&
                | WHERE | && lc_newline &&
                | REGEXP_CONTAINS(station_name, 'Kennington'))) |.

    "Call API method: bigquery.jobs.query
    CALL METHOD lo_bq->query_jobs
      EXPORTING
        iv_p_project_id = lv_project_id
        is_input        = ls_input
      IMPORTING
        es_output       = DATA(ls_response)
        ev_ret_code     = DATA(lv_ret_code)
        ev_err_text     = DATA(lv_err_text)
        es_err_resp     = DATA(ls_err_resp).

    IF lo_bq->is_success( lv_ret_code ).
      "API Call successful, loop through the data & display the result
      IF ls_response-job_complete = abap_true.
        LOOP AT ls_response-rows ASSIGNING FIELD-SYMBOL(<ls_row>).
          LOOP AT <ls_row>-f ASSIGNING FIELD-SYMBOL(<ls_value>).
            ASSIGN <ls_value>-v->* TO FIELD-SYMBOL(<ls_field_value>).
            CASE sy-tabix.
              WHEN 1.
                ls_output-centroid_id = <ls_field_value>.
              WHEN 2.
                ls_output-station_name = <ls_field_value>.
              WHEN 3.
                ls_output-isweekday = <ls_field_value>.
              WHEN 4.
                ls_output-num_trips = <ls_field_value>.
              WHEN 5.
                ls_output-distance_from_city = <ls_field_value>.
            ENDCASE.
          ENDLOOP.
          APPEND ls_output TO lt_output.
          CLEAR ls_output.
        ENDLOOP.
        IF lt_output IS NOT INITIAL.
          cl_demo_output=>new( )->begin_section( 'ML.Predict Query Details'
                               )->write_text( ls_input-query
                               )->write_text( 'Dataset: bigquery-public-data.london_bicycles'
                               )->end_section(
                               )->begin_section( 'ML.Predict Query Results'
                               )->write_data( lt_output
                               )->end_section(
                               )->display( ).
        ENDIF.
      ENDIF.
    ELSE.
      "Display error message in case the API call fails
      MESSAGE lv_err_text TYPE 'E'.
    ENDIF.

    "Close HTTP Connection
    lo_bq->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    MESSAGE lo_exception->get_text( ) TYPE 'E'.
ENDTRY.
  1. Raporu kaydedip etkinleştirin.
  2. Raporu çalıştırın (F8).

Başarılı bir yürütme işleminden sonra aşağıdaki gibi bir rapor çıktısı görmeniz gerekir:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Tebrikler

"Google Cloud için ABAP SDK'sını kullanarak BigQuery Machine Learning (ML) modelinden tahmin alma" adlı codelab'i tamamladığınız için tebrikler.

BigQuery Machine Learning modelinin tahminlerini doğrudan SAP sisteminizden başarıyla aldınız. ABAP ile Google Cloud Hizmetleri arasında yeni bir entegrasyon düzeyine ulaştınız. Diğer heyecan verici Google Cloud için ABAP SDK codelab'leriyle ufkunuzu genişletin:

  • Google Cloud için ABAP SDK ile Translation API'yi kullanma
  • Parçalama kullanarak Cloud Storage paketine büyük bir nesne yükleme
  • Google Cloud için ABAP SDK ile Secret Manager'dan kimlik bilgileri/gizli anahtarlar alma
  • ABAP'tan Vertex AI test-bison'u çağırma

9. Temizleme

Google Cloud için ABAP SDK ile ilgili ek codelab'lere devam etmek istemiyorsanız lütfen temizleme işlemine geçin.

Projeyi silme

  • Google Cloud projesini silin:
gcloud projects delete abap-sdk-poc

Belirli kaynakları silme

  1. Compute örneğini silin:
gcloud compute instances delete abap-trial-docker
  1. Güvenlik duvarı kurallarını silin:
gcloud compute firewall-rules delete sapmachine
  1. Hizmet hesabını silin:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com