[Kafka] 빅데이터 플랫폼: hadoop, spark, kafka의 역할과 데이터 아키텍쳐
데이터 플랫폼은 대용량 데이터를 수집, 저장, 처리, 분석할 수 있는 통합 플랫폼을 의미한다.
이를 위해 다양한 기술과 솔루션이 활용될 수 있으며, 하둡, 스파크, 카프카는
데이터 플랫폼 구성에서 가장 많이 사용되는 기술 중 하나이다.
하둡은 대규모 데이터를 분산 처리할 수 있는 분산 파일 시스템(HDFS)과
분산 컴퓨팅 프레임워크(MapReduce)를 제공한다.
스파크는 하둡 기반의 분산 처리 엔진으로,
메모리 기반의 빠른 처리 속도와 다양한 데이터 소스 지원 등을 특징으로 한다.
카프카는 대용량 실시간 데이터 스트리밍 플랫폼으로, 다양한 소스로부터 데이터를 수집하고,
다양한 대상에 데이터를 전송할 수 있다.
이러한 기술들이 데이터 플랫폼 구성에서 주요한 역할을 하고 있다.
여기서 관계형데이터베이스와 하둡의 차이에 대해 궁금할 것이다.
RDBMS(Relational Database Management System)와 하둡은 데이터를 처리하는 방식이 매우 다르다.
RDBMS는 데이터를 테이블 형태로 저장하고, SQL(Structured Query Language)을 이용하여
데이터를 검색, 조작한다. 대표적인 RDBMS 제품으로는 Oracle, MySQL, SQL Server 등이 있다.
RDBMS는 일반적으로 정형 데이터(Structured Data)를 다루며, 데이터 크기가 작을 때 가장 효율적인 방법이다.
또한 ACID(원자성, 일관성, 격리성, 지속성)를 보장하여 데이터의 정합성을 유지한다.
반면에, 하둡은 대용량의 비정형 데이터(Unstructured Data)를 다루는 데 특화되어 있다.
하둡은 대용량 데이터를 분산 저장하고, 분산 처리할 수 있는 분산 파일 시스템(HDFS)과
분산 컴퓨팅 프레임워크(MapReduce)를 이용하여 데이터를 처리한다.
하둡은 수많은 컴퓨터를 활용하여 데이터를 처리하므로,
데이터 크기가 매우 크거나 처리 시간이 오래 걸리는 작업에 적합하다.
또한, 하둡은 비정형 데이터를 다루기 때문에 스키마가 고정되어 있지 않아,
데이터의 형태나 구조가 바뀌어도 처리할 수 있습니다. 하지만, ACID를 보장하지 않으며, 실시간 처리에 적합하지 않는다.
따라서, RDBMS와 하둡은 각각 다른 데이터 처리 방식과 장단점을 가지고 있으며,
데이터의 종류와 처리 방식에 따라 적절한 기술을 선택하여 사용해야 한다.
RDBMS mysql 예제
-- MySQL에서 customers 테이블 생성 및 데이터 추가
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50),
age INT
);
INSERT INTO customers VALUES (1, 'John Smith', 'john@example.com', 30);
INSERT INTO customers VALUES (2, 'Jane Doe', 'jane@example.com', 25);
INSERT INTO customers VALUES (3, 'Bob Johnson', 'bob@example.com', 40);
-- MySQL에서 customers 테이블에서 데이터 검색
SELECT * FROM customers WHERE age > 30;
하둡 예제
from pyspark.sql import SparkSession
# SparkSession 객체 생성
spark = SparkSession.builder.appName("Example").getOrCreate()
# HDFS에서 데이터를 읽어와서 DataFrame 생성
data = spark.read.csv("/path/to/data.csv", header=True, inferSchema=True)
# DataFrame에서 필요한 컬럼만 선택하여 새로운 DataFrame 생성
new_data = data.select("column1", "column2", "column3")
# 새로운 DataFrame을 다시 HDFS에 저장
new_data.write.csv("/path/to/new_data.csv", header=True)
Spark를 사용하여 HDFS에서 데이터를 읽어와서 필요한 컬럼만 선택하여
새로운 DataFrame을 생성하고, 이를 다시 HDFS에 저장하는 과정을 보여준다.
Spark는 하둡의 분산 처리 기능을 활용하여 대용량 데이터를 처리하는 데 특화된 프레임워크 중 하나이다.
이제 간단한 예제 코드를 통해 하둡과 스파크, 카프카의 역할을 살펴보겠다.
하둡 예제 코드:
맵리듀스를 이용해 간단한 워드 카운트를 수행
from mrjob.job import MRJob
class WordCount(MRJob):
def mapper(self, _, line):
for word in line.split():
yield word, 1
def reducer(self, word, counts):
yield word, sum(counts)
if __name__ == '__main__':
WordCount.run()
스파크 예제 코드:
스파크를 이용해 워드 카운트를 수행 스파크는 데이터를 RDD(Resilient Distributed Datasets) 형태로
처리하여 RDD를 이용해 데이터를 처리하고, reduceByKey() 함수를 이용해 단어별로 카운트를 한다.
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("WordCount").getOrCreate()
lines = spark.read.text("input.txt").rdd.map(lambda r: r[0])
counts = lines.flatMap(lambda word: word.split(' ')).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("output")
카프카 예제 코드:
from kafka import KafkaProducer
import time
producer = KafkaProducer(bootstrap_servers='localhost:9092')
for i in range(10):
message = "message {}".format(i)
producer.send('test_topic', message.encode())
time.sleep(1)
위 코드는 카프카를 이용해 토픽에 메시지를 보내는 예제이다.
KafkaProducer를 이용해 토픽에 메시지를 보낸다.
이렇게 하둡, 스파크, 카프카는 대용량 데이터를 안정적으로 처리하고 분석에 중요하다.
하둡을 사용할 때 주의해야할 점
하둡에서 데이터를 처리할 때 발생할 수 있는 문제 중 하나는
블록 크기가 너무 작아서 I/O 성능이 저하되는 경우이다.
이 문제를 해결하기 위해서는 블록 크기를 늘리거나 블록 사이즈와 데이터 크기를 맞춰야 한다.
예를 들어, 1GB 크기의 파일을 처리하는데 블록 크기를 64MB로 설정한 경우,
데이터를 처리할 때 블록 간 이동이 빈번하게 일어나 I/O 성능이 저하된다.
이 경우에는 블록 크기를 128MB로 늘리거나, 1GB에 맞게 블록 크기를 조절하여 I/O 성능을 개선할 수 있다.
블록 크기를 설정하는 방법은
hadoop fs -Ddfs.block.size=128M -put inputfile.txt /user/hadoop/input/
위 명령어에서 **-Ddfs.block.size=128M**은 블록 크기를 128MB로 설정하고,
**inputfile.txt**를 /user/hadoop/input/ 디렉토리에 저장하는 명령어이다.