
"๋ฐ์ดํฐ ํฌ๋งท์ ์๋ชป ์ ํํ๋ฉด, ์ฑ๋ฅ๊ณผ ๋น์ฉ์ด 10๋ฐฐ ์ฐจ์ด๋ฉ๋๋ค."
๋น ๋ฐ์ดํฐ ์์ง๋์ด๋ง์์ ํ์ผ ํฌ๋งท ์ ํ์ ํ์ดํ๋ผ์ธ์ ์ฑํจ๋ฅผ ๊ฐ๋ฆ ๋๋ค.
๋น
๋ฐ์ดํฐ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ ๋จ์ํ CSV๋ JSON์ผ๋ก ์ ์ฅํ๊ธฐ์ ๋๋ฌด ๋ง์ต๋๋ค.
์์ญ TB, ์๋ฐฑ PB์ ๋ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅ ยท ์์ถ ยท ์กฐํํ๊ธฐ ์ํด ํน์ ํ์ผ ํฌ๋งท์ด ๋ฑ์ฅํ์ต๋๋ค.
๋ํ์ ์ธ ๋น
๋ฐ์ดํฐ ํ์ผ ํฌ๋งท์ผ๋ก๋ Parquet, Avro, ORC ๋ฑ์ด ์์ผ๋ฉฐ,
์ด ๊ธ์์๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ ํฌ๋งท์ธ Parquet๊ณผ Avro๋ฅผ ๊น์ด ๋น๊ตํฉ๋๋ค.
โฒ ๋น
๋ฐ์ดํฐ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ์ฃผ์ ํ์ผ ํฌ๋งท ๋น๊ต
Apache Parquet์ ์ปฌ๋ผ ๊ธฐ๋ฐ(Columnar) ์ ์ฅ ๋ฐฉ์์ ์ฌ์ฉํ๋ ํ์ผ ํฌ๋งท์
๋๋ค.
2013๋
Twitter์ Cloudera๊ฐ ๊ณต๋ ๊ฐ๋ฐํ์ผ๋ฉฐ, ํ์ฌ ๋น
๋ฐ์ดํฐ ๋ถ์์ ์ฌ์ค์ ํ์ค ํฌ๋งท์
๋๋ค.
Parquet์ ๋ฐ์ดํฐ๋ฅผ ํ(Row) ๋จ์๊ฐ ์๋ ์ด(Column) ๋จ์๋ก ์ ์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ ํ
์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํ ๋:
| ID | Name | Age | City |
|---|---|---|---|
| 101 | Alice | 25 | New York |
| 102 | Bob | 30 | Chicago |
| 103 | Carol | 28 | Seattle |
Parquet์ด ์ ์ฅํ๋ ๋ฐฉ์:
ID: [101, 102, 103]
Name: [Alice, Bob, Carol]
Age: [25, 30, 28]
City: [New York, Chicago, Seattle]
๊ฐ ์ด์ด ํจ๊ป ์ ์ฅ๋๊ธฐ ๋๋ฌธ์, Age ์ปฌ๋ผ๋ง ํ์ํ ์ฟผ๋ฆฌ๋ ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ์ ํ ์ฝ์ง ์์๋ ๋ฉ๋๋ค.
โฒ Parquet ์ปฌ๋ผ ๊ธฐ๋ฐ ์ ์ฅ ๊ตฌ์กฐ
Apache Avro๋ ํ ๊ธฐ๋ฐ(Row-oriented) ๋ฐ์ดํฐ ์ง๋ ฌํ ํ๋ ์์ํฌ์
๋๋ค.
2009๋
Apache Hadoop ํ๋ก์ ํธ์์ ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ํนํ ์คํธ๋ฆฌ๋ฐ ํ๊ฒฝ์์ ๊ฐ์ ์ ๋ณด์
๋๋ค.
Avro๋ JSON์ผ๋ก ์คํค๋ง๋ฅผ ์ ์ํ๊ณ , ์ค์ ๋ฐ์ดํฐ๋ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ผ๋ก ์ ์ฅํฉ๋๋ค.
์คํค๋ง๊ฐ ๋ฐ์ดํฐ ํ์ผ ํค๋์ ํจ๊ป ์ ์ฅ๋์ด ์๊ธฐ ์์ ์ (Self-describing) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
Avro๊ฐ ์ ์ฅํ๋ ๋ฐฉ์:
[101, Alice, 25, New York]
[102, Bob, 30, Chicago]
[103, Carol, 28, Seattle]
๋ ์ฝ๋ ์ ์ฒด๊ฐ ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋๋ฏ๋ก, ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
โฒ Apache Avro ์ํคํ
์ฒ ๊ตฌ์กฐ
โฒ Apache Kafka + Avro๋ฅผ ํ์ฉํ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
๋ ํฌ๋งท์ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ ์ ์ฅ ๋ฐฉ์์ ์์ต๋๋ค.
โฒ ํ ๊ธฐ๋ฐ(Avro) vs ์ปฌ๋ผ ๊ธฐ๋ฐ(Parquet) ์ ์ฅ ๋ฐฉ์ ๋น๊ต
| ์ ์ฅ ๋ฐฉ์ | ํฌ๋งท | ํน์ง |
|---|---|---|
| Row-based | Avro | ํ ๋ ์ฝ๋์ ๋ชจ๋ ํ๋๊ฐ ํจ๊ป ์ ์ฅ โ ์ฐ๊ธฐ ๋น ๋ฆ |
| Columnar | Parquet | ๊ฐ์ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๊ฐ ํจ๊ป ์ ์ฅ โ ๋ถ์ ์ฟผ๋ฆฌ ๋น ๋ฆ |
๋น์ ๋ก ์ดํดํ๊ธฐ:
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๐ ๋ถ์ ์ฟผ๋ฆฌ ์ฑ๋ฅ | ํ์ํ ์ปฌ๋ผ๋ง ์ฝ์ด I/O๋ฅผ ๋ํญ ์ ๊ฐ |
| ๐พ ์์ถ ํจ์จ | ๋์ผ ํ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ์ฌ ์์ด ์์ถ๋ฅ ํ์ (๋ณดํต CSV ๋๋น 3~10๋ฐฐ) |
| ๐ OLAP ์ต์ ํ | ์ง๊ณ, ํํฐ๋ง, BI ๋์๋ณด๋์ ์ต์ |
| ๐ Predicate Pushdown | ๋ฉํ๋ฐ์ดํฐ๋ก ๋ถํ์ํ ํ์ผ ๋ธ๋ก ์์ ์คํต |
| โ๏ธ ํด๋ผ์ฐ๋ ์นํ์ | AWS Athena, Google BigQuery, Snowflake ๊ธฐ๋ณธ ์ง์ |
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๐ข ์ฐ๊ธฐ ์ฑ๋ฅ ์ ํ | ์ปฌ๋ผ ์ฌ์ ๋ ฌ ์ค๋ฒํค๋๋ก ์ฐ๊ธฐ ์๋ ๋๋ฆผ |
| ๐ ์คํค๋ง ๋ณ๊ฒฝ ๋ณต์ก | ์ปฌ๋ผ ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ์ฃผ์ ํ์ |
| ๐ ์ฌ๋์ด ์ฝ๊ธฐ ๋ถ๊ฐ | ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ผ๋ก ์ง์ ์ด๋ ๋ถ๊ฐ |
| ๐ ์คํธ๋ฆฌ๋ฐ ๋ถ์ ํฉ | ํ ๋จ์ ์คํธ๋ฆฌ๋ฐ์๋ ๋นํจ์จ์ |
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| โก ๋น ๋ฅธ ์ฐ๊ธฐ ์ฑ๋ฅ | ํ์ ์์ฐจ ์ถ๊ฐํ๋ฏ๋ก ์ฐ๊ธฐ/์ง๋ ฌํ ์ด๊ณ ์ |
| ๐ ์คํค๋ง ์งํ | ํ๋ ์ถ๊ฐ/์ญ์ ํด๋ ํ์ ํธํ์ฑ ์ ์ง |
| ๐ ์คํธ๋ฆฌ๋ฐ ํ์ค | Apache Kafka์ ์ฌ์ค์ ํ์ค ์ง๋ ฌํ ํฌ๋งท |
| ๐ฆ ์๊ธฐ ์์ ์ | ์คํค๋ง๊ฐ ๋ฐ์ดํฐ ๋ด๋ถ์ ํฌํจ๋์ด ์ด์์ฑ ํ์ |
| ๐ ๋ค์ธ์ด ์ง์ | Java, Python, C++ ๋ฑ ๋ค์ํ ์ธ์ด ํด๋ผ์ด์ธํธ |
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๐ ๋ถ์ ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ ํ | ์ ์ฒด ํ์ ์ฝ์ด์ผ ํ๋ฏ๋ก ํน์ ์ปฌ๋ผ ์กฐํ ๋๋ฆผ |
| ๐พ ์์ถ ํจ์จ ์๋์ ๋ฎ์ | Parquet ๋๋น ํ์ผ ํฌ๊ธฐ ํผ |
| ๐ ์ฟผ๋ฆฌ ์ต์ ํ ์ ํ | Predicate Pushdown ๋ฑ ๊ณ ๊ธ ์ต์ ํ ์ด๋ ค์ |
| ๐ ์ฌ๋์ด ์ฝ๊ธฐ ๋ถ๊ฐ | ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ด๋๋ฆฌ ํฌ๋งท |
โฒ Parquet vs Avro ํต์ฌ ๋น๊ต
| ๋น๊ต ํญ๋ชฉ | Apache Avro | Apache Parquet |
|---|---|---|
| ์ ์ฅ ๋ฐฉ์ | ํ ๊ธฐ๋ฐ (Row-oriented) | ์ปฌ๋ผ ๊ธฐ๋ฐ (Columnar) |
| ํ์ผ ํ์ฅ์ | .avro | .parquet |
| ์ต์ ์ฉ๋ | ์คํธ๋ฆฌ๋ฐ, ์ด๋ฒคํธ, ์คํค๋ง ์งํ | ๋ถ์ ์ฟผ๋ฆฌ, ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค |
| ์คํค๋ง ์งํ | โญโญโญ ํ์ | โญโญ ์ ํ์ |
| ์์ถ ํจ์จ | โญโญ ๋ณดํต | โญโญโญ ํ์ |
| ์ฝ๊ธฐ ์ฑ๋ฅ | โญโญ (์ ์ฒด ํ ์ฝ๊ธฐ) | โญโญโญ (์ปฌ๋ผ ์ ํ ์ฝ๊ธฐ) |
| ์ฐ๊ธฐ ์ฑ๋ฅ | โญโญโญ ๋น ๋ฆ | โญโญ ๋๋ฆผ |
| ์ฟผ๋ฆฌ ์ต์ ํ | โญ ์ ํ์ | โญโญโญ ํ์ |
| ํ์ผ ํฌ๊ธฐ | ์๋์ ์ผ๋ก ํผ | ์๋์ ์ผ๋ก ์์ |
| ์ค์ฒฉ ๋ฐ์ดํฐ | JSON ์คํค๋ง ๊ธฐ๋ฐ | Dremel ์ธ์ฝ๋ฉ ์ต์ ํ |
| ์ฃผ์ ํ๋ซํผ | Kafka, Hadoop, Spark | Spark, Hive, Presto, Snowflake |
| ์ฃผ์ ์ํ๊ณ | ์คํธ๋ฆฌ๋ฐ, ๋ก๊ทธ, ์ด์ ์์คํ | ๋ฐ์ดํฐ ๋ ์ดํฌ, BI, ๋ฐฐ์น ๋ถ์ |
โ
Apache Kafka๋ก ์ค์๊ฐ ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ์ ํ๋ค
โ
์คํค๋ง๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ณ ํ์ ํธํ์ฑ์ด ์ค์ํ๋ค
โ
์ฐ๊ธฐ(Write) ์์
์ด ์๋์ ์ผ๋ก ๋ง๋ค
โ
์๋ก ๋ค๋ฅธ ์์คํ
๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ตํํด์ผ ํ๋ค
โ
๋ก๊ทธ ์์ง, IoT ์ผ์ ๋ฐ์ดํฐ, ์ด๋ฒคํธ ์์ง์ ํ๋ค
โ
๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ๋ฐ์ดํฐ ์ง๋ ฌํ๊ฐ ํ์ํ๋ค
โ
๋ฐ์ดํฐ ๋ถ์, BI ๋์๋ณด๋, OLAP ์ฟผ๋ฆฌ๊ฐ ์ฃผ ๋ชฉ์ ์ด๋ค
โ
AWS Athena, BigQuery, Snowflake์์ ์ฟผ๋ฆฌํ๋ค
โ
๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ ์ ๋น์ฉ์ผ๋ก ์ ์ฅํ๊ณ ์ถ๋ค
โ
์ฝ๊ธฐ(Read) ์์
์ด ์ฐ๊ธฐ๋ณด๋ค ํจ์ฌ ๋ง๋ค
โ
Apache Spark๋ก ๋ฐฐ์น ๋ถ์์ ์ํํ๋ค
โ
ํน์ ์ปฌ๋ผ๋ง ์ ํํด์ ์ฟผ๋ฆฌํ๋ ํจํด์ด ๋ง๋ค
์ค์ ํ์ ์์๋ ๋ ํฌ๋งท์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ ๋๋ค.
[์ค์๊ฐ ์ด๋ฒคํธ ์์ง] [๋ฐฐ์น ๋ถ์]
Producer โ Kafka(Avro) โ ETL โ Data Lake(Parquet) โ BI ๋๊ตฌ
| ETL ๋จ๊ณ | ๊ถ์ฅ ํฌ๋งท | ์ด์ |
|---|---|---|
| ๋ฐ์ดํฐ ์์ง (Ingestion) | โ Avro | ์ค์๊ฐ Kafka ์คํธ๋ฆฌ๋ฐ, ๋น ๋ฅธ ์ฐ๊ธฐ |
| ์ค๊ฐ ์ฒ๋ฆฌ (Processing) | โ Avro | ์คํค๋ง ์งํ ์ ์ฐ์ฑ ํ๋ณด |
| ์ต์ข ์ ์ฅ (Analytics) | โ Parquet | ๋น ๋ฅธ ์ฟผ๋ฆฌ, ๋์ ์์ถ๋ฅ |
๐ก ์ค์ ํ: Kafka์์ Avro๋ก ์์ง โ Spark๋ก ๋ณํ โ Parquet์ผ๋ก Data Lake ์ ์ฅ.
์ด ํจํด์ด AWS, GCP, Azure ๋ชจ๋์์ ์ฌ์ค์ ํ์ค ์ํคํ ์ฒ์ ๋๋ค.
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("AvroExample").getOrCreate()
# Avro ํ์ผ ์ฝ๊ธฐ
df = spark.read.format("avro").load("data.avro")
df.show()
# DataFrame์ Avro๋ก ์ ์ฅ
df.write.format("avro").save("output.avro")
# Parquet ํ์ผ ์ฝ๊ธฐ
df = spark.read.parquet("data.parquet")
df.show()
# DataFrame์ Parquet์ผ๋ก ์ ์ฅ
df.write.mode("overwrite").parquet("output.parquet")
โ๏ธ Spark์์ Parquet์ ๊ธฐ๋ณธ(default) ์ ์ฅ ํฌ๋งท์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
| Avro | Parquet | |
|---|---|---|
| ํ ์ค ์์ฝ | ์คํธ๋ฆฌ๋ฐยท์งํํ๋ ์คํค๋ง์ ์ | ๋ถ์ยท์์ถ ํจ์จ์ ์ |
| ํต์ฌ ํค์๋ | ์ง๋ ฌํ, ์คํธ๋ฆฌ๋ฐ, ์ ์ฐ์ฑ | ์ปฌ๋ผ ์ค์บ, ์์ถ, ๋ถ์ ์ฑ๋ฅ |
๋ ํฌ๋งท์ ๊ฒฝ์ ๊ด๊ณ๊ฐ ์๋๋ผ ์ํธ ๋ณด์์ ์ธ ๊ด๊ณ์
๋๋ค.
๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์์ ์์ง ๋จ๊ณ์ Avro, ๋ถ์ ๋จ๊ณ์ Parquet์ ์ฌ์ฉํ๋ ๊ฒ์ด
ํ์
๋ฐ์ดํฐ ์์ง๋์ด๋ค์ด ์ ํํ ๊ฐ์ฅ ๊ฒ์ฆ๋ ์ํคํ
์ฒ์
๋๋ค.
"์ ๋ต์ ํ๋๊ฐ ์๋๋ค. ์ํฌ๋ก๋์ ๋ง๋ ํฌ๋งท์ ์ ํํ๋ผ."