예: Python 'Hello World' 애플리케이션

이 예시는 Python으로 작성된 매우 간단한 'hello world' 애플리케이션으로, 다음을 수행하는 방법을 보여 줍니다.

  • Cloud Bigtable 인스턴스 연결
  • 새 테이블 만들기
  • 테이블에 데이터 쓰기
  • 데이터 다시 읽기
  • 테이블 삭제

샘플 실행

이 예시에서는 Python용 Google Cloud 클라이언트 라이브러리Cloud Bigtable 패키지를 사용하여 Cloud Bigtable과 통신합니다. Cloud Bigtable 패키지는 새 애플리케이션을 위한 최상의 선택입니다. 기존 HBase 워크로드를 Cloud Bigtable로 이동해야 하는 경우 HappyBase 패키지를 사용하는 'hello world' 예시를 참조하세요.

이 샘플 프로그램을 실행하려면 GitHub에서 샘플 안내를 따르세요.

Cloud 클라이언트 라이브러리를 Cloud Bigtable과 함께 사용

샘플 애플리케이션을 Cloud Bigtable에 연결하여 몇 가지 간단한 작업을 보여줍니다.

클라이언트 라이브러리 설치 및 가져오기

PIP를 사용하여 virtualenv 환경에 필요한 Python 패키지를 설치합니다. 필요한 패키지를 정의하는 요구사항 파일이 샘플에 포함되어 있습니다.

google-cloud-bigtable==1.4.0
google-cloud-core==1.4.1

모듈을 가져옵니다.

import datetime

from google.cloud import bigtable
from google.cloud.bigtable import column_family
from google.cloud.bigtable import row_filters

Cloud Bigtable에 연결

bigtable.Client를 사용하여 Cloud Bigtable에 연결합니다.

# The client must be created with admin=True because it will create a
# table.
client = bigtable.Client(project=project_id, admin=True)
instance = client.instance(instance_id)

테이블 만들기

Instance.table()을 사용하여 테이블 객체를 인스턴스화합니다. column family를 만들고 가비지 컬렉션 정책을 설정한 후 column family를 Table.create()에 전달하여 테이블을 만듭니다.

print('Creating the {} table.'.format(table_id))
table = instance.table(table_id)

print('Creating column family cf1 with Max Version GC rule...')
# Create a column family with GC policy : most recent N versions
# Define the GC policy to retain only the most recent 2 versions
max_versions_rule = column_family.MaxVersionsGCRule(2)
column_family_id = 'cf1'
column_families = {column_family_id: max_versions_rule}
if not table.exists():
    table.create(column_families=column_families)
else:
    print("Table {} already exists.".format(table_id))

테이블에 행 쓰기

인사말 문자열 목록을 반복하여 테이블의 새로운 행을 만듭니다. 각 반복에서 Table.row()를 사용하여 행을 정의하고 row key를 할당합니다. Row.set_cell()을 호출하여 현재 셀 값을 설정하고 새 행을 행 배열에 추가합니다. 마지막으로 Table.mutate_rows()를 호출하여 행을 테이블에 추가합니다.

print('Writing some greetings to the table.')
greetings = ['Hello World!', 'Hello Cloud Bigtable!', 'Hello Python!']
rows = []
column = 'greeting'.encode()
for i, value in enumerate(greetings):
    # Note: This example uses sequential numeric IDs for simplicity,
    # but this can result in poor performance in a production
    # application.  Since rows are stored in sorted order by key,
    # sequential keys can result in poor distribution of operations
    # across nodes.
    #
    # For more information about how to design a Bigtable schema for
    # the best performance, see the documentation:
    #
    #     https://cloud.google.com/bigtable/docs/schema-design
    row_key = 'greeting{}'.format(i).encode()
    row = table.direct_row(row_key)
    row.set_cell(column_family_id,
                 column,
                 value,
                 timestamp=datetime.datetime.utcnow())
    rows.append(row)
table.mutate_rows(rows)

필터 만들기

작성한 데이터를 읽기 전에 Cloud Bigtable이 반환하는 데이터를 제한하려면 row_filters.CellsColumnLimitFilter()를 사용하여 필터를 생성합니다. 테이블에 가비지로 수집되지 않은 이전 버전이 있더라도 이 필터는 각 값의 최신 버전만 반환하도록 Cloud Bigtable에 지시합니다.

row_filter = row_filters.CellsColumnLimitFilter(1)

키를 통해 행 읽기

테이블의 Table.read_row() 메서드를 호출하여 특정 row key로 행에 대한 참조를 가져오고 키와 필터를 전달하여 행에서 각 값의 버전 하나를 가져옵니다.

print('Getting a single greeting by row key.')
key = 'greeting0'.encode()

row = table.read_row(key, row_filter)
cell = row.cells[column_family_id][column][0]
print(cell.value.decode('utf-8'))

모든 테이블 행 검색

Table.read_rows()를 사용하여 테이블에서 행 범위를 읽습니다.

print('Scanning for all greetings:')
partial_rows = table.read_rows(filter_=row_filter)

for row in partial_rows:
    cell = row.cells[column_family_id][column][0]
    print(cell.value.decode('utf-8'))

테이블 삭제

Table.delete()을 사용하여 테이블을 삭제합니다.

print('Deleting the {} table.'.format(table_id))
table.delete()

하나로 결합

다음은 주석이 없는 전체 예입니다.



"""Demonstrates how to connect to Cloud Bigtable and run some basic operations.

Prerequisites:

- Create a Cloud Bigtable cluster.
  https://cloud.google.com/bigtable/docs/creating-cluster
- Set your Google Application Default Credentials.
  https://developers.google.com/identity/protocols/application-default-credentials
"""

import argparse
import datetime

from google.cloud import bigtable
from google.cloud.bigtable import column_family
from google.cloud.bigtable import row_filters

def main(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)

    print('Creating the {} table.'.format(table_id))
    table = instance.table(table_id)

    print('Creating column family cf1 with Max Version GC rule...')
    max_versions_rule = column_family.MaxVersionsGCRule(2)
    column_family_id = 'cf1'
    column_families = {column_family_id: max_versions_rule}
    if not table.exists():
        table.create(column_families=column_families)
    else:
        print("Table {} already exists.".format(table_id))

    print('Writing some greetings to the table.')
    greetings = ['Hello World!', 'Hello Cloud Bigtable!', 'Hello Python!']
    rows = []
    column = 'greeting'.encode()
    for i, value in enumerate(greetings):
        row_key = 'greeting{}'.format(i).encode()
        row = table.direct_row(row_key)
        row.set_cell(column_family_id,
                     column,
                     value,
                     timestamp=datetime.datetime.utcnow())
        rows.append(row)
    table.mutate_rows(rows)

    row_filter = row_filters.CellsColumnLimitFilter(1)

    print('Getting a single greeting by row key.')
    key = 'greeting0'.encode()

    row = table.read_row(key, row_filter)
    cell = row.cells[column_family_id][column][0]
    print(cell.value.decode('utf-8'))

    print('Scanning for all greetings:')
    partial_rows = table.read_rows(filter_=row_filter)

    for row in partial_rows:
        cell = row.cells[column_family_id][column][0]
        print(cell.value.decode('utf-8'))

    print('Deleting the {} table.'.format(table_id))
    table.delete()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('project_id', help='Your Cloud Platform project ID.')
    parser.add_argument(
        'instance_id', help='ID of the Cloud Bigtable instance to connect to.')
    parser.add_argument(
        '--table',
        help='Table to create and destroy.',
        default='Hello-Bigtable')

    args = parser.parse_args()
    main(args.project_id, args.instance_id, args.table)