빅데이터 개념 부터 시작해서 빅데이터 분석 플랫폼의 출현(hadoop)과 스파크의 등장배경까지 풀어서 작성된 spark 소개 자료 입니다.
스파크는 RDD에 대한 개념과 spark SQL 라이브러리에 대한 자료가 조금 자세히 설명 되어있습니다. (텅스텐엔진, 카탈리스트 옵티마이져에 대한 간략한 설명이 있습니다.)
마지막에는 간단한 설치 및 interactive 분석 실습자료가 포함되어 있습니다.
원본 ppt 를 공개해 두었으니 언제 어디서든 필요에 따라 변형하여 사용하시되 출처만 잘 남겨주시면 감사드리겠습니다.
다른 슬라이드나, 블로그에서 사용된 그림과 참고한 자료들은 작게 출처를 표시해두었는데, 본 ppt의 초기버전을 작성하면서 찾았던 일부 자료들은 출처가 불분명한 상태입니다. 자료 출처를 알려주시면 반영하여 수정해 두도록하겠습니다. (제보 부탁드립니다!)
5. 빅데이터란?
– A bunch of data?
– An industry?
– An expertise?
– A trend?
– A cliche?
2016-12-22 5
6. 빅데이터란?
• 정의
– 빅데이터(big data)란 기존 데이터베이스 관리도구로 데이터를 수
집, 저장, 관리, 분석할 수 있는 역량을 넘어서는 대량의 정형 또는
비정형 데이터 집합 및 이러한 데이터(를 저장하고 이)로부터 가치
를 추출하고 결과를 분석하는 기술을 의미한다.
• 특징
– 3V (Volume + Velocity + Variety)
Source: https://ko.wikipedia.org/wiki/%EB%B9%85_%EB%8D%B0%EC%9D%B4%ED%84%B0
2016-12-22 6
7. 빅데이터의 활용
– 유저 행동 분석
– 트렌드 토픽 추적
– 유저-토픽 모델링
– 타게팅 광고
– 추천시스템
– AB-테스트 분석
– And more...
2016-12-22 7
사실 제일 중요한 파트
8. computer
빅데이터 이전의 데이터 처리
• Word Counting Example
– 1 computer
– Input file 준비(1KB ~ 10GB)
– 프로그램 코딩 & 실행( C++, Java, python, …)
– Output 보기
wordCount Program
(java, c++, python, … )
Input
file
Output
file
Input File
A Apple is red.
A Banana is yellow.
A Cat is cute.
…
Output File
A 3
Apple 1
is 3
…
처리해야 할 데이터의
양이 많아져도
속도와 정확성이
보장 될까?
2016-12-22 8
11. How big is big?
– 2008: Google processes 20 PB a day
– 2009: Facebook has 2.5 PB user data + 15 TB/day
– 2009: eBay has 6.5 PB user data + 50 TB/day
– 2011: Yahoo! has 180-200 PB of data
– 2012: Facebook ingests 500 TB/day
2016-12-22 11
12. Scale out의 필요성
• Scale up의 한계
– 데이터 크기의 문제
• Terabytes, Petabytes 데이터의 저장 및 관리
– 데이터 처리의 문제
• multiprocessing의 한계
– 비용의 문제
이미지 출처 : http://blog.naver.com/islove8587/220548900044
2016-12-22 12
14. Apache Hadoop
• 2005년, Doug Cutting과 Mike Cafarella in Yahoo!
• “the Nutch search engine”의 서브프로젝트로 시작
– HDFS - 2003 – Google File System
– MapReduce - 2004 – MapReduce : Simplified Data Processing
on Large Clusters
Source: https://en.wikipedia.org/wiki/Apache_Hadoop
2016-12-22 14
15. Apache Hadoop
• Apache software foundation의 최상위 프로젝트
• open-source software for reliable, scalable, distributed
computing.
• 2016. 8. 25 stable release 2.7.3
• 2016. 9. 03 alpha1 release 3.0.0
• 2013년, Hadoop 2 발표
– HDFS module의 비약적인 향상
– YARN 의 등장
• 2016년 9월, Hadoop 3 발표
– HDFS 저장 효율 증가
– Multiple Stanby Namenode, heap 튜닝 기능
– MapReduce 성능 향상
http://hadoop.apache.org/
2016-12-22 15
16. Hadoop 모듈
• Hadoop Common
– Hadoop 실행 시 다른 모듈들을 지원하기 위한 공통 유틸들
• Hadoop Distributed File System (HDFS™)
– high-throughput을 보장하는 분산 파일 시스템
• Hadoop MapReduce
– 대용량의 병렬 데이터를 배치 연산할 수 있게 해주는 모듈
• Hadoop YARN
– 클러스터의 자원관리 및 스케쥴링을 담당하는 프레임워크
– 2013 - Apache Hadoop YARN: Yet Another Resource Negotiator
2016-12-22 16
http://hortonworks.com/hadoop/yarn/
19. 빅데이터 분석 시스템 구축
lambda-architecture
http://lambda-architecture.net
2016-12-22 19
20. 빅데이터 분석 시스템 구축 – spark 이전
• 분석할 데이터의 특성에 따라 사용 가능한 플랫폼이 다름
– 배치처리 분석을 위해서는 hadoop 사용
– 스트림 데이터 분석에서는 storm 사용
• 결과분석 등의 추가 작업을 위해서는 Third party package들과의
연동이 필요함
– Hbase 등의 NoSQL DB와의 연동을 통해 데이터를 관리
– Hive, mahout 등의 추가 package를 통해서 SQL분석, ML 이 가능
2016-12-22 20
익숙해져야 할 인터페이스가 너무 많고 복잡하네...
21. Hadoop의 데이터 처리
• Word Counting Example
– Computer cluster
– Input File
– Hadoop MR application
• Map/Reduce function
– Output File(hdfs)
Computing Node
read Write
Write
read
Map function
Reduce function
2016-12-22 21
22. Hadoop의 데이터 처리
• DISK 기반 데이터 처리의 문제점
– 데이터 처리 시간 외에도 read/write 연산에 추가 시간 소요
– 반복 쿼리 작업 수행 시 중간 결과물도 DISK에 read/write 반복
• Iteration 작업에 적합하지 않음
– 동일 Data에 대해서 작업할 때, 매번 Read 연산이 필요
DISK 기반 데이터 처리
2016-12-22 22
Hadoop의 disk 기반 데이터 처리는 효율이 떨어지네..
24. 인메모리 기반의 데이터 프로세싱
• Spark 이전에는 RAM 기반으로 분산처리 해보려는 시도가 없었을까?
• Piccolo(Ram 기반)의 데이터 프로세싱
– Fine-grained update 지원
• (ex> DBMS에서 table의 특정 element만 update 하는 것과 유사)
– Fault-tolerance가 성능을 저하
• RAM 상의 데이터 셋이 망가짐을 대비해 replicating
• replicating만으로는 불안하므로 disk에 checkpointing
• replicating 하는 동안 연산을 멈춰야하며, checkpointing 시에는 더욱 시간이 오래 걸림
• 뭔가 부족한 느낌..
• Hadoop(Disk 기반)의 데이터 프로세싱
– Fine-grained update 지원하지 않음
• file to file로의 변경만 지원하며 변경된 파일을 새로 씀
• Modify가 불가능한 파일 시스템
• (ex> DBMS 변환이 필요할 경우 update는 사용할 수 없고,
“create table as (select ~~~)” query를 통해 새로운 table을 만드는 것과 유사)
• 둘을 섞어볼까?
2016-12-22 24
http://www.slideshare.net/yongho/rdd-paper-review
25. 인메모리 기반 데이터 프로세싱
프레임워크 Apahce Hadoop Piccolo
데이터 저장 공간 HDD/SDD RAM
프로세싱 속도 느림 빠름
Fine grained
update
미지원 지원
Fault-tolerance
-상대적으로 쉬움
-성능에 영향 X
-상대적으로 복잡
-성능 저하의 원인
분산처리 지원 지원
2016-12-22 25
Apahce Spark
RAM
빠름
미지원
-상대적으로 쉬움
-성능에 영향 X
미지원
지원
Reliable
Scalable
Fast
26. 인메모리 기반 데이터 프로세싱
• 단계-단계 사이에 read/write 작업이 사라짐
=> 반복 작업의 효율이 증가함
2016-12-22 26
27. 인메모리 기반 데이터 프로세싱
• 매 쿼리때마다 input을 처음부터 read해왔던 문제가 사라짐
=>동일 데이터 셋에 대한 데이터 변환/질의 처리 효율이 증가함
2016-12-22 27
28. Resilient Distributed Datasets
• Resilient Distributed Datasets
– Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster
Computing
– 인메모리 기반 데이터 처리
– Spark 에서는 내부적으로 연산하는 데이터들을 모두 RDD 타입으로 처리
– Spark application 개발은 아래의 3가지에 대한 이해를 바탕으로 시작
• RDD
• RDD 변환 API (Scala / Python/ java / R interface)
• RDD 변환 API 로 만들어진 SQL/ML/graph/stream Library
(Scala / Python/ java / R interface)
– Immutable, partitioned collections of record
– 변하지 않는, 분산된 레코드들의 집합
• Immutable : 만들어진 뒤엔 변하지 않아
• Partitioned : 데이터 셋을 잘게 잘라서 분산
2016-12-22 28
분산처리는 어떻게?? scalability, reliability 어떻게 보장해?
=> 어떻게 만들었는지 알면 또 만들 수 있겠네?
=> 가장 효율적으로 클러스터 노드에 분산시켜 보자
disk 기반 데이터 처리의 성능 문제
간단한 인터페이스 지원
29. Spark application 예제
2016-12-22 29
Hadoop MapReduce 기반 Word Count 예제
Spark 기반 Word Count 예제
코드와 실례로 보기
lambda expression 에 대해 알아야 함
(java기준 설명)
함수형 프로그래밍에도 관심있다면
글1, 글2 도 보면 좋을 듯
30. Spark application 예제
• scala spark 예제 : word counting
scala> textFile = sc.textFile("README.md")
scala> words = textFile.flatMap(line => line.split(" ")) //(transformation)
scala> mapWords = words.map(word => (word, 1)). //(transformation)
scala> redWords = mapWords.reduceByKey((a, b) => a + b) //(transformation)
scala> collection = redWords.Collect() //(action)
2016-12-22 30
[(#, 4),
(Apache, 24),
(Spark,16), ( ,68),
(help, 1),
(storage, 1),
(Hadoop,3),
…]
File :
README.md
[RDD<String> :
textFile
RDD<String> :
words
RDD<(String,int)> :
words
# Apache Spark
Spark is a fast and general…
high-level APIs in Scala, Java…
supports general computation…
rich set of higher-level tools,…
MLlib for machine learning, …
and Spark Streaming for….
…
RDD<(String,int)> :
words
#
Apache
Spark
Spark
is
a
fast
and
…
(#,1)
(Apache ,1)
(Spark ,1)
(,1)
(Spark ,1)
(is ,1)
(a ,1)
(fast ,1)
(and ,1)
…
(#, 4)
(Apache, 24)
(Spark,16)
( ,68)
(help, 1)
(storage, 1)
(Hadoop,3)
…
flatMap map
reduce
ByKey
collect
array[(String,int)] :
collection
Data
Src
output
31. Spark application 예제
• scala spark 예제 : line counting
scala> textFile = sc.textFile("README.md")
scala> SparkLine = textFile.filter(line => line.contains("Spark")) //(transformation)
scala> lineCnt = SparkLine.count() //(action)
2016-12-22 31
File :
README.md
RDD<String> :
SparkLine
int :
lineCnt
19# Apache Spark
Spark is a fast and general…
high-level APIs in Scala, Java…
supports general computation…
rich set of higher-level tools,…
MLlib for machine learning, …
and Spark Streaming for….
<http://spark.apache.org/>
…
RDD<String>:
TextFile
# Apache Spark
Spark is a fast and general…
and Spark Streaming for….
<http://spark.apache.org/>
…
Filter Count
Data
Src
output
32. • RDD를 제어하는 API operation은 크게 2개의 타입
– Transformation : RDD에서 새로운 RDD를 생성하는 함수
– Action : RDD에서 RDD가 아닌 타입의 data로 변환하는 하는 함수들
• operation의 순서를 기록해 DAG로 표현한 것을 Lineage라 부름
RDD operation
RDD Operation
2016-12-22 32
33. • Narrow Dependencies
– 변환 후의 파티션이 하나의 파티션으로
매핑되는 경우
– 해당 작업이 다 한 노드에서 처리 가능
– 네트워크를 타지 않음
(메모리의 속도로 동작)
– 파시션이 부셔져도 노드에서 다 복원 가능
• Wide Dependencies
– 변환 후의 파티션이 여러 파티션으로
매핑 되는 경우
– 부셔지면 재계산 비용이 비싸다
– 셔플이 일어나야 하는 작업들
– 일반적으로 네트워크를 타는 경우가 많음
RDD Operation
2016-12-22 33
Dependency type
Partition
• 하나의 RDD는 여러 개의 파티션으로 나뉘어짐
• 성능에 유효한 영향을 줌
• 파티션의 개수, 파티셔너는 선택 가능
• 기본파티셔너 (Hash,range) 외에도 사용자가 정의한 파티셔너를 사용가능
34. Lineage
1. fault-tolerant 확보
– 계보(lineage)만 기록해두면 동일한 RDD를 생성할 수 있음
– RDD의 copy를 보관하기 보다, Lineage만 보관해도 복구가 가능
– 일부 계산 코스트가 큰 RDD는 디스크에 Check pointing
2. Lazy-execution이 가능해짐
– 인터프리터에서 Transformation 명령어를 읽어 들일 때는 단순히 lineage만 생성
– Action 명령어가 읽히면, 쌓여있던 lineage를 실행
Lineage의 예시
2016-12-22 34
reliablity 확보
35. Lineage
3. Job scheduling에 활용 가능
– Lineage가 어느 정도 그려진 상태에서는 현재 자원(source data)이 배치된 상황과 앞으
로 배치될 상황 및 dependency 등을 미리 계산해서 작업 분산이 가능해진다.
2016-12-22 35
scalability 확보
37. Apache Spark란?
• 인메모리 기반의 대용량 데이터 고속 처리 엔진
• 범용의 분산 클러스터 컴퓨팅 프레임워크
• JAVA, Python, scala,R을 기반으로 구동
• 2009년 UC Berkely AMPLab에서 시작된 오픈소스 프로젝트
• 2013년 아파치 프로젝트 선정
• 2014년 아파치 최상위 프로젝트 선정
• 2016년 Stable release 2.0.1
http://spark.apache.org/
2016-12-22 37
38. 특장점
• 인메모리 데이터 처리
– 하둡의 맵리듀스 작업처리 속보보다 100배 빠른 성능 구현
• 단일 시스템 내에서 데이터 batch/Stream 처리, SQL 및 Machine
Learning, Graph processing을 지원
• JAVA, scala, python, R 인터페이스 제공
• Standalone은 물론 YARN, mesos 등의
클러스터 리소스 관리 패키지를 통해 다양한 환경에서 구동가능
• 8000개 이상의 노드 추가 가능한 scalability 확보
• HDFS, cassandra, Hbase, S3 등 다양한 데이터의 활용 가능
2016-12-22 38
39. Spark 아키텍쳐
• 분산 클러스터 컴퓨팅 환경 구축을 위해 3가지 환경을 지원
– 자체적인 standalone scheduler 환경 구축 (싱글 노드)
– YARN, Mesos와 같은 클러스터 관리 패키지 연동을 통한 클러스터 리소스 관리 및
환경 구축
• Spark Core
– 메인 컴포넌트로 배치 단위의 RDD에 연산을 가해 데이터를 처리하는 작업을 수행
• 공식지원 추가 라이브러리
– Spark Core를 기반으로 SQL 분석, 스트리밍 처리, Machine Learning, Graph
Processing을 모두 지원
2016-12-22 39
41. 컴포넌트 - Spark MLlib
• 스파크 기반의 scalable 머신러닝 라이브러리
• Java, Scala, Python, R 모든 인터페이스에서 사용 가능
• 일반적인 MR 프로세싱 보다 100배 가량 빠른 성능
• Spark의 ML Pipeline 개념은 Python module scikit-learn
기반
• 일반적인 ML 알고리즘과 utilities들을 포함하고 있음
– linear SVM and logistic regression
– classification and regression tree
– random forest and gradient-boosted trees
– clustering via k-means, Gaussian mixtures, and power iteration clustering
– topic modeling via latent Dirichlet allocation
– linear regression with L1- and L2-regularization
– multinomial naive Bayes
– frequent itemset mining via FP-growth
– basic statistics
– feature transformations
– …
2016-12-22 41
43. 컴포넌트- Spark GraphX
• GraphX는 스파크 상에서 분산형 그래프 프로세싱이 가능하게 해주
는 프레임워크
• Vertex RDD/Edge RDD라는 명칭으로 확장된 형태의 RDD type을
다룸
• Pregel을 기반으로한 그래프 처리 API를 제공
– Pregel은 구글에서 개발한 그래프 처리 아키텍쳐
– subgraph, joinVertices, and aggregateMessages 등의 연산 지원
• 간단한 그래프 분석을 위한 그래프 알고리즘과 그래프 빌더가 포함
2016-12-22 43
45. 컴포넌트 - Spark Streaming
• Spark Core의 확장
– 스파크에서 Scalable, High-
throughput, Fault-tolerant한 스트림
처리가 가능하게 해줌
• 스트림을 데이터를 Mini-batch 사
이즈로 쪼개어 RDD처럼 처리
– Discretized Stream(DStream)이라는
개념으로 데이터 추상화
• 스트림 데이터에 실시간으로
map, reduce, join, window와 같
은 함수 적용 가능
• 다양한 방식의 Data I/O를 지원
– Kafka, Flume, Twitter 등 다양한 소스
의 데이터를 받아들일 수 있음.
– 처리된 데이터는 실시간으로 HDFS,
DB, 대시보드 등으로 보내질 수 있음.
Spark Streaming 활용도
Spark Streaming과 Spark core의 관계
Mini-batch 개념도
2016-12-22 45
47. 컴포넌트 - Spark SQL
• 스파크 프로젝트 내에서 SQL이나 HiveQL과 같은 쿼리 작업이
가능하게 해주는 라이브러리
• Java, Python, Scala, R 모든 인터페이스에서 사용 가능
• DataFrame & DataSet이라는 새로운 RDD-like 타입을 다룸
– DataFrame & DataSet 은 테이블과 비슷한 형태로 Row objects들의 집합
• DataFrame & DataSet 은 다양한 Input source를 지원
– 존재하던 RDD
– JSON 데이터 셋
– HiveQL 쿼리를 실행한 결과
– ODBC/JCBC 서버와의 연동
2016-12-22 47
48. Tungsten execution engine
• 스파크의 bottleneck은?
• I/O나 network bandwidth가 아님
– High bandwidth SSD & striped HDD의 등장
– 10Gbps network의 등장
• CPU 와 memory에서 bottleneck 현상이 발생
– 기본적인 processing workload와 함께
– Disk I/O를 최소화하기 위한 input data pruning workload
– Shuffle을 위한 serialization과 hashing이 특히 key bottleneck
• CPU와 memory의 효율을 높여야…
– 하드웨어의 한계에 가깝게 성능을 뽑아올 수 있는 System Engine이 필요!
• Project Tungsten
– Spark 1.4부터 DataFrame에 적용
– spark 1.6에서 Dataset으로 확장 참고:
1. Project Tungsten – databrick
2. https://issues.apache.org/jira/browse/SPARK-7075
49. Tungsten execution engine
• Memory Management and Binary Processing
– JVM object 모델과 garbage collection의 overhead가 큼
=>장기적으로 data를 저장할 경우 Java objects 보다는 binary format으로 저장
– 메모리를 좀더 명확하게 관리할 필요가 있음
=> denser in-memory data format을 적용하여 메모리 사용률을 최소화 함
더 나은 memory accounting (size of bytes) 기술 적용(기존엔 Heuristics 기반)
– 이를 기반으로 하면서 domain semantics을 최대한 반영한
data processing을 지원해야 함
=>binary format의 in memory data에 대해서도 data type을 이해하는 operator를 지원
(serialization/deserialization 없이 data processing)
• Cache-aware Computation
– sorting and hashing for aggregations, joins, and shuffle의 성능이 향상이 필요
=>memory hierarchy를 활용하는 algorithm과 data structure
• Code Generation
– expression evaluation, DataFrame/SQL operators, serializer의 성능 향상이 필
요
=>modern compilers and CPUs의 성능을 제대로 활용할 수 있는 code generation
50. Catalyst optimizer
– Catalyst의 구동 (In Spark SQL) ( 자세한 사항은 paper 참고)
– Tree 구조를 기반으로 optimization
– 크게 4단계로 진행
– extensible design
• 새로운 optimization techniques과 feature들의 추가가 용이
• 외부 개발자가 optimizer를 확장하여 사용하기 용이
Catalyst의
Optimization Phase
그림 출처: Catalyst Optimizer - databrick
Tree로 표현된
Query plan
그림 출처: Deep Dive Into Catalyst
52. 컴포넌트 - Spark SQL / RDD와 DataFrame
DataFrames / SQL
Structured Binary Data (Tungsten)
• High level relational operation 사용 가능
• Catalyst optimization 적용 가능
• Lower memory pressure
• Memory accounting (avoid OOMs)
• Faster sorting / hashing / serialization
RDDs
Collections of Native JVM Objects
• 로직 상에 특정 data type 표현이 용이
• Compile-time type-safety 보장
• 함수형 프로그래밍 가능
• 두 타입 간의 변환은 지원 되지만..
– 높은 변환 cost
– 변환을 위한 boilerplate(표준 문안, 규칙) 숙지 필요
• 둘의 장점을 합쳐놓은 API를 제공할 수 있을까?
– Catalyst optimizer & Tungsten execution engine의 장점을 활용할 수 있어야 함
– Domain object의 type을 이해할 수 있고 이를 활용할 수 있어야 함
성능 ↑안전성 & 유연성 ↑
2016-12-22 52
53. 컴포넌트 - Spark SQL / Dataset
– RDD와 DataFrame의 장점만 취해 만든 interface API
– http://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Dataset.html
특장점
Fast
Typesafe
Support for a variety of object models
Java Compatible
Interoperates with DataFrames
Dataset
Structured Binary Data (Tungsten)
• High level relational operation 사용 가능
• Catalyst optimization 적용 가능
• Lower memory pressure
• Memory accounting (avoid OOMs)
• Faster sorting / hashing / serialization
• 로직 상에 특정 data type 표현이 용이
• Compile-time type-safety 보장
• 함수형 프로그래밍 가능
그림 출처: technicaltidbit.blogspot.kr/
2016-12-22 53
54. 컴포넌트 - Spark SQL / Dataset
• structured/semi-structured Data 분석 => Dataset으로
구분 RDD DataFrame Dataset
성능 비교적 느림 빠름 빠름
메모리 관리 누수 존재 최적화 최적화
Type-safety 보장 보장되지 않음 보장
분석 확장성 유연함 제한적 유연함
RDD-Dataset의
WordCount 예제의
실행 시간 비교
RDD-Dataset의
캐싱 시 memory
사용량 비교
그림 출처: Introducing Spark Datasets- databrick
2016-12-22 54
58. 실습 환경 정보
본 문서의 실습 환경 정보
• OS : Centos 7.0
• Java version : JDK 8
• Spark version : Spark 2.0.1 release
• 예제 언어 : scala, python
2016-12-22 58
59. 사전 환경 설정(생략)
• JDK 설치(1.8 이상일 경우 스킵)
– Java SE development kit 의 약자 자바 프로그램을 개발하기
위해 필요한 라이브러리 들의 모음
– Java Runtime Environment(자바 프로그램을 실행하기 위한 모듈들)
를 포함하고 있음
– 본 링크 에서 OS 별 최신버전의 jdk를 다운로드 후 아래와 같이 설치
2016-12-22 59
$ cd /usr
$ mkdir java
$ cd /usr/java
// “/usr/java/” 경로에 준비된 jdk1.X.X_XX.tar 옮기기
$ mv {JDK 다운로드 경로}/ jdk-{version}-linux-x64.tar.gz /usr/java/
$ tar -xf jdk-{version}-linux-x64.tar.gz
$ ln -s /usr/java/jdk1.X.X_XX latest
$ ln -s latest default
$ alternatives --install /usr/bin/java java /usr/java/jdk1.X.X_XX /bin/java 1
$ alternatives --config java
//설치된 버전의 java에 해당하는 번호로 세팅
3 개의 프로그램이 'java'를 제공합니다.
선택 명령
-----------------------------------------------
* 1 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/bin/java
+ 2 /usr/java/jdk1.X.X_XX/bin/java
현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오: 2
60. 사전 환경 설정(생략)
• JAVA_HOME 변수 설정
- 공용 변수 저장 파일의 가장 하단부에 환경변수 추가 후 저장
- 설치한 버전의 java가 확인되면 완료
2016-12-22 60
$ vim /etc/profile
----------------vim edit display start---------------------
…
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$ANT_HOME/bin:$JAVA_HOME/bin
----------------vim edit display end---------------------
$ source /etc/profile
$ java –version
java version "1.x.x_xx“
Java(TM) SE Runtime Environment (build 1.x.x_xx-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, mixed mode)
61. • http://spark.apache.org/downloads.html 링크에 접속한다.
1. Spark의 가장 최신 release를 선택한다.
2. “Pre-built for Hadoop 2.7 and later”를 선택
(구축된 Hadoop cluster를 사용할 계획이라면 구축된 Hadoop의 버전을 선택한다.)
3. Direct Download를 선택한다.
(“select Apache Mirror”를 선택하면 국내 저장소를 통해 빠르게 다운로드 가능하다.)
4. 링크를 클릭하여 다운로드 받는다.
Spark Standalone 설치
2016-12-22 61
62. Spark Standalone 설치
• Spark를 계정 홈 경로에 설치
– spark-2.0.1-bin-hadoop2.7.tgz 파일을 /home/{user} 에 저장
– cd ~ 명령어로 계정 홈 폴더에 이동한다.
– tar -xvf spark-2.0.1-bin-hadoop2.7.tgz 명령어로 압축을 푼다.
2016-12-22 62
63. Spark Standalone 설치
• Spark Shell 실행 해보기
– cd ~/spark-2.0.1-bin-hadoop2.7 명령어로 스파크 홈 폴더에 이동
– bin/spark-shell 명령어를 입력하여 스파크가 실행 되는 것을 확인한다. (scala용)
– bin/pyspark 명령어를 입력하여 스파크가 실행 되는 것을 확인한다. (python용)
2016-12-22 63
65. Spark Standalone 실습
2016-12-22 65
• Spark 실행 방법
1. scala, python의 interface를 가지는 spark shell을 이용한 interactive 분석
– Apache zeppelin을 통한 interactive한 분석이 가능
– Apache zeppelin의 노트북 기능을 활용한 code 공유도 가능
2. Spark application을 작성하여 런칭
– Python 어플리케이션 개발
– Java, scala 어플리케이션 개발
66. Spark Standalone 실습
2016-12-22 66
RDD operation
Scala api 예제
http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html
Scala , java, python interface 별 RDD Operation 사용 예제
http://backtobazics.com/big-data/spark/apache-spark-map-example/
67. Interactive Analysis with the Spark Shell
• spark scala 예제 (1) Basic Map
// Scala 변수 List를 RDD로 로딩
scala> val numList = List(2, 1, 4, 3)
numList: List[Int] = List(2, 1, 4, 3)
scala> val nums = sc.parallelize(numList )
nums: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:26
// RDD의 각 element를 제곱
scala> val squarNum = nums.map(x => x*x) //(transformation)
squarNums: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[1] at map at <console>:28
// RDD를 scala 변수 list 형태로 반환
scala> val output = squarNum.collect() //(action)
output: Array[Int] = Array(4, 1, 16, 9)
2016-12-22 67
68. Interactive Analysis with the Spark Shell
• spark scala 예제 (2) Basic max/min/sum
// Scala 변수 List를 RDD로 로딩
scala> val numList = List(2, 1, 4, 3)
numList: List[Int] = List(2, 1, 4, 3)
scala> val nums = sc.parallelize(numList )
nums: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:26
// nums RDD를 대상으로 min/max/sum을 계산
scala> nums.max() //(action)
res0: Int = 4
scala> nums.min() //(action)
res1 : Int = 1
scala> nums.sum() //(action)
res2 : Int = 10
scala> nums.fold(0)((x, y) => x + y)) //(action)
res3 : Int = 10
2016-12-22 68
69. Interactive Analysis with the Spark Shell
• spark scala 예제 (3) line counting
// {SPARK_HOME}에 위치하는 README.md파일을 로딩
scala> val textFile = sc.textFile("README.md")
textFile: org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[1] at textFile at <console>:24
// 읽은 파일의 총 line 수는?
scala> textFile.count() //(action)
res0: Long = 99
// 첫번째 Line의 문자열은?
scala> textFile.first() //(action)
res1: String = # Apache Spark
// “Spark”라는 문자열을 포함하고 있는 line의 수는?
scala> val SparkLine = textFile.filter(line => line.contains("Spark")) //(transformation)
SparkLine: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at filter at <console>:26
scala> SparkLine.count() //(action)
res2: Long = 19
2016-12-22 69
70. Interactive Analysis with the Spark Shell
• spark scala 예제 (4) word counting
// {SPARK_HOME}에 위치하는 README.md파일을 로딩
scala> val lines = sc.textFile("README.md")
// 각 라인을 word단위로 분리
scala> val words = lines.flatMap(line => line.split(" ")) //(transformation)
// case1 .Word별로 개수를 카운트
scala> val wordMap = words.map(word => (word, 1)) //(transformation)
scala> val result = wordMap.reduceByKey((a, b) => a + b) //(action)
res0: Array[(String, Int)] = Array(
(package,1),
(this,1),
(Version"](http://spark.apache.org/docs/latest/building-spark.html#specifying-the-hadoop-version),1),
(Because,1),
(Python,2),
(cluster.,1),
(its,1),
([run,1),
(general,2),
….
2016-12-22 70
71. Interactive Analysis with the Spark Shell 문제
• (1) [1,2,3,4,5,6,7,8,9] list에서 홀수인 자연수들의 제곱 합을 구하세요.
• (2) “README.md” 파일의 총 word의 개수를 출력하세요
• (3) “README.md” 파일에서 총 ‘k’가 들어가는 word의 개수를 출력하세요
2016-12-22 71
72. Submitting Spark Applications
• spark-submit 을 통한 실행
1. 간단한 python application의 경우
– Vim등의 텍스트 에디터를 이용하여 python code를 작성
– cd ~/spark-2.0.1-bin-hadoop2.7 명령어로 스파크 홈 폴더에 이동
– 아래의 명령어를 통해 작성한 test.py spark 어플리케이션을 실행
2016-12-22 72
from pyspark import SparkContext
logFile = “/home/{user}/spark-2.0.1-bin-hadoop2.7/README.md
sc = SparkContext("local", "Simple App")
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print("Lines with a: %i, lines with b: %i" % (numAs, numBs))
$ YOUR_SPARK_HOME/bin/spark-submit --master local[4] test.py
...
Lines with a: 46, Lines with b: 23
...
73. Submitting Spark Applications
• spark-submit 을 통한 실행
2. Scala나 java로 application을 작성할 경우
– Scala, java IDE를 사용하여 Project를 생성
– sbt(scala), maven(java) 등의 빌드 도구 플러그인을 활용하여
spark library와 기타 사용되는 library들의 dependencies를 관리
– 원하는 작업을 수행하는 spark application code를 작성
– 프로젝트를 컴파일 및 빌드하여 jar 파일을 생성
– 완성된 application.jar 파일은 spark-submit 커맨드를 사용하여 실행
• 자세한 내용은 아래 링크에서 확인
https://spark.apache.org/docs/latest/submitting-applications.html
2016-12-22 73
74. 추가 자료
• Facebook 그룹
– 스사모 (한국 스파크 사용자 모임) - 인메모리 컴퓨팅
• https://www.facebook.com/groups/sparkkoreauser/
– 제플린과 친구들 - 빅데이터 비행단
• https://www.facebook.com/groups/AapacheZeppelinFanKorea/
– 통계분석연구회(Statistics Analysis Study)
• https://www.facebook.com/groups/statsas
– R Korea - KRSG(Korean R Study Group)
• https://www.facebook.com/groups/krstudy
– 생활코딩
• https://www.facebook.com/groups/codingeverybody/
– 한국데이터사이언스학회(Korean Association of Data Science)
• https://www.facebook.com/groups/datasci/?ref=group_browse_ne
w
2016-12-22 74