Data/Bigdata

Apache Spark란?

안녕하세요 씨앤텍시스템즈입니다.

 

이번 포스팅은 빅데이터 소프트웨어이자 가장 화두인 Apache Spark에 대해서 살펴보겠습니다.

 


 

1. Apache Spark이란?

  Apache Spark는 인-메모리 기반 통합 컴퓨팅 엔진이며, 빅데이터 클러스터 환경에서 데이터를 병렬 처리 할 수 있는 오픈소스 소프트웨어이고 가장 활발하게 개발되고 있습니다.

  Apache Spark는 캘리포니아 대학교 버클리의 AMPLab에서 개발된 스파크의 코드베이스는 나중에 아파치 소프트웨어 재단에 기부되었으며 그 이후로 계속 유지 보수를 해오고 있습니다. 스파크는 암시적 데이터 병렬성과 장애 허용과 더불어 완전한 클러스터를 프로그래밍하기 위한 인터페이스를 제공한다.

                               - https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC

 

 

https://spark.apache.org/

 

Apache Spark™ - Unified Analytics Engine for Big Data

Ease of Use Write applications quickly in Java, Scala, Python, R, and SQL. Spark offers over 80 high-level operators that make it easy to build parallel apps. And you can use it interactively from the Scala, Python, R, and SQL shells.

spark.apache.org

 

2. Apache Spark 환경

<Spark 지원 컴포넌트, https://spark.apache.org/>

  Apache Spark는 다양한 컴포넌트와 라이브러리를 지원하는데, 코어 프로그래밍에서부터 SQL을 지원하는 Spark SQL, 실시간 데이터 처리를 지원하는 Spark Streaming, 여러 머신러닝 기법을 지원하는 Spark MLlib 등 넓은 범위의 라이브러리를 지원합니다. 

 

<Spark가 지원하는 Dats sources, https://spark.apache.org/>

  또한, Apache Spark는 데이터 연결에 대해 다양하게 사용 할 수 있는데, 빅데이터 기술의 시발점이 되었던 Hadoop, NoSQL Database인 HBase&Cassandra, 클라우드 환경과 클러스터 관리를 위한 Mesos 등 각각 구성 환경에 따라 구축 할 수 있도록 지원합니다.

 

<Spark 언어 API, https://databricks.com/blog/2016/06/22/apache-spark-key-terms-explained.html>

  Apache Spark은 Scala 기반으로 개발되어 있는데 Scala 뿐만 아니라, Spark 언어 API를 이용하여 데이터 분석에 가장 많이 사용되고 있는 언어인 R, Python, SQL을 사용하여 Spark를 실행 할 수 있습니다. 이는 Spark가 데이터 분석가, 데이터 엔지니어, 데이터 사이언티스트, 프로그래밍 개발자 등 모두에게 확장 가능하고 유연한 환경을 제공함을 알 수 있습니다. 그리고, 언어별 성능은 Spark 버전이 상향 되면서 상당 부분 개선되어 사용함에 용이해졌습니다.

 

3. Apache Spark RDD

<RDD 구조, https://medium.com/cloudnesil/apache-spark-at-a-glance-7088b9fe5ef5>

  Apache Spark의 기본 데이터 구조는 탄력적 분산 데이터셋이라는 RDD(Resilient Distributed Dataset)로 구성되어 있습니다. 이는 Spark의 핵심 개념인 분산, 내고장성, 인메모리 등을 완벽하게 지원합니다.

  RDD를 다시 말해, 불변성의 병렬 처리가 가능한 파티션 레코드라 부를 수 있습니다. 

 

4. Apache Spark 예제

 

 - WordCount (Python)

text_file = sc.textFile("hdfs://...")
counts = text_file.flatMap(lambda line: line.split(" ")) \
             .map(lambda word: (word, 1)) \
             .reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("hdfs://...")

 - WordCount (Scala)

val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
                 .map(word => (word, 1))
                 .reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")

 - WordCount (Java)

JavaRDD<String> textFile = sc.textFile("hdfs://...");
JavaPairRDD<String, Integer> counts = textFile
    .flatMap(s -> Arrays.asList(s.split(" ")).iterator())
    .mapToPair(word -> new Tuple2<>(word, 1))
    .reduceByKey((a, b) -> a + b);
counts.saveAsTextFile("hdfs://...");

 - SparkR

sparkR.session()
if (nchar(Sys.getenv("SPARK_HOME")) < 1) {
  Sys.setenv(SPARK_HOME = "/home/spark")
}
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))
sparkR.session(master = "local[*]", sparkConfig = list(spark.driver.memory = "2g"))

df <- as.DataFrame(faithful)

# Displays the first part of the SparkDataFrame
head(df)
##  eruptions waiting
##1     3.600      79
##2     1.800      54
##3     3.333      74

people <- read.df("./examples/src/main/resources/people.json", "json")
head(people)
##  age    name
##1  NA Michael
##2  30    Andy
##3  19  Justin

# SparkR automatically infers the schema from the JSON file
printSchema(people)
# root
#  |-- age: long (nullable = true)
#  |-- name: string (nullable = true)

# Similarly, multiple files can be read with read.json
people <- read.json(c("./examples/src/main/resources/people.json", "./examples/src/main/resources/people2.json"))

 


  이번 포스티에서는 빅데이터 소프트웨어 중 가장 활발하게 개발되고 화두인 Apache Spark에 대해서 알아보았으며, 더 자세한 내용은 Apache Spark 홈페이지 및 추후 포스팅을 통해 알아보겠습니다.

 

 

 

감사합니다.

728x90

'Data > Bigdata' 카테고리의 다른 글

Spark DataFrame (PySpark)  (0) 2020.04.20
R을 이용한 Bioinformatics (Bioconductor)  (1) 2020.04.20
Apache Spark 기능  (0) 2020.02.13
Elastic Search란?  (0) 2020.01.20
R을 활용한 빅데이터 처리  (2) 2020.01.02