๐ป ๋ก์ปฌ ๋งฅ๋ถ์์ Spark ์คํํ๊ธฐ - 2ํธ: Client Mode
Databricks Certification ์ทจ๋์ ๋ชฉํ๋ก Apache Spark๋ฅผ โ์ ๋๋กโ ๊ณต๋ถํด๋ณด๊ณ ์์ต๋๋ค. ํ์ฌ์์ Databricks Unity Catalog๋ฅผ ๋์ ํ๋ ค๊ณ ๋ถํฌํ๊ณ ์๋๋ฐ์. Spark์ ์ข ์นํด์ง ์ ์์๊น์? ๐ ์ ์ฒด ํฌ์คํธ๋ Development - Spark์์ ํ์ธํด์ค ์ ์์ต๋๋ค.
1ํธ์์๋ ๋จ์ผ ๋จธ์ ์์ ์คํํ๋ โLocal Modeโ๋ก Spark ์์ ์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์๋ค. 2ํธ์์๋ โClient Modeโ๋ก Spark ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ , Spark ์์ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์.
Setup Spark Cluster
Setup Master Node
๋จผ์ Master ๋
ธ๋๋ฅผ ๋์๋ณด์. pyspark
๋ก Spark๋ฅผ ์ธํ
ํ๋ค๋ฉด, ํจ๊ป ์ ๊ณตํ๋ spark-class
๋ช
๋ น์ด๋ก Master ๋
ธ๋๋ฅผ ๋์ธ ์ ์๋ค.
$ spark-class org.apache.spark.deploy.master.Master -h localhost
...
24/08/22 00:52:41 INFO Utils: Successfully started service 'sparkMaster' on port 7077.
24/08/22 00:52:41 INFO Master: Starting Spark master at spark://localhost:7077
24/08/22 00:52:41 INFO Master: Running Spark version 3.5.2
24/08/22 00:52:41 INFO JettyUtils: Start Jetty 0.0.0.0:8080 for MasterUI
24/08/22 00:52:41 INFO Utils: Successfully started service 'MasterUI' on port 8080.
24/08/22 00:52:41 INFO MasterWebUI: Bound MasterWebUI to 0.0.0.0, and started at http://172.30.1.16:8080
24/08/22 00:52:41 INFO Master: I have been elected leader! New state: ALIVE
๊ทธ๋ฆฌ๊ณ http://localhost:8080
์ ์ ์ํ๋ฉด, Spark UI๋ ๋ณผ ์ ์๋ค.
์ผ๋จ Master ๋
ธ๋๋ง ๋์ด ์ํ์์ ์๊ธฐ์ spark-hello.py
์์
์ spark-submit
ํด๋ณด์.
$ spark-submit \
--master spark://localhost:7077 \
./hello-spark.py
์ด ์ํ์์ Spark Application์ ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ฌ๋ Spark App์ ์คํํ ์์ปค๊ฐ ์๊ธฐ ๋๋ฌธ์, ์คํ์ด ๋์ง ์๊ณ ๊ณ์ ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๋ค.
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
์ฆ, Worker๊ฐ ์์ง ๋ถ์ง ์์์ Spark App์ด ์คํ๋์ง ์๊ณ ์์๋ค! ๊ทธ๋ฌ๋ฉด ์ด์ ์์ปค ๋ ธ๋๋ฅผ ๋ถ์ฌ๋ณด์.
Setup Worker Node
$ spark-class org.apache.spark.deploy.worker.Worker \
spark://localhost:7077
---
...
24/08/22 13:00:57 INFO JettyUtils: Start Jetty 0.0.0.0:8081 for WorkerUI
24/08/22 13:00:57 INFO Utils: Successfully started service 'WorkerUI' on port 8081.
24/08/22 13:00:57 INFO WorkerWebUI: Bound WorkerWebUI to 0.0.0.0, and started at http://172.16.80.54:8081
24/08/22 13:00:57 INFO Worker: Connecting to master localhost:7077...
24/08/22 13:00:57 INFO TransportClientFactory: Successfully created connection to localhost/127.0.0.1:7077 after 11 ms (0 ms spent in bootstraps)
24/08/22 13:00:57 INFO Worker: Successfully registered with master spark://localhost:7077
์ฐธ๊ณ ๋ก Worker ๋
ธ๋ ์์ฒด์ Spark UI๋ ์๋๋ฐ, ์๊ฑด http://localhost:8081
์์ ์ ์ํ ์ ์๋ค.
spark-submit again
์ด์ Master ๋
ธ๋์ Worker ๋
ธ๋ ๋ ๋ค ๊ตฌ์ฑ์ ํ์ผ๋, ๋ค์ spark-submit
์ ํด๋ณด์.
$ spark-submit \
--master spark://localhost:7077 \
./hello-spark.py
Spark App์ด ์คํ๋๊ณ , Completed ์ํ๋ก ๋์ด๊ฐ ๊ฑธ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ Worker ๋ ธ๋์์๋ ์ด๋ ๊ฒ ๋์จ๋ค.
Spark UI๋ฅผ ํตํด ์งํ๋ฅผ ์ดํด๋ณด๋ฉด, ๊ฐ๋จํ count ์์ธ์ธ๋ฐ๋ CPU core๋ฅผ ๋ฌด๋ ค 12 core
๋ ์ฌ์ฉํ๋ค! ์ด๊ฒ์ spark-submit
์ ํ ๋, ๋ฐ๋ก ์ฌ์ฉํ Core์ Memory ์ฉ๋์ ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค!
$ spark-submit \
--master spark://localhost:7077 \
--total-executor-cores 2 \
--executor-memory 500m \
./hello-spark.py
Spark Standalone ๋ชจ๋
Master-Worker ๋ ธ๋๋ก Spark ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ ์ด ๋ฐฉ์์ โStandaloneโ ๋ชจ๋๋ผ๊ณ ํ๋ค.
๋ณธ๋ Spark ํด๋ฌ์คํฐ๋ Master ๋ ธ๋, Worker ๋ ธ๋ ๋ฟ๋ง ์๋๋ผ โCluster Managerโ๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์์ด Spark ํด๋ฌ์คํฐ ์ํ ๊ด๋ฆฌ, ๋ฆฌ์์ค ํ ๋น, ์์ ๋ถ๋ฐฐ ๋ฑ์ ์ญํ ์ ์ํํ๋ค.
- Memory Management
- Fault Recovery
- Task Scheduling
Standalone์ ๋ป์ธ โ์๋ฆฝํ/๋ ๋ฆฝํโ๋ผ๋ ๋ป์ ๋ง๊ฒ Standalone ๋ชจ๋์์๋ Master ๋ ธ๋๊ฐ Cluster Manager์ ์ญํ ๊น์ง ์ํํ๋ค.
Spark ํด๋ฌ์คํฐ๋ฅผ Prod ํ๊ฒฝ์์ ์ด์ํ ๋๋ YARN์ด๋ Mesos๋ฅผ Cluster Manager๋ก ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค. spark-on-kubernetes๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๋ค๋ฉด, Kubernetes๊ฐ Cluster Manager์ ์ญํ ์ ์ํํ๊ธฐ๋ ํ๋ค.
Client Mode์ ๋ํด ์ข๋ ์์ธํ
์ง๋ ํฌ์คํธ์์๋ โLocal Modeโ๋ก Spark Application์ ์คํํ๋ค๋ฉด, ์ด๋ฒ์๋ โClient Modeโ๋ก Spark App์ ์คํํ๋ค. Client ๋ชจ๋์์๋ Driver Process๊ฐ Client JVM ์์์ ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ Worker JVM ์์์ Executor Process๋ค์ด ์คํ๋๋ ๊ตฌ์กฐ๋ค.
Master and Worker, Driver and Executor
์ด ๋ถ๋ถ์ ๊ณต๋ถํ๋ฉด์ ์ด๋จ ๋๋ Master-Worker ๋๋ Driver-Worker๋ผ๊ณ ๋ถ๋ฅด๊ณ , ๋ ์ด๋จ ๋๋ Driver-Executor๋ผ๊ณ ๋ถ๋ฅด๋ ์ฉ์ด๋ค์ด ์ ๋ง ํท๊ฐ๋ ธ๋ค.
๊ทธ๋์ ์ฐพ์๋ณด๋ ์ด๋ ๊ฒ ์ค๋ช ํ๋ ๊ณณ์ด ์์๋ค.
- Spark ํด๋ฌ์คํฐ ๊ด์ ์์๋
- Master ๋ ธ๋์ Worker ๋ ธ๋๋ก ๊ตฌ์ฑ๋๋ค.
- ๊ฐ ๋ ธ๋๋ ๋ฌผ๋ฆฌ์ ๋จธ์ ์ ๊ฐ๋ ์ด๋ค.
- Spark์ ๊ด์ ์์๋
- Driver Process์ Executor Progress๋ก ๊ตฌ์ฑ๋๋ค.
- Process ๋์ Program๋ผ๊ณ ๋ ๋งํ๋ค.
์ด๋, Driver Process๋ ๋ฐ๋์ Master ๋ ธ๋์ ๋จ๋ ๊ฑด ์๋๋ค. ์์์ ์ดํด๋ณธ Client Mode๋ Driver Process๊ฐ Client์ JVM์ ๋ฌ๋ค. ๋ฐ๋ฉด์, ์์ง ์คํํด๋ณด์ง ์์ โCluster Modeโ์์๋ Driver Process๊ฐ ํด๋ฌ์คํฐ ๋ด๋ถ์์ ๊ฒฐ์ ๋๋ค. (์ด๊ฒ๋ Master ๋ ธ๋์ ๋ฐ๋์ ๋จ๋๊ฒ ์๋๋ผ Worker ๋ ธ๋ ์ค ํ๋์ Driver Process๊ฐ ์คํ๋๋ ๊ฒฝ์ฐ๋ ์๋ค๋ ๊ฒ ๊ฐ๋ค. ๐ตโ๐ซ)
์์ Client Mode์์์ ๊ทธ๋ฆผ๊ณผ ์ ๋น๊ตํด๋ณด๋ฉด, Client JVM์ธ์ง Driver JVM์ธ์ง ํ๊ธฐ๊ฐ ๋ค๋ฅด๊ฒ ๋์ด ์๋ค. ์๋๋ Spark ๊ณต์ ๋ฌธ์์์ ๋ฌ์ฌ๋ Client ๋ชจ๋์ Cluster ๋ชจ๋์ ์ฐจ์ด์ ์ด๋ค.
Spark Deploy Mode: Distinguishes where the driver process runs. In โclusterโ mode, the framework launches the driver inside of the cluster. In โclientโ mode, the submitter launches the driver outside of the cluster. - Spark Doc
๋ค์์๋
์์ง โCluster Modeโ๋ฅผ ์ ๋๋ก ์ดํด๋ณด์ง ๋ชป ํ๋ค. ์คํ์ ํด๋ดค๋๋ฐ, ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋จ๋ฉด, Cluster Mode์์๋ pyspark
๋ฅผ ์คํ์ํฌ ์ ์๋ค๊ณ ํ๋ค.
Exception in thread โmainโ org.apache.spark.SparkException: Cluster deploy mode is currently not supported for python applications on standalone clusters.
๊ทธ๋์ Cluster Mode๋ ๋ค์์ scala ์คํ์ ํ๊ฒ ๋ ๋ ๋ค์ ์ดํด๋ณผ ๊ฒ!
๋ค์ ํฌ์คํธ์์ SparkSession
๊ณผ SparkContext
๋ฅผ ์ดํด๋ณด๊ณ ๋์ ๋น๊ต ํด๋ณด๊ณ ์ ํ๋ค.