'Spark'에 해당되는 글 18건

  1. 2015/03/08 용비 (Chapter 2) 12. Standalone Applications
  2. 2015/03/05 용비 (Chapter 2) 11. Core Spark Concepts
  3. 2015/03/01 용비 (Chapter 2) 10. Python and Scala Shell
  4. 2015/02/17 용비 (Chapter 2) 09. Downloading Spark
  5. 2015/01/30 용비 (Chapter 1) 08. Who, What

Spark에 대한 빠른 여행에서 빠뜨린 마지막 조각은 어떻게 standalone program을 사용하느냐는 것이다. Interactive하게 실행하는 것을 제외하고, Spark Java, Scala, Python으로 작성된 Standalone application에도 link될 수 있다. Shell에서 그것을 사용하는 주요 차이점은 직접 SparkContext를 초기화 해주어야 한다는 것이다. 그 이후, API는 동일하게 사용할 수 있다.

 

Spark linking하는 과정은 언어에 따라 다르다. Java Scala에서는 application Maven dependency Apache에 의해publish spark-core artifact를 넣어 주면 된다. 이 글이 쓰여질 시점에 최종 Spark 버전은 1.0.0이고, Maven coordinate는 다음과 같다.

 

groupId = org.apache.spark

artifactId = spark-core_2.10

version = 1.0.0

 

Maven에 익숙하지 않다면, maven public repository library를 등록하여 link할 수 있는 Java 기반 언어에 대한 유명한package management tool이다. 프로젝트를 build하는데 Maven을 사용할 수 있다. 혹은 Maven Repository에 연동할 수 있는 다른 툴-Scala SBT tool이나 Gradle과 같은-을 사용할 수도 있다. Eclipse와 같은 유명한 통합 개발 환경 또한 프로젝트에Maven dependency를 직접 추가할 수 있도록 지원한다.

 

Python에서는 Python Script로 간단하게 application을 작성할 수 있다. 하지만, Spark에 포함된 특별한 bin/spark-submit script를 사용하여 실행해야만 한다.  script Spark Python API function으로 사용할 수 있도록 환경을 설정한다. Script는 다음처럼 간단하게 실행할 수 있다.

 

bin/spark-submit my_script.py

 

(윈도우 시스템에서는 / 대신 \(backslash)를 사용해야 함에 주의!)

(NOTE : 1.0 이전 Spark 버전에서는 Python application을 실행하기 위해서 bin/pyspark my_script.py을 사용하라)

 

Application Spark link하기 위한 상세 예제는 공식 Spark Document Quick Spark Guide에 나와 있다. 그 문서의 최종본에는 appendix에 전체 example도 또한 포함되어 있다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/659

(Chapter 2) 11. Core Spark Concepts

Spark 2015/03/05 21:13 용비

Introduction to Core Spark Concepts

이제 여러분은 shell을 사용하여 첫번째 Spark Code를 작성하고 실행해 보았다. 이제 programming에 대해서 좀더 상세한 내용을 공부할 시간이다. High level에서 볼 때, 모든 Spark application Cluster상에서 다양한 병렬 연산을 수행하는 driver program으로 이루어져 있다. Driver program에는 main 함수와 Cluster상에 분산되어 있는 Dataset에 대한 정의가 포함되어 있고, Dataset에 대한 operation이 담겨져 있다. 앞에서 언급한 예제에서 보면, driver program은 실행하고자 하는 연산에 대한 code를 작성하기만 하면 되는 Spark shell 그 자체이다.

 

Driver Program SparkContext object를 통해서 Spark에 접속한다. SparkContext는 계산하고자 하는 Cluster에 연결하는 것을 나타낸다. Shell에서는 변수 sc를 호출하는 순간 SparkContext가 자동으로 생성된다. 다음과 같이shell에서 sc typing해보자.

 

>>> sc

<pyspark.context.SparkContext object at 0x1025b8f90>

 

한번 SparkContext를 가져오고 나면, resilient distributed dataset(RDD)을 생성하는데 그것을 사용할 수 있다. 앞의 예제에서는 file내의 text line을 나타내는 RDD를 생성하기 위해서 SparkContext.textFile을 호출했다. 그리고 우리는 lines 상에서(생성한 RDD상에서) count()와 같은 다양한 연산을 수행할 수 있었다.

 

이러한 연산을 수행하기 위해서 driver program Executor라고 불리는 여러 node들을 관리한다. 예를 들어, Cluster상에서 count()를 수행하려고 한다면, 서로 다른 machine에서 서로 다른 크기의 file로부터 line을 셀 것이다. 우리는 Spark shell local에서 수행했기 때문에 single machine에서 모든 작업을 수행할 것이다. 하지만, Cluster 환경에서 병렬로 데이터를 분석하기 위해서 동일한 shell에 연결할 수 있다. 다음 그림은 Cluster상에서 어떻게 Spark가 동작하는지를 보여준다.

사용자 삽입 이미지

[Components for distributed execution in Spark]

끝으로, 대부분의 Spark API Cluster상의 Operator로 작업을 수행하기 위해 전달하는 함수 역할을 수행한다. 예를 들어, "Python"이라는 단어를 포함하고 있는 line filtering하기 위해 README example을 확장할 수 있다.

 

[Python filtering example]

>>> lines = sc.textFile("README.md")

>>> pythonLines = lines.filter(lambda line: "Python" in line)

>>> pythonLines.first()

u'## Interactive Python Shell'

 

[Scala filtering example]

scala> val lines = sc.textFile("README.md") // Create an RDD called lines

lines: spark.RDD[String] = MappedRDD[...]

scala> val pythonLines = lines.filter(line => line.contains("Python"))

pythonLines: spark.RDD[String] = FilteredRDD[...]

scala> lines.first()

res0: String = ## Interactive Python Shell

 

(NOTE : lambda에 익숙하지 않거나 => syntax에 익숙하지 않으면, Python이나 Scala 내부에서 함수를 정의하기 위한 축약방식이다. 이러한 언어들을 Spark에서 사용할 때, 분리해서 함수를 정의하고 Spark에 그 이름을 넘겨줄 수도 있다. 예를 들어 Python으로 다음과 같이 작성할 수 있다.

 

def hasPython(line):

return "Python" in line

 

pythonLines = lines.filter(hasPython)

 

Spark에 함수를 넘기는 것은 Java에서도 가능하다. 하지만, 이 경우에는 우리는 class로 정의하고 Function이라고 불리는 인터페이스를 implement해야 한다. 예를 들면 다음과 같다.

 

JavaRDD<String> pythonLines = lines.filter(

new Function<String, Boolean>() {

Boolean call(String line) { return line.contains("Python"); }

}

);

 

Java 8에서는 lambdas라고 불리는 축약형 syntax를 소개하고 있다. Python이나 Scala에서 사용하는 방식과 비슷하다. 위와 동일한 기능을 하는 Java lambdas Code는 다음과 같다.

 

JavaRDD<String> pythonLines = lines.filter(line -> line.contains("Python"));

 

우리는 나중에 Passing Functions to Spark에서 추가로 논의할 것이다.)

 

우리는 나중에 Spark API에 대해서 더 자세히 다룰 것이다. Spark API cluster상에서 병렬로 처리되는 filter와 같은 함수 기반 operation을 위한 마법과도 같다. Spark는 자동으로 여러분이 작성한 함수(예를 들면, line.contaions("Python"))를 가져다가 executor node에 태운다. 이와 같이 여러분이 하나의 driver program 코드를 작성하면 자동으로 여러 node에서 실행해 준다. Chapter 3에서는 RDD API에 대해서 더 자세히 다룬다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/658

Introduction to Spark's Python and Scala Shells

Spark는 즉각적인 Data Analysis를 쉽게 할 수 있는 interactive shell을 제공한다. Spark shell R, Python, Scala와 같은 다른 형태의 shell이나 Bash, windows command prompt와 같은 OS시스템의 shell을 사용해본 경험이 있다면 쉽게 익숙해질 수 있을 것이다.

 

하지만, 하나의 machine에 있는 disk memory에 있는 데이터를 취급하는 대부분의 다른 shell들과는 다르게 Spark shell은 여러 machine disk memory에 분산되어 있는 데이터로 작업할 수 있도록 한다. 그리고 SparkData 처리 process를 자동으로 분산처리하고 보호한다.

 

Spark memory Data load할 수 있기 때문에, 많은 분산 컴퓨팅 환경에서 수초안에 - 심지어 수십대의 machine에서 테라바이트 단위의 data를 처리하는 경우에도 - 처리를 완료할 수 있다. 그러므로 shell을 이용해 sort of iterative, ad-hoc, exploratory analysis를 처리하는 경우에 Spark를 이용해서 처리하는 것이 적합하다. Spark Cluster에 연결하는 것을 지원하기 위해 많이 사용하는 Python, Scala shell 모두 지원한다.

 

[NOTE]

이 책의 대부분의 코드는 Spark에서 지원하는 모든 language로 이루어져 있지만, interactive shell Python Scala만 이용가능하다. Shell API를 배우는데 아주 유용하기 때문에 Java 개발자들도 Python이나 Scala 언어로 모든 example을 사용해 보기를 추천한다. API는 모든 언어에서 동일하다.

 

Spark's Shell power를 설명하는 가장 쉬운 방법은 간단한 data analysis에 사용해 보는 것이다. 공식적인 Spark document에 있는 Quick Start Guide에 있는 example을 돌려보자.

 

첫번째로 Spark's Shell Open한다.

Python version Spark Shell open하기 위해서는(우리는 PySpark Shell이라고도 부른다.) Spark directory로 들어가서 다음을 치면 된다.

 

bin/pyspark (윈도우 시스템에서는 bin\pyspark)

 

Scala versionShell open하기 위해서는 다음을 친다.

 

bin/spark-shell

 

Shell prompt는 몇 초 안에 나타날 것이다. Shell을 시작할 때, 많은 log message를 볼 수 있을 것이다. Log output을 깨끗하게 하기 위해서 [Enter] 키보드를 치면 shell prompt를 볼 수 있다. PySpark Shell을 실행하고 난 후의 화면은 다음 그림과 같다.

사용자 삽입 이미지

[The PySpark Shell With Default Logging Output]


Shell 내에 주의를 산만하게 하는 화면에 출력된 logging statements를 볼 수 있을 것이다. Logging에 대한 길이를 조절할 수 있다. 이렇게 하기 위해서 conf directory log4j.properties 파일을 만들수 있다. Spark 개발자에게는 이미 log4j.properties.template 파일이 포함되어 있다. Logging을 덜 나오게 하려면 conf/log4j.properties.template 파일을 conf/log4j.properties 파일로 복사하고 다음 라인을 찾는다.

 

log4j.rootCategory=INFO, console

 

다음과 같이 변경하여 WARN에 대한 message만 보도록 log level을 낮출 수 있다.

 

log4j.rootCategory=WARN, console

 

Shell을 다시 open했을 때, 이제는 output이 다음과 같이 나타날 것이다.

사용자 삽입 이미지

[The PySpark Shell With Less Logging Output]


[IPYTHON 사용]

Ipython은 많은 사용자들이 애용하고 있는 tab 키보드를 치면 이후 문장을 자동으로 완성시켜주는  Python Shell의 확장판이다. 설치에 대한 안내는 http://ipython.org 에서 찾아볼 수 있다. 변수 1 IPYTHON 환경 설정을 해줌으로써 Spark에서 Ipython을 사용할 수 있다.

 

IPYTHON=1 ./bin/pyspark

 

Web 브라우저 버전의 Ipython Notebook을 사용하기 위해서는 다음을 사용하라.

 

IPYTHON_OPTS="notebook" ./bin/pyspark

 

윈도우 시스템에서는 환경변수 설정을 다음과 같이 하면 된다.

 

set IPYTHON=1
bin\pyspark

 

우리는 Spark를 이용해 Cluster 환경에서 자동으로 분산되어 있는 collection으로부터 계산하는 operation을 수행해 볼 것이다. 이러한 collection RDD (Resilient Distributed Dataset)라고 부른다. RDD Spark에서 분산되어 있는Data와 계산에 대한 가장 기본적인 추상화 계층이다.

 

RDD에 대해서 더 자세히 말하기 전에, local text file로 아래와 같이 ad-hoc data analysis하기 위한 하나의 shell을 간단히 작성해 보자.

 

[Python line count]

>>> lines = sc.textFile("README.md") # Create an RDD called lines

>>> lines.count() # Count the number of items in this RDD

127

>>> lines.first() # First item in this RDD, i.e. first line of README.md

u'# Apache Spark'

 

[Scala line count]

scala> val lines = sc.textFile("README.md") // Create an RDD called lines

lines: spark.RDD[String] = MappedRDD[...]

scala> lines.count() // Count the number of items in this RDD

res0: Long = 127

scala> lines.first() // First item in this RDD, i.e. first line of README.md

res1: String = # Apache Spark

 

Shell에서 빠져 나오려면 Ctrl+D를 누르면 빠져나올 수 있다.

 

위의 예에서, lines라고 불리는 변수는 RDD이고 text file로부터 local machine에 생성된다. 우리는 RDD 상에서 dataset의 구성요소 수를 세거나 (여기서는 text file 내의 line ), 첫번째 라인을 출력하는 것과 같은 여러 병렬 연산들을 수행할 수 있다. 우리는 다음 장에서 RDD에 대해서 더 깊이 다룰 것이다. 하지만, 더 나아가기 전에 Spark의 기본적인 개념들에 대해서 설명하는 시간을 갖도록 하자.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/657

(Chapter 2) 09. Downloading Spark

Spark 2015/02/17 13:27 용비

Chapter 2. Downloading and Getting Started


Spark 다운로드하고 하나의 컴퓨터에서 single mode 실행해보자. Data Scientist Engineer 포함해 Spark 새로 사용하는 사람이라면 누구나 알기 쉽게 썼다.


Spark Python, Java, Scala 사용할 있다. 전문 프로그래머일 필요는 없지만, 최소한 한가지 언어의 기본 문법에 대해서 익숙한 사용자라는 것을 가정하고 설명할 것이다. 가능한 모든 언어로 만들어진 예제가 포함되어 있다.


Spark 자체는 Scala 개발했고, JVM상에서 돌아간다. 랩탑이나 Cluster에서 Spark 실행하기 위해서는 Java 6 이상이 설치되어 있어야 한다. Python API 사용하고 싶다면, Python Interpretor 2.6 이상이 필요하다. 아직 Spark Python 3에서는 동작하지 않는다.


Downloading Spark


Spark 사용하기 위한 첫번째 단계는 Spark 다운로드 받고, 사용할 있는 형태로 압축을 푸는 것이다. 가장 최근에 Release precompile Spark 다운로드하는 것부터 시작해 보자.

http://spark.apache.org/download.html 에서 Pre-Built Packages -> For Hadoop 1 (HDP1, CDH3) -> direct file download 클릭한다. Spark-1.0.0-bin-hadoop.tgz 파일을 다운로드 받을 있다.

다른 Hadoop version에서 Spark 사용하고 싶다면 다운로드 페이지에서 다운 받을 있지만, 파일 이름이 약간 다르다. Source로부터 직접 Build하여 사용할 수도 있는데, 최종 소스 코드는 다음 URL에서 다운로드 받을 있다. http://github.com/apache/spark.


(Mac OS X 포함하여 대부분의 Unix, Linux 계열에서는 command-line에서 tar 파일 압축 해제 명령어로 압축을 있다. 하지만, tar command 설치되어 있지 않은 Windows 같은 시스템에서는 tar 압축을 해제할 있는 무료 (7-Zip) 다운로드 받아서 사용할 있다.)


, 이제 Spark 다운로드 받았으니 압축을 해제하고 Spark Default 버전이 어떻게 생겼는지 알아보자. 가장 먼저 Spark 다운로드 받은 폴더로 이동하고, 다운로드 받은 파일 압축을 풀어보자.


cd ~

tar -xf spark-1.0.0-bin-hadoop1.tgz

cd spark-1.0.0-bin-hadoop1

ls


위의 tar command-line에서 x flag 압축 해제를 의미하고, f 압축 해제할 파일명을 의미한다. ls command 압축이 풀린 Spark 폴더의 내용을 보여준다. 압축이 풀린 폴더에 있는 주요 파일들은 다음과 같다.


README.md - Getting Started with Spark 대한 간단한 내용이 담겨져 있다.

bin - 실행 파일들이 담겨져 있는 폴더이다. Spark 상호동작할 있는 spark-shell 폴더에 위치한다.

core, streaming, python - Spark 프로젝트의 주요 컴포넌트에 대한 소스코드들이 있는 곳이다.

examples - Spark API 대해 사용법과 작동하는 원리를 배울 있는 Spark standalone job 대한 예제 코드들이 있다.


Spark 프로젝트에 있는 수많은 폴더와 파일들 때문에 걱정할 필요는 없다. 이후에 대부분의 내용을 다룰 것이다. 지금은 Spark Python Shell, Scala Shell 대해서 깊이 들여다 보자. Spark 간단한 example 돌려볼 것이다. 그리고, 직접 작성한 코드를 컴파일하고 간단한 Spark Job 구동시켜 것이다.


챕터에서는 Spark 분산 모드가 아닌, 하나의 machine에서 하나의 Spark 구동되는 "Local Mode" 돌려볼 것이다. Spark 다양한 mode 환경에서 실행될 있다. Local Mode 뿐만 아니라 Mesos, YARN, Spark 배포판에 포함되어 있는 Standalone Scheduler상에서 구동할 있다. 앞으로 다양한 환경에서 Spark Deploy하는 부분에 대해서 상세히 다룰 것이다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/656

(Chapter 1) 08. Who, What

Spark 2015/01/30 18:30 용비

Who use Spark, and for What?

누가 사용하고 어디에 사용하는가?


Spark cluster computing 위한 범용 framework이기 때문에 넓은 application 사용할 있다. Preface에서 책의 독자로 Data Scientist, Engineer 부류를 제시했다. 부류를 면밀하게 살펴보고 그들이 어떻게 Spark 사용하는지 알아보자. 부류가 사용하는 case 간단하게 정리하자면 Data Science, Data Application으로 분류할 있다.


Data Science Task


Data Science 지난 동안 데이터 분석의 중심부에 위치해 왔다. 하지만, 표준화된 정의가 없기 때문에 여기서는 데이터를 분석하고 모델링하는 작업을 주로 하는 사람들을 Data Scientist라고 한다. Data Scientist SQL, 통계, 미래 예측 모델링 (machine learning), 일반적으로 Python, Matlab, R 같은 약간의 프로그래밍을 경험한 사람들이다. Data Scientist 때때로 Data wrangling이라고 부르는 분석할 있는 이해 가능한 데이터로 형식을 변환하는 기술에 대해서도 어느 정도 경험이 있는 사람들이다.


Data Scientist 어떤 질문에 대한 답을 구하기 위해서, 통찰력을 발견하기 위해서 데이터를 분석하는데 스킬을 사용한다. 종종 특별한 분석을 위해서, 때때로 interactive shell 사용하여 query 결과나, 최소한의 시간으로 구현한 코드의 결과를 본다.


Spark 속도와 simple API 이러한 목적에 빛을 발한다. 그리고 built-in 라이브러리를 통해서 다양한 알고리즘을 적용할 있다. 때로 최초로 사용할 , Data Scientist 작업이 제품화이거나 확장, 어려운 작업이거나 data processing application 튜닝하는 작업일 있다. Data Scientist 초기 연구가 상품 추천 시스템 생성을 이끄는 것일 수도 있다.


Data Processing Applications


Spark 사용하는 다른 경우는 Engineer 관점에서 사용하는 것일 있다. 경우 Data Processing Application 만들기 위해 Spark 사용하는 많은 분야의 소프트웨어 개발자를 생각해 있다. 이런 개발자들은 software engineering 대한 원리를 이해하고 있다. 캡슐화, 인터페이스 설계, OOP 대해서 알고 있을 것이다. 컴퓨터 공학을 전공하고, 소프트웨어 시스템 설계하고 빌드할 있는 능력이 있는 사람들이다.


Engineer 위해서 Spark Cluster상에서 application 병렬화하는 간단한 방법을 제공한다. 분산 프로그래밍에 대한 복잡한 면을 감추고, 네트워크 통신이나 fault tolerance 대해서도 신경 필요가 없다. 모니터링과 검사, application 튜닝을 쉽게 있고, common task 빠르게 구현할 있다. API 모듈화된 특성에 따라 재사용 가능한 라이브러리로 로컬에서 테스트도 쉽게 있다.


Spark 사용자들은 굉장히 다양한 기능들을 제공하기 때문에 data processing application 위해서 쉽게 배우고 사용할 있다.


Spark History


Hadoop 기반 MapReduce interative computing job 비효율적이라는 것을 알고, UC 버클리 RAD lab => AMLLab에서 연구 시작. 처음에는 interactive query, iterative algorithms 빨리 실행하고 in-memory storage 효율적인 fault recovery 지원하자는 아이디어에서 출발함.

처음에는 MapReduce보다 10-20 빠른 성능을 보임. 이후, machine learning 연구자들이 샌프란시스코 만의 교통 상황을 모니터링하고 예측하기 위해 Spark 사용하기 시작함. 지금은 굉장히 빠른 시간 내에 사용하는 조직이 늘었음.

2011년도에 AMLLab 연구자들이 Shark(Hive on Spark), Spark Streaming 개발하기 시작함.


받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/654