Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋ฉด ๋ฌด์—‡์ด ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€

Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋ฉด ๋ฌด์—‡์ด ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€ Spark๋ฅผ ์™œ ๊ตณ์ด Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ˆœ๊ฐ„ ์šด์˜ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€๋ฅผ ์‹ค๋ฌด ๊ด€์ ์—์„œ ์ •๋ฆฌํ•œ๋‹ค.


๋“ค์–ด๊ฐ€๋ฉฐ

Spark on Kubernetes ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ฉด ๋Œ€๊ฐœ ์„ค์น˜๋ฒ•์ด๋‚˜ ์„ฑ๋Šฅ ํŠœ๋‹๋ถ€ํ„ฐ ๋– ์˜ฌ๋ฆฌ๊ธฐ ์‰ฝ๋‹ค.
ํ•˜์ง€๋งŒ ํ˜„์—…์—์„œ ๋” ์ค‘์š”ํ•œ ์งˆ๋ฌธ์€ ๋”ฐ๋กœ ์žˆ๋‹ค.
์™œ ๊ตณ์ด Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋Š”๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ˆœ๊ฐ„ ์šด์˜ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”๊ฐ€๋‹ค.
์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๋ ค๋ฉด ๋จผ์ € Spark์™€ Kubernetes๋ฅผ ์•„์ฃผ ์งง๊ฒŒ๋ผ๋„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋จผ์ € Spark๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€

Apache Spark ๊ณต์‹ ๋ฌธ์„œ๋Š” Spark๋ฅผ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ†ตํ•ฉ ๋ถ„์„ ์—”์ง„์œผ๋กœ ์ •์˜ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Spark SQL, Structured Streaming, MLlib, GraphX์ฒ˜๋Ÿผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋„๊ตฌ๋ฅผ ํ•˜๋‚˜์˜ ์ƒํƒœ๊ณ„ ์•ˆ์—์„œ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ๋‹ค. ์‹ค๋ฌด์ ์œผ๋กœ ํ’€์–ด ๋งํ•˜๋ฉด Spark๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์ฝ๊ณ , ๊ฐ€๊ณตํ•˜๊ณ , ์ง‘๊ณ„ํ•˜๊ณ , ํ•™์Šต์‹œํ‚ค๋Š” ์ผ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์—”์ง„์ด๋‹ค.

์ฆ‰ Spark๋Š” ๋‹จ์ˆœํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ธฐ๋ณด๋‹ค, ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง๊ณผ ๋ถ„์„ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋Š” ์‹คํ–‰ ์—”์ง„์— ๊ฐ€๊น๋‹ค.
๋ฐฐ์น˜ ์ฒ˜๋ฆฌ, ์ŠคํŠธ๋ฆฌ๋ฐ, ๋จธ์‹ ๋Ÿฌ๋‹ ์ „์ฒ˜๋ฆฌ๊นŒ์ง€ ํ•œ ํ”Œ๋žซํผ ์•ˆ์—์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ์˜ ์ค‘์‹ฌ์ถ•์œผ๋กœ ์ž์ฃผ ๋“ฑ์žฅํ•œ๋‹ค.

Kubernetes๋Š” ๋˜ ๋ฌด์—‡์ธ๊ฐ€

Kubernetes ๊ณต์‹ ๋ฌธ์„œ๋Š” Kubernetes๋ฅผ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์›Œํฌ๋กœ๋“œ์™€ ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ด์‹ ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋žซํผ์ด๋ผ๊ณ  ์„ค๋ช…ํ•œ๋‹ค. ๊ฐ™์€ ๋ฌธ์„œ์—์„œ Kubernetes๋Š” ์„ ์–ธํ˜• ๊ตฌ์„ฑ๊ณผ ์ž๋™ํ™”๋ฅผ ์ง€์›ํ•˜๊ณ , ์Šค์ผ€์ค„๋ง, ์ž๊ฐ€๋ณต๊ตฌ, ํ™•์žฅ, ์‹œํฌ๋ฆฟ๊ณผ ์„ค์ • ๊ด€๋ฆฌ, ๋ฐฐ์น˜ ์‹คํ–‰ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ •๋ฆฌํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž ๊ฐ๊ฐ์œผ๋กœ ๋‹ค์‹œ ๋งํ•˜๋ฉด Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‹จ์ˆœ ์‹คํ–‰๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ปจํ…Œ์ด๋„ˆ ์›Œํฌ๋กœ๋“œ๋ฅผ ์šด์˜ํ•˜๋Š” ํ‘œ์ค€ ์šด์˜ ์ฒด๊ณ„์— ๊ฐ€๊น๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ด๋””์— ๋ฐฐ์น˜ํ• ์ง€, ์žฅ์• ๊ฐ€ ๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ ๋‹ค์‹œ ๋„์šธ์ง€, ๋ฆฌ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€, ๋น„๋ฐ€์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฃผ์ž…ํ• ์ง€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ”Œ๋žซํผ ์ฐจ์›์—์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

๊ทธ๋Ÿผ ์™œ Spark๋ฅผ Kubernetes์— ์˜ฌ๋ฆฌ๋ ค ํ•˜๋Š”๊ฐ€

์—ฌ๊ธฐ์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์งˆ๋ฌธ์ด ์ƒ๊ธด๋‹ค.
Spark๋Š” ์›๋ž˜๋„ ์ž˜ ๋Œ์•„๊ฐ€๋Š”๋ฐ ์™œ ๊ตณ์ด Kubernetes๋ฅผ ๋ถ™์ด๋ ค ํ• ๊นŒ.
Spark ๊ณต์‹ ๋ฌธ์„œ๋Š” Spark๊ฐ€ standalone, YARN, Kubernetes ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Spark on Kubernetes ๋ฌธ์„œ๋Š” Spark๊ฐ€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ,
Kubernetes์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ฐํžŒ๋‹ค.

์ด ๋ง์€ ๊ณง Spark๋ฅผ ๋” ์ด์ƒ ๋ณ„๋„ ์„ฌ์ฒ˜๋Ÿผ ์šด์˜ํ•˜์ง€ ์•Š๊ณ , ์กฐ์ง์ด ์ด๋ฏธ ์“ฐ๊ณ  ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ ์œ„์˜ ํ•˜๋‚˜์˜ ์›Œํฌ๋กœ๋“œ๋กœ ๋‹ค๋ฃจ๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ฐฐ์น˜ ์žก, API ์„œ๋ฒ„, ๋‚ด๋ถ€ ์–ด๋“œ๋ฏผ ํˆด, ์›Œ์ปค, ์‹คํ—˜์šฉ ํ™˜๊ฒฝ์ด ๋ชจ๋‘ Kubernetes ์œ„์— ์žˆ๋‹ค๋ฉด Spark ์—ญ์‹œ ๊ฐ™์€ ๊ทœ์น™ ์•ˆ์œผ๋กœ ํŽธ์ž…ํ•˜๋Š” ํŽธ์ด ์šด์˜์ƒ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ด ๊ด€๊ณ„๋ฅผ ํ•œ ์žฅ์œผ๋กœ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.

Spark์™€ Kubernetes์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ

๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•ต์‹ฌ์€ ๋‹จ์ˆœํ•˜๋‹ค. Spark๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—”์ง„์ด๊ณ , Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ ์›Œํฌ๋กœ๋“œ ์šด์˜ ํ”Œ๋žซํผ์ด๋‹ค.
์ด ๋‘˜์ด ๋งŒ๋‚˜๋ฉด Spark ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Kubernetes ์œ„์—์„œ driver pod์™€ executor pod ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๊ณ , ์Šค์ผ€์ค„๋ง๊ณผ ๋ณต๊ตฌ, ๋ฆฌ์†Œ์Šค ๋ฐฐ์น˜, ์šด์˜ ํ‘œ์ค€ํ™”๋Š” Kubernetes์˜ ์ฑ…์ž„ ์•„๋ž˜๋กœ ๋“ค์–ด๊ฐ„๋‹ค.


์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ๋ณด๋ฉด

๋ง๋กœ๋งŒ ์„ค๋ช…ํ•˜๋ฉด ์ถ”์ƒ์ ์œผ๋กœ ๋“ค๋ฆด ์ˆ˜ ์žˆ๋‹ค.
๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋กœ ๋ณด๋ฉด ๋กœ์ปฌ์—์„œ ๋Œ๋ฆฌ๋˜ PySpark ์ฝ”๋“œ ์ž์ฒด๋Š” ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ณด๋‹ค ์–ด๋””์— ์–ด๋–ป๊ฒŒ ์ œ์ถœํ•˜๋А๋ƒ๋‹ค.
์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์ˆซ์ž ๋ฒ”์œ„๋ฅผ ๋งŒ๋“  ๋’ค ์ง์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ์•„์ฃผ ์งง์€ PySpark ์ฝ”๋“œ๋‹ค.

from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
    .appName("spark-on-k8s-demo")
    .getOrCreate()
)

numbers = spark.range(1, 1000001)
even_count = numbers.filter("id % 2 = 0").count()

print(f"even_count={even_count}")

spark.stop()

์ด ์ฝ”๋“œ๋ฅผ Kubernetes ์œ„์— ์ œ์ถœํ•  ๋•Œ๋Š” Spark ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ spark-submit์—์„œ master๋ฅผ Kubernetes API ์„œ๋ฒ„๋กœ ์ง€์ •ํ•˜๊ณ , ์‹คํ–‰์— ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์™€ namespace ๊ฐ™์€ ๊ฐ’์„ ํ•จ๊ป˜ ๋„˜๊ธด๋‹ค. ์•„์ฃผ ์ถ•์•ฝํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

./bin/spark-submit \
  --master k8s://https://kubernetes.default.svc:443 \
  --deploy-mode cluster \
  --name spark-on-k8s-demo \
  --class org.apache.spark.examples.SparkPi \
  --conf spark.executor.instances=2 \
  --conf spark.kubernetes.container.image=myrepo/spark:4.1.1 \
  --conf spark.kubernetes.namespace=data-platform \
  local:///opt/spark/examples/jars/spark-examples_2.13-4.1.1.jar

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฝ”๋“œ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๋ชจ๋ธ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” Spark ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ถœํ•˜๊ณ , Kubernetes๋Š” driver pod์™€ executor pod๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Spark on Kubernetes๋ฅผ ์ดํ•ดํ•  ๋•Œ๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ณด๋‹ค ์ œ์ถœ ์„ค์ •, ์ด๋ฏธ์ง€, namespace, ๊ถŒํ•œ, ๋ฆฌ์†Œ์Šค ์„ค์ •์„ ๊ฐ™์ด ๋ด์•ผ ํ•œ๋‹ค.


๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ์ง€์  1: ์‹คํ–‰ ๋‹จ์œ„๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž์—์„œ Pod ์ค‘์‹ฌ์œผ๋กœ ๋ฐ”๋€๋‹ค

Spark on Kubernetes ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด spark-submit์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ถœํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„๊ฐ€ Kubernetes Pod๋กœ ๋œจ๊ณ , ๊ทธ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ executor Pod๋“ค์„ ์ƒ์„ฑํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ฆ‰ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๋Š” Spark ์ฝ”๋“œ๋Š” ๋น„์Šทํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์šด์˜์ž๊ฐ€ ๋ณด๋Š” ์‹คํ–‰ ๋‹จ์œ„๋Š” ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค.

๊ตฌ๋ถ„ Spark ์ „์šฉ ์šด์˜ ๊ฐ๊ฐ Kubernetes ์œ„ Spark ์šด์˜ ๊ฐ๊ฐ
์‹คํ–‰ ๋‹จ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, executor driver pod, executor pod
๋ฐฐ์น˜ ๊ธฐ์ค€ Spark ํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ์ค€ namespace, pod, quota, node ๊ธฐ์ค€
์žฅ์•  ํ™•์ธ Spark UI์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ ์ค‘์‹ฌ Spark UI + pod ์ƒํƒœ + ์ด๋ฒคํŠธ + ํด๋Ÿฌ์Šคํ„ฐ ๋กœ๊ทธ
๊ถŒํ•œ ์„ค๊ณ„ Spark ์„ค์ • ์ค‘์‹ฌ service account, RBAC, secret ์ค‘์‹ฌ

์ด ๋ณ€ํ™”๋Š” ์ƒ๊ฐ๋ณด๋‹ค ํฌ๋‹ค. ์ด์ „์—๋Š” Spark ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ค executor ์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋จน๋Š”์ง€๊ฐ€ ์ฃผ ๊ด€์‹ฌ์‚ฌ์˜€๋‹ค๋ฉด, Kubernetes ์œ„์—์„œ๋Š” ์ด Pod๊ฐ€ ์–ด๋А namespace์— ์†ํ•˜๋Š”์ง€, ์–ด๋–ค ๋ฆฌ์†Œ์Šค quota ์•ˆ์—์„œ ๋Œ์•„๊ฐ€๋Š”์ง€, ์–ด๋А ๋…ธ๋“œ์— ๋ฐฐ์น˜๋˜๋Š”์ง€๊นŒ์ง€ ํ•จ๊ป˜ ๋ด์•ผ ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด Spark ์šด์˜์ด ํ”Œ๋žซํผ ์šด์˜ ๋ฌธ๋ฒ• ์•ˆ์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค.


๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ์ง€์  2: ์™œ ์šด์˜ํ•˜๋Š”๊ฐ€์˜ ์ด์œ ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค

Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋‹จ์ง€ ์ตœ์‹  ๊ธฐ์ˆ ์„ ์“ฐ๊ณ  ์‹ถ์–ด์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์‹ค์ œ ์ด์œ ๋Š” ๊ฝค ํ˜„์‹ค์ ์ด๋‹ค.

์ฒซ์งธ, ํ”Œ๋žซํผ ํ†ตํ•ฉ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
์ด๋ฏธ ์กฐ์ง ์•ˆ์˜ ์„œ๋น„์Šค๋“ค์ด Kubernetes ์œ„์—์„œ ๋Œ์•„๊ฐ„๋‹ค๋ฉด Spark๋งŒ ๋ณ„๋„ ์šด์˜ ์ฒด๊ณ„๋กœ ๊ฐ€์ ธ๊ฐˆ ์ด์œ ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
๋‘˜์งธ, ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ์™€ ๋ฆฌ์†Œ์Šค ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Kubernetes๋Š” quota, namespace, scheduling ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒ€๊ณผ ์›Œํฌ๋กœ๋“œ๋ฅผ ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
์…‹์งธ, ๋ณด์•ˆ·๊ด€์ธก·๋ฐฐํฌ ํ‘œ์ค€ํ™”๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
์‹œํฌ๋ฆฟ ์ฃผ์ž…, ์„ค์ • ๊ด€๋ฆฌ, ๋กœ๊ทธ ์ˆ˜์ง‘, ์ด๋ฏธ์ง€ ๋ฐฐํฌ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ Spark๋งŒ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์ด ์ง€์ ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ์ด ์ ์  ๋” ๋…๋ฆฝ์ ์ธ ํŠน์ˆ˜ ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๋ผ, ์กฐ์ง ์ „์ฒด ์—”์ง€๋‹ˆ์–ด๋ง ํ”Œ๋žซํผ์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Spark on Kubernetes๋Š” ๋ฐ”๋กœ ์ด ๋ณ€ํ™”์™€ ๋งž๋‹ฟ์•„ ์žˆ๋‹ค.


๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ์ง€์  3: ๋ณด์•ˆ๊ณผ ๊ถŒํ•œ์€ ๋” ์„ธ๋ฐ€ํ•ด์ง€์ง€๋งŒ ๋” ๋ณต์žกํ•ด์ง„๋‹ค

๋งŽ์€ ํŒ€์ด Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ ๋ณด์•ˆ์ด ์ข‹์•„์งˆ ๊ฒƒ์ด๋ผ ๊ธฐ๋Œ€ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ Spark on Kubernetes ๋ฌธ์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ์ž๋™ ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, Pod Security Admission, ๋ณผ๋ฅจ ์‚ฌ์šฉ, ์‚ฌ์šฉ์ž ID, RBAC, Secret ์ฒ˜๋ฆฌ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ๋”ฐ๋กœ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ๋‹ค.

์ด ๋ง์€ ๊ณง ๋ณด์•ˆ์ด ์ข‹์•„์งˆ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ €์ ˆ๋กœ ์ข‹์•„์ง€์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋“œ๋ผ์ด๋ฒ„ Pod๊ฐ€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋ฉด ์„œ๋น„์Šค ๊ณ„์ • ๊ถŒํ•œ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๊ณ , ์™ธ๋ถ€ ์ €์žฅ์†Œ ๋น„๋ฐ€ํ‚ค๋ฅผ ์จ์•ผ ํ•œ๋‹ค๋ฉด Secret์„ ์–ด๋–ป๊ฒŒ ๋งˆ์šดํŠธํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.
Spark๋งŒ ์•Œ๋˜ ์‹œ์ ˆ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์šด์˜ ๊ฒฐ์ •์ด ํ•„์š”ํ•ด์ง„๋‹ค.


๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ์ง€์  4: ๋””๋ฒ„๊น… ๊ด€์ ์ด ๋„“์–ด์ง„๋‹ค

Spark๋งŒ ์šด์˜ํ•  ๋•Œ๋Š” ์‹คํŒจ ์›์ธ์„ Spark ์„ค์ •, ์…”ํ”Œ, ๋ฉ”๋ชจ๋ฆฌ, ์ฝ”๋“œ ๋กœ์ง์—์„œ ๋จผ์ € ์ฐพ๋Š”๋‹ค.
Kubernetes ์œ„์—์„œ๋Š” ์—ฌ๊ธฐ์— Pod ์Šค์ผ€์ค„๋ง ์‹คํŒจ, ์ด๋ฏธ์ง€ pull ์‹คํŒจ, ๊ถŒํ•œ ๋ˆ„๋ฝ, ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์‹คํŒจ, ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์ด ํ•จ๊ป˜ ๋“ค์–ด์˜จ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌธ์ œ๋ฅผ ๋ณผ ๋•Œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฌธ์ œ + ํ”Œ๋žซํผ ๋ฌธ์ œ๋ฅผ ๊ฐ™์ด ๋ด์•ผ ํ•œ๋‹ค.

์‹ค์ œ๋กœ Spark on Kubernetes ๋ฌธ์„œ๊ฐ€ ๋กœ๊ทธ ์ ‘๊ทผ, Driver UI ์ ‘๊ทผ, ๋””๋ฒ„๊น…๊ณผ ์ธํŠธ๋กœ์ŠคํŽ™์…˜์„ ๋ณ„๋„ ํ•ญ๋ชฉ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ์ด์œ ๋„ ์—ฌ๊ธฐ์— ์žˆ๋‹ค.
๊ฐ™์€ executor ์‹คํŒจ๋ผ๋„ ์›์ธ์ด Spark ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ Pod ์ƒ์„ฑ ์‹คํŒจ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด ์ฐจ์ด ๋•Œ๋ฌธ์— Spark on Kubernetes๋Š” ์—”์ง„ ํ•˜๋‚˜๋ฅผ ์•„๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๊ณ , Kubernetes ์šด์˜ ๊ฐ๊ฐ๊นŒ์ง€ ๊ฐ™์ด ์š”๊ตฌํ•œ๋‹ค.


๊ทธ๋Ÿผ ์–ธ์ œ ์ด ์„ ํƒ์ด ๋งž๋Š”๊ฐ€

Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋Š” ์„ ํƒ์ด ํŠนํžˆ ์ž˜ ๋งž๋Š” ๊ฒฝ์šฐ๋Š” ๋น„๊ต์  ๋ถ„๋ช…ํ•˜๋‹ค.
์กฐ์ง์˜ ํ‘œ์ค€ ์šด์˜ ํ”Œ๋žซํผ์ด ์ด๋ฏธ Kubernetes์ด๊ณ , ์—ฌ๋Ÿฌ ์›Œํฌ๋กœ๋“œ๊ฐ€ ๊ฐ™์€ ๊ด€์ธก·๋ฐฐํฌ·๋ณด์•ˆ ์ฒด๊ณ„๋ฅผ ์“ฐ๊ณ  ์žˆ์œผ๋ฉฐ,
๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์›Œํฌ๋กœ๋“œ๋„ ๊ทธ ํ๋ฆ„ ์•ˆ์œผ๋กœ ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ๋‹ค. ์ด ๊ฒฝ์šฐ Spark๋Š” ๋ณ„๋„ ์šด์˜ ์‚ฌ์ผ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ”Œ๋žซํผ์˜ ์ผ๋ถ€๊ฐ€ ๋œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์•„์ง Kubernetes ์šด์˜ ์—ญ๋Ÿ‰์ด ์•ฝํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ ์ „์šฉ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์ด๊ณ , ํŒ€์ด Spark ์™ธ ๋ ˆ์ด์–ด๊นŒ์ง€ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ๊ผญ ์˜ฎ๊ฒจ์•ผ ํ•  ์ด์œ ๋Š” ์•ฝํ•˜๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ์กฐ์ง์ ์œผ๋กœ ์ด๋“์ด๋ผ๋Š” ์‚ฌ์‹ค์€ ๋‹ค๋ฅด๋‹ค.

๋งˆ๋ฌด๋ฆฌ

Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋ฉด ๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ Spark API๊ฐ€ ์•„๋‹ˆ๋‹ค. ์šด์˜์˜ ๊ด€์ ์ด ๋ฐ”๋€๋‹ค. Spark๋ฅผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—”์ง„์œผ๋กœ๋งŒ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Kubernetes ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” ์›Œํฌ๋กœ๋“œ๋กœ ๋ณด๊ฒŒ ๋œ๋‹ค. ๊ทธ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์‹คํ–‰ ๋‹จ์œ„๋Š” Pod๊ฐ€ ๋˜๊ณ , ๋ฆฌ์†Œ์Šค ์šด์˜์€ quota์™€ scheduling์ด ๋˜๊ณ , ๋ณด์•ˆ์€ RBAC์™€ Secret ์„ค๊ณ„๊ฐ€ ๋˜๋ฉฐ, ์žฅ์•  ๋ถ„์„์€ ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ๋ฒจ๊นŒ์ง€ ํ™•์žฅ๋œ๋‹ค.

๊ฒฐ๊ตญ ์ด ์„ ํƒ์€ ์„ฑ๋Šฅ ๋ฌธ์ œ ํ•˜๋‚˜๋กœ ๊ฒฐ์ •๋˜์ง€ ์•Š๋Š”๋‹ค. ์˜คํžˆ๋ ค ์กฐ์ง์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์‹œ์Šคํ…œ์„ ์–ผ๋งˆ๋‚˜ ํ”Œ๋žซํผ์ ์œผ๋กœ ์šด์˜ํ•˜๊ณ  ์‹ถ์€๊ฐ€์— ๋” ๊ฐ€๊น๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ด ์ด๋ฏธ ๋‚˜์™€ ์žˆ๋Š” ํŒ€์ด๋ผ๋ฉด, Spark on Kubernetes๋Š” ๋‹จ์ˆœ ์œ ํ–‰์ด ์•„๋‹ˆ๋ผ ๊ฝค ์„ค๋“๋ ฅ ์žˆ๋Š” ์šด์˜ ๋ชจ๋ธ์ด ๋œ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ