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'sını kullanarak bu modelden tahminler alacaksınız.

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

  • BigQuery
  • Cloud Shell

Ne oluşturacaksınız?

Aşağıdakileri oluşturursunuz:

  • BigQuery makine öğrenimi (ML) modeli.
  • BigQuery API'yi çağıracak BigQuery İş Kullanıcısı rolüne sahip bir hizmet hesabı.
  • BigQuery API'yi çağıran ve ML modelinden tahminler alan 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 SAP GUI (Windows veya Java) yüklü olmalıdır. SAP GUI dizüstü bilgisayarınızda zaten yüklüyse uygulama sunucusu IP'si olarak sanal makinenin harici IP adresini kullanarak SAP'e 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 için kimlik doğrulama yapmak ve varsayılan projeyi abap-sdk-poc olarak ayarlamak üzere 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 komutlardaki 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'sının yüklü olduğu bir SAP sistemine erişiminiz olmalıdır.
  • Bu codelab'e devam etmeden önce 1. codelab'i (Google Cloud Platform'a ABAP Platform Trial 1909'u ve Google Cloud için ABAP SDK'sını yükleme) ve 2. codelab'i (Compute Engine sanal makinesinde barındırılan SAP için jetonları kullanarak ABAP SDK kimlik doğrulamasını yapılandırma) tamamlamanız gerekir.
  • 1. ve 2. codelab'i tamamladıysanız kimlik doğrulama ve bağlantı için gerekli kurulumla birlikte Google Cloud'da bir ABAP Platform Trial 1909 sistemi sağlanmış olur.
  • 1. ve 2. codelab'i tamamlamadıysanız bu codelab'de verilen adımları gerçekleştirmek için gerekli tüm altyapıya 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ş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 şekilde yürütüldüğünde 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

Bir BigQuery ML modelinden ML tahminlerini güvenli bir şekilde almak için BigQuery İş Kullanıcısı ve BigQuery Veri Görüntüleyen rollerine sahip bir hizmet hesabı oluşturmanız gerekir. Bu hizmet hesabı, 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 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 atanan rolle birlikte listelenir.

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ümelere gruplandırmak için k-ortalama algoritmasını uygulayabilirsiniz. Tahmini analizlerle ilgili olan gözetimli makine öğreniminin aksine, gözetimsiz öğrenme açıklayıcı analizlerle ilgilidir. Amaç, veriye dayalı kararlar alabilmek için verilerinizi anlamaktır.

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 projenizin adını 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ğerini girin.
  • Konum türü için Çoklu bölge'yi, ardından AB (Avrupa Birliği'ndeki birden fazla bölge)'yi seçin. London Bicycle Hires herkese açık veri kümesi, AB çoklu bölgesinde depolanır. Veri kümeniz aynı konumda olmalıdır.
  • Kalan varsayılan ayarları olduğu gibi bırakın ve Veri kümesi oluştur'u tıklayın. Veri kümesi oluşturma sayfası.

K-ortalama modeli oluşturma

Veri kümeniz oluşturulduğuna göre sonraki adımda verileri kullanarak bir k-ortalama modeli oluşturmanız gerekir. 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. Schema (Şema) sekmesini tıklayın. Model şemasında, BigQuery ML'nin küme oluşturmak için kullandığı üç istasyon özelliği listelenir. Ş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ündeki çubuk grafikler, her merkez noktası 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'sını kullanarak BigQuery ML tahminleri alma

Google Cloud tarafında ön koşulları ayarladığınıza göre, Google Cloud için ABAP SDK'sını kullanarak ML modelinden tahmin almak için SAP sisteminizde adımları tamamlamaya hazırsınız.

İstemci Anahtarı Yapılandırması Oluşturma

Google Cloud için ABAP SDK'sı, 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'ye SPRO işlem kodunu girin.
  2. SAP Reference IMG'yi (SAP Referans IMG'si) tıklayın.
  3. Google Cloud için ABAP SDK'sı > Temel Ayarlar > İstemci Anahtarını Yapılandır'ı tıklayın.

25871e639293b9ee.png

  1. Listelenen alanlar için 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. adlı bir Rapor Programı oluşturun
  2. Açılan pop-up'ta aşağıdaki resimde gösterildiği gibi ayrıntıları girin:

4cb32d50427df294.png

  1. Sonraki pop-up'ta Yerel Nesne'yi seçin veya uygun bir paket adı girin.
  2. ABAP Düzenleyici'ye 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şleminde, aşağıdaki gibi bir rapor çıkışı görürsünüz:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Tebrikler

"Google Cloud için ABAP SDK'sını kullanarak BigQuery makine öğrenimi (ML) modelinden tahmin alma" kod laboratuvarını tamamladığınız için tebrikler.

Bir 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üzeyine ulaştınız. Google Cloud için ABAP SDK'sıyla ilgili diğer heyecan verici Codelab'lerle ufkunuzu genişletin:

  • Google Cloud için ABAP SDK'sı ile Translation API'yi kullanma
  • Parçalara ayırma özelliğini kullanarak büyük bir nesneyi Cloud Storage paketine yükleme
  • Google Cloud için ABAP SDK'sı ile Secret Manager'dan Kimlik Bilgileri/Gizli Anahtarlar Alma
  • ABAP'den Vertex AI test-bison'u çağırma

9. Temizleme

Google Cloud için ABAP SDK'sıyla ilgili ek kod laboratuvarlarına devam etmek istemiyorsanız lütfen temizleme işlemine devam edin.

Projeyi silme

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

Kaynakları tek tek silme

  1. Bilgisayar ö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