re

git .gitignore 설정 후 반영이 안될때

www-PC MINGW32 /c/dev/repos/sourcetree/scala (master)
$ git rm -r --cached .
rm '.cache-main'
rm '.classpath'
rm '.gitignore'
rm '.project'

www-PC MINGW32 /c/dev/repos/sourcetree/scala (master)
$ git add .

www-PC MINGW32 /c/dev/repos/sourcetree/scala (master)
$

www-PC MINGW32 /c/dev/repos/sourcetree/scala (master)
$ git commit -m "fixed untracked files"
[master 997536c] fixed untracked files
 4 files changed, 2 insertions(+), 26 deletions(-)
 delete mode 100644 .cache-main
 delete mode 100644 .classpath
 delete mode 100644 .project



저장소에 추적하지 않을 파일을 삭제하고 차후 무시 --cached 옵션을 추가하면 로컬파일도 삭제한다.

$ git rm --cached filename


저장소와 로컬에는 파일이 존재하지만 업데이트 정보를 갱신하지 않을 경우 

$ git update-index --assume-unchanged [경로]


source tree 에서 머지가 필요하다고 나오는 경우

$ git status

$ git mergetool




'소스버젼관리' 카테고리의 다른 글

[Git] revert, reset 차이점  (0) 2017.02.23

http://www.w3ii.com/ko/php7/default.html


http://php.net/manual/kr/migration71.new-features.php




잠시 거슬러 올라가서

필자가 중3시절에 1.6GB 대용량 하드에 CPU 133MHZ 를 자랑하던 나름 슈퍼컴을 쓰면서

레드햇을 깔아보겠다고 개고생하던게 생각난다.



이런 고려짝 얘기를 왜하냐면

나도 모르겠다.

구글링 하다 이리저리 문서를 뒤져보다 보니 격세지감이 느껴져서 한마디 할까 해서 적는다.


당시에 낡은 레드햇 책한권으로 Linux 하나 까는데 한달이 걸렸던거 같다.

문서도 귀했지만 찾기도 쉽지 않았다.


정말 막혀서 안풀리면 01410 이였던가? 200원 주고 구리선 구해다 모뎀에 연결하고

PC통신에 접속해서 문서 몇개 구하면 그렇게 좋을 수가 없었다.

(나중에 전화비 10만원 나온건 안자랑)


플로피디스켓, 5.25인치 디스켓, 시디롬 까지 다 슬롯이 있었던 최고의 슈퍼컴이였다.

당시 1995년인가 250만원인가 300만원이였던것으로 기억한다.

(아버지가 된 지금에서 생각해보니 부모님 참 고맙네요)


구글링 조금 해보니 실제 내가 썼던 부팅 화면이 바로 나온다.




요새는 개발자하기 참 좋아 보인다는 생각이 든다.

예전엔 좋은 개발자가 되기 위해선 좋은 '멘토'가 필수적이였다.

그만큼 삽질의 연속이였고 그 문제를 해결할 방안이 그렇게 많지 않았다.

스스로 처음부터 디버깅해서 찾아내는것이 대다수였으니... 멘토를 가지고 있는 사람과 그렇지 않은 사람과는

차이가 분명했으리라.


반면 요즘은 위에 멘토는 '구글느님' 하나로 족하다.

족하다 못해 과분하다.


오픈소스 진영에서는 과분할 정도로 좋은 소스들이 쏟아진다.

과거와 비교할 수 없는 양질의 자료들이 pdf, slide 등 보기 좋은 파일로 공유가 쏟아진다.


지금 잠잘 시간이 있는가?


Geek 스럽게 끈기를 가지고 노력하다 보면 분명 당신은 좋은 개발자가 될 수 있다.



덧.

향후 20년 후에는 지금 모습이 위와같이 회자될꺼라 생각하니 더 소름끼친다.

VR 인터페이스로 AI 디바이스와 커뮤니케이션 하면서 실체가 없는 PC와 선들이 없는 작업 환경에서

과거 구글이라는 1차적 검색엔진에 사람들이 열광하던 모습을 보고 피식~ 거릴꺼라 본다.




원문 http://www.atmarkit.co.jp/ait/articles/1202/10/news122.html


아래는 번역한 것입니다.



Twitter와 Foursquare , LinkedIn 이 사용하는 "Scala"

 Scala "는 표준 Java 플랫폼에서 동작 할 수있는 프로그래밍 언어입니다. 2003 년경에 등장한 비교적 새로운 언어이지만, 이미 Twitter와 Foursquare, LinkedIn의 채용 실적도 있습니다. 국내(일본)에서도 일부 채용 사례가있는 것 같습니다.

 이름 Scala (스칼라)는 "확장 (확장 가능) 언어"를 의미합니다. Scala는 Java의 Generics ( 제네릭 )의 설계 등에도 관여 한 스위스 연방 공과 대학 (EPFL)의 Martin Odersky (마틴 주문 스키) 교수에 의해 설계 및 개발되었습니다.

 교수에 따르면, Scala 언어 개발 동기로서 다음의 두 가지가 있다고되어 있습니다 ( Wikpedia 에서 인용).

  1. 범용 언어는 확장이 아니고서는 안된다. 같은 개념으로 작은 프로그램도 큰 프로그램도 기술 할 수 있어야한다
  2. 확장 성 (확장 성)는 함수형 언어 와 객체 지향 언어 의 두 가지 프로그래밍의 개념을 통합하고 일반화함으로써 실현할 수있다

 개발 동기에있는 것처럼 Scala는 작은 스크립트 용도에서 대규모 시스템에서 사용하는 언어로서의 용도까지 다양한 요구에 부응 할 수 있도록되어 있습니다. 그리고 그 확장 성을 제공하기 위해, "객체 지향 언어와 함수형 언어의 개념을 결합 해 '라는 특징을 가지고 있습니다.

 또한 Scala 공식 사이트에서 Scala의 소개 글에서는 먼저 다음과 같이 언급하고 있습니다 ( Scala 공식 사이트 에서 인용).

Scala is a general purpose programming language designed to express common programming patterns in a concise,

elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages,

enabling Java and other programmers to be more productive.

Code sizes are typically reduced by a factor of two to three when compared to an equivalent Java application.

 일본어 번역입니다 ( 프로그래밍 언어 Scala 일본어 정보 사이트 에서 인용).

Scala는 일반적인 프로그래밍 패턴을 간결하게 · 우아한 · 그리고 형태 안전하게 표현하기위한 범용 프로그래밍 언어입니다.

Scala는 객체 지향 기능과 함수형 언어의 기능을 잘 통합하고, Scala를 사용하여 Java 및 기타 프로그래머의 생산성은 더욱 향상 될 것입니다.

Scala 코드 크기는 일반적으로 동일한 기능을 제공하는 Java 응용 프로그램에 비해 2 분의 1 ~ 3 분의 1 정도입니다.

 "객체 지향 함수형 언어의 기능을 통합함으로써보다 간결하게 코드를 작성하고 생산성을 향상 할 것"이라고 말했다.

코드를 Java와 Scala에서 비교해 보자

 여기에 하나 예를 살펴 보자. 아래의 코드는 '인수로 전달 된 문자열 목록 중 제 2 인수에 지정된 길이 이상의 요소 를 모두 대문자로 변환하고 그 요소를 함수 내부에서 새로 정의 된 목록에 추가하여 반환 "함수를 Java로 기술 한 것입니다.

public List filterNames ( List < String > names , int len ) {

List < String > result = new ArrayList ();

for ( String name : names ) {

if ( name . length () > = len ) {

result . add ( name . toUpperCase ());

}

} return result ;

}

Java 소스 코드

 목록 루프 돌려 요소마다 길이를 체크하여 조건에 맞는 요소를 함수 내부에 정의 된 목록에 추가합니다.

 동일한 작업을 Scala로 작성하면 이렇게됩니다.

   def filterNames ( list : List [ String ] len : Int ) = list . filter ( _ . length () > = len ) map ( _ . toUpperCase )    
Scala의 소스 코드

 전달 된 목록 길이 (len)에서 필터링 하고 결과 목록의 요소마다 모두 대문자로 변환 한 목록을 반환합니다. 어떻습니까? 물론, Java 코드보다 많이보다 적은 코드로되어 있습니다.

 이것은 매우 간단한 예는 있지만, Scala이라고 간결하고 이해하기 쉬운 코드를 쓸 것을 알 수 있습니다.

기존의 언어를 좋은 모습을 가지고 한 'Scala "의 5 가지 특징

 Scala는 다음과 같은 특징을 가지고 있습니다. 다양한 기능을 가지고 있습니다 만, Scala 만이 가지는 특별한 기능이라고하는 것은별로없고 기존의 프로그래밍 언어에서 좋은 점을 받아 들여 잘 균형을 가지고 있다고 생각합니다.

[1] Scala는 객체 지향 언어

 Scala는 순수 "객체 지향"언어입니다. 모든 값은 " 객체 "이며, 모든 작업은 " 방법 "입니다.

 Java의 int 및 double과 같은 기본 형식 은 존재하지 않습니다. 예를 들어, Scala에서 "1 + 2"라는 코드는 "Int 클래스 (값 1)의"+ "라는 메서드에 인수 2를 전달할 '라는 뜻입니다.

 또한 Scala에서는 객체 지향을 실현하기 위해 클래스 기반의 상속과 ' 믹스 인 합성」을 지원하고 있습니다.

 "믹스 인 합성 '은' 토레이토 "(Ruby에서 말하는 "모듈"Java로 말하면 '구현을 가질 인터페이스의 일종 ")를 사용하여 하나의 클래스에 여러 구현을 가지는 기능을 맞추는 것입니다.

[2] 함수형 프로그래밍이 가능

 함수형 프로그래밍 "이라는 단어는 최근 잘 듣는 키워드지도 모릅니다. 이것은 간단하게 말하면, 부작용 (데이터의 내부 상태를 변경할 수)를 가지지 않는 "함수"를 사용하여 프로그램을 구축하는 프로그래밍 기법입니다.

 함수형 프로그래밍의 장점으로 " 함수가 독립적이고"상태 "가 없기 때문에 가독성과 유지, 테스트, 리팩토링이 용이하게된다 "는 장점이 있습니다.

 Scala에서는 함수를 "퍼스트 클래스"로 간주합니다. 즉, "정수 나 문자열 등처럼 함수를 인수 또는 반환 값에있다" 라는 것입니다.

 또한 "상수"(val) 나 「불변 컬렉션 "을 사용하여 프로그래밍 가능 합니다 (※ 변수 (var)과 가변 컬렉션을 사용해도 상관 없습니다).

 이 같은 특징을 가지고 있기 때문에 표현력이 올라 간결한 작성할 수 있습니다.

 객체 지향과 함수형 프로그래밍은 대립하는 개념이 아니라 Scala에서는 각각 상승하고 간결한 묘사와 유연성을 실현하고 있습니다.

[3] 정적 타이핑

 정적 타이핑 "는 변수 나 함수가 미리 정해진 데이터 형을 처리하도록 정확한 설명을 요구하는 프로그래밍 언어의 특성입니다.

 Scala는 정적 타입 언어이기 때문에 안전하게 추상화가 가능한 타입 시스템 을 가지고 있습니다. 따라서 형식으로 인한 오류는 런타임이 아닌 컴파일시에 존재를 알 수 있습니다.

 "정적 타이핑이라고 형태의 기술로 프로그램이 중복되는 것은?"라고 생각하는 분들도 있을지 모릅니다. 하지만 Scala에서는 형태 추론 에 의해 형식 설명을 생략 할 수 간결한 표현을 가능하게하고 있습니다.

[4] Java와의 호환성

 Scala의 소스 파일을 컴파일하면 JVM (Java 가상 머신)의 바이트 코드입니다. Java 가상 머신에서 작동하기 때문에 Scala에서 Java의 메소드 나 필드를 호출 할 수 있으며, 반대의 경우도 가능 합니다.

 즉, 기존의 풍부한 Java 라이브러리를 그대로 활용할 수 있습니다 (※ 일부 예외 있음).

【5】 병행 처리

 현재 CPU의 멀티 코어 화 (하나의 프로세서에 여러 개의 프로세서 코어를 봉입 한 기술)이 일반화되고 있습니다. Java에서 병렬 처리 를 할 때 java.lang.Thread 클래스와 java.util.concurrent 패키지를 사용하여 병렬 처리를 수행합니다.

 Scala에서는 멀티 코어를 인식하고 효율적으로 병렬 처리를위한 'Actor'라는 라이브러리를 가지고 있습니다. 이것은 " 행위자 모델 '에 따라 라이브러리에서 액터끼리 메시지를 보내 서로를 처리하는 프로그래밍 모델입니다.

 또한 Scala 2.9는 병렬 처리 지원의 컬렉션 (palallel collection)가 사용 가능하게되었습니다. 이것은 컬렉션을 병렬화하여 각각의 스레드에서 수행 할 작업을 간단하게 작성할 수 있습니다.


'Programming > Scala' 카테고리의 다른 글

[Scala] 정규표현식  (0) 2017.04.28
[Scala] Scala가 자바보다 매력적인 이유  (0) 2017.04.04
[Scala] Overview  (0) 2017.01.25

- 정리를 통한 문서 간결성

- 글의 정확성

- 내용 전달



원래 포스팅 하나 하는 것이 쉬운것이 아니다.


그래도 예전 위키를 운영할 때는 곧잘 척척 했던거 같은데 

손놓고 있었더니 이제 문서 작성하는 감이 많이 죽었구나... 싶다.



현재 작성중인 글들만 15개가 넘고 정리하고 간결하게 다듬고 있는데

공개는 못하고 있다.



이 모든것이 스스로 정리가 안되는 내용이 많다보니 더 그런거 같네요.

앎이 깊어 질수록 글은 짧아지고 정확해 집니다.

그것이 안되니 답답하네요.


진득하니 해보자~!!!





Scala 란?


공식

https://www.scala-lang.org/



제작자

    1. Martin Odersky(독일) 2001년에 만듬
    2. 스위스 로잔 EPFL(로잔 연방공대)의 교수
    3. 타입세이프의 공동 창업자
    4. 자바 제네릭스 설계자의 일원
    5. javac 참조 컴파일러 최초 개발
    6. Coursera(온라인강의사이트) 에서 함수형 프로그래밍과 Principles Reactive Programming(진보된 웹 프로그래밍) 을 가르치고 있음.

목적
    1. Gj, Pizza 프로젝트에서 출발
    2. 컴포넌트 소프트웨어를 잘 지원하기 위한 언어 (자바가 많이 비대해졌음 / 대형 프로젝트에도 모듈별로 설계가능)
    3. Scalable, abstraction, composition, decompositio 을 충족하기 위해 암수형 언어가 필요했다.

특징

    1. Scalable Language 확장가능한 언어
    2. 순수 객체지향언어이며 클래스와 특성을 통한 고급 구성 요소 아키텍처를 지원한다. (스칼라 모든것이 객체이다)
          -> 1+1 구문에서 1도 객체임
    1. 다른 언어의 전통적인 디자인 패턴이 이미 적용되어 있다. (예: 싱글톤)
    2. 함수형 언어
    3. 암시적 클래스를 통해 자바와 관계없이 기존 작업에 새 작업을 추가 할 수 있다.
    4. 표준 자바 플랫폼에서 실행 (JVM 에서 실행)
    1. -> 자바와 스칼라는 자바 프로젝트에 같이 존재 할 수 있고 다른 프로젝트에 존재할 수 있다.
    2. -> 자바 라이브러리, 프레임워크 및 도구를 모두 사용할 수 있다.
    3. ant 또는 maven, Eclipse, IntelliJ, Netbeans 와 같은 IDE, Spring 또는 Hibernate 와 같은 프레임워크 모두 Scala 와 완벽하게 작동한다. 심지어 모든 JVM 과 안드로이드에서도 실행가능하다.
    4. 발전된 자바로 다루기 보다는 새로운 언어로 접근 하는 것이 낫다.

기능적인 특징

    1. 스칼라는 순수한 객체지향 언어이다.
    2. 개념적으로 모든 값이 객체이며 모든 연산은 메소드 호출이다.
    3. 이 언어는 클래스와 특성을 통한 고급 구성 요소 아키텍쳐를 지원합니다.
    4. 컬렉션 프레임워크 Scala 2.8 릴리즈에서 제공하는 것이 중요한 변화 이전에도 지원을 하긴 했고 프레임워크에서는 그것들과 호환됩니다.


함수형 언어?

함수형 프로그래밍 언어의 시초

IPL -> LISP -> Scheme -> Erlang -> Clojure -> Scala 의 갈래



기본 습득을 위한 문서

http://docs.scala-lang.org/index.html

가이드 및 개요

http://docs.scala-lang.org/overviews/?_ga=1.4105904.1400885517.1486215221

튜토리얼

http://docs.scala-lang.org/tutorials/

등등




Review

먼저 기초적인 문법을 살펴본 결과 의외로(?) 형식이 엄격하지 않다. (예: 메소드 return 타입 등)

코딩시 불필요한 입력을 최소화 할 수 있게 신경쓴 모습이 많다.

아래 메소드 정의 모두 같은 결과를 가진다.

def add(x:Int, y:Int):Int = {
	return x + y		
}
def add(x:Int, y:Int) = {
	x + y
}
def add(x:Int, y:Int) = x + y
그리고 변수 선언도 var, val 변수와 상수 구분 외 변수타입 설정이 없다.
for 문에서도 중첩 for 문을 ; 으로 구분해서 한라인으로 지정 가능하다.
뿐만아니라 
함수에서 getOrElse 구문으로 기본 리턴값을 지정 가능하다. 
switch 문에서도 break 생략이 가능하다.
세미콜론 ; 도 한라인에서 구분을 위한 것이 아니면 생략 가능하다.
결론.
그동안 기본 로직에서 예외처리를 해야 했던 것들을 없앴다.
언어적으로 쉽게 접근이 가능하도록 했다.
JAVA 플랫폼에서 연동이 강력하지만 오히려 JAVA 랭귀지 보다는 JAVASCRIPT 를 자주쓰던 개발자가 접근하기 더 용이해 보일 정도록 자바스크립트와 어느정도 유사하며 기존 랭귀지 형식에 얽매이지 않는 모습이다.
단, 이러한 기본 구조에서 문법들이 얽히고 설켜서 완성된 코드들을 보면 눈이 돌아간다.
하나씩 이해하고 넘어가던 문법들도 헷갈릴정도다.
뭔가 접근이 쉬운 언어같지만 또 어려운 언어같아 보인다.


스칼라 실행에 대해서

https://www.scala-lang.org/documentation/getting-started.html

터미널 & 쉘

> scala
This is a Scala shell.
Type in expressions to have them evaluated.
Type :help for more information.
scala> object HelloWorld {
    |   def main(args: Array[String]): Unit = {
    |     println("Hello, world!")
    |   }
    | }
defined module HelloWorld
scala> HelloWorld.main(Array())
Hello, world!
scala>:q
>


터미널 & 쉘 실행

자바 바이트 표준코드 생성
$ scalac HelloWorld.scala

클래스 파일 생성
$ scalac -d classes HelloWorld.scala

생성된 바이트 코드 실행
$ scala HelloWorld

옵션을 지정 할 수 있다. (cp 는 classpath 별칭)
$ scala -cp classes HelloWorld


스크립트로 실행  

#!/usr/bin/env scala
object HelloWorld extends App {
  println("Hello, world!")
}
HelloWorld.main(args)
$./script.sh


IDE 에서 실행

(생략..)







그외 참조할만한 문서


Programming.In.Scala 책 Summary 정리

https://github.com/wonury/Programming.In.Scala/wiki - 11장까지 하다 멈춤

https://github.com/codeport/scala/wiki/Programming-in-scala - 31장까지 진행. 거의 끝났음


자바 프로그래머를 위한 스칼라 튜토리얼

http://docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html


스칼라 예제소스

https://github.com/vkostyukov/scalacaster


휘리릭 읽어볼만

https://github.com/taokim/h3scala


개발환경

https://www.scala-lang.org/download/


그외 정리 잘된 문서

https://twitter.github.io/scala_school/


위키백과의 스칼라

https://ko.wikipedia.org/wiki/%EC%8A%A4%EC%B9%BC%EB%9D%BC_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)




공식 문서 : http://spark.apache.org/docs/latest/index.html


Apache Spark는 빠르고 일반적인 범용 클러스터 컴퓨팅 시스템입니다. 

Java, Scala, Python 및 R의 고급 API와 일반 실행 그래프를 지원하는 최적화 된 엔진을 제공합니다. 또한 SQL 및 구조화 된 데이터 처리를위한 Spark SQL, 기계 학습을위한 MLlib, 그래프 처리를위한 GraphX 및 Spark Streaming을 비롯한 다양한 고급 도구 세트를 지원합니다. 

아래 그림에서 자세히 알아봅니다.


특징

- 인메모리

- 단일 시스템에서 배치/스트림 처리, SQL, ML Graph 프로세싱 지원

- 자바 스칼라 파이션 등 인터페이스 제공

- Strandalone 은 물론 YARN, mesos 등의 클러스터 리소스 관리 패키지를 통해 다양한 환경에서 구동가능

- 8000 개 이상의 노드 추가 가능 확장성 확보

- HDFS, 카산드라, 흐브, S3 등 다양한 데이터의 활용 가능



Spark SQL - SQL / HiveQL 같은 쿼리 작업이 가능하게 해주는 라이브러리

RDD - 본 문서에서 다룸

DataFrame / DataSet - 테이블과 비슷한 형태로 Rows objects 들의 집합

- DataFrame/DataSet 은 다양한 input source 를 지원

- 존재하던 RDD

- JSON

- HiveQL

- ODBC / JCBC 서버 연동

 


RDD, DataFrame 뭐가 좋나?

https://databricks.com/blog/2016/01/04/introducing-apache-spark-datasets.html


Spark RDDs vs DataFrames vs SparkSQL

https://community.hortonworks.com/articles/42027/rdd-vs-dataframe-vs-sparksql.html 


이 내용은 별도 페이지로 정리하도록 한다.

http://dadk.tistory.com/74



Spark 구성요소




아파치 스파크 코어

스파크 코어 다른 모든 기능이에 구축 스파크 플랫폼의 기본 일반 실행 엔진입니다. 이는 인 메모리 컴퓨팅 및 외부 스토리지 시스템에서 참조하는 데이터 세트를 제공합니다.


스파크 SQL

스파크 SQL 구조화 및 반 구조화 된 데이터에 대한 지원을 제공 SchemaRDD라는 새로운 데이터 추상화를 소개 스파크 코어의 상단에 구성 요소입니다.


스파크 스트리밍

스파크 스트리밍 스트리밍 분석을 수행하는 코어의 빠른 스케줄링 기능을 스파크 활용합니다. 이 미니 일괄 적으로 데이터를 섭취 및 데이터의 그 미니 배치에 RDD (탄력 분산 데이터 집합) 변환을 수행한다.


MLlib (기계 학습 라이브러리)

MLlib는 스파크 위 때문에 분산 메모리 기반 스파크 아키텍처의 분산 기계 학습 프레임 워크입니다. 그것은, 벤치 마크에 따르면, 교류 최소 제곱 (ALS) 구현에 대한 MLlib 개발자에 의해 수행된다. 스파크 MLlib은 (두싯는 스파크 인터페이스를 얻은 전) 구 배 빨리 아파치 머하 웃의 하둡 디스크 기반 버전입니다.


GraphX

GraphX??는 스파크의 상단에 분산 그래프 처리 프레임 워크입니다. 이 프레 겔 추상화 API를 사용하여 사용자 정의 그래프를 모델링 할 수 그래프 연산을 표현하기위한 API를 제공한다. 또한이 추상화에 최적화 된 런타임을 제공합니다.


Spark Application 개발은 아래의 3가지에 대한 이해를 바탕으로 시작

1. RDD

2. RDD 변환 API (Scala / Python / java / R interface)

3. RDD 변환 API 로 만들어진 SQL / ML / graph / stream Library (Scala / python.. 상동)



1 성능

저장방식 : 메모리 Read-only

성능이 좋다. 기존 Hadoop, HadoopBM 과 비교해도 빠르다.

머신이 늘어나도 성능이 유지된다

기존에는

HDFS + MapReduce 하둡, SQL 질의를 위한 Hive, Oozie, 하둡->대량데이터 전송을 위한 Sqoop 등을 써야 했다.

하둡 API 자체도 어려웠고 접근이 더 어려움.


2 RDD (Resilient Distributed Datasets)

핵심 : RAM 으로 적재하면서 Read-only 로 처리

- 막말로 Spark 는 RDD + Interface 라 할 수 있다.

- 두가지 논문이 근간을 이룸

GFS

스탠포드 = 정석

사골 (읽어볼 수록 새로움)

RDD

버클리 = 개념원리

라면 (후루룩 읽힘)

- 배열 다루듯이 하면 된다. RDD 를 다룬다는건 컬렉션을 다룬다는 뜻.

- RDD 를 데이터를 생성하는 두가지 방법

* Parallelized 

sc.parallelize(Array(1,2,3,4,5))

* External Datasets 

sc.textFile("data.txt")

2-1 RDD 에 대해서 좀더 알아보자

RDD는 병렬로 작동 할 수있는 클러스터 노드간에 분할 된 요소 모음입니다. 

RDD는 Hadoop 파일 시스템 (또는 다른 Hadoop 지원 파일 시스템)이나 드라이버 프로그램의 기존 Scala 컬렉션에서 시작하여 파일을 변환하여 만들어집니다. 

사용자는 Spark에 메모리에 RDD를 유지하도록 요청하여 병렬 작업에서 효율적으로 재사용 할 수 있습니다. 

마지막으로, RDD는 노드 장애로부터 자동으로 복구됩니다. 

다음문서에서 Spark Shell 기반으로 RDD 핸들링 하는 방법과 관련 사항을 알아보도록 하겠다.

http://dadk.tistory.com/67

2-2 Dataset / DataFrames

RDD 보다 Dataset (dataframes) 이 더 빠르다

https://databricks.com/blog/2016/01/04/introducing-apache-spark-datasets.html

(RDD 와 Dataset 은 별도 포스팅으로 알아보도록 한다.)


3. DStream (Discretized Streams)

시간 흐름에 따른 순차적 데이터를 의미 내부적으로 DStream 은 각 시점에 RDD 스퀸스이다.

Flume, Kafka 또는 HDFS 와 같은 많은 input 유형으로 부터 생성될 수 있다.

Dtream 두가지 Operation

Transformation

    DStream 을 생성(파생)

    operation 은 두가지로 구분 할 수 있다.

        Stateless

            이전 Batch 결과 데이터에 영향을 받지 않는 데이터를 처리

            map(), filter(), reduceByKey() 같은 Operation 들

        Stateful

            이전 Batch 결과 데이터를 현재 Batch 결과를 만들기 위해 사용

            Sliding Window 나 기간내 상태 주적 등이 있다.

Output

    외부 데이터 저장소에 결과 저장


4 RDD 두가지 액션

- transformations 

데이터를 개발자가 원하는 모양으로 변형시키는 것

(map, reduce, join) 데이터의 이합집산, 지지고 볶는 흐름 단순히 map, reduce 만 있던 MR 보다 명령어 풍부

Trasfomation 의 결과는 항상 RDD 이다.

- Action 

모든 trasformations 결과를 내 높아라

trans->trans->....trans->action

액션을 실행하는 순간 데이터 변형(Transfomation)을 얻음(?) 결과는 value

Action 을 실행해야 Job 이 나온다.


Operation 의 순서를 기록해 DAG 로 표현한 것을 Lineage 라 부른다.

하나의 RDD 는 여러개의 파티션으로 나뉜다.


5. Spark Streaming

실시간 데이터 스트림의 확장 성, 높은 처리량, 내결함성 스트림 처리를 가능하게하는 핵심 Spark API의 확장입니다. 

http://spark.apache.org/docs/latest/streaming-programming-guide.html


Kafka, Flume, Kinesis 또는 TCP 소켓과 같은 많은 소스에서 데이터를 수집 할 수 있으며 map, reduce, join 및 window와 같은 고급 함수로 표현 된 복잡한 알고리즘을 사용하여 데이터를 처리 할 수 있습니다. 마지막으로 처리 된 데이터를 파일 시스템, 데이터베이스 및 라이브 대시 보드로 푸시 할 수 있습니다. 실제로 Spark의 기계 학습 및 그래프 처리 알고리즘을 데이터 스트림에 적용 할 수 있습니다.



6. Spark Application 처리 구조

Driver Program - main() 함수를 가지고 있는 프로세스 (SparkContext 객체를 생성하고 RDD 를 전달)

Application을 task 라고 불리는 실제 수행 단위로 변환을 task를 묶어서 Worker Node의 Excutor 로 전달

Worker Node - 실제 작업을 수행하는 노드 

Cluster Manager - 클러스터에서 필요한 자원을 찾아줌

Excutor 
- Task 를 수행하는 프로세스 Executor 가 오류가 나면 대체 Executor 에게 Job 할당 (멀티 스레드에서 tasks 를 수행하고 결과를 Driver Program 에게 전송) 
- Cache 하는 RDD 를 저장하기 위한 메모리 공간 제공
Task - 익스큐터에 할당되는 작업의 단위
Job - 사용자 입장에서의 작업의 단위 (Task 의 조합)


7. Spark Application 실행동작 순서 흐름
1 사용자 Spark-submit 을 사용해 작성 어플 실행
2 Submit 은 Driver Program 을 실행하여 main() 호출
3 Driver 에서  생성된 SparkContext 는 Cluster Manager 로 부터 Executor 실행을 위한 리소스 요청 
4 Cluster Manager 는 Excutor 를 실행
5 Driver Program 은 Application을 Task 단위로 나누어 Excutor 에게 전송
6 Executor 는 Task 를 실행
7 Executor 는 Application 이 종료되면 결과를 Driver Program 에게 전달하고 클러스터 매니저에게 리소스 반납.



참조할만한 문서

Spark SQL for SQL

    Hadoop의 Hive가 아닌 Spark SQL을 통해 SQL을 MapReduce없이 빠르게 처리가 가능합니다. 

    http://spark.apache.org/docs/latest/sql-programming-guide.html


Structed data processing

    Json, Parquet 등의 다양한 struced data processing을 지원합니다.

    

MLlib for machine learning

    Classification, Regression, Abnormal Detection, Clustering 등의 다양한 machine learning algorithm을 제공합니다. 

    http://spark.apache.org/docs/latest/ml-guide.html


GraphX for graph processing

    graph processing을 지원하는 GraphX를 제공합니다. 

    http://spark.apache.org/docs/latest/graphx-programming-guide.html


Spark Streaming.

    streaming처리가 가능한 storm처럼 spark에서도 batch processing 외에도 streaming처리가 가능합니다.

    http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html

    http://spark.apache.org/docs/latest/streaming-programming-guide.html


Launching on a Cluster

    Sparks를 클러스터에서 동작하게 하기 위해서는 cluster manager가 필요합니다.


Cluster Manager 종류 

    Amazon EC2

    Standalone Deploy Mode

    Apache Mesos

    Hadoop Yarn


Download

  스파크는 binary, build 버전을 받을 수 있습니다. [다운로드] 만약 binary를 다운로드 받으신다면, Hadoop버전에 맞는 package type을 선택하셔야 합니다. 저 같은 경우에는 hadoop2.6의 hdfs와 yarn위에서 동작시키기 위해 Hadoop 2.6 prebuilt된 버전을 다운로드 했습니다. 

wget http://d3kbcqa49mib13.cloudfront.net/spark-1.6.1-bin-hadoop2.6.tgz




그외


1. Spark 실행

스파크는 Windows, UNIX (e.g. Linux, Mac OS)에서 동작이 가능합니다. Spark를 사용하기 위해서는 사전 설치해야하는 항목들이 있습니다. Spark는 JVM위에서 동작하기 때문에 JAVA는 필수입니다. Java 7+, Python 2.6+, R 3.1+, Scala를 사용하기 위해서는 2.10을 설치해야 합니다.


2 Running the Examples and Shell

Spark를 다운로드 받으면 $SPARK_HOME/examples/src/main의 경로에 언어별로 간단한 예제를 제공하고 있습니다. 


3 Interactive Shell 지원

$SPARK_HOME/bin/pyspark --master local[2]

python interative shell도 제공을 합니다.

$SPARK_HOME/bin/spark-submit examples/src/main/python/pi.py 10

실행 결과는 Pi is roughly 3.140176


당연히 Scala 도 가능

$SPARK_HOME/bin/run-example SparkPi 10

interactive scala shell을 실행할 수 있습니다.  


3-1 master local[2] 옵션

$SPARK_HOME/bin/spark-shell --master local[2]

--master local[2] 옵션은 spark를 2개의 worker threads로 locally 실행한다의 의미 입니다. (--help로 확인 가능)더 자세한 내용은 아래 참고하세요. 

https://spark.apache.org/docs/latest/submitting-applications.html#master-urls



4. R 언어지원

Spark 1.4부터 R을 제공합니다.

$SPARK_HOME/bin/sparkR --master local[2]

$SPARK_HOME/bin/spark-submit examples/src/main/r/dataframe.R



참조문서

https://spark.apache.org/docs/1.6.2/streaming-programming-guide.html






'오픈소스 > Spark' 카테고리의 다른 글

Spark RDDs vs DataFrames vs SparkSQL  (0) 2017.06.18
[Spark] SQL and DataFrame  (0) 2017.04.10



Kafka 란?

http://kafka.apache.org/
http://kafka.apache.org/intro
http://kafka.apache.org/documentation/


설치

spark 와 마찬가지로 다운받아 별도 설치 없이 데몬을 띄움.

별다른 설정 없이 카프카 서버의 실행, 메세지 테스트를 진행합니다.

서버에 Java 1.7.x 이상이 설치되어 있어야 합니다.



구조


구조

Kafka는 발행-구독(publish-subscribe) 모델을 기반으로 동작하며 크게 producer, consumer, broker로 구성된다.

확장성 / 고가용성을 위해 브로커들을 클러스터로 구성 동작.


기본 동작

producer 특정 topic 메시지를 생성 전달 -> Broker 분산처리 (Zookepper) Topic 별로 적재(Topic 은 파티션별로 쪼개져 각서버에 분산) -> 해당 Topic 을 구독하는 Consumer 가 메시지를 가져가서 처리


설명

Producers

    - 메시지 송신 API

    - 특정 Topic에 해당하는 메시지를 생성하는 프로세스, 메시지를 Broker에 전달(발행/Publish)

    - Producers는 데이터를 그들이 선택한 Topic으로 publish한다.

    - Producer가 메시지를 실제로 어떤 partition으로 전송할지는 사용자가 구현한 partition 분배 알고리즘에 의해 결정된다. 예를 들어 라운드-로빈 방식의 partition 분배 알고리즘을 구현하여 각 partition에 메시지를 균등하게 분배하도록 하거나, 메시지의 키를 활용하여 알파벳 A로 시작하는 키를 가진 메시지는 P0에만 전송하고, B로 시작하는 키를 가진 메시지는 P1에만 전송하는 형태의 구성도 가능하다.

Consumer

    - 메시지 수신 API

    - Broker에게서 구독(Subscribe)하는 Topic의 메시지를 가져와 사용(처리)하는 프로세스

    - Topic 당 할당된 스레드 개수만큼 스레드가 만들어지면 Partition 으로부터 메세지를 읽음.

    - 하나의 스레드는 1개 이상 partition 으로 부터 메시지를 읽을 수 있다.

    - public void run 메소드 내 while(is.hasNext())에서 블록킹돼 있다가 파티션으로 메시지가 들어오면 이 곳에서 메시지를 읽는다. 따라서 다른 타겟으로 메시지를 처리하는 데 적합한 장소라고 할 수 있다. 즉 메시지를 파일로 저장하던지 대용량 입력이 가능한 하둡이나 NoSQL로 저장하기에 유용하다.

Broker

    - 토픽을 기준으로 메시지 관리

    - broker 는 클러스터로 구성 (이에 대한 분산 처리는 zookeeper 가 처리)

    - Producers와 Consumers가 만날 수 있도록 메시지를 관리하는 서버 클러스터로 Producer에게서 전달받은 메시지를 Topic별로 분류한다. 

    - 여러대의 Broker Cluster로 구성 가능하며, Zookeeper에 의해 각 노드가 모니터링 된다.



그외

Topic

    - 발행(Publish)된 메시지들의 category

    - 유사한 메시지들의 집합이다. 프로듀서는 메시지를 전달할 토픽을 반드시 지정해야 한다.

    - partition 단위로 클러스터 각 서버들에 분산 저장

    - 각 partition 은 0부터 1씩 증가하는 offset 값을 메시지에 부여 (partition 내 메시지 식별)

    - 클러스터내 메시지들은 설정된 기간동안 유지 후 삭제됨 

Log 

    Producers가 생성한 메시지

Consumer API

    - 컨슈머 구현에 두가지 API 제공 Simple Consumer API, High-Level Consumer API  

    - 세부적인 것들은 모두 추상화되어 있어 몇 번의 간단한 함수 호출로 consumer를 구현할 수 있는 High Level Consumer API

    - offset과 같은 세부적인 부분까지 다룰 수 있지만 이 때문에 구현하기가 상당히 까다로운 Simple Consumer API가 제공된다(이름은 simple이지만 전혀 simple하지 않다).

리플리케이션(Replication) 

    - Fault Tolerance 위해 파티션 단위로 복제한다.

Partition

    - 로드밸런싱을 목적으로 토픽을 논리적으로 분할하는 것을 의미한다.



기존의 메시징과 차이점

1 기존 broker -> consumer 로 push 카프카 반대로 pull 로 땡겨옴.

2 이로 인해 필요한 메시지만 broker 에서 가져오므로 최적의 성능. 그리고 pull 방식이라 batch 처리 구현 가능.

3 카프카는 파일로 저장 연속성 상승 (대용량에 적합) - HDD 의 순차읽기는 SSD에 7배 정도만 느리다.

4 AMQP 프로토콜이나 JMS API를 사용하지 않고 단순한 메시지 헤더를 지닌 TCP기반의 프로토콜을 사용하여 오버헤드 감소


기본 클러스터 구조도





기본 예제

# 토픽생성
# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".


# log stash 에서 들어올 토픽도 하나 생성해 둔다. 
# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic logstash_logs
logstash_logs

참고로 토픽 삭제시 --delete 옵션을 주면 된다.

bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic 토픽이름

# 토픽리스트
# bin/kafka-topics.sh --list --zookeeper localhost:2181
logstash_logs
test
# 프로듀서 메시지 생성
# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
message.
line enter.
hello world.
# 컨슈머 메시지 받기 
# 이제 새창에서 위 프로듀서로 메세지를 전송하면 실시간으로 받는다.
# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from beginning
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
message.
line enter.
hello world.

hello
hi
asdf
asdf
as
df
as
df


hhahaha
======================================



실행 오류시

실행시 오류가 나온다면 JDK 버젼 및 64bit 여부 확인 

또는 JAVA_HOME 설정 (.profile) 이 되어 있는지 확인한다.




다음은 데이터 생산 스크립트를 실행하는 예다.


kafka-producer-perf-test.sh --topic test_topic \  

--throughtput 700 \

--record-size 2000 \

--num-recored 200000 \

--producer-props \

bootstrap.servers=kafka01.server:9092,kafka02.server:9092  



다음은 데이터 소비 스크립트를 실행하는 예다.

kafka-consumer-perf-test.sh \  

--zookeeper kafka01.server:2181,kafka02.server:2181 \

--messages 200000 \

--topic test_topic \

--threads 2 \

--show-detailed-stats \

--broker-list kafka01.server:9092,kafka02.server:9092 \

--group test_group



참고 

kafka-producer-perf-test.sh 파일과 kafka-consumer-perf-test.sh 파일을 옵션 없이 실행하면 스크립트 사용 방법을 확인할 수 있다.



토픽명 alter 도 가능.

bin/kafka-topics.sh —zookeeper localhost:2181 --alter --topic topic_name 
--parti-tions count


+ Recent posts