SparkSessionWrapper

  • SparkSessionWrapper를 생성하는 이유는 SparkSession을 시작/중지하는 비용이 크기 때문에
  • SparkSession을 하나 생성해서 빠르게 코드 수행이 가능하다.
  • trait은 java에서 interface를 생각하면 된다. 사용하기 위해서는 with를 통해 확장이 가능하다.
  • 여기서 lazy를 사용하는 이유는 정의된 spark의 변수가 처음 사용될때 코드가 실행되도록
    • that a val is executed when it is defined
    • a lazy val is executed when it is accessed the first time.
  • getOrCreate의 메소드는 SparkSession이 있으면 가져오고, 없으면 새로 생성하는 메소드

Lazy Example

null을 골라내서 개수

join

print 하는 방법

데이터 읽기/쓰기

spark로 프로젝트할때 python? scala? 고민을 하게되는데, 이때 가장 큰 고민은
scala의 경우에는 build하는 sbt, maven을 사용을 해야하는 점이다.
python을 사용하는 사람은 보통 build하는데 익숙하지 않다. 그래서 package의 dependencies를 관리하는게 매우 번거로움
그래서 찾다가보니 proejct를 처음 시작할때 도움을 주는 툴이 있었다.

http://www.foundweekends.org/giter8/

$ mkdir <project_root>
$ sbt new scala/scala-seed.g8

위 명령을 실행하고 나면 해당 디렉토리에 아래와 같은 파일들이 생긴다

build.sbt  project  src

이렇게 제공하면 툴도아니지... 이미 여러개의 template이 존재한다.

Template

$ sbt new scala/scala-seed.g8 --branch myBranch 
$ sbt new holdenk/sparkProjectTemplate.g8
  • sparkProjectTemplate
  • 위 템플릿을 입력하면 아래와 같이 프로젝트 이름, organization, package, library 설정이 가능하다
  • 참고로 project의 이름은 package 이름에 organization + project_name이 되기 때문에 -을 쓰면 에러 발생
This is a g8 template for building a skeleton Spark project.

name [sparkProject]:

build 테스트

  • inputFile.txt에 단어 몇개를 입력하고 아래와 같이 명령어를 입력하면
sbt "run inputFile.txt outputFile.txt"
  • outputFile.txt의 디렉토리에 결과가 생긴다

build

  • sbt assembly를 하면 test가지 포함해서 실행해준다.

# 목표
es code분석이 필요해짐에 따라 es 소스를 intellij에 가져와서 debugging해보자.

# 가이드 문서
es버전 6.6이상에서 7.5이하면 아래 가이드 처럼 하면되는데,
https://www.elastic.co/kr/blog/how-to-debug-elasticsearch-source-code-in-intellij-idea 

7.5이상이라면, 아래 풀리퀘를 참고하여 변경된 부분만 원복해서 위와 같은 가이드로 진행하면 된다.
https://github.com/elastic/elasticsearch/pull/48188/files

 

Switch to debug with server=n by atorok · Pull Request #48188 · elastic/elasticsearch

Before this change one needed to re-start debugging several times, as we launched multiple JVMs in debug mode. With this option the IDE has the option to re-launch and listen for connections again ...

github.com


# 진행

1. es 소스 로컬에 가져오기.

git clone https://github.com/elastic/elasticsearch.git
cd elasticsearch 
git checkout --track origin/7.1


2.  gradle설치하고, java 설치하고, JAVA_HOME 설정하기.

((gradle 설치))
   * mac에서는 gradled은 homebrew로 간단하게 설치가되고
     window에서는 gradle홈피가서 zip파일 다운로드받아서 풀고, 환경변수, path만 잡아주면 됨.

((java 설치))
   * java는 es7.1기준 12가 필요해서, java12 설치함.
   . bash_profile에 java home설정해주고 source ~/.bash_profile
     vi ~/.bash_profile

export JAVA_HOME=/library/java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home
export PATH=${PATH}:$JAVA_HOME/bin


   * java 설치 파일 url : https://www.oracle.com/java/technologies/javase/jdk12-archive-downloads.html

 

Java Archive Downloads - Java SE 12

WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in production. For production use Oracle recommends downlo

www.oracle.com


3. ./gradlew idea
   * 일단 terminal에서 es repository를 클론해온 elasticsearch 디렉터리로 가서 ./gradlew idea 를 실행
   * 이거 해놓고 intellij에서 import해야 자연스럽게 gradle project import가 편해지는 듯.

4. intellij 열어서, import project > gradle 체크 하고 > 오픈.

5. intellij에 gradle auto enable 이런거 뜨면 ok 체크 해주고, 

6. intellij > file > project setting 가서 jdk 12로 변경해주기.
   * platform setting > sdk에서 jdk12 설치한 거 홈으로 잡아주고,
   * project setting > project에서 project sdk를 jdk12로 잡아주기.

7. 소스 폴더 distribution>build.gradle에서 xpack.security.enabled'를 false로 바꿔줘야 localhost에서 rest api사용가능함.

8. intellij 터미널에서 ./gradlew run --debug-jvm 실행.
   * 하다가 뻑나면 ./gradlew clean하고, ./gradlew idea하고 다시 실행.

9. 아래와 같이 run#start가 뜨면 된건데, 이때 intellij>run>attach to process를 누르고 방금 빌드완료한 snapshot넣어주면,
    디버깅 준비 완료!!
    ============-> 98% EXECUTING [33m 6s]
    > :distribution:run#start

10. 이제 break point 걸어서, localhost:9200/_cluster/settings 등등 api날려보면서 코드 디버깅 할 수 있음.

  • vi에서 indentation을 맞추는게 생각보다 까다롭다. 어떤 툴을 써서 각자의 코드에 맞게 수정을 한다던지...
  • how-do-i-fix-the-indentation-of-an-entire-file-in-vi 에서 indentation 파일 전체를 하는방법이 있다.
  • 참고로 gg는 파일 첫번째 줄로 이동, G는 파일 맨끝으로 이동, ==은 indentation 아래는 이명령어의 조합을 사용
파일 전체 들여쓰기
gg=G    

To indent the all the lines below the current line  
\=G

# To indent the current line

To indent n lines below the current line  
n==

For example, to indent 4 lines below the current line  
4==

To indent a block of code, go to one of the braces and use command  
\=% 
  • 이렇게 하면 들여쓰기가 자동으로 맞춰지는 무슨 기준으로 맞춰지는걸까...
  • indent-multiple-lines-quickly-in-vi 에 상당히 자세하게 나와있다 이후에 한번 살펴보자

오늘부터 자주 사용하게 되는 리눅스 명령어를 모아봐야겠다.

1. 메모리 현황 보기 : cat /proc/meminfo | grep Mem

cat /proc/meminfo | grep Mem
MemTotal:       131445188 kB
MemFree:         6539336 kB
MemAvailable:   52647956 kB

* Free memory is the amount of memory which is currently not used for anything. This number should be small, because memory which is not used is simply wasted. Available memory is the amount of memory which is available for allocation to a new process or to existing processes.
* free memory는 현재 어떤 것에도 사용되지 않는 메모리이고, 사용되지 않는 메모리는 낭비되기때문에 사이즈가 작음.
available memory는 새로운 프로세스 또는 존재하는 프로세스에 allocation할 수 있는 메모리.

2. 특정 port가 사용되는지 보기 : sudo netstat -ntlp | grep :5044
port가 listen되고 있는지 볼 수 있음.


3. cpu 현황 전체 보기 : cat /proc/cpuinfo

processor 수만 따로 보기 : grep -c processor /proc/cpuinfo

 

1. automatic garbage collection.

프로그램에서 <사용되고있거나 or 참조되고있는> 객체와 <사용되지않거나 or 참조되고있지않는> 객체를 구별하여,
<사용되지않고 or 참조되지않고있는> 객체가 사용하는 메모리를 회수 할 수 있다.
c에서는 수동 프로세스인데, java에서는 automatic process!

2. process

  • step1. marking
    • 마킹단계에서는 모든 객체들을 스캔하여, 어떤것이 안쓰이는지를 마킹함.
  • step2. normal deletion
    • 참조되는 객체는 남기고, 참조되지 않는 객체는 지우고, 메모리 할당은 free space를 가르키고, 메모리 할당이 이루어져야 할때 free space를 찾는다.
  • step3. deletion with compacting
    • 남겨진 참조되는 객체들을 compact 압축 할 수 있다.
    • 남겨진 객체들을 모음으로써 새로운 메모리 할당을 더욱 쉽고, 빠르게 할 수 있음. ---- 선택?

3. the generatinal garbage collection process.

대부분의 객체들은 아주 짧은 수명을 지님.
시간이 지남에 따라 더 적은 수의 객체가 할당 된 상태로 유지 됨.
실제로 대부분의 객체는 그래프 왼쪽값이 높을 수록 수명이 매우 짧음.
jvm성능 강화를 위해 위의 내용을 참고하여 jvm generations개념을 도입함.

young generation은 1개의 eden영역과 2개의 survivor영역(s0, s1)이 존재.
지난 글 참조. 2020/02/19 - [우리는 개발자] - [java] GC에 관하여.

  • step1. 새로운 객체가 eden영역에 할당됨. survivor영역은 빈곳으로 시작.
  • step2. eden영역 모두 차면, 마이너 gc발생 : 참조되는 객체가 s0 영역으로 이동되고, 참조되지 않는 영역은 지워짐.
  • step3. 다음 gc에도 같은 일이 eden영역에서 벌어지는데, 참조되지 않는 영역은 지워지고 참조되는 영역은 s1 으로 이동.                               s0에 있던 객체들도 s1로 이동. 이동할때마다 age가 1씩 늘어나는 셈.
  • step4. 모든 surviving 객체가 s1으로 이동되면 s0과 eden이 모두 클리어된 상태. survivor공간에는 age가 다른 객체들이 존재하게됨.
  • step5. 다음 minor gc에도 같은 프로세스가 반복됨. 이때에 survivor spaces들이 전환됨.
  • step6. minor gc이후 오래된 객체들은 특정 age(treshold)에 도달하면 old generation으로 승격됨.
  • step7. 계속해서 minor gc가 일어나다가, 결국에는 old genertaion에서 major gc도 발생하게 됨.

그림으로 살펴보면 아래와 같은 흐름이 됨.

* 아주 잘 정리되어있는 오라클 공식문서 

4. jvm java garbage collectors 옵션 설정.

-Xms : jvm start할때 초기 heap size.
-Xmx : maximum heap size.
-Xmn : young gengeration size.
-XX:PermSize : starting size of the permanent generation.
-XX:MaxPermSize : the maximu, size of the Permanent Generation

1. JRE

Java Runtime Environment = java virtual machine(JVM) + java platform core calsses + supporting java platform libraries

2. JAVA (object-oriented programming language)

  • 1) platform independence
    • java 애플리케이션은 bytecode로 컴파일 됨. 그리고 jvm위에 올라가서 동작함. 그래서 다른 os, 다른 device에도 잘 돌아감.
  • 2) object-oriented
    • c와 c++ feature를 많이 차용한 object-oriented 언어임.
  • 3) automatic garbage collection
    • java는 자동적으로 메모리를 할당하고, 해제함. 프로그램이 그 일을 해야하는 버든이 없음.
  • 4) rich standard library
    • 미리 만들어진 오브젝트들이 많음. input/output, networking, date manipulation과 같은 일을 수행하기 위한

3. jdk

  • jdk (java development kit)은 java 애플리케이션을 developing하기 위한 툴의 컬렉션임.
  • 즉, jdk로 java program을 컴파일하고, jvm에서 돌릴 수 있음.
  • jdk는 application을 패키징하고, 배포해주는 기능까지 함.

4. 정리하면 ? jdk는 complile할때 필요한거고, jre는 run할때 필요한것인데

  • jdk설치하면 jre까지 전부 설치됨.
  • jdk와 jre는 서로 java application programming interfaces를 공유함.
  • java api는 java application을 만들기 위해 사용되는 패키징된 라이브러리의 컬렉션.

5. jvm

  • 추상화된 computing machine임.

+ Recent posts