๐ฅ
[Spark] Spark Join ์ข ๋ฅ ๋ณธ๋ฌธ
์คํํฌ์์ Join ์์๋ ์ํฉ์ ๋ฐ๋ผ Shuffle ์ฐ์ฐ์ ์ํํด์ผ ํ๊ณ , ์ด๋ executor ์ฌ์ด์ ๋ฐฉ๋ํ ๋ฐ์ดํฐ ์ด๋์ ์ผ๊ธฐํ๋ค.
์คํํฌ์์ ์ฌ์ฉ๋๋ ์กฐ์ธ์ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
1. Broadcast Hash Join
๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํ ๋ ํ ์ชฝ์ด ๋งค์ฐ ์๊ณ ํ ์ชฝ์ ๋งค์ฐ ํฐ ์ฌ์ด์ฆ์ ๋ฐ์ดํฐ์ผ ๋, ๋ ์์ ์ชฝ์ ๋ฐ์ดํฐ๊ฐ Driver์ ์ํด ๋ชจ๋ executor๋ก ๋ณต์ฌ๋๋ ๋ฐฉ์์ด๋ค.
- ์ฌ์ด์ฆ๊ฐ ์์ ํ ์ด๋ธ์ ํค ๊ฐ์ ํด์ ํ ์ด๋ธ๋ก ๋ง๋ ๋ค.
- ํด์ ํ ์ด๋ธ์ ๊ฐ์ ํฐ ํ ์ด๋ธ ํํฐ์ ์ ๋ณต์ฌํด์ค๋ค.
- ๊ฐ ํํฐ์ ๋ด๋ถ์์ ์กฐ์ธ์ ์งํํ๋ค.
์ด ๋ฐฉ์์ shuffle์ ์๋ตํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ด๋์ ๋ฐ๋ฅธ ์ฝ์คํธ๊ฐ ์ฌ๋ผ์ง๋ค.
๋ชจ๋ executor์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌํ๋ ค๋ dataset์ด ์ผ์ ํฌ๊ธฐ๋ณด๋ค ๋ ์์์ผ broadcast hash join์ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด ๊ฐ์ `spark.sql.autoBroadcastJoinThreshold` ์์ ์ค์ ๊ฐ๋ฅํ๋ค. (default 10MB)
2. Shuffle Sort Merge Join
์ด๋ฆ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฅผ shuffle ํ๊ณ sort ํด์ merge ํ๋ join ๋ฐฉ์์ด๋ค.
`spark.sql.autoBroadcastJoinThreshold` ๊น์ด -1๋ก ์ค์ ๋์ด ์๋ค๋ฉด ํด๋น ์กฐ์ธ์ ๋จผ์ ์ํํ๋ค.
- Dataset์์ ๋์ผํ key๋ฅผ ๊ฐ์ง ๋ ์ฝ๋๊ฐ ๋์ผ partition์ ์์นํ ์ ์๊ฒ๋ shuffle์ ์ํํ๋ค. (shuffle)
์ด๋ถ๋ถ์ ๋ ๋ฐ์ดํฐ์ ์์ ๊ณตํต๋ "์ ๋ ฌ๋"์ปฌ๋ผ์ด ์ ์ฅ๋ partitioned bucket์ ๋ง๋ค๋ฉด ์๋ต์ด ๊ฐ๋ฅํ๋ค -> ํ์ธํ์ - executor ๋ด๋ถ์์ ๋ ๋ฐ์ดํฐ๋ฅผ key๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌํ๋ค (sort)
- ์ ๋ ฌ๋ key๊ฐ์ ๋๋ฉด์ key๊ฐ ์ผ์นํ๋ row๋ผ๋ฆฌ joinํ๋ค. (merge)
3. Shuffle Hash Join
์ด ์กฐ์ธ ๋ฐฉ๋ฒ์ Broadcastํ์ง ์๋ shuffle hash join์ด๋ค. ์ฆ, ๋ ํ ์ด๋ธ ๋ชจ๋ ์ถฉ๋ถํ ์์ง ์์ ๊ฒฝ์ฐ ์ํ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก shuffle์ ํตํด ๊ฐ์ key๋ฅผ ๊ฐ์ง row๋ฅผ ๋์ผํ executor์ ๋ฐฐ์น์ํจ๋ค. ์ดํ ๊ฐ executor์์ hash join์ ์ํํ๋ค.
sparkSQL ์ตํฐ๋ง์ด์ ๊ฐ ์์์ ์ ์ ํฉํ ์กฐ์ธ ๋ฐฉ๋ฒ์ ์ฐพ์์ฃผ๊ฒ ์ง๋ง ์ฌ์ฉ์๊ฐ ์๊ฐํ๊ธฐ์ Broadcast join์ด ๋ ์ ํฉํ๋ค๊ณ ์๊ฐ๋ ๋์๋ ์๋์ ๊ฐ์ด Dataframe API๋ฅผ ํตํด ์ตํฐ๋ง์ด์ ์๊ฒ ํํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค.
A.join(broadcast(B), some_condition)
์คํํฌ ์กฐ์ธ ์ ๋ต ๊ด๋ จํ์ฌ ์๋์์ ์ ์ค๋ช ๋์ด ์๋ค.
'๋ฐ์ดํฐ > Spark' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spark] ์คํํฌ์ Executor Memory ๊ตฌ์กฐ (0) | 2024.03.23 |
---|---|
[Spark] GraphX (0) | 2024.03.18 |
[Spark] spark์์ s3 ์ ๊ทผํ๊ธฐ (ACCESS_KEY, SECRET_KEY) (0) | 2023.12.19 |
[Spark] s3 ๋ฐ์ดํฐ dataframe์ผ๋ก ๋ก๋ํ๊ธฐ (0) | 2023.06.01 |
[Spark] TaskMemoryManager: Failed to allocate a page (2097152 bytes), try again. ์ค๋ฅ ๋ฐ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2023.05.22 |