DataCatalog?

  • 데이터를 빨리 발견하고, 이해하고, 관리하기 위한 구조를 강화시켜주는 관리되는 확장 가능한 메타데이터 관리 시스템.
  • 기술적/비즈니스적 메타정보를 저장하는 시스템. 
  • 아이덴티티/접근권한 관리(IAM) 및 데이터 분실 방지(DLP)와 연계되어 있는 강력한 보안 시스템 제공.
  • 메타데이터로 자산에 태그를 붙이거나, 접근할 데이터 자산을 검색할 수 있다.
  • 데이터셋, 테이블에 태그를 붙일 수 있고, 태그 템플릿을 사용하여 미리 사용할 테그들의 종류를 정의할 수도 있다.

 

실습 내용

빅쿼리에 데이터셋을 생성한 다음 공공데이터인 뉴욕 택시 테이블을 복사한다.

데이터 카탈로그 태그 템플릿을 만들어서 새로 생성된 테이블에 태그를 붙여본다.

 

 

데이터 카탈로그 API 활성화 체크

APIs and Services > Library에서 Data Catalog 검색해서 Enabled를 선택.

혹시나 실패하면 다시 시도 해보자.

 

 

빅쿼리 데이터셋 준비하기

Bigquery 선택해서 빅 쿼리 콘솔을 열자.

Create Dataset을 선택해서 dataset ID에 demo_dataset 선택하고, Datalocation은 적절히, Defalut data expiration은 Never를 선택한다. Create Dataset 선택.

왼쪽 패널에서 +Add Data > Explore public datasets 선택해서 NYC TLC trip 선택하자. 

왼쪽 패널에 bigquery-public-data가 표시된다. 그 밑에 new_york_taxi_trips 데이터셋에서 tlc_yellow_trips_2018 테이블을 선택해서 Copy Table을 한다. 테이블 명은 trips로 복사. 당연히 프로젝트밑에 demo_dataset을 목적지로 선택한다.

 

데이터 카탈로그 태그 템플릿 생성하기

Data Catalog UI에서 태그 템플릿을 생성한다.

Data Catalog > + Create > Create Tag template 선택

탬플릿 이름은 Demo Tag Template, ID는 demo_tag_template, 위치는 기본값을 둔다.

이제 태그 속성을 추가해야 하는데, 속성(attribute)을 필드(field)라고도 부른다.

 

Add Field를 선택해서 표시명, Field ID, 필수 속성 여부, 데이터 형식을 선택한다. 데이터 형식에는 String, Double, Boolean, Enumerated,Datetime를 선택할 수 있다. Enumerated를 선택할 경우에는 열겨형에서 선택할 수 있는 값을 추가로 선택해 주어야 한다.

 

 

테이블에 태그 붙이기

데이터카달로그에서 데이터셋을 검색한다. 오른쪽 상단 카달로그 아이콘을 누르면 검색창이 표시된다. demo_dataset을 선택한다.

태그를 붙이고자하는 테이블을 선택한다. 예에서는 trips 테이블 선택. Entry details페이지를 열고 Attach Tag 를 클릭한다.

 

 

 

 

실컷 정리했더니 https://cloud.google.com/data-catalog/docs/quickstart-tagging 내용과 동일하다.

 

 

 

 

구조

실습을 통해 만드는 서비스 구조

클라우드 저장소 만들기

# 변수명 설정. 버킷 유일성을 보장하기 위하여 postfix를 붙임.
export PROJECT_ID=$(gcloud info --format='value(config.project)')
export IV_BUCKET_NAME=${PROJECT_ID}-upload
export FILTERED_BUCKET_NAME=${PROJECT_ID}-filtered
export FLAGGED_BUCKET_NAME=${PROJECT_ID}-flagged
export STAGING_BUCKET_NAME=${PROJECT_ID}-staging

# 클라우드 저장소 버킷 만들기
gsutil mb gs://${IV_BUCKET_NAME}
gsutil mb gs://${FILTERED_BUCKET_NAME}
gsutil mb gs://${FLAGGED_BUCKET_NAME}
gsutil mb gs://${STAGING_BUCKET_NAME}
gsutil ls

 

Pub/Sub 만들기

클라우드 저장소 통지 메시지와 클라우드 함수간 메시지 전송용으로 사용.

export UPLOAD_NOTIFICATION_TOPIC=upload_notification
gcloud pubsub topics create ${UPLOAD_NOTIFICATION_TOPIC}
gcloud pubsub topics create visionapiservice
gcloud pubsub topics create videointelligenceservice
gcloud pubsub topics create bqinsert
gcloud pubsub topics list

 

클라우드 저장소 통지 생성하기

새로운 객체가 클라우드 저장소 업로드 버킷에 올라오면 촉발되게 한다.

gsutil notification create -t upload_notification -f json -e OBJECT_FINALIZE gs://${IV_BUCKET_NAME}
gsutil notification list gs://${IV_BUCKET_NAME}

 

 

배포용 클라우드 함수 준비하기

실습에서 사용되는 설정 파일은 config.json

함수는 index.js에 정의된다.

 

소스코드를 다운로드하여서 살펴보자.

gsutil -m cp -r gs://spls/gsp138/cloud-functions-intelligentcontent-nodejs .
cd cloud-functions-intelligentcontent-nodejs

 

빅쿼리 데이터셋과 테이블 생성하기

비전 API를 사용한 결과를 빅쿼리에 저장할 예정. 데이터셋을 intelligentcontentfilter로, 테이블은 filtered_content로 명명한다. (그냥 config.json에 정의된 대로 생성하는 것에 불과)

export DATASET_ID=intelligentcontentfilter
export TABLE_NAME=filtered_content

bq --project_id ${PROJECT_ID} mk ${DATASET_ID}

bq --project_id ${PROJECT_ID} mk --schema intelligent_content_bq_schema.json -t ${DATASET_ID}.${TABLE_NAME}

#빅쿼리 테이블이 잘 생성되었나 확인
bq --project_id ${PROJECT_ID} show ${DATASET_ID}.${TABLE_NAME}

 

설정 파일의 placeholder를 실제 값으로 바꾸기

sed -i "s/\[PROJECT-ID\]/$PROJECT_ID/g" config.json
sed -i "s/\[FLAGGED_BUCKET_NAME\]/$FLAGGED_BUCKET_NAME/g" config.json
sed -i "s/\[FILTERED_BUCKET_NAME\]/$FILTERED_BUCKET_NAME/g" config.json
sed -i "s/\[DATASET_ID\]/$DATASET_ID/g" config.json
sed -i "s/\[TABLE_NAME\]/$TABLE_NAME/g" config.json

참고로 config.json파일은 다음과 같이 생겼다.

{
  "VISION_TOPIC": "projects/[PROJECT-ID]/topics/visionapiservice",
  "VIDEOINTELLIGENCE_TOPIC": "projects/[PROJECT-ID]/topics/videointelligenceservice",
  "BIGQUERY_TOPIC": "projects/[PROJECT-ID]/topics/bqinsert",
  "REJECTED_BUCKET": "[FLAGGED_BUCKET_NAME]",
  "RESULT_BUCKET": "[FILTERED_BUCKET_NAME]",
  "DATASET_ID": "[DATASET_ID]",
  "TABLE_NAME": "[TABLE_NAME]",
  "GCS_AUTH_BROWSER_URL_BASE": "https://storage.cloud.google.com/" ,
  "API_Constants": {
        "ADULT" : "adult",
        "VIOLENCE" : "violence",
        "SPOOF" : "spoof",
        "MEDICAL" : "medical"
  }
}

 

클라우드 함수 배포하기

함수 구현은 깃헙(https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs/blob/master/index.js)에 정의되어 있음.

 

# 클라우드 펍/섭에서 클라우드 저장소 통지 메시지를 받고, 이 메시지를 클라우드 펍/섭 메시지와 함께 다른 클라우드 함수를 호출하는 함수 배포
gcloud functions deploy GCStoPubsub --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic ${UPLOAD_NOTIFICATION_TOPIC} --entry-point GCStoPubsub

# 클라우드 펍/섭에서 메시지를 받아서 비전 API를 호출하고 이를 insertIntoBigQuert클라우드 함수로 메시지를 전달하는 함수 
gcloud functions deploy visionAPI --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic visionapiservice --entry-point visionAPI

# 클라우드 펍/섭에서 메시지를 받아서 비전 API를 호출하고 이를 insertIntoBigQuert클라우드 함수로 메시지를 전달하는 함수 
gcloud functions deploy videoIntelligenceAPI --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic videointelligenceservice --entry-point videoIntelligenceAPI --timeout 540

# 클라우드 펍/섭에서 메시지를 받아서 데이터를 빅쿼리 테이블로 넣기 위한 API를 호출하는 함수
gcloud functions deploy insertIntoBigQuery --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic bqinsert --entry-point insertIntoBigQuery

#배포된 함수 확인
gcloud beta functions list

 

전체 앱 동작 확인

클라우드 콘솔에서 저장소의 -upload가 붙은 버킷에 이미지/동영상 파일을 업로드해본다.

 

로그 동작 모니터링

클라우드 함수가 잘 실행되었는지 확인해보기

gcloud beta functions logs read --filter "finished with status" "GCStoPubsub" --limit 100
gcloud beta functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100

# sql.txt 파일 만들기. PLACEHOLDER 값 변경해야 함.
echo "
#standardSql

SELECT insertTimestamp,
  contentUrl,
  flattenedSafeSearch.flaggedType,
  flattenedSafeSearch.likelihood
FROM \`$PROJECT_ID.$DATASET_ID.$TABLE_NAME\`
CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
ORDER BY insertTimestamp DESC,
  contentUrl,
  flattenedSafeSearch.flaggedType
LIMIT 1000
" > sql.txt

bq --project_id ${PROJECT_ID} query < sql.txt

 

 

 

 

 

 

 

 

 

 

+ Recent posts