์์ต์ 3: Snowpark Container Service ๋ง๋ค๊ธฐ ๋ฐ ๊ด๋ฆฌยถ
์๊ฐยถ
Snowpark Container Services ๋ Snowflake ์ํ๊ณ ๋ด์์ ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ, ๊ด๋ฆฌ, ํ์ฅ์ ์ด์งํ๋๋ก ์ค๊ณ๋ ์์ ๊ด๋ฆฌํ ์ปจํ ์ด๋ ์๋น์ค์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด Snowflake ๋ด์์ ์ปจํ ์ด๋ํ๋ ์ํฌ๋ก๋๋ฅผ ์ง์ ์คํํ ์ ์์ต๋๋ค.
์ด ์์ต์์์๋ Snowflake Python APIs ์ ์ฌ์ฉํ์ฌ Snowpark Container Services ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
์ค์
Snowpark Container Services ๋ ์ผ๋ฐ์ ์ผ๋ก AWS์ Snowflake ๊ณ์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ง์ ์ Azure์ ๊ณ์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Snowpark Container Services โ ์ด์ฉ ๊ฐ๋ฅํ ๋ฆฌ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ ์ ์กฐ๊ฑดยถ
์ด ์์ต์๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํด์ผ ํฉ๋๋ค.
Docker Desktop์ ์ค์นํฉ๋๋ค.
์ด ์์ต์์์๋ Docker Desktop์ด ํ์ํ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค. ์ค์น ์ง์นจ์ https://docs.docker.com/get-docker/ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์ ๋จ๊ณ๊ฐ ํฌํจ๋ ์ผ๋ฐ ์ค์ ์ง์นจ์ ๋ฐ๋ฆ ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
Snowflake Python APIs ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
Snowflake ์ฐ๊ฒฐ์ ๊ตฌ์ฑํฉ๋๋ค.
Python API ์์ต์์ ํ์ํ ๋ชจ๋ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค.
API
Root
์ค๋ธ์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ฐธ๊ณ
์ด๋ฏธ ๊ณตํต ์ค์ ์ ์๋ฃํ๋ค๋ฉด ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ ์์ต์๋ฅผ ์์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฌ์ ์๊ตฌ ์ฌํญ์ ์๋ฃํ๋ฉด Snowpark Container Services ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด API๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ๊ฒ์ ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ยถ
์ด์ Snowflake Python APIs ์์ต์์์ ๋ ธํธ๋ถ์ ์ฌ์ฉํ๋ค๋ฉด ์ด ์์ต์์์๋ ์ ๋ ธํธ๋ถ์ผ๋ก ์ ํํฉ๋๋ค. ์ด ๋ ธํธ๋ถ์๋ Snowpark Container Services ๋ฅผ ์ฌ์ฉํ์ฌ NGINX ์น ์๋ฒ๋ฅผ ์คํํ๋ ์ํ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ๋ชจ๋ Snowflake์์ ์คํ๋ฉ๋๋ค.
์ ํธํ๋ ์ฝ๋ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋
jupyter notebook
๋ช ๋ น์ ์คํํด ์ ๋ ธํธ๋ถ์ ์ฝ๋๋ค.๋ ธํธ๋ถ์ ์ฒซ ๋ฒ์งธ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
from snowflake.core.database import Database from snowflake.core.schema import Schema database = root.databases.create(Database(name="spcs_python_api_db"), mode="orreplace") schema = database.schemas.create(Schema(name="public"), mode="orreplace")
์์ ๊ณตํต ์ค์ ์์ ์์ฑํ Snowflake ์ฐ๊ฒฐ ๋ฐ
root
์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค์spcs_python_api_db
๋ฐ์ดํฐ๋ฒ ์ด์ค์public
์คํค๋ง๋ฅผ ์์ฑํฉ๋๋ค. ์๋ก ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ํ๋ด๋ ์ฐธ์กฐ๋ ์ ์ฅํฉ๋๋ค. Snowpark Container Services ์ปดํฌ๋ํธ๋ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง์ ์ ์ฅ๋ฉ๋๋ค.
Snowpark Container Services ์ ๊ฐ์ยถ
์์ต์๋ฅผ ๊ณ์ ์งํํ๊ธฐ ์ ์ Snowpark Container Services ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ตํ ์ดํด๋ด ๋๋ค. Snowpark Container Services ์์ ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ์ค๋ธ์ ํธ๋ก ์์ ํฉ๋๋ค.
์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ: Snowflake ๊ณ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ์ ์๋ ์ ์ฅ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
Snowpark Container Services ๋ OCI ํด๋ผ์ด์ธํธ(์: Docker CLI ๋ฐ SnowSQL)๊ฐ Snowflake ๊ณ์ ์ ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ์ ์ก์ธ์คํ ์ ์๋๋ก ํ์ฑํํ๋ OCIv2 ํธํ ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง๋ฅผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ๋ก๋ํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ ์์ ํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ปดํจํ ํ: ์ปดํจํ ๋ฆฌ์์ค(๊ฐ์ ๋จธ์ ๋ ธ๋) ์งํฉ์ ๋ํ๋ ๋๋ค.
์ด๋ฌํ ์ปดํจํ ๋ฆฌ์์ค๋ Snowflake ๊ฐ์ ์จ์ดํ์ฐ์ค์ ์ ์ฌํ์ง๋ง ๋์ผํ์ง๋ ์์ต๋๋ค. ์๋น์ค(์ด ๊ฒฝ์ฐ, ์ฌ์ฉ์์ NGINX ์๋น์ค)๊ฐ ์ปดํจํ ํ์์ ์คํ๋ฉ๋๋ค. ์ปดํจํ ์ง์ฝ์ ์ธ ์๋น์ค๋ ๋ง์ ์ฝ์ด์ ๋ง์ GPUs๊ฐ ์ฅ์ฐฉ๋ ๊ณ ์ฑ๋ฅ ์ปดํจํ ํ์ด ํ์ํ์ง๋ง, ๋ ์ง์ฝ์ ์ธ ์๋น์ค๋ ์ฝ์ด ์๊ฐ ์ ์ ์๊ท๋ชจ ์ปดํจํ ํ์์ ์คํํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ปดํจํ ํ ์์ ํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์๋น์ค: ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์๋น์ค์๋ ์ต์ํ ์ฌ์๊ณผ ์ปดํจํ ํ์ด ํ์ํฉ๋๋ค. ์ฌ์์๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๊ฒฝ๋ก, ์๋น์ค๊ฐ ๋ ธ์ถํ ์๋ํฌ์ธํธ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ฌ์์ YAML๋ก ์์ฑ๋์ด ์์ต๋๋ค. ์ปดํจํ ํ์ ์๋น์ค๊ฐ ์คํ๋๋ ์ปดํจํ ๋ฆฌ์์ค์ ์งํฉ์ ๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋น์ค ์์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์ ๋จ๊ณ๋ก ์ด๋ํ์ฌ ์ด๋ฌํ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ ์ค์ ํฉ๋๋ค.
์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ ๋ง๋ค๊ธฐยถ
์ด ์น์ ์์๋ ๋จผ์ Snowflake Python APIs ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Docker Hub์์ NGINX ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ Docker CLI๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํฉ๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ ๋ง๋ค๊ธฐ ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
๋ ธํธ๋ถ์ ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
from snowflake.core.image_repository import ImageRepository my_repo = ImageRepository("MyImageRepository") schema.image_repositories.create(my_repo)
์ด ์ฝ๋ ์์ ์์๋ ์ด ์์ต์์์ ์ด์ ์ ์์ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง์ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ด๋ฆ์ ์ถ๋ ฅํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
my_repo_res = schema.image_repositories["MyImageRepository"] my_repo = my_repo_res.fetch() print(my_repo.name)
๋ฆฌํฌ์งํ ๋ฆฌ(๋ฆฌํฌ์งํ ๋ฆฌ URL ๋ฐ ๋ ์ง์คํธ๋ฆฌ ํธ์คํธ ์ด๋ฆ)์ ๋ํ ์ ๋ณด๊ฐ ์์ด์ผ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ URL์ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
repositories = schema.image_repositories for repo_obj in repositories.iter(): print(repo_obj.repository_url)
์ถ๋ ฅ์
repository_url
ํน์ฑ์ URL์ ์ ๊ณตํฉ๋๋ค. ์:<orgname>-<acctname>.registry.snowflakecomputing.com/spcs_python_api_db/public/myimagerepository
๋ฆฌํฌ์งํ ๋ฆฌ URL์ ํธ์คํธ ์ด๋ฆ์ ๋ ์ง์คํธ๋ฆฌ ํธ์คํธ ์ด๋ฆ์ ๋๋ค. ์:
<orgname>-<acctname>.registry.snowflakecomputing.com
NGINX์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ๋ก๋ํ๊ธฐ
Docker๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๋ ค๋ฉด ๋จผ์ Snowflake๋ก Docker๋ฅผ ์ธ์ฆํด์ผ ํฉ๋๋ค.
Snowflake ๋ ์ง์คํธ๋ฆฌ๋ก Docker๋ฅผ ์ธ์ฆํ๋ ค๋ฉด ๋ช ๋ น์ค ํฐ๋ฏธ๋์ ์ด๊ณ Docker CLI๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์
docker login
๋ช ๋ น์ ์คํํฉ๋๋ค.docker login <registry_hostname> -u <username>
registry_hostname
: ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ์์repository_url
์ ํธ์คํธ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.username
: Snowflake ์ฌ์ฉ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. Docker๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฌป๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
์
docker login myorg-myacct.registry.snowflakecomputing.com -u admin
Docker Hub์์ NGINX ์ด๋ฏธ์ง: ์ AMD64 ๋น๋ ๊ฐ์ ธ์ค๊ธฐ
docker pull --platform linux/amd64 amd64/nginx
amd64/nginx
์ด๋ฏธ์ง์ Snowflake ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ URL์ ํ๊ทธ๋ก ์ง์ ํฉ๋๋ค.docker tag docker.io/amd64/nginx:latest <repository_url>/<image_name>
์
docker tag docker.io/amd64/nginx:latest myorg-myacct.registry.snowflakecomputing.com/spcs_python_api_db/public/myimagerepository/amd64/nginx:latest
ํ๊ทธ๋ ํน์ ๋ฒ์ ์ด๋ ์ด๋ฏธ์ง ๋ณํ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฉ์ ์ง์ ํ ์ธ๊ฐ์ด ์ฝ์ ์ ์๋ ์๋ณ์์ ๋๋ค.
Snowflake ๊ณ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํฉ๋๋ค.
docker push <repository_url>/<image_name>
์
docker push myorg-myacct.registry.snowflakecomputing.com/spcs_python_api_db/public/myimagerepository/amd64/nginx:latest
์ปดํจํ ํ ๋ง๋ค๊ธฐยถ
์ปดํจํ ํ์ ์ ์ํ๊ณ ์์ฑํ๋ ค๋ฉด ๋ ธํธ๋ถ์ ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
new_compute_pool_def = ComputePool(
name="MyComputePool",
instance_family="CPU_X64_XS",
min_nodes=1,
max_nodes=2,
)
new_compute_pool = root.compute_pools.create(new_compute_pool_def)
์ด ์
์์๋ ๋ค์ ํน์ฑ์ ๋ํ ๊ฐ์ ์ ๊ณตํ์ฌ ComputePool
์์ฑ์๋ฅผ ์ฌ์ฉํด ์ปดํจํ
ํ์ ์ ์ํฉ๋๋ค.
instance_family
: ์ธ์คํด์ค ์ ํ๊ตฐ์ ์ปดํจํ ํ์ ๋ ธ๋์ ํ๋ก๋น์ ๋ํ ๋จธ์ ์ ์ ํ์ ์๋ณํฉ๋๋ค.๊ฐ ๋จธ์ ์ ํ์ ํด๋น ์ปดํจํ ํ์ ์๋ก ๋ค๋ฅธ ์์ ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ๋จธ์ ์ ํ์ธ
CPU_X64_XS
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CREATE COMPUTE POOL ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.min_nodes
: ์ปดํจํ ํ์ ์์ํ ์ต์ ๋ ธ๋ ์์ ๋๋ค.max_nodes
: ์ปดํจํ ํ์ด ํ์ฅํ ์ ์๋ ์ต๋ ๋ ธ๋ ์์ ๋๋ค.์ปดํจํ ํ์ ์์ฑํ๋ฉด Snowflake๋ ์ง์ ๋ ์ต์ ๋ ธ๋ ์๋ก ํด๋น ํ์ ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด Snowflake๊ฐ ์๋์ผ๋ก ํ์ฅ์ ๊ด๋ฆฌํ๊ณ , ์คํ ์ค์ธ ๋ ธ๋๊ฐ ์ถ๊ฐ ์ํฌ๋ก๋๋ฅผ ๊ฐ๋นํ ์ ์์ ๋ ์ต๋ ์ง์ ๋ ๊ฐ์๊น์ง ์๋ก์ด ๋ ธ๋๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ปดํจํ
ํ ์ ์๋ฅผ compute_pools.create()
์ ์ ๋ฌํ์ฌ ์ปดํจํ
ํ์ ์์ฑํฉ๋๋ค.
์๋น์ค๋ฅผ ๋ง๋ญ๋๋ค.ยถ
์ด์ ์ค์ ํ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ปดํจํ ํ์ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ์ ์ํ๊ณ ์์ฑํ ์ ์์ต๋๋ค. ์๋น์ค๋ Snowflake์์ ๋ชจ๋ ์กฐ์ ๋๋ ์ปดํจํ ํ์์ ์คํ๋๋ ์ปจํ ์ด๋ ๋ชจ์์ ๋งํฉ๋๋ค.
์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ๋ ธํธ๋ถ์ ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
image_repository = schema.image_repositories["MyImageRepository"]
์ด ๋ฆฌํฌ์งํ ๋ฆฌ๋ PUBLIC ์คํค๋ง์ ์คํ ์ด์ง๋ก ๋์ด๋ Snowflake ๊ณ์ ์ ์์ต๋๋ค. ๋ค์ ๋จ๊ณ์์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ด ์ฐธ์กฐ๊ฐ ํ์ํฉ๋๋ค.
์๋น์ค๋ฅผ ์ ์ํ๊ณ ์์ฑํ๋ ค๋ฉด ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
from textwrap import dedent from io import BytesIO from snowflake.core.service import Service, ServiceSpecInlineText specification = dedent(f"""\ spec: containers: - name: web-server image: {image_repository.fetch().repository_url}/amd64/nginx:latest endpoints: - name: ui port: 80 public: true """) service_def = Service( name="MyService", compute_pool="MyComputePool", spec=ServiceSpecInlineText(spec_text=specification), min_instances=1, max_instances=1, ) nginx_service = schema.services.create(service_def)
์ด ์ ์ ์๋น์ค ์ฌ์๊ณผ ์๋น์ค๋ฅผ ์ ์ํ ๋ค์ NGINX ์น ์๋ฒ์ ๋ํ ์๋น์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ์ ๋ฐ ์๋น์ค์ ๋ํ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๊ฐ์ต๋๋ค.
specification
โ Python ํ์์ด ์ง์ ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด (f-string)์ ์ฌ์ฉํ์ฌ ์ฌ์์ ์ ์ํฉ๋๋ค. ๋ฌธ์์ด์ YAML๋ก ํ์์ด ์ง์ ๋ฉ๋๋ค.์ฌ์์๋ ์ปจํ ์ด๋ ์ด๋ฆ, ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๊ฒฝ๋ก, ์๋น์ค๊ฐ ๋์ค์๊ฒ ๊ณต๊ฐ๋ ์๋ํฌ์ธํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ์์ ์์๋ ์ฌ์์ ์ธ๋ผ์ธ์ผ๋ก ์ ์ํ์ง๋ง, ์คํ ์ด์ง์์
.yml
ํ์ผ์ ๋ํ ์ฐธ์กฐ๋ก ์ฌ์์ ์ ์ํ ์๋ ์์ต๋๋ค.service_def
โService
์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ์ด๋ฆ, ์๋น์ค๊ฐ ์คํ๋ ์ปดํจํ ํ, ์ฌ์ ๊ฒฝ๋ก, ์๋น์ค์ ์ด ์ธ์คํด์ค ์๋ฅผ ์ ๋ฌํ์ฌ ์๋น์ค๋ฅผ ์ ์ํฉ๋๋ค.์ด ์ ์์๋ ์ฌ์์ ์ธ๋ผ์ธ์ผ๋ก f- ๋ฌธ์์ด๋ก ์ ์ํ๊ธฐ ๋๋ฌธ์
ServiceSpecInlineText
๋ฅผ ์ฌ์ฉํ์ฌspec
์ ๊ฐ์ ์ค์ ํฉ๋๋ค. ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์คํํ๋๋ก ์๋น์ค๋ฅผ ์ง์ ํ ์ ์์ง๋ง, ์ด ์์ ์์๋min_instances
๋ฐmax_instances
๋ฅผ1
๋ก ์ค์ ํ์ฌ ์คํํ ์๋น์ค ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์ง์ ํฉ๋๋ค.
์๋น์ค ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
from pprint import pprint pprint(nginx_service.get_service_status(timeout=5))
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํด์ผ ํฉ๋๋ค.
{'auto_resume': True, 'auto_suspend_secs': 3600, 'instance_family': 'CPU_X64_XS', 'max_nodes': 1, 'min_nodes': 1, 'name': 'MyService'}
์์ฒด ์๋น์ค ์ฌ์ฉยถ
์๋น์ค๋ฅผ ์์ฑํ ํ Snowpark Container Services ๋ ์๋น์ค์ ์ก์ธ์คํ๋ ๋ฐ ํ์ํ ์๋ํฌ์ธํธ๋ฅผ ํ๋ก๋น์ ๋ํ๋ ๋ฐ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆฝ๋๋ค.
์๋ํฌ์ธํธ์ ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ ธํธ๋ถ์ ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
import json, time while True: public_endpoints = nginx_service.fetch().public_endpoints try: endpoints = json.loads(public_endpoints) except json.JSONDecodeError: print(public_endpoints) time.sleep(15) else: break
์ด ์ฝ๋ ์์ ๋ Snowpark Container Services ๋๋ Snowflake Python APIs ์ ํน์ ํ ๊ฒ์ด ์๋๋ผ ์๋ํฌ์ธํธ๊ฐ ์ค๋น๋์๋์ง ํ์ธํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ๋ฟ์ ๋๋ค. ์๋น์ค ์ค๋ธ์ ํธ์์
.fetch().public_endpoints
๋ฅผ ํธ์ถํ์ฌ ์๋ํฌ์ธํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํด์ผ ํฉ๋๋ค.
Endpoints provisioning in progress... check back in a few minutes Endpoints provisioning in progress... check back in a few minutes Endpoints provisioning in progress... check back in a few minutes
์๋ํฌ์ธํธ๊ฐ ํ๋ก๋น์ ๋๋ ํ์๋ ๋ธ๋ผ์ฐ์ ์์ ๊ณต๊ฐ ์๋ํฌ์ธํธ๋ฅผ ์ด ์ ์์ต๋๋ค.
๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
import webbrowser print(f"Visiting {endpoints['ui']} in your browser. You might need to log in there.") webbrowser.open(f"https://{endpoints['ui']}")
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํด์ผ ํฉ๋๋ค.
Visiting myorg-myacct.snowflakecomputing.app in your browser. You might need to log in there.
์ฑ๊ณตํ๋ฉด ์๋ํฌ์ธํธ ๋ฐฉ๋ฌธ ์ ๋ธ๋ผ์ฐ์ ์ ๋ค์๊ณผ ๊ฐ์ NGINX ์ฑ๊ณต ํ์ด์ง๊ฐ ํ์๋ฉ๋๋ค.
Python API๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋น์ค๋ฅผ ์ผ์ ์ค๋จํ ํ ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
from time import sleep nginx_service.suspend() sleep(3) print(nginx_service.get_service_status(timeout=5))
์๋น์ค๋ฅผ ๋ค์ ์์ํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
nginx_service.resume() sleep(3) print(nginx_service.get_service_status(timeout=5))
๋จ ๋ช ์ค์ Python์ผ๋ก Snowpark Container Services ๋ฅผ ์ฌ์ฉํ์ฌ Snowflake์์ NGINX ์น ์๋ฒ๋ฅผ ์คํํ ์ ์์์ต๋๋ค.
์ ๋ฆฌยถ
Snowflake๋ ๊ณ์ ์ ํ์ฑ ์ปดํจํ ํ ๋ ธ๋์ ๋ํด ์๊ธ์ ์ฒญ๊ตฌํฉ๋๋ค. ์์น ์๋ ์๊ธ์ด ์ฒญ๊ตฌ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋จผ์ ์๋น์ค์ ์ปดํจํ ํ์ ์ผ์ ์ค๋จํ ๋ค์, ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ชจ๋ ์ญ์ ํฉ๋๋ค.
์ปดํจํ ํ๊ณผ ์๋น์ค๋ฅผ ์ผ์ ์ค๋จํ๋ ค๋ฉด ๋ ธํธ๋ถ์ ๋ค์ ์ ์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
new_compute_pool_def.suspend() nginx_service.suspend()
์ปดํจํ ํ๊ณผ ์๋น์ค๋ฅผ ์ญ์ ํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
new_compute_pool_def.drop() nginx_service.drop()
๋ค์์๋ ๋ฌด์์ ํด์ผ ํฉ๋๊น?ยถ
์ถํํฉ๋๋ค! ์ด ์์ต์์์๋ Snowflake Python APIs ์ ์ฌ์ฉํ์ฌ Snowpark Container Services ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ณธ ์ฌํญ์ ๋ฐฐ์ ์ต๋๋ค.
์์ฝยถ
์ด ๊ณผ์ ์์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๋ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
์๋น์ค๊ฐ ์คํ๋๋ ์ปดํจํ ํ์ ์์ฑํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ์๋น์ค๋ฅผ ์์ฑํฉ๋๋ค.
์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
Snowpark Container Services ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ฅผ ์ผ์ ์ค๋จํ๊ณ ์ญ์ ํ์ฌ ์ ๋ฆฌํฉ๋๋ค.
์ถ๊ฐ ๋ฆฌ์์คยถ
API๋ฅผ ์ฌ์ฉํ์ฌ Snowflake์์ ๋ค๋ฅธ ์ ํ์ ์ค๋ธ์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ ๋ง์ ์์ ๋ ๋ค์ ๊ฐ๋ฐ์ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ฐ์ด๋ |
์ค๋ช |
---|---|
Python์ ์ฌ์ฉํ์ฌ Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์คํค๋ง, ํ ์ด๋ธ ๋ฐ ๋ทฐ ๊ด๋ฆฌํ๊ธฐ |
๋ฐ์ดํฐ๋ฒ ์ด์ค, ์คํค๋ง, ํ ์ด๋ธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ค๋ฉด API๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
Python์ ์ฌ์ฉํ์ฌ Snowflake ์ฌ์ฉ์, ์ญํ ๋ฐ ๊ถํ ๊ด๋ฆฌ |
API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์, ์ญํ ๋ฐ ๋ณด์กฐ๊ธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. |
Python์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ธ๋ก๋ฉ ๋ฆฌ์์ค ๊ด๋ฆฌ |
API๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋ณผ๋ฅจ, ํ์ดํ, ์คํ ์ด์ง๋ฅผ ํฌํจํ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ธ๋ก๋ฉ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. |
Python์ ์ฌ์ฉํ์ฌ Snowflake ์์ ๋ฐ ์์ ๊ทธ๋ํ ๊ด๋ฆฌํ๊ธฐ |
API๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ณผ ์์ ๊ทธ๋ํ๋ฅผ ์์ฑ, ์คํ, ๊ด๋ฆฌํฉ๋๋ค. |