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?

Şunları oluşturacaksınız:

  • 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 ML 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 codelab'e devam etmeden önce codelab 1'i (Google Cloud Platform'da ABAP Platform Trial 1909'u ve Google Cloud için ABAP SDK'yı yükleme) ve codelab 2'yi (Compute Engine sanal makinesinde barındırılan SAP için jeton tabanlı ABAP SDK kimlik doğrulamasını yapılandırma) tamamlamanız gerekir.
  • 1. ve 2. codelab'i tamamladıysanız bu codelab'ler, Google Cloud'da ABAP Platform Trial 1909 System'i ve kimlik doğrulama ile bağlantı için gerekli kurulumu sağlamış olmalıdır.
  • 1. ve 2. codelab'i tamamlamadıysanız bu codelab'de verilen adımları uygulamak için gerekli tüm altyapı ve bağlantıya sahip olmazsınız. Bu nedenle, bu codelab'e devam etmeden önce codelab 1 ve codelab 2'yi tamamlamanız gerekir.

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

  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 etkinleştirilmiş olmalıdır.

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üleyicisi rollerine sahip bir hizmet hesabı oluşturmanız gerekir. Bu roller, programınızın proje içinde sorguları (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 vererek güvenlik risklerini en aza indirir.

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'daki bisiklet kiralama yerleri 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 denetimli makine öğreniminin aksine, denetimsiz öğrenme açıklayıcı analizle ilgilidir. Veriye dayalı kararlar alabilmek için verilerinizi anlamanız gerekir.

Veri kümenizi oluşturma

Makine öğrenimi 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. Explorer (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)'yi seçin. 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şturabilir ve 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-means 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 tahminlerini alma

Google Cloud tarafında ön koşulları ayarladığınıza göre, Google Cloud için ABAP SDK'yı kullanarak makine öğrenimi modelinden tahmin 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 tıklayın.
  3. Google Cloud için ABAP SDK > Temel Ayarlar > İstemci Anahtarını Yapılandır'ı tıklayın.

25871e639293b9ee.png

  1. Aşağıdaki değerleri listelenen alanlara göre 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üzenleyicisinde 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ütmenin ardından aşağıdaki gibi bir rapor çıktısı görürsünüz:

739e5685511fc9fc.png6405542a597ed09f.png

8. Tebrikler

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

BigQuery makine öğrenimi modelinin tahminlerini doğrudan SAP sisteminizden başarıyla aldınız. ABAP ile Google Cloud Hizmetleri arasında yeni bir entegrasyon düzeyinin kilidini açtınız. Google Cloud için ABAP SDK ile ilgili diğer heyecan verici codelab'lerle ufkunuzu genişletin:

  • Translation API'yi Google Cloud için ABAP SDK ile kullanma
  • Öbekleme kullanarak Cloud Storage paketine büyük bir nesne yükleme
  • ABAP SDK for Google Cloud ile Secret Manager'dan kimlik bilgisi/gizli anahtar 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

Tek tek 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