Google Cloud용 ABAP SDK를 사용하여 SAP에서 BigQuery ML 예측 읽기

1. 소개

이 Codelab에서는 BigQuery에서 머신러닝 (ML) 모델을 만들고 Google Cloud용 ABAP SDK를 사용하여 이 모델에서 예측을 가져옵니다.

다음과 같은 Google Cloud 서비스를 활용할 수 있습니다.

  • BigQuery
  • Cloud Shell

빌드할 항목

다음을 만듭니다.

  • BigQuery 머신러닝 (ML) 모델
  • BigQuery API를 호출할 BigQuery 작업 사용자 역할이 있는 서비스 계정
  • BigQuery API를 호출하고 ML 모델에서 예측을 가져오는 ABAP 프로그램

2. 요구사항

  • 브라우저(Chrome, Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트 또는 Google Cloud Platform용 90일 무료 체험판 계정 만들기
  • 시스템에 설치된 SAP GUI (Windows 또는 Java) SAP GUI가 이미 노트북에 설치되어 있는 경우 VM 외부 IP 주소를 애플리케이션 서버 IP로 사용하여 SAP에 연결합니다. Mac을 사용하는 경우 이 링크에서 제공되는 Java용 SAP GUI도 설치할 수 있습니다.

3. 시작하기 전에

6757b2fb50ddcc2d.png

  • Cloud Shell에서 다음 명령어를 실행하여 계정을 인증하고 기본 프로젝트를 abap-sdk-poc로 설정합니다. 예시로 us-west4-b 영역을 사용했습니다. 필요한 경우 다음 명령어에서 원하는 대로 프로젝트와 영역을 변경하세요.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Google Cloud용 ABAP SDK가 설치된 SAP 시스템에 액세스할 수 있어야 합니다.
  • 이 Codelab을 진행하기 전에 Codelab 1 (Google Cloud Platform에 ABAP Platform 무료 체험판 1909 설치 및 Google Cloud용 ABAP SDK 설치) 및 Codelab 2 (Compute Engine VM에서 호스팅되는 SAP용 토큰을 사용하여 ABAP SDK 인증 구성)를 완료해야 합니다.
  • Codelab 1과 Codelab 2를 완료했다면 Google Cloud 기반 ABAP Platform Trial 1909 System과 인증 및 연결에 필요한 설정이 프로비저닝되었을 것입니다.
  • Codelab 1과 Codelab 2를 완료하지 않았다면 이 Codelab에서 제공하는 단계를 수행하는 데 필요한 인프라와 연결이 모두 필요한 것이 아닙니다. 따라서 이 Codelab을 진행하기 전에 Codelab 1과 Codelab 2를 완료해야 합니다.

4. Google Cloud 프로젝트에서 BigQuery API V2 사용 설정

  1. Cloud 콘솔에서 오른쪽 상단에 있는 Cloud Shell 활성화를 클릭합니다.

6757b2fb50ddcc2d.png

  1. Cloud Shell에서 다음 명령어를 실행하여 BigQuery API를 사용 설정합니다.
gcloud services enable bigquery.googleapis.com

성공적으로 실행되면 아래와 같은 메시지가 표시됩니다.

b5f52859df2c2f56.png

이제 Google Cloud 프로젝트에서 BigQuery API가 사용 설정되어 있어야 합니다.

5. 안전한 BigQuery 액세스를 위한 서비스 계정 만들기

BigQuery ML 모델에서 안전하게 ML 예측을 수행하려면 BigQuery 작업 사용자BigQuery 데이터 뷰어 역할이 있는 서비스 계정을 만들어야 합니다. 그래야 프로그램이 프로젝트 내에서 쿼리를 작업으로 실행하고 테이블에서 데이터를 읽을 수 있습니다. 이 역할은 작업을 만들고 데이터를 읽는 데 필요한 권한만 부여하여 보안 위험을 최소화합니다.

서비스 계정 만들기

필요한 역할이 있는 서비스 계정을 만들려면 다음 단계를 수행합니다.

  1. Cloud Shell 터미널에서 다음 명령어를 실행합니다.
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. 이제 이전 단계에서 만든 서비스 계정에 필요한 역할을 추가합니다.
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'

위의 명령어는 abap-sdk-poc를 Google Cloud 프로젝트의 자리표시자로 사용합니다. abap-sdk-poc를 프로젝트 ID로 바꿉니다.

  1. 역할이 추가되었는지 확인하려면 IAM 페이지로 이동하세요. 생성한 서비스 계정이 할당된 역할과 함께 표시됩니다.

6. BigQuery 머신러닝 모델 만들기

이 Codelab에서는 런던 자전거 대여 데이터 세트를 클러스터링하기 위한 k-평균 모델을 만듭니다. k-평균 알고리즘을 적용하여 데이터를 클러스터로 그룹화할 수 있습니다. 예측 분석을 다루는 지도 머신러닝과 달리 비지도 학습은 설명적 분석에 관한 것입니다. 데이터 기반 결정을 내릴 수 있도록 데이터를 이해하는 것입니다.

데이터 세트 만들기

ML 모델을 저장할 BigQuery 데이터 세트를 만들려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다. BigQuery 페이지로 이동
  2. 탐색기 창에서 프로젝트 이름을 클릭합니다.
  3. 5cf3b742649f1e2c.png 작업 보기 >를 클릭합니다. 데이터 세트 만들기

3fbc072041bfa313.png

  1. 데이터 세트 만들기 페이지에서 다음을 수행합니다.
  • 데이터 세트 IDbqml_tutorial를 입력합니다.
  • 위치 유형으로 멀티 리전을 선택한 후 EU (유럽연합의 멀티 리전)를 선택합니다. 런던 자전거 공유 공개 데이터 세트는 EU 멀티 리전에 저장됩니다. 데이터 세트가 같은 위치에 있어야 합니다.
  • 나머지 기본 설정은 그대로 두고 데이터 세트 만들기를 클릭합니다. 데이터 세트 만들기 페이지

k-평균 모델 만들기

이제 데이터 세트가 설정되었으므로 다음 단계는 데이터를 사용하여 k-평균 모델을 만드는 것입니다. CREATE MODEL 문을 model_type=kmeans 옵션과 함께 사용하여 k-평균 모델을 만들고 학습시킬 수 있습니다.

쿼리를 실행하고 k-평균 모델을 만들려면 다음 단계를 수행합니다.

  1. BigQuery 페이지로 이동합니다. BigQuery로 이동
  2. 편집자 창에서 다음 SQL 문을 실행합니다.
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. 탐색 패널의 리소스 섹션에서 프로젝트 이름을 펼치고 bqml_tutorial을 클릭한 다음 london_station_clusters를 클릭합니다.
  2. 스키마 탭을 클릭합니다. 모델 스키마는 BigQuery ML이 클러스터링을 수행하는 데 사용한 3개의 정거장 속성을 나열합니다. 스키마가 다음과 같이 나타납니다.

5f1feb313bd0f6a5.png

  1. 평가 탭을 클릭합니다. 이 탭에는 k-평균 모델로 식별된 클러스터의 시각화가 표시됩니다. 숫자 특성에서 막대 그래프는 각 중심에 가장 중요한 숫자 특성 값을 최대 10개까지 표시합니다. 드롭다운 메뉴에서 시각화할 특성을 선택할 수 있습니다.

8f9b53971e33dc08.png

7. Google Cloud용 ABAP SDK를 사용하여 BigQuery ML 예측 수행하기

이제 Google Cloud 측 기본 요건을 설정했으므로 SAP 시스템에서 Google Cloud용 ABAP SDK를 사용하여 ML 모델에서 예측을 가져오는 단계를 완료할 준비가 되었습니다.

클라이언트 키 구성 만들기

인증 및 연결 관련 구성의 경우 Google Cloud용 ABAP SDK는 /GOOG/CLIENT_KEY/GOOG/SERVIC_MAP. 테이블을 사용합니다.

/GOOG/CLIENT_KEY 테이블에서 구성을 유지하려면 다음 단계를 따르세요.

  1. SAP GUI에서 트랜잭션 코드 SPRO를 입력합니다.
  2. SAP 참조 IMG를 클릭합니다.
  3. Google Cloud용 ABAP SDK > 기본 설정 > 클라이언트 키 구성

25871e639293b9ee.png

  1. 나열된 필드에 대해 다음 값을 유지하고 다른 필드는 모두 비워 둡니다.

필드

Google Cloud 키 이름

BIGQUERY_ML

Google Cloud 서비스 계정 이름

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

Google Cloud 범위

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

프로젝트 ID

abap-sdk-poc

승인 클래스

/GOOG/CL_AUTH_GOOGLE

ABAP 보고서를 작성하여 BigQuery ML 모델에서 예측 수행하기

ABAP 보고서를 작성하려면 다음 단계를 따르세요.

  1. SAP GUI에서 트랜잭션 코드 SE38로 이동하여 이름이 ZDEMO_BIGQUERY_ML_PREDICT.인 보고서 프로그램을 만듭니다.
  2. 팝업이 열리면 다음 이미지와 같이 세부정보를 입력합니다.

4cb32d50427df294.png

  1. 다음 팝업에서 로컬 객체를 선택하거나 패키지 이름을 적절하게 입력합니다.
  2. ABAP 편집기에서 다음 코드를 추가합니다.
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. 보고서를 저장하고 활성화합니다.
  2. 보고서를 실행합니다 (F8).

성공적으로 실행되면 아래와 같은 보고서 출력이 표시됩니다.

739e5685511fc9fc.png

6405542a597ed09f.png

8. 축하합니다

'Google Cloud용 ABAP SDK를 사용하여 BigQuery 머신러닝 (ML) 모델에서 예측 가져오기' 과정을 잘 완료하셨습니다. codelab!

SAP 시스템 내에서 바로 BigQuery 머신러닝 모델의 예측을 성공적으로 가져왔습니다. 이제 ABAP와 Google Cloud 서비스가 새로운 차원으로 통합되었습니다. Google Cloud Codelab을 위한 다른 흥미로운 ABAP SDK로 시야를 넓혀 보세요.

  • Google Cloud용 ABAP SDK와 함께 Translation API 사용
  • 청킹을 사용하여 대형 객체를 Cloud Storage 버킷에 업로드하기
  • Google Cloud용 ABAP SDK를 사용하여 Secret Manager에서 사용자 인증 정보/보안 비밀 검색
  • ABAP에서 Vertex AI test-bison 호출

9. 삭제

Google Cloud용 ABAP SDK와 관련된 추가 Codelab을 계속 진행하지 않으려면 정리를 진행하세요.

프로젝트 삭제

  • Google Cloud 프로젝트를 삭제합니다.
gcloud projects delete abap-sdk-poc

개별 리소스 삭제하기

  1. 컴퓨팅 인스턴스를 삭제합니다.
gcloud compute instances delete abap-trial-docker
  1. 방화벽 규칙을 삭제합니다.
gcloud compute firewall-rules delete sapmachine
  1. 서비스 계정을 삭제합니다.
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com