ThinkAboutSoftware / OnlineSelfCodingGroup

Online coding and study group at every Saturday at 10:30 am.
MIT License
18 stars 4 forks source link

99th online meetup, 2022-10-08 #167

Closed jongfeel closed 2 years ago

jongfeel commented 2 years ago

https://meet.google.com/jyx-mxnq-kpk

참여 방법:

Assignees에 자신의 github 계정을 self로 추가 2시간 분량의 할 내용에 대해 댓글 작성 (최소 모임 시작 전까지) 빛의 속도 혹은 (주말, 휴일 포함) 최소 3일 내에 구글 캘린더 등록 메일 확인 모임 시간에 각자 개발 관련된 공부 진행

모임 끝난 후 공부한 내용 정리 & 링크 추가 => 최소 다음 모각코 전까지 확인 가능해야 함.

주의: 회사일 혹은 마감 기한 임박한 일 처리의 경우는 최대한 자제해 주세요. 주말 아침에 일하면 우울하니까요. ㅜㅜ

chichoon commented 2 years ago

오늘 할 일

블로그 글 하나 쓰기 (아마 리액트 또는 로그인 관련)

한 일

쿠키와 세션 로그인, 인증, 인가 JWT (작성중)

jongfeel commented 2 years ago

오브젝트 읽고 정리하기

wjrmffldrhrl commented 2 years ago

BigQuery 정리

데이터 세트

https://cloud.google.com/bigquery/docs/datasets-intro?hl=ko

exgs commented 2 years ago

할 일

  1. 책 읽기: '리눅스 커널 이야기' 읽기

한 일

야크 털 깎기, 하지만 야크 털 깎기는 필요악
커널 공부도 그러하네요 ㅎㅎ.. 책읽다가 서칭하다가, 서칭, 서칭, 서칭만 하게되는

socket과 core에 대한 구분

소켓은 물리적인 cpu의 개수를 의미하고 코어는 물리적인 cpu 안에 몇개의 컴퓨팅 코어가 있는지를 뜻한다.

Linux command for system engineering

uname -a show linux kernel version 'dmesgring buffer 형태로 operation of kernel의 message를 보여준다. dmidecode -t processor` cpu, core에 대한 정보를 알 수 있다.

linux kernel

dmesg를 이용해 확인하는 커널 정보 외에 현재 사용 중인 커널의 컴파일 옵션도 확인할 필요가 있다.

커널이 하는 역활

  1. Management: PM, MM
  2. Network
  3. Device: peripheral device

    커널이 프로세스를 생성할 때 프로세스마다 고유한 스택 공간을 마련한다. 이 스택 공간(0x80C00000 ~ 0x80C02000 : ARM architecture)에 struct thread_info 구조체 필드가 저장되었다. 이 구조체 필드는 커널이 프로세스를 제어할 때 중요한 정보(선점 스케쥴 여부, 프로세스 컨택스트 정보, 레지스터 세트)를 담고 있다.

wjrmffldrhrl commented 2 years ago

데이터 세트

데이터세트는…

제한사항

위치

BigQuery에서는 두 가지 유형의 위치를 사용한다.

데이터 세트를 만들 때는 BigQuery 데이터를 저장할 위치를 지정해야 하며, 데이터 세트를 만든 후에는 위치를 변경할 수 없다.

BigQuery는 데이터를 로드, 쿼리, 내보내기를 수행할 때 요청에서 참조된 데이터 세트를 토대로 작업을 실행할 위치를 결정한다.

고려사항

만들기

데이터 세트는 아래와 같은 방법들로 만들 수 있다.

필수 권한

데이터 세트를 만들기 위해서는 bigquery.datasets.create IAM 권한이 필요하다.

아래 역할에는 데이터 세트를 만드는데 필욯나 권한이 포함되어 있다.

콘솔

SQL

아래와 같은 쿼리 수행

CREATE SCHEMA PROJECT_ID.DATASET_ID
  OPTIONS (
    default_kms_key_name = 'KMS_KEY_NAME',
    default_partition_expiration_days = PARTITION_EXPIRATION,
    default_table_expiration_days = TABLE_EXPIRATION,
    description = 'DESCRIPTION',
    labels = [('LABEL_1','VALUE_1'),('LABEL_2','VALUE_2')],
    max_time_travel_hours = HOURS);

bq cli

--location 플래그와 함께 ba mk 명령 실행

bq --location=LOCATION mk \
    --dataset \
    --default_kms_key=KMS_KEY_NAME \
    --default_partition_expiration=PARTITION_EXPIRATION \
    --default_table_expiration=TABLE_EXPIRATION \
    --description="DESCRIPTION" \
    --label=LABEL_1:VALUE_1 \
    --label=LABEL_2:VALUE_2 \
    --max_time_travel_hours=HOURS \
    PROJECT_ID:DATASET_ID

sdk (python)

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to create.
# dataset_id = "{}.your_dataset".format(client.project)

# Construct a full Dataset object to send to the API.
dataset = bigquery.Dataset(dataset_id)

# TODO(developer): Specify the geographic location where the dataset should reside.
dataset.location = "US"

# Send the dataset to the API for creation, with an explicit timeout.
# Raises google.api_core.exceptions.Conflict if the Dataset already
# exists within the project.
dataset = client.create_dataset(dataset, timeout=30)  # Make an API request.
print("Created dataset {}.{}".format(client.project, dataset.dataset_id))

정보 가져오기

데이터 세트를 나열하기 위해 아래와 같은 방법을 사용할 수 있다.

위 동작을 수행하기 위해서는 bigquery.datasets.get IAM 권한이 필요하다.

이 권한이 포함된 역할은 아래와 같다.

콘솔

탐색기 패널에서 검색

SQL

SELECT
  schema_name
FROM
  PROJECT_ID.INFORMATION_SCHEMA.SCHEMATA;

bq cli

bq ls --filter labels.key:value \
--max_results integer \
--format=prettyjson \
--project_id project_id

--filter 를 사용해서 일치하는 데이터 세트를 나열할 수 있다.

--max_results 또는 -n을 사용해서 최대 결과 수를 제어할 수 있다.

sdk (python)

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

datasets = list(client.list_datasets())  # Make an API request.
project = client.project

if datasets:
    print("Datasets in project {}:".format(project))
    for dataset in datasets:
        print("\t{}".format(dataset.dataset_id))
else:
    print("{} project does not contain any datasets.".format(project))

정보를 가져오는 방법도 비슷하다.

콘솔

탐색기 패널에서 데이터 세트를 선택한 세트 정보 확인

bq cli

bq show 명령어를 통해 정보를 확인할 수 있으며 --format 플래그를 사용하여 출력을 제어할 수 있다.

bq show --format=prettyjson project_id:dataset

sdk (python)

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
# dataset_id = 'your-project.your_dataset'

dataset = client.get_dataset(dataset_id)  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
friendly_name = dataset.friendly_name
print(
    "Got dataset '{}' with friendly_name '{}'.".format(
        full_dataset_id, friendly_name
    )
)

# View dataset properties.
print("Description: {}".format(dataset.description))
print("Labels:")
labels = dataset.labels
if labels:
    for label, value in labels.items():
        print("\t{}: {}".format(label, value))
else:
    print("\tDataset has no labels defined.")

# View tables in dataset.
print("Tables:")
tables = list(client.list_tables(dataset))  # Make an API request(s).
if tables:
    for table in tables:
        print("\t{}".format(table.table_id))
else:
    print("\tThis dataset does not contain any tables.")

삭제

아래 방법으로 데이터 세트를 삭제할 수 있다.

데이터 세트를 삭제하기 위해서는 다음 IAM 권한이 필요하다.

이러한 권한은 아래 역할에 포함되어 있다.

콘솔

데이터 세트 삭제 클릭

SQL

DROP SCHEMA IF EXISTS mydataset;

bq cli

bq rm 명령어를 --dataset 또는 -d 플래그와 함께 사용하여 데이터 세트를 삭제한다.

bq rm -r -f -d project_id:dataset

-f플래그를 사용하면 확인을 건너뛸 수 있다.

프로젝트 id를 포함하면 -d 플래그를 사용하지 않아도 된다.

bq rm -r -f myotherproject:mydataset

sdk (python)

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set model_id to the ID of the model to fetch.
# dataset_id = 'your-project.your_dataset'

# Use the delete_contents parameter to delete a dataset and its contents.
# Use the not_found_ok parameter to not receive an error if the dataset has already been deleted.
client.delete_dataset(
    dataset_id, delete_contents=True, not_found_ok=True
)  # Make an API request.

print("Deleted dataset '{}'.".format(dataset_id))

데이터 세트의 시간 이동 기간 내에 있는 경우 삭제된 데이터 세트를 복원할 수 있다.

  1. 새 데이터 세트 만들기

    bq mk tmp_dataset
  2. 원본 데이터 세트가 삭제되기 전 타임스탬프 사용

    • ex) 1418864998000
  3. [INFORMATION_SCHEMA.TABLE_STORAGE_TIMELINE](https://cloud.google.com/bigquery/docs/information-schema-table-storage-timeline?hl=ko) 뷰에 쿼리를 실행하고 복원할 테이블 식별

    SELECT
      TABLE_NAME
    FROM
      `region-REGION`.INFORMATION_SCHEMA.TABLE_STORAGE_TIMELINE
    WHERE
      TABLE_SCHEMA = "ORIGINAL_DATASET_NAME"
    AND
      DELETED = true;
  4. 1418864998000 시점의 original_dataset.table1 테이블을 새 tmp_dataset 데이터 세트에 복사

    bq cp original_dataset.table1@1418864998000 tmp_dataset.table1

가용성 및 내구성

장애 도메인

Google Cloud 데이터 센터에서 발생할 수 있는 장애에 대한 장에 도메인 유형은 다음과 같다.

장애 유형

가용성 및 내구성

BigQuery 데이터 세트를 만들 때 데이터를 저장할 위치(리전, 멀티리전)을 선택 하는데 선택한 위치 내에서 두 개의 서로 다른 영역에 데이터 복사본을 자동으로 저장한다.

BigQuery는 여러 가용성 영역에 걸쳐 중복 스토리지와 컴퓨팅을 결합하여 고가용성과 내구성을 제공한다.

리전 장애로 인해 리전이 다시 온라인 상태가 될 때까지 가용성이 손실될 수 있지만 데이터는 손실되지 않는다.

Reference

BigQuery 스토리지 개요 | Google Cloud

BigQuery - clustering 이야기

Impact of dataset locations on BigQuery query execution performance