JVM (Java Virtual Machine)

Java에서 프로그램을 실행 한다는 것은 컴파일 과정을 통해서 생성된 Class파일을 JVM으로 로딩하고 ByteCode를 해석(interpret) 하는 과정을 거쳐 메모리 등의 리소스를 할당하고 관리하며 정보를 처리하는 일련의 작업들을 포괄한다.

자바 가상머신

Thread 관리 및 Garbage Collection과 같은 메모리 정리 작업도 수행함.

  • 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행 하는것
  • JVM은 Java와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애 받지 않고 재사용을 가능하게 해줌
  • 메모리관리, Garbage collection을 수행
  • 스택 기반의 가상머신
  • "한번 작성해, 어디에서나 실행한다" 는 원칙!

JVM 구성 요소

JVM Architecture Diagram

ClassLoader를 통해 Class파일들을 로딩하고, 로딩된 Class파일들은 Execute Engine을 통해 해석 됨

해석된 프로그램은 Runtime Data Areas에 배치되어 실질적인 수행이 이루어짐

Java Source

사용자가 작성한 Java 코드 이다.

Java Compiler

Java Source를 JVM이 해석 할 수 있는 Java ByteCode로 변경

ClassLoader

JVM 내로 .class 파일들을 Load하여 Loading된 클래스들을 Runtime Data Area에 배치된다.

Execution Engine

Loading된 클래스의 ByteCode를 해석(interpret) 한다.

Runtime Data Area에 할당된 바이트 코드들은 ExecutionEngine에 의해 실행이 된다. 실행 엔진은 바이트 코드를 읽고 실행한다.

  • InterPreter : 바이트 코드명령어를 하나씩 읽어서 해석하고 실행.
    하나하나 해석은 빠르지만 전체적인 실행속도는 느리다는 단점.
  • JIT(Just In Time) Compiler : 인터프리터의 단점을 보완하기 위해 도입된것이 JIT.
    역할 : 인터프리터 방식으로 실행 되다가 같은 코드를 매번 해석하지 않고 실행 할때 컴파일을 하면서 해당코드를 NativeCode로 변경후에 캐싱한다. 이후에는 바뀐 부분만 컴파일하고 나머지는 캐싱된 코드를 사용함으로써 인터프리터의 속도를 개선할 수 있다.
  • Garbage Collector : 참조 되지 않는 오브젝트를 수집하고 제거

Runtime Data Area

JVM 이라는 프로세스가 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간

Method Area

클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역이다.( 모든 Thread가 공유한다)

Heap Area

New 명령어로 생성된 인스턴스와 객체가 저장되는 구역 (GarbageCollection 이슈는 이 영역에서 일어나며, 모든 Thread가 공유)

Stack Area

Method 내에서 사용되는 값들( 매개변수, 지역변수, 리턴값) 등이 저장되는 구역으로 메소드가 호출될때 LIFO(last in first out : 마지막에 나온것이 먼저 나간다) 로 하나씩 생성되고 메소드 실행이 완료되면 LIFO로 하나씩 지워진다.

(각 Thread 별로 하나씩 생성됨)

PC Register

CPU의 Register와 역할이 비슷하다. 현재 수행중인 JVM 명령의 주소값이 저장된다( 각 Thread별로 하나씩 생성)

Native Method Stack

다른 언어(C/C++) 의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역

참고

https://d2.naver.com/helloworld/1230

JVM Performance Optimizing 및 성능 분석 사례 -1장 JVM 메모리 구조

'ProgramLanguage > Java' 카테고리의 다른 글

JNDI (Java Naming and Directory Interface)  (0) 2020.08.30
Java8- Default 메서드(Abstract, Interface)  (0) 2020.03.18
JVM 튜닝  (0) 2020.02.10
Lambda_Expression(2)  (0) 2020.01.25
객체 지향 설계 5원칙 - SOLID  (0) 2019.12.26

스파크의 특징에는 한서버에서 큰데이터의 양을 처리할수 있다고하는데 어떻게 되는건지 궁금해서 찾아 보았다.

StackOverFlow에서 검색을 한 결과 두 가지의 설명이 있다.

내가 원하는 질문은 2번이지만, 1번의 글도 해석을 해보았습니다.

 

1. 질문 : 스파크의 주 메모리에 맞출 수 없을때 스파크가 큰 파일(페타 바이트)을 읽는 방법

대답 : Spark는 작업이 호출(action)될 때만 데이터 읽기를 시작한다. 작업이 호출되면 Spark가 파티션의 데이터를 로드 한다. 동시에 불러온 파티션의 수는 사용가능한 코어 수에 따라다르다. Spark에서 1partition = 1 core = 1 로 생각 할 수도 있다. 동시에 로드된 모든 파티션은 메모리에 맞아야한다. 그렇지 않으면 OOM이 표시됨

여러 단계가 있다고 가정하면 Spark는 로드된 파티션에서만 첫번째 변환 작업을실행한다. 로드된 파티션의 데이터에 변환을 적용하려면 출력을 셔플 데이터로 저장한 다음 더 많은 파티션을 읽고 난후 모든 데이터를 읽을때까지 계속 읽는다.

transform을 적용하지 않고 count만 하는 경우에는 Spark는 파티션의 데이터를 읽지만 클러스터에 데이터를 저장하지 않으며, count를 다시 수행하면 모든 데이터를 다시 한번 읽게된다. 이럴 경우 데이터를 여러변 읽게 되는데, 이를 방지 하기 위해서, cache와 persist를 사용한다.

persist(StorageLevel.MEMORY_ONLY) 와 persist(MEMORY_AND_DISK) 두 가지가 있는데, 메모리에만 저장할 경우에는 OOM이 표기될수도 있다. 그래서 메모리와 디스크에 저장을 하는데, 데이터가 디스크에 맞지 않으면 OS는 일반적으로 executor를 kill 한다.

https://stackoverflow.com/questions/46638901/how-spark-read-a-large-file-petabyte-when-file-can-not-be-fit-in-sparks-main

 

2. 질문 : 메모리 내 계산을위한 spark의 작동 메커니즘과 혼동되지 않습니다. spark가 인 메모리 처리를 수행하는 경우 16GB의 인 메모리 스토리지가있을 때 100TB의 데이터를 계산하는 방법

대답 : Spark는 머신의 리소스 및 컴퓨팅 기능에 맞는 데이터 블록에서 작동합니다. 이 작업은 여러 번 반복되어 스파크가 데이터를 메모리에로드하고 처리 한 후 다음 데이터 청크에서 작업하는 데 필요한 경우 결과를 디스크에 다시 기록합니다.

https://stackoverflow.com/questions/54959785/how-does-spark-do-in-memory-computation-when-size-of-data-is-far-larger-than-ava

2번 질문을 보면 데이터블록에서 동작하는것이고, 데이터를 메모리에 로드하고 처리한 후 데이터 청크에서 작업을 하고 결과를디스크에 다시 기록하고, 메모리가 부족한 경우에는 디스크와 메모리를 반복적으로 사용하는 것 같은데 자세한 내용은 다음에 정리하여 올리겠습니다.

빅데이터 처리를 위한 오픈소스 병렬 분산 처리 플랫폼


반복처리와 연속으로 이루어지는 변환처리 의 고속화

스파크는 특정한 데이터 셋에 대하여 반복처리와 연속적으로 이루어지는 변환 처리를 고속화 할 목적으로 개발

스파크가 등장하기전에는 어땠을까?

데이터를 처리 하기 위해 맵리듀스(MapReduce)가 널리 활용 되어왔다.

맵리듀스는 기본적으로 입력 데이터를 스토리지에 읽고 다수의 머신에 분산처리를 수행한 결과를 스토리지에 저장한다. 이 처리가 끝나지않는 경우에는 데이터가

읽기 -> 분산처리 -> 저장 을 계속 보존하여 수행한다.

맵리듀스를 처리하면 중간결과가 항상 스토리지에 저장되서 데이터 크기가 커도 문제가 없이 동작하며, 장애발생시에도 쉽게 복구 된다.

하지만 특정 데이터의 부분집합에 대해 여러번 처리 하는 애플리케이션일 경우에는 맵리듀스로 효울적인 처리가 어렵다.

매번 중간 데이터를 다시 읽어야 하기 때문에다.이럴경우 디스크의 출력에 많은 리소스가 발생한다.

반면에 Spark는 연속적인 처리에서 불필요한 디스크와 네트워크 I/O가 발생하지 않도록 처리 한다.

처리 전체를 검토한 뒤에 그에 맞는 최적화 처리를 끼워 넣는 방식으로 설계하여 맵 리듀스 보다 고속으로 처리가 가능하다.


TODO

  1. 하둡,Spark 로 map과 filter programming 코드 구현하고 비교하기(궁금함)

시행착오에 적합한 환경제공

한 대의 머신으로 처리할 수 있는 용량보다 더 큰 데이터셋에 대해 시행 착오가 가능한 환경을 제공함

파이썬, Matlab, 등 다양한 애널리틱스 툴들은 데이터 해석을 한정적인 분석을 하기에 적합한 환경이다. 하지만 한 대 의 서버에서 처리할 수 있는 용량을 넘어서는 데이터셋에 대해서는 위의 소프트웨어들은 현실적이지 않음.

큰 데이터셋에 대해서는 스카일아웃과 같은 방법을 선택하고, 여러대의 머신으로 병렬 분산 처리를 수행할 필요가 있다.


Spark는 데이터셋을 추상적으로 다루기 위한 RDD(Resilient Distribued Dataset) 이라는 것이 있는데, RDD가 제공하는 API로 변환을 기술하기만 하면 처리가 되게 구현되어있다.


서로 다른 처리를 통합해 이용할 수 있는 환경

배치 처리, 스트림처리, SQL 처리 ,머신러닝, 그래프 처리 와 같은 형태의 애플리케이션을 하나의 환경에서 통합적으로 다룰 수 있다는 점

위의 다양한 형태의 어플리케이션을 구현하려면 각 프로그래밍 모델에 따라 애플리케이션을 별도로 구성을 해야했지만, 동일한 환경에서 사용이 가능하다.

예를 들면, SQL로 데이터 클랜징, 필터링 후에 머신러닝, 다시 SQL로 처리 하는 것을 구현해야한다고하면? 기존에는 각각의 미들웨어를 사용하여 처리하고 이동하고 복잡한구성을 만들수도 있었지만, 스파크 에서는 하나의 동일한 애플리케이션에서 구현하여 처리가 가능하다.

미들웨어의 병행에 운용하는 경우와 비교하여 운용 부담을 줄일 수 있다.


용어

Shuffle : 파티션의 위치가 변경되는 작업

+ Recent posts