일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Angular2
- SBT
- apache storm
- spark
- hibernate
- 스프링 배치
- 도메인주도설계
- Storm
- Gradle
- hdfs
- elasticsearch
- 엘라스틱서치
- Linux
- nginx
- Domain Driven Design
- elastic search
- docker
- 제주
- design pattern
- Clean Code
- Java
- Spring
- Spring Boot
- intellij
- DDD
- scala
- Hbase
- Spring XD
- hadoop
- Spring Batch
- Today
- Total
목록Programming (135)
욱'S 노트
Overview 스파크 어플리케이션의 드라이버 프로그램들로 구성된다. 여기서 드라이버 프로그램이란 클러스터상에서 병렬 연산으로 수행되는 사용자 메인 함수를 의미한다.그리고 스파크는 두가지 주요한 추상화를 제공하는데, RDD(Resillent Distributed DataSet)과 공유 변수(Shared variable)이다. RDD는 파티션된 클러스터에 병렬 연산으로 수행될 수 있는 켈렉션이다. RDD는 일반적인 스칼라 컬렉션으로부터 만들어질 수 있고, HDFS와 같은 외부 시스템으로부터 만들어질 수도 있다. RDD는 노드 장애에 대해서 자동으로 복구된다. 스파크 타스크는 기본적으로 클러스터상에서 병렬 수행된다. 이에 변수들은 공유될 필요가 있다. 스파크는 두가지 타입의 공유 변수를 제공한다. 첫번째는 ..
일단 무작정 스파크를 시작해보자. 목표는 빌드환경 구성을 위해서 sbt를 사용할 것이며 텍스트에디터에 개발을 수행할 수 없으니 IntelliJ로 세팅을 하겠다. 1. 인텔리J에서 프로젝트 구성File -> New -> Project 순으로 메뉴를 선택하면 아래와 같은 화면이 나타난다.당연히 프로젝트는 Scala에 SBT를 선택한다. 2. 프로젝트가 구성되면 build.sbt 파일에 다음과 같이 입력한다.name := "spark-test" version := "1.0" scalaVersion := "2.11.7" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"아직 sbt를 모르지만 간략하게 설명하면 name은 프로젝트 명을 의미하고..
스칼라는 빌트인 패턴 매칭 메커니즘을 제공한다. 다음 예제는 정수 값에 대한 매치를 수행한 결과이다.def getNumberString(number : Int) : String = number match { case 1 => "one" case 2 => "two" case _ => "many" } println(getNumberString(1)) println(getNumberString(2)) println(getNumberString(3))case문들이 있는 블럭에서 정수값을 문자열로 매핑하는 함수를 정의하고 있다. match 키워드는 객체에 대한 함수를 제공하는 편리한 방법이다.다음은 다양한 타입의 패턴에 대응하는 방법이다.def parseNumber(number : Any) : Any = numb..
스칼라는 케이스 클래스 문법을 지원한다. 케이스클래스는 다음과 같은 일반적인 클래스이다.기본적으로 불변이다.패턴 매칭에 따라 분리될 수 있다.레퍼런스 대신 구조적 동일성에 의해 비교된다.간결하게 초기화 되고 사용될 수 있다.예제를 살펴보자. Notification 추상 클래스가 슈퍼클래스와 각 구현 클래스 Email, SMS, VoiceRecording이다.abstract class Notification case class Email(sourceEmail : String, title : String, body : String) extends Notification case class SMS(sourceNumber : String, message : String) extends Notification c..
메소드에는 여러개의 파라미터를 정의할 수 있다. 메소드를 호출할때 더 작은 수의 파라미터가 들어오면 메소드는 전달된 수를 기본값으로 하고 그것보다 적은 수의 파라미터를 가진 함수로 표현될 수 있다.object CurryingTest extends App { def modN(n : Int)(x : Int) = x % n def multiply(f : Int => Int, x : Int, y : Int) = f(x) + y println(multiply(modN(2), 10, 4)) }위의 예제를 보자 modN은 두개의 파라미터가 정의된 것 같지만 multiply에서 사용시 한개의 파라미터만 전달되었다. 이 경우 n인자를 디폴트로 전달받은 함수로 인지되어 modN(2)는 multyply의 Int => Int..
스칼라는 NESTED 함수 정의를 지원한다. 다음은 입력된 ArrayBuffer에서 특정값을 필터링하는 예제이다.import scala.collection.mutable.ArrayBuffer object NestedFunctionTest extends App { def filter(list : ArrayBuffer[Int], filterValue : Int) = { def filterInternal(list : ArrayBuffer[Int]) = { val results = ArrayBuffer[Int]() list.foreach(i => if (i != filterValue) results += i) results } filterInternal(list) } println(filter(ArrayBuff..
스칼라에서는 고차함수 정의를 지원한다. 함수는 다른 함수를 파라미터로 전달받고 그것을 활용할 수 있다. 고차함수를 사용하는 예제는 다음과 같다.(f1 : (Int, Int) => Int, x : Int, y : Int, z : Int) => f1(x, y) * z해당 함수는 함수를 인자로 받고 함수의 결과에 곱하기를 하는 함수이다. 다음은 실제 사용예이다.object HighOrderFunctionTest extends App { val plus = (x : Int, y : Int) => x + y val minus = (x : Int, y : Int) => x - y val multiply = (f1 : (Int, Int) => Int, x : Int, y : Int, z : Int) => f1(x, ..
스칼라에서 익명함수를 정의하는 방법은 매우 간단하다. 아래는 가장 간편하게 정의한 예이다. 왼쪽부분은 파라미터를 정의한 부분이고 오른쪽 부분의 수식을 정의한 부분이다.(x: Int) => x + 1위의 익명함수는 사실 아래와 같은 정의를 단순한 한 것이다.new Function1[Int,Int] { override def apply(x: Int): Int = x + 1 }다수의 파라미터의 경우는 아래와 같이 정의한다.(x: Int, y:Int) => x + y파라미터가 없는 경우는 다음과 같다.() => System.getProperty("user.dir")위의 각 함수들을 테스트하면 아래와 같이 수행할 수 있다.object FunctionTest extends App { val plusOne = (x:..
단일 상속만을 지원하는 언어들과는 다르게 스칼라는 클래스를 재사용을 위한 다른 개념을 가지고 있다. 새로운 클래스 정의내에 클래스의 정의를 새로운 멤버 정의로 재활용할 수 있다. 이것을 믹스인-클래스 컴포지션이라고 한다.abstract class AbsIterator { type T def hasNext : Boolean def next : T }다음으로는 AbsIterator를 상속한 믹스인 클래스를 고려해보자. 클래스를 믹스인으로 사용될 수 있게 정의하기 위해서 trait 키워드를 활용한다. trait RichIterator extends AbsIterator { def foreach(f : T => Unit) = { while (hasNext) f(next) } }다음은 String의 각 캐릭터를 ..
트래잇은 자바에서의 인터페이스와 유사하다. 트래잇은 지원해야하는 메소드 시그니처를 명시한다. 자바 8에서처럼 스칼라는 부분적인 구현을 지원한다. 몇몇의 메소드의 기본 구현을 제공할 수 있다는 것을 의미한다. 클래스와는 반대로 생성자 파라미터를 가질 수 없다.trait Similarity { def isSimilar(x : Any) : Boolean def isNotSimilar(x : Any) : Boolean = !isSimilar(x) }두개의 메소드를 가지고 있다. isSimilar는 구현을 제공하지 않고 있지만 isNotSimilar는 구현을 제공한다. 결과적으로 이 트래잇과 결합하는 클래스는 isSimilar에 대한 구현만 하면 된다. 트래잇은 일반적으로 mixin 클래스 컴포지션으로 클래스와 ..