ML/MLOps Engineer
Apache Spark RDD(Resilient Distributed Dataset)

Apache Spark์˜ RDD(Resilient Distributed Dataset)๋Š” Spark์˜ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”๋กœ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ถˆ๋ณ€์„ฑ(immutable) ๋ฐ ๋ถ„์‚ฐ(distributed) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. RDD๋Š” ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

RDD์˜ ์ฃผ์š” ํŠน์ง•

  1. Resilient (ํƒ„๋ ฅ์„ฑ)
    • RDD๋Š” ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ™˜ ๋‚ด์—ญ(๊ณ„๋ณด, lineage)์„ ์ €์žฅํ•˜๋ฉฐ, ์ผ๋ถ€ ํŒŒํ‹ฐ์…˜์ด ์†์‹ค๋˜๋”๋ผ๋„ lineage๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Distributed (๋ถ„์‚ฐ)
    • RDD๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๊ฑธ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณ„์‚ฐ์„ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ํŒŒํ‹ฐ์…˜์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์›Œ์ปค ๋…ธ๋“œ์— ๋ถ„์‚ฐ๋˜์–ด ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰.
  3. Immutable (๋ถˆ๋ณ€์„ฑ)
    • RDD๋Š” ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์€ ์ƒˆ๋กœ์šด RDD๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ด๊ณ  ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. Lazy Evaluation (์ง€์—ฐ ํ‰๊ฐ€)
    • RDD ๋ณ€ํ™˜(transformations)์€ ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ์‹คํ–‰์ด ํ•„์š”ํ•  ๋•Œ(์˜ˆ: ์•ก์…˜ ์ˆ˜ํ–‰ ์‹œ) ์—ฐ์‚ฐ์ด ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์‹คํ–‰ ๊ณ„ํš(DAG: Directed Acyclic Graph)์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  5. In-Memory Computing (๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ)
    • RDD๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ I/O ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
    • ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ๋„ ์ง€์›.

RDD์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  1. ๋ฐ์ดํ„ฐ ๋ถ„ํ•  (Partitions)
    • RDD๋Š” ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„๋ฆฌ๋˜๋ฉฐ, ๊ฐ ํŒŒํ‹ฐ์…˜์€ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ณ€ํ™˜(Transformations)
    • RDD์—์„œ ์ƒˆ๋กœ์šด RDD๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ, Lazy Evaluation์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
    • ์˜ˆ: map, filter, flatMap, distinct, groupByKey, reduceByKey.
  3. ์•ก์…˜(Actions)
    • ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ, ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: collect, count, reduce, saveAsTextFile, foreach.
  4. ๊ณ„๋ณด(Lineage)
    • RDD๊ฐ€ ์ƒ์„ฑ๋œ ๋ณ€ํ™˜ ๋‚ด์—ญ์„ ์ถ”์ ํ•˜์—ฌ ์žฅ์•  ์‹œ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ์— ์‚ฌ์šฉ.

RDD ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  1. ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๋กœ๋“œ
    • ํŒŒ์ผ ์‹œ์Šคํ…œ, HDFS, Cassandra, HBase ๋“ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์ƒ์„ฑ.
      rdd = spark.sparkContext.textFile("hdfs://path/to/file")
  2. ์ปฌ๋ ‰์…˜์—์„œ ๋ณ€ํ™˜
    • ๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜์„ ๋ณ‘๋ ฌํ™”ํ•˜์—ฌ ์ƒ์„ฑ.
      rdd = spark.sparkContext.parallelize([1, 2, 3, 4])
  3. ๋ณ€ํ™˜์„ ํ†ตํ•œ ์ƒ์„ฑ
    • ๊ธฐ์กด RDD์— ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด RDD ์ƒ์„ฑ.
      rdd2 = rdd.map(lambda x: x * 2)

RDD์˜ Transformations ์˜ˆ์‹œ

์—ฐ์‚ฐ ์„ค๋ช… ์˜ˆ์‹œ
map ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์ ์šฉ rdd.map(lambda x: x * 2)
filter ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋งŒ ์„ ํƒ rdd.filter(lambda x: x > 10)
flatMap ๊ฐ ์ž…๋ ฅ ์š”์†Œ๋ฅผ ์—ฌ๋Ÿฌ ์ถœ๋ ฅ ์š”์†Œ๋กœ ๋งคํ•‘ rdd.flatMap(lambda x: x.split(" "))
distinct ์ค‘๋ณต์„ ์ œ๊ฑฐ rdd.distinct()
reduceByKey ๋™์ผ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋“ค์„ ์ง€์ •๋œ ํ•จ์ˆ˜๋กœ ๋ณ‘ํ•ฉ rdd.reduceByKey(lambda x, y: x + y)
join ๋‘ RDD๋ฅผ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐ์ธ rdd1.join(rdd2)

RDD์˜ Actions ์˜ˆ์‹œ

์—ฐ์‚ฐ ์„ค๋ช… ์˜ˆ์‹œ
collect ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋“œ๋ผ์ด๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฐ˜ํ™˜ rdd.collect()
count RDD์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ rdd.count()
reduce ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด RDD์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ณ‘ํ•ฉ rdd.reduce(lambda x, y: x + y)
take ์ƒ์œ„ N๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ rdd.take(10)
saveAsTextFile ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ์ €์žฅ rdd.saveAsTextFile("output/path")

RDD์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  1. ์œ ์—ฐ์„ฑ: ๋ฐ์ดํ„ฐ์˜ ๋‹ค์–‘ํ•œ ๋ณ€ํ™˜ ๋ฐ ์•ก์…˜ ์ง€์›.
  2. ํ™•์žฅ์„ฑ: ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ.
  3. ์žฅ์•  ๋ณต๊ตฌ: ๊ณ„๋ณด๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๊ฐ€๋Šฅ.

๋‹จ์ 

  1. ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰: ํฐ ๋ฐ์ดํ„ฐ์…‹์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ํผ.
  2. ๋ณต์žก์„ฑ: ๊ณ ์ˆ˜์ค€ API(DataFrame, Dataset)์— ๋น„ํ•ด ์‚ฌ์šฉ๋ฒ•์ด ๋ณต์žก.
  3. ์ตœ์ ํ™” ํ•œ๊ณ„: DataFrame/Dataset์— ๋น„ํ•ด ์‹คํ–‰ ์ตœ์ ํ™”๊ฐ€ ์ œํ•œ์ .

RDD์™€ DataFrame/Dataset์˜ ๋น„๊ต

ํŠน์ง• RDD DataFrame Dataset
๋ฐ์ดํ„ฐ ์ถ”์ƒํ™” ์ˆ˜์ค€ ์ €์ˆ˜์ค€ (Row-by-Row ์—ฐ์‚ฐ) ๊ณ ์ˆ˜์ค€ (์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜) ๊ณ ์ˆ˜์ค€ (์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜ + ํƒ€์ž… ์„ธ์ดํ”„)
์ตœ์ ํ™” ์ œํ•œ์  (RDD ๊ณ„๋ณด ์‚ฌ์šฉ) Catalyst Optimizer ์‚ฌ์šฉ Catalyst Optimizer ์‚ฌ์šฉ
์œ ํ˜• Java/Python ๊ฐ์ฒด Row ๊ฐ์ฒด ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด
ํผํฌ๋จผ์Šค ๋Š๋ฆผ ๋น ๋ฆ„ ๋น ๋ฆ„