Big Data

Colab + Spark 활용한 간단한 예제

개발기록자 2023. 6. 5.

Colab + Spark

이번 글에서는 앞에서 작성한 Apache Spark에 대한 예제로 Colab 환경에서 Spark를 설치하여 간단한 예제를 해보겠습니다. Colab을 활용하면 개인 컴퓨터에 별도의 Spark 설치 없이도 편리하게 Spark를 사용할 수 있습니다. 우선 Colab에서 Spark를 설치하고 필요한 환경 설정을 완료한 후, 구글 드라이브에 있는 데이터를 활용하여 데이터 빈도 분석을 해보겠습니다.


Colab(코랩)이란

코랩(Google Colab, Colaboratory)은 클라우드 기반의 Jupyter Notebook 환경으로 웹 브라우저에서 Python 코드를 작성하고 실행, 결과 확인을 할 수 있습니다. 무료로 제공되며 GPU 및 TPU를 활용하여 데이터 처리, 머신 러닝, 딥러닝 등 작업을 수행할 수 있습니다.


Colab + Spark 환경 설정

우선 코랩에 스파크 개발 환경을 설정해 보겠습니다. 코랩을 사용하기 위해서는 구글 계정이 필요하며, 코랩 페이지에 접속하여 새 노트를 생성합니다. 스파크는 최신버전으로 사용할 예정이며, 아래 페이지를 참고해서 원하는 버전을 선택하시면 되겠습니다.

Colab - https://colab.research.google.com/

Apach Spark = https://spark.apache.org/downloads.html

 

1. openjdk8 설치

!apt-get install openjdk-8-jdk-headless

 

2. spark3.4 tar 다운로드

!wget -q https://dlcdn.apache.org/spark/spark-3.4.0/spark-3.4.0-bin-hadoop3.tgz

 

3. 압축 풀기

!tar -xvf spark-3.4.0-bin-hadoop3.tgz

 

4. 환경변수 설정

import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-3.4.0-bin-hadoop3"

 

5. findspark 설치

환경변수를 설정했지만 pyspark의 import 에러 이슈로 findspark를 설치합니다.

!pip install findspark

 

6. findspark 초기화

import findspark
findspark.init()

 

7. pyspark 버전 확인

import pyspark
spark_version = pyspark.__version__
print("Apache Spark 버전 확인: " + spark_version)

# 3.4.0

Spark를 이용한 예제

'일자/카테고리 별 키워드 순위'라는 직접 생성한 데이터를 구글 드라이브에 업로드하여 간단한 예제를 해보겠습니다. 키워드별로 정확한 수치가 아닌 순위만 존재하기 때문에 순위를 이용해 키워드에 대한 빈도를 확인해 보겠습니다.

특정 월/카테고리의 상위 10위 이내 키워드에 대한 빈도

 

Spark 예제 데이터

 

1. SparkSession 생성

from pyspark.sql import SparkSession

# SparkSession 생성
spark = SparkSession.builder\
                    .master('local[*]')\
                    .appName('Colab-Spark-Test')\
                    .getOrCreate();

 

2. 구글 드라이브 연결

구글에 있는 파일을 이용하기 위해 구글 드라이브를 마운트 합니다.

from google.colab import drive

drive.mount('/content/drive')

 

3. 데이터 읽기

from pyspark.sql.types import StructType, StructField
from pyspark.sql.types import StringType, IntegerType

# schema - keyword
schema1 = StructType([\
    StructField("dt", StringType()),\
    StructField("code", StringType()),\
    StructField("rank", StringType()),\
    StructField("keyword", StringType()),\
    StructField("linkId", StringType())  
])

# txt 파일을 dataframe으로 읽기 - keyword
keyword_df = spark.read.csv("/content/drive/MyDrive/data/result.txt", header=False, schema=schema1)

# rank 컬럼의 데이터 타입 변환
keyword_df = keyword_df.withColumn("rank", keyword_df["rank"].cast(IntegerType()))


# schema - category
schema2 = StructType([\
    StructField("category", StringType()),\
    StructField("code", StringType()),\
])

# txt 파일을 dataframe으로 읽기 - category
category_df = spark.read.csv("/content/drive/MyDrive/data/category_code.txt", header=False, schema=schema2)

 

4. 데이터 확인 및 스키마 구조 확인

keyword_df.show(10)
keyword_df.printSchema()
print(keyword_df.count())

category_df.show(10)
category_df.printSchema()
print(category_df.count())

 

데이터 및 스키마 구조 확인

 

5. 특정 카테고리/월에 대한 키워드 빈도 계산

join을 이용하여 2개의 dataframe을 조인할 수 있습니다.(필요한 작업은 아니라 생략)

from pyspark.sql.functions import lit, col

# code를 이용해 조인
# join_df = keyword_df.join(category_df, keyword_df["code"] == category_df["code"], 'inner').select("dt", keyword_df["code"], "category", "rank", "keyword")

# 특정 카테고리 선택
selected_code = "50000003"
# 카테고리명
selected_category = result.filter(col("code") == selected_code).select('category').first()[0]

# 특정 월 선택
selected_month = "202205"

# 선택한 카테고리와 월에 해당하는 10위 이내 데이터 필터링
filtered_df = result.filter((col("code") == selected_code) & (col("dt").startswith(selected_month)) & (col('rank') <= 10))

# 월별 키워드 빈도 계산
monthly_counts = filtered_df.groupBy("keyword").count()

# 결과 확인
monthly_counts.orderBy(col("count").desc()).show(10)

생성한 결과 데이터 확인

 

6. 결과를 WordCloud로 표현

WordCloud를 이용해 빈도에 따른 키워드를 표현합니다. 한글의 경우 폰트 문제로 글자가 깨질 수 있으니 별도의 설정이 필요합니다.

from wordcloud import WordCloud
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt

wordcloud_data = {row["keyword"]: row["count"] for row in monthly_counts.collect()}
wordcloud = WordCloud(width=1200, height=800, background_color="#ffffff").generate_from_frequencies(wordcloud_data)

plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.title(f"Keyword Word Cloud - {selected_category} - {selected_month}")
plt.show()

결과 데이터를 이용한 WordCloud


함께 보면 좋은 글

 

Apache Spark란?

Spark(스파크)란? 스파크는 대규모 데이터 처리 및 분석을 위한 오픈소스 클러스터 컴퓨팅 프레임워크입니다. 스파크는 데이터를 분산 처리하고, 인메모리 방식을 사용하여 효율적이고 빠른 처리

dev-records.tistory.com

 

'Big Data' 카테고리의 다른 글

Data Lake와 Data Warehouse, Data Mart 개념과 비교  (0) 2023.06.16
Apache Kafka(카프카) 기본개념  (2) 2023.06.09
Apache Spark란?  (0) 2023.06.02
Hadoop YARN이란 무엇인가?  (0) 2023.05.27
HDFS와 MapReduce에 대해  (0) 2023.05.25

댓글