<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devhrxoobm.itwiki.kr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC</id>
	<title>IT 위키 - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://devhrxoobm.itwiki.kr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC"/>
	<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/w/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC"/>
	<updated>2026-09-16T04:28:08Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8_%EC%8A%A4%ED%86%A0%EC%96%B4&amp;diff=40997</id>
		<title>레이 오브젝트 스토어</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8_%EC%8A%A4%ED%86%A0%EC%96%B4&amp;diff=40997"/>
		<updated>2025-05-13T21:13:44Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이 오브젝트 스토어는 Ray에서 분산된 객체 데이터를 저장하고 공유하기 위한 메모리 기반 저장소이다. ==개요== Ray의 오브젝트 스토어는 Plasma를 기반으로 구현되었으며, 각 노드에 로컬 저장소가 존재하지만, 클러스터 전체에서 논리적으로 연결되어 하나의 분산 캐시처럼 동작한다. Remote 함수나 액터 메서드의 결과값은 이 오브젝트 스토어에 저장되며, ObjectRef를...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이 오브젝트 스토어는 Ray에서 분산된 객체 데이터를 저장하고 공유하기 위한 메모리 기반 저장소이다.&lt;br /&gt;
==개요==&lt;br /&gt;
Ray의 오브젝트 스토어는 Plasma를 기반으로 구현되었으며, 각 노드에 로컬 저장소가 존재하지만, 클러스터 전체에서 논리적으로 연결되어 하나의 분산 캐시처럼 동작한다. Remote 함수나 액터 메서드의 결과값은 이 오브젝트 스토어에 저장되며, ObjectRef를 통해 참조된다.&lt;br /&gt;
==특징==&lt;br /&gt;
*모든 객체는 불변(immutable)이며, 직렬화되어 저장된다.&lt;br /&gt;
*각 노드는 자체 오브젝트 스토어를 가지며, 객체는 요청이 있을 때 다른 노드로 전송된다.&lt;br /&gt;
*객체는 수동 복제가 아닌 요청 기반 복사를 통해 전파된다.&lt;br /&gt;
*Ray는 참조 횟수를 추적하여 더 이상 필요하지 않은 객체를 자동으로 제거한다.&lt;br /&gt;
*객체 크기가 작을 경우 인라인으로 직접 반환되고, 클 경우 오브젝트 스토어에 저장된다.&lt;br /&gt;
==주요 기능==&lt;br /&gt;
*Remote 함수와 액터의 반환값 또는 인자로 사용되는 객체 저장&lt;br /&gt;
*`ray.put()`을 통해 직접 객체를 저장하고 ObjectRef를 생성할 수 있음&lt;br /&gt;
*다른 노드가 객체를 필요로 하면 원 소유자에게 요청하여 복사&lt;br /&gt;
*메모리 부족 시 가비지 컬렉션 또는 디스크로 스필링 수행&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
data = [1, 2, 3]&lt;br /&gt;
obj_ref = ray.put(data)&lt;br /&gt;
result = ray.get(obj_ref)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장애 허용==&lt;br /&gt;
*소유자 노드가 소실되면 해당 객체도 손실된다.&lt;br /&gt;
*모든 복사본이 존재하는 노드가 사라진 경우에도 객체가 소실되며, ObjectLostError가 발생한다.&lt;br /&gt;
*객체 재구성이 가능할 경우, lineage 정보를 기반으로 자동 재생성할 수 있다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[레이 (분산 컴퓨팅)]]&lt;br /&gt;
*[[레이 ObjectRef]]&lt;br /&gt;
*[[레이 리모트 함수]]&lt;br /&gt;
*[[레이 Raylet]]&lt;br /&gt;
*[[글로벌 컨트롤 스토어]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. OSDI 2018.&lt;br /&gt;
*Ray Documentation. &#039;&#039;Object Store&#039;&#039;. https://docs.ray.io&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_GCS&amp;diff=40996</id>
		<title>레이 GCS</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_GCS&amp;diff=40996"/>
		<updated>2025-05-13T21:06:26Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이 GCS(Global Control Store)는 Ray 클러스터의 전역 상태 정보를 저장하고 관리하는 중앙 구성 요소이다. ==개요== GCS는 Ray 클러스터 내 모든 작업, 객체, 함수, 이벤트 등의 메타데이터를 저장하는 전역 키-값 저장소로, Ray의 제어 흐름을 중앙 집중화하여 구성 요소 간의 복잡한 상태 동기화를 단순화한다. Ray 2.0 이후부터는 GCS(Global Control Service)라는 명칭으로 불린다. ==...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이 GCS(Global Control Store)는 Ray 클러스터의 전역 상태 정보를 저장하고 관리하는 중앙 구성 요소이다.&lt;br /&gt;
==개요==&lt;br /&gt;
GCS는 Ray 클러스터 내 모든 작업, 객체, 함수, 이벤트 등의 메타데이터를 저장하는 전역 키-값 저장소로, Ray의 제어 흐름을 중앙 집중화하여 구성 요소 간의 복잡한 상태 동기화를 단순화한다. Ray 2.0 이후부터는 GCS(Global Control Service)라는 명칭으로 불린다.&lt;br /&gt;
==주요 기능==&lt;br /&gt;
*작업(Task), 객체(Object), 함수(Function), 이벤트(Event) 테이블 저장&lt;br /&gt;
*클러스터 상태를 위한 Pub/Sub 기능 제공&amp;lt;ref&amp;gt;Pub/Sub은 Publish-Subscribe의 줄임말로, 생산자(Publisher)가 전송한 메시지를 수신자(Subscriber)가 비동기적으로 받아보는 방식이다. Ray에서는 작업 상태 변경, 객체 생성 등과 같은 이벤트를 GCS가 브로드캐스트하면, 이를 구독한 구성 요소들이 수신하여 처리한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
*Web UI, 디버깅, 프로파일링 툴 등에 정보 제공&lt;br /&gt;
*구성 요소의 상태 복구 시 참조되는 계보(lineage) 정보 유지&lt;br /&gt;
*액터 메타데이터(IP, 포트 등) 등록 및 조회&lt;br /&gt;
==특징==&lt;br /&gt;
*GCS는 기본적으로 헤드 노드에서 실행된다.&lt;br /&gt;
*모든 구성 요소는 GCS를 통해 간접적으로 상태를 공유하기 때문에 자체적으로는 무상태(stateless)로 유지된다.&lt;br /&gt;
*이러한 구조는 장애 발생 시 재시작을 용이하게 하며, 구성 요소 간 독립 확장을 가능하게 한다.&lt;br /&gt;
==장애 허용==&lt;br /&gt;
*기본적으로 GCS는 단일 장애 지점(SPOF)이다.&lt;br /&gt;
*Ray 2.0 이상에서는 외부 고가용성 Redis를 활용하여 Kubernetes 환경에서 GCS 장애 허용 구성이 가능하다.&lt;br /&gt;
==역할 요약==&lt;br /&gt;
*클러스터의 중앙 메타데이터 저장소&lt;br /&gt;
*작업 스케줄링 및 객체 배포 시 상태 기준점 제공&lt;br /&gt;
*구성 요소 재시작 및 복구를 위한 기준 상태 보존&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[레이 (분산 컴퓨팅)]]&lt;br /&gt;
*[[레이 Raylet]]&lt;br /&gt;
*[[레이 리모트 함수]]&lt;br /&gt;
*[[레이 ObjectRef]]&lt;br /&gt;
*[[레이 리모트 액터]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. OSDI 2018.&lt;br /&gt;
*Ray Team. &#039;&#039;Global Control Store (GCS)&#039;&#039;. https://docs.ray.io&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_%EB%A6%AC%EB%AA%A8%ED%8A%B8_%EC%95%A1%ED%84%B0&amp;diff=40995</id>
		<title>레이 리모트 액터</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_%EB%A6%AC%EB%AA%A8%ED%8A%B8_%EC%95%A1%ED%84%B0&amp;diff=40995"/>
		<updated>2025-05-13T21:01:50Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이 리모트 액터는 상태를 유지하는 객체를 분산 환경에서 실행할 수 있도록 지원하는 Ray의 실행 단위이다. ==개요== Remote Actor는 @ray.remote 데코레이터가 붙은 클래스이며, 각 인스턴스는 클러스터 내의 단일 워커 프로세스로 생성된다. 일반 remote 함수와 달리 액터는 내부 상태를 유지할 수 있으며, 메서드 호출은 비동기적으로 실행되고 ObjectRef를 반환한다. 액터는...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이 리모트 액터는 상태를 유지하는 객체를 분산 환경에서 실행할 수 있도록 지원하는 Ray의 실행 단위이다.&lt;br /&gt;
==개요==&lt;br /&gt;
Remote Actor는 @ray.remote 데코레이터가 붙은 클래스이며, 각 인스턴스는 클러스터 내의 단일 워커 프로세스로 생성된다. 일반 remote 함수와 달리 액터는 내부 상태를 유지할 수 있으며, 메서드 호출은 비동기적으로 실행되고 ObjectRef를 반환한다. 액터는 순차적으로 메시지를 처리하여 상태 충돌 없이 일관성을 유지한다.&lt;br /&gt;
==특징==&lt;br /&gt;
*상태(state)를 유지할 수 있음&lt;br /&gt;
*하나의 액터는 하나의 워커 프로세스에서 실행됨&lt;br /&gt;
*메서드 호출은 remote 함수처럼 ObjectRef를 반환&lt;br /&gt;
*모든 메서드 호출은 직렬화되어 순차적으로 실행됨&lt;br /&gt;
*액터 풀을 통해 병렬 처리 가능&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
class Counter:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.n = 0&lt;br /&gt;
&lt;br /&gt;
    def increment(self):&lt;br /&gt;
        self.n += 1&lt;br /&gt;
&lt;br /&gt;
    def read(self):&lt;br /&gt;
        return self.n&lt;br /&gt;
&lt;br /&gt;
counter = Counter.remote()&lt;br /&gt;
counter.increment.remote()&lt;br /&gt;
print(ray.get(counter.read.remote()))  # 출력: 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==동작 방식==&lt;br /&gt;
*액터는 생성 시 GCS에 등록되며, 메타데이터(IP, 포트 등)가 저장된다.&lt;br /&gt;
*이후 메서드 호출은 gRPC를 통해 액터 프로세스에 직접 전달된다.&lt;br /&gt;
*액터 생성 요청은 먼저 Actor Creation Task로 등록되고, 완료 전이라도 핸들은 반환된다.&lt;br /&gt;
*자원 할당은 액터 생성 시 수행되며, 메서드 호출 시에는 별도 자원 할당이 필요 없다.&lt;br /&gt;
==장애 허용==&lt;br /&gt;
*액터는 상태를 가지므로 복구가 복잡하다.&lt;br /&gt;
*메시지 처리 중 실패: 자동 재시도되지 않음&lt;br /&gt;
*메시지 처리 전/후 실패: 최대 max_restarts 또는 max_retries`횟수까지 자동 복구 가능&lt;br /&gt;
*초기화 실패는 첫 번째 메시지 실패로 간주됨&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[레이 (분산 컴퓨팅)]]&lt;br /&gt;
*[[레이 리모트 함수]]&lt;br /&gt;
*[[레이 ObjectRef]]&lt;br /&gt;
*[[레이 Raylet]]&lt;br /&gt;
*[[글로벌 컨트롤 스토어]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. OSDI 2018.&lt;br /&gt;
*Ray Documentation. &#039;&#039;Actors&#039;&#039;. https://docs.ray.io&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_%EB%A6%AC%EB%AA%A8%ED%8A%B8_%ED%95%A8%EC%88%98&amp;diff=40994</id>
		<title>레이 리모트 함수</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_%EB%A6%AC%EB%AA%A8%ED%8A%B8_%ED%95%A8%EC%88%98&amp;diff=40994"/>
		<updated>2025-05-13T20:57:17Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이 리모트 함수는 Ray에서 분산 비동기 처리를 위해 사용하는 기본 실행 단위이다. ==개요== 리모트 함수(Remote Function)는 `@ray.remote` 데코레이터를 통해 정의되며, 클러스터의 여러 노드에서 병렬로 실행될 수 있는 비동기 태스크를 생성한다. 함수 호출 시 결과값이 즉시 반환되는 대신, 미래 결과를 참조하는 ObjectRef 객체가 반환되며, `ray.get()`을 통해 최종 값을 가져...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이 리모트 함수는 Ray에서 분산 비동기 처리를 위해 사용하는 기본 실행 단위이다.&lt;br /&gt;
==개요==&lt;br /&gt;
리모트 함수(Remote Function)는 `@ray.remote` 데코레이터를 통해 정의되며, 클러스터의 여러 노드에서 병렬로 실행될 수 있는 비동기 태스크를 생성한다. 함수 호출 시 결과값이 즉시 반환되는 대신, 미래 결과를 참조하는 ObjectRef 객체가 반환되며, `ray.get()`을 통해 최종 값을 가져올 수 있다.&lt;br /&gt;
==특징==&lt;br /&gt;
*함수 호출 시 즉시 ObjectRef 반환&lt;br /&gt;
*비동기 실행을 통해 병렬 처리 가능&lt;br /&gt;
*클러스터 자원 상황에 따라 실행 노드가 자동으로 결정됨&lt;br /&gt;
*작은 결과는 직접 반환되며, 큰 결과는 객체 저장소에 저장됨&lt;br /&gt;
*`@ray.remote(max_retries=n)`으로 자동 재시도 횟수 지정 가능&lt;br /&gt;
==실행 과정==&lt;br /&gt;
1. 사용자가 remote 함수를 호출하면 ObjectRef가 반환된다. 2. 호출자는 해당 작업의 소유자가 되며, 의존성 객체가 준비될 때까지 대기한다. 3. 준비 완료 시 Ray 스케줄러가 적절한 노드에 자원을 할당한다. 4. 작업 명세는 gRPC를 통해 워커에게 전달된다. 5. 작업이 실행되고 결과는 object store에 저장되며 ObjectRef와 연결된다.&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def square(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [square.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장애 허용==&lt;br /&gt;
*응용 수준 오류: 예외가 결과로 반환되며 자동 재시도되지 않음&lt;br /&gt;
*시스템 수준 오류: 워커 프로세스 장애 등의 경우 최대 설정 횟수만큼 자동 재시도됨&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[레이 (분산 컴퓨팅)]]&lt;br /&gt;
*[[레이 리모트 액터]]&lt;br /&gt;
*[[레이 ObjectRef]]&lt;br /&gt;
*[[레이 Raylet]]&lt;br /&gt;
*[[글로벌 컨트롤 스토어]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. OSDI 2018.&lt;br /&gt;
*Ray Documentation. &#039;&#039;Remote Functions&#039;&#039;. https://docs.ray.io&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_ObjectRef&amp;diff=40993</id>
		<title>레이 ObjectRef</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_ObjectRef&amp;diff=40993"/>
		<updated>2025-05-13T20:54:37Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이 ObjectRef는 Ray에서 원격 함수 또는 액터 호출의 결과를 참조하기 위한 객체 참조자이다. ==개요== ObjectRef는 Ray에서 분산 비동기 실행을 지원하기 위해 사용하는 참조 메커니즘이다. remote 함수나 액터 메서드를 호출하면 즉시 결과값이 반환되는 것이 아니라, 해당 결과를 가리키는 ObjectRef 객체가 반환된다. ObjectRef는 작업이 완료되었을 때 결과를 가져올 수 있도...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이 ObjectRef는 Ray에서 원격 함수 또는 액터 호출의 결과를 참조하기 위한 객체 참조자이다.&lt;br /&gt;
==개요==&lt;br /&gt;
ObjectRef는 Ray에서 분산 비동기 실행을 지원하기 위해 사용하는 참조 메커니즘이다. remote 함수나 액터 메서드를 호출하면 즉시 결과값이 반환되는 것이 아니라, 해당 결과를 가리키는 ObjectRef 객체가 반환된다. ObjectRef는 작업이 완료되었을 때 결과를 가져올 수 있도록 연결된 참조 역할을 한다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*비동기 실행 결과를 지연 참조(lazy reference)할 수 있다.&lt;br /&gt;
*Ray 클러스터 내 객체의 위치를 추적할 수 있는 메타데이터를 포함한다.&lt;br /&gt;
*`ray.get(ObjectRef)`를 호출하면 해당 결과를 가져온다.&lt;br /&gt;
*하나의 객체는 여러 ObjectRef를 통해 참조될 수 있다.&lt;br /&gt;
==생성 방식==&lt;br /&gt;
*Remote 함수 또는 액터 메서드 호출 시 자동 생성된다.&lt;br /&gt;
*ray.put()을 통해 명시적으로 객체를 저장하고 ObjectRef를 생성할 수도 있다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x + 1&lt;br /&gt;
&lt;br /&gt;
obj_ref = f.remote(10)&lt;br /&gt;
result = ray.get(obj_ref)  # result = 11&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==내부 동작==&lt;br /&gt;
*ObjectRef는 고유 식별자(ID)를 통해 Ray의 객체 저장소에 저장된 데이터를 가리킨다.&lt;br /&gt;
*소유자(owner)는 ObjectRef의 수명 주기를 관리하며, 참조 카운트를 통해 자동 메모리 해제(GC)가 이루어진다.&lt;br /&gt;
*참조된 객체가 다른 노드에 있을 경우, Ray는 소유자로부터 복사 정보를 받아와 로컬 노드에 복제한다.&lt;br /&gt;
==장애 허용==&lt;br /&gt;
*소유자 노드가 사라질 경우, ObjectRef도 함께 소실될 수 있다.&lt;br /&gt;
*객체가 저장된 모든 노드가 사라지면, ObjectLostError가 발생한다.&lt;br /&gt;
*GCS에 저장된 작업 계보(lineage)를 통해 객체 재생성(reconstruction)이 가능한 경우도 있다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[레이 (분산 컴퓨팅)]]&lt;br /&gt;
*[[레이 리모트 함수]]&lt;br /&gt;
*[[레이 리모트 액터]]&lt;br /&gt;
*[[레이 Raylet]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. OSDI 2018.&lt;br /&gt;
*Ray Team. &#039;&#039;Object References in Ray&#039;&#039;. https://docs.ray.io&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_Raylet&amp;diff=40992</id>
		<title>레이 Raylet</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_Raylet&amp;diff=40992"/>
		<updated>2025-05-13T20:50:16Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이 Raylet은 Ray 분산 컴퓨팅 프레임워크의 핵심 구성 요소로, 각 워커 노드에서 태스크 실행과 객체 저장을 관리하는 경량 프로세스이다. ==개요== Raylet은 Ray 클러스터 내의 각 노드에서 실행되며, 태스크 스케줄링과 객체 저장소 관리를 담당한다. Ray 0.x 버전에서는 글로벌 스케줄러와 로컬 스케줄러가 분리되어 있었으나, Raylet 구조가 도입되면서 이 기능들이 단일...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이 Raylet은 Ray 분산 컴퓨팅 프레임워크의 핵심 구성 요소로, 각 워커 노드에서 태스크 실행과 객체 저장을 관리하는 경량 프로세스이다.&lt;br /&gt;
==개요==&lt;br /&gt;
Raylet은 Ray 클러스터 내의 각 노드에서 실행되며, 태스크 스케줄링과 객체 저장소 관리를 담당한다. Ray 0.x 버전에서는 글로벌 스케줄러와 로컬 스케줄러가 분리되어 있었으나, Raylet 구조가 도입되면서 이 기능들이 단일 프로세스에 통합되었다. Raylet은 분산 스케줄러와 오브젝트 스토어를 하나의 프로세스로 구성하여 통신 효율성과 시스템 단순성을 높였다.&lt;br /&gt;
==구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;로컬 스케줄러(Local Scheduler)&#039;&#039;&#039;: 로컬 노드에서 실행 가능한 작업을 수락하고 실행한다. 자원이 부족하거나 작업이 다른 노드에서 더 적절하게 실행될 경우, 다른 노드로 위임한다.&lt;br /&gt;
*&#039;&#039;&#039;객체 저장소(Object Store)&#039;&#039;&#039;: Plasma 기반으로 구현되며, 분산된 캐시 역할을 수행한다. 작업의 입력 및 출력 객체를 저장하고 공유한다.&lt;br /&gt;
==주요 기능==&lt;br /&gt;
*태스크의 의존성 분석 및 준비 완료 대기&lt;br /&gt;
*클러스터 내에서 적절한 노드로 작업 분산&lt;br /&gt;
*작업 결과를 공유 메모리 기반 객체 저장소에 저장&lt;br /&gt;
*자원 요구사항을 기반으로 스케줄링 의사결정 수행&lt;br /&gt;
*노드 간 통신 및 글로벌 컨트롤 스토어(GCS)와 메타데이터 연동&lt;br /&gt;
==작동 방식==&lt;br /&gt;
&lt;br /&gt;
# 클라이언트로부터 태스크 요청이 들어오면 Raylet은 먼저 필요한 객체가 로컬에 있는지 확인한다. &lt;br /&gt;
# 객체가 준비되면 태스크를 실행하거나, 다른 노드로 위임한다. &lt;br /&gt;
# 결과는 로컬 객체 저장소에 기록되며, 필요 시 다른 노드로 전파된다. &lt;br /&gt;
# 실행 결과는 ObjectRef를 통해 클라이언트에게 전달된다.&lt;br /&gt;
&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[레이 (분산 컴퓨팅)]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. OSDI 2018.&lt;br /&gt;
*The Ray Team. &#039;&#039;Ray Architecture Overview&#039;&#039;. https://docs.ray.io&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40991</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40991"/>
		<updated>2025-05-13T20:42:50Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==아키텍처==&lt;br /&gt;
[[파일:레이 아키텍처.png|섬네일|레이 아키텍처]]&lt;br /&gt;
Ray 클러스터는 &#039;&#039;&#039;헤드 노드(head node)&#039;&#039;&#039;와 하나 이상의 &#039;&#039;&#039;워커 노드(worker node)&#039;&#039;&#039;로 구성된다.&lt;br /&gt;
===헤드 노드===&lt;br /&gt;
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;Global control store (GCS)&#039;&#039;&#039;: 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.&lt;br /&gt;
*&#039;&#039;&#039;Autoscaler&#039;&#039;&#039;: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.&lt;br /&gt;
헤드 노드는 기본적으로 &#039;&#039;&#039;단일 장애 지점(single point of failure)&#039;&#039;&#039;으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 &#039;&#039;&#039;고아 노드(orphaned node)&#039;&#039;&#039;가 되어 수동으로 제거해야 할 수 있다.&amp;lt;ref&amp;gt;Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== 워커 노드===&lt;br /&gt;
각 워커 노드는 &#039;&#039;&#039;Raylet&#039;&#039;&#039;이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.&lt;br /&gt;
*&#039;&#039;&#039;Object store&#039;&#039;&#039;: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.&lt;br /&gt;
*&#039;&#039;&#039;Scheduler&#039;&#039;&#039;: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.&lt;br /&gt;
==리모트 함수==&lt;br /&gt;
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.&lt;br /&gt;
*동일한 코드를 여러 코어나 머신에서 실행 가능&lt;br /&gt;
*오류 발생 시 자동 재시도 등 내결함성 제공&lt;br /&gt;
*큰 파라미터도 효율적으로 처리 가능&lt;br /&gt;
*프로세스 간 정보 전달이 용이함&lt;br /&gt;
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 &#039;&#039;&#039;ObjectRef&#039;&#039;&#039; 형태로 반환된다. ObjectRef란 실제 결과가 저장될 미래 객체에 대한 일종의 포인터이다.&lt;br /&gt;
===실행 방식===&lt;br /&gt;
*사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.&lt;br /&gt;
*ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.&lt;br /&gt;
*remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 동작 흐름 ===&lt;br /&gt;
&lt;br /&gt;
* 함수 호출자는 해당 작업의 &#039;&#039;&#039;소유자(owner)&#039;&#039;&#039;가 되며, ObjectRef를 관리한다.&lt;br /&gt;
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.&lt;br /&gt;
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.&lt;br /&gt;
*[[GRPC (RPC 프레임워크)|gRPC]]를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.&lt;br /&gt;
**작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.&lt;br /&gt;
===오류 처리===&lt;br /&gt;
*&#039;&#039;&#039;응용 수준 오류&#039;&#039;&#039;: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 수준 오류&#039;&#039;&#039;: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.&amp;lt;ref&amp;gt;max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
==리모트 액터==&lt;br /&gt;
Remote function은 상태를 갖지 않는(stateless) 함수의 병렬 실행에 적합하다. 그러나 상태를 유지해야 하는 경우에는 Remote Actor를 사용한다.&lt;br /&gt;
===개요===&lt;br /&gt;
*상태를 유지하는 객체를 분산 환경에서 사용할 수 있게 해주는 기능이다.&lt;br /&gt;
* &#039;&#039;&#039;@ray.remote&#039;&#039;&#039; 데코레이터를 클래스에 붙여 사용한다.&lt;br /&gt;
*액터는 하나의 프로세스로 실행되며, 그 안의 상태는 외부에서 접근할 수 없다.&lt;br /&gt;
*상태 변경은 해당 액터에 메시지를 보내는 방식으로만 가능하다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
class Counter(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.n = 0&lt;br /&gt;
&lt;br /&gt;
    def increment(self):&lt;br /&gt;
        self.n += 1&lt;br /&gt;
&lt;br /&gt;
    def read(self):&lt;br /&gt;
        return self.n&lt;br /&gt;
&lt;br /&gt;
counters = [Counter.remote() for i in range(4)]&lt;br /&gt;
[c.increment.remote() for c in counters]&lt;br /&gt;
futures = [c.read.remote() for c in counters]&lt;br /&gt;
print(ray.get(futures))  # [1, 1, 1, 1]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 액터 모델 ===&lt;br /&gt;
&lt;br /&gt;
* 액터는 고유 주소(handle)를 가진 프로세스이다.&lt;br /&gt;
&lt;br /&gt;
*내부 상태는 외부에서 직접 접근할 수 없으며, 메시지를 통해 간접적으로만 조작할 수 있다.&lt;br /&gt;
*각 액터는 메시지를 하나씩 순차적으로 처리하므로 상태 충돌이 발생하지 않는다.&lt;br /&gt;
*상태를 나누거나 복제할 수 있다면, 여러 액터 풀을 구성하여 처리량을 향상시킬 수 있다.&lt;br /&gt;
===동작 방식===&lt;br /&gt;
*Ray는 액터를 새로운 워커로 생성하고, 그 이후 모든 메서드는 해당 워커에서 실행된다.&lt;br /&gt;
*액터 생성은 GCS에 등록되어 메타데이터(IP, 포트 등)를 공유한다.&lt;br /&gt;
*각 클라이언트는 GCS를 재조회하지 않고, 캐시된 메타데이터로 직접 gRPC를 통해 액터에게 메시지를 전송한다.&lt;br /&gt;
*메서드 호출은 remote function과 동일하게 ObjectRef를 반환한다.&lt;br /&gt;
=== 장애 처리===&lt;br /&gt;
*액터는 상태를 가지므로 복구가 더 복잡하다.&lt;br /&gt;
*메시지 처리 중 실패 시 자동 재시도되지 않는다.&lt;br /&gt;
*메시지 사이에서 실패한 경우, Ray는 다음 호출 시 최대 설정된 횟수만큼 재시도한다.&lt;br /&gt;
*초기화 실패도 첫 메시지 실패와 동일하게 처리된다.&lt;br /&gt;
==장애 허용==&lt;br /&gt;
Ray는 애플리케이션 계층과 시스템 계층으로 구성되어 있으며, 두 계층 모두 장애 복구 기능을 갖추고 있다.&lt;br /&gt;
===시스템 계층 구성 요소===&lt;br /&gt;
*&#039;&#039;&#039;Global Control Store (GCS)&#039;&#039;&#039;: Ray의 전체 상태를 저장하는 중앙 구성 요소&lt;br /&gt;
*&#039;&#039;&#039;분산 스케줄러&#039;&#039;&#039;: 작업 분배 및 자원 할당을 담당&lt;br /&gt;
*&#039;&#039;&#039;분산 오브젝트 저장소&#039;&#039;&#039;: 객체 데이터를 클러스터 내에서 분산 관리&amp;lt;ref&amp;gt;GCS를 제외한 구성 요소는 수평 확장 및 장애 허용이 가능하다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Global Control Store (GCS)===&lt;br /&gt;
* GCS는 시스템 상태를 중앙에서 유지하여 나머지 구성 요소들이 무상태(stateless)로 설계되도록 한다.&lt;br /&gt;
*구성 요소가 장애로 인해 재시작되면, GCS에서 상태를 읽어와 복구한다.&lt;br /&gt;
*이를 통해 객체 저장소와 스케줄러를 독립적으로 확장할 수 있다.&lt;br /&gt;
*기본적으로 GCS는 헤드 노드에 존재하며, 단일 장애 지점(SPOF)이 된다.&lt;br /&gt;
===Remote Function의 장애 허용===&lt;br /&gt;
*Remote function은 상태가 없기 때문에 복구가 간단하다.&lt;br /&gt;
* 시스템 오류로 실패한 작업은 지정된 최대 횟수만큼 자동 재시도된다.&lt;br /&gt;
*응용 오류(Exception 발생)는 자동 재시도되지 않고, 예외 객체로 반환된다.&lt;br /&gt;
*최대 재시도 횟수는 `@ray.remote(max_retries=n)`으로 설정 가능하다.&lt;br /&gt;
=== Remote Actor의 장애 허용===&lt;br /&gt;
*액터는 상태를 갖기 때문에 복구가 더 복잡하다.&lt;br /&gt;
* 초기화, 메시지 처리 중, 요청 간 등 어떤 단계에서도 실패할 수 있다.&lt;br /&gt;
====메시지 처리 중 실패====&lt;br /&gt;
*자동 재시도되지 않음&lt;br /&gt;
*다음 메시지를 처리할 때까지 대기하며, 최대 max_restarts 횟수까지 액터를 재시작한다.&lt;br /&gt;
==== 요청 간 실패====&lt;br /&gt;
*다음 메시지 호출 시 자동으로 액터를 복구한다.&lt;br /&gt;
* 상태 복구 로직이 적절히 구현되어 있다면 실패는 느린 처리 외에는 큰 영향을 주지 않는다.&lt;br /&gt;
*상태 복구 로직이 없을 경우, 액터는 초기 상태로 재시작된다.&lt;br /&gt;
===기타 사항===&lt;br /&gt;
*대부분의 자원은 애플리케이션 종료 시 자동 정리된다.&lt;br /&gt;
*&#039;&#039;&#039;Detached&#039;&#039;&#039; 리소스(예: detached actor, placement group)는 클러스터가 유지되는 한 계속 유지된다.&amp;lt;ref&amp;gt;이로 인해 클러스터의 자동 스케일 다운이 방지될 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
==기타 설계 사항==&lt;br /&gt;
===직렬화(Serialization)===&lt;br /&gt;
*Ray는 Plasma in-memory object store를 사용하여 객체를 노드 간 및 프로세스 간 효율적으로 전달한다.&lt;br /&gt;
*NumPy 배열은 zero-copy 방식으로 같은 노드 내 여러 워커가 공유할 수 있다.&lt;br /&gt;
*Plasma에 저장된 객체는 불변이며(shared memory)에 저장된다.&lt;br /&gt;
*객체는 요청이 있을 때에만 다른 노드로 전송되며, 사전 복제되지 않는다.&lt;br /&gt;
===리소스 관리===&lt;br /&gt;
*기본적으로 함수와 액터는 동일한 자원(CPU 1개)을 요구한다.&lt;br /&gt;
*GPU, 메모리 등 필요한 자원을 명시할 수 있으며, 스케줄러는 이를 고려하여 실행 노드를 할당한다.&lt;br /&gt;
* 자원이 부족한 경우, 오토스케일러가 필요한 사양을 가진 노드를 추가한다.&lt;br /&gt;
===자동 스케일링(Autoscaler)===&lt;br /&gt;
*오토스케일러는 다음을 담당한다:&lt;br /&gt;
**워커 노드 생성&lt;br /&gt;
**워커 노드 제거&lt;br /&gt;
**워커 재시작&lt;br /&gt;
===배치 전략(Placement Groups)===&lt;br /&gt;
*Placement group은 작업과 자원을 함께 배치하기 위한 논리적 단위이다.&lt;br /&gt;
*사전 자원 할당(preallocation)을 통해 작업 지연을 줄일 수 있다.&lt;br /&gt;
*&#039;&#039;&#039;Pack&#039;&#039;&#039;: 하나의 노드에 최대한 묶어 배치하여 locality 향상&lt;br /&gt;
*&#039;&#039;&#039;Spread&#039;&#039;&#039;: 여러 노드에 분산 배치하여 신뢰성 및 부하 분산 확보&amp;lt;ref&amp;gt;Placement group은 CPU, GPU 등 자원 묶음 단위로 구성된다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
===네임스페이스(Namespaces)===&lt;br /&gt;
*Ray는 작업과 액터를 논리적으로 그룹화하기 위해 네임스페이스를 사용한다.&lt;br /&gt;
*기본적으로 익명 네임스페이스에서 실행된다.&lt;br /&gt;
*여러 프로그램에서 동일한 액터를 공유하려면 동일한 네임스페이스를 명시해야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ray.init(namespace=&amp;quot;bdad&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===의존성 관리===&lt;br /&gt;
*Conda 또는 virtualenv 기반으로 동적 환경 구성이 가능하다.&lt;br /&gt;
* 런타임 환경을 함수 단위로 설정할 수도 있다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ray.init(runtime_env={&amp;quot;pip&amp;quot;: &amp;quot;requirements.txt&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
@ray.remote(runtime_env={&amp;quot;conda&amp;quot;: [&amp;quot;some_package&amp;quot;]})&lt;br /&gt;
def some_function(x): ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Job API===&lt;br /&gt;
*클러스터에 작업을 제출하고 추적할 수 있는 API를 제공한다.&lt;br /&gt;
*작업 ID로 상태를 조회하거나 실행 로그를 확인할 수 있다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%8C%8C%EC%9D%BC:%EB%A0%88%EC%9D%B4_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98.png&amp;diff=40990</id>
		<title>파일:레이 아키텍처.png</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%8C%8C%EC%9D%BC:%EB%A0%88%EC%9D%B4_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98.png&amp;diff=40990"/>
		<updated>2025-05-13T20:41:56Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;출처: https://www.linkedin.com/posts/vishnu-pradeep65_ray-architecture-basics-101-a-ray-cluster-activity-7101243889704964096-G-Yn/&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=GRPC_(RPC_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)&amp;diff=40989</id>
		<title>GRPC (RPC 프레임워크)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=GRPC_(RPC_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)&amp;diff=40989"/>
		<updated>2025-05-13T20:39:13Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: gRPC는 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크이다. ==개요== gRPC는 Google에서 개발한 내부 RPC 시스템에서 유래하였으며, 현재는 다양한 언어와 플랫폼에서 사용할 수 있는 일반 목적의 RPC 프레임워크로 발전하였다. HTTP/2를 기반으로 하며, 바이너리 직렬화 형식인 프로토콜 버퍼(Protocol Buffers)를 사용하여 높은 성능과 효율적인 통신을 지...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;gRPC는 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
gRPC는 Google에서 개발한 내부 RPC 시스템에서 유래하였으며, 현재는 다양한 언어와 플랫폼에서 사용할 수 있는 일반 목적의 RPC 프레임워크로 발전하였다. HTTP/2를 기반으로 하며, 바이너리 직렬화 형식인 프로토콜 버퍼(Protocol Buffers)를 사용하여 높은 성능과 효율적인 통신을 지원한다.&lt;br /&gt;
==특징==&lt;br /&gt;
*HTTP/2 기반 통신 프로토콜 사용&lt;br /&gt;
*Protocol Buffers를 통한 고속 직렬화 및 역직렬화&lt;br /&gt;
*클라이언트-서버 간 명확한 인터페이스 정의 (.proto 파일 사용)&lt;br /&gt;
*다양한 언어 지원 (Python, C++, Java, Go, Rust 등)&lt;br /&gt;
*동기 및 비동기 방식의 호출 모두 지원&lt;br /&gt;
*스트리밍 지원 (클라이언트 스트리밍, 서버 스트리밍, 양방향 스트리밍)&lt;br /&gt;
==작동 방식==&lt;br /&gt;
1. 개발자는 .proto 파일을 사용해 서비스와 메시지를 정의한다. 2. gRPC 툴체인은 이 파일을 바탕으로 서버와 클라이언트 코드를 생성한다. 3. 클라이언트는 로컬 함수 호출처럼 원격 서버의 함수를 호출하며, 내부적으로 gRPC는 이 호출을 HTTP/2 요청으로 변환하여 서버에 전달한다. 4. 서버는 정의된 로직을 수행하고, 결과를 다시 클라이언트로 전송한다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*마이크로서비스 간 고성능 통신&lt;br /&gt;
*분산 머신 러닝 및 데이터 처리 시스템 (예: Ray)&lt;br /&gt;
*모바일 및 IoT 기기와 서버 간 통신&lt;br /&gt;
*실시간 스트리밍 기반 애플리케이션&lt;br /&gt;
==gRPC와 기존 RPC의 차이점==&lt;br /&gt;
*기존의 REST API는 텍스트 기반(JSON) 통신을 주로 사용하며, HTTP/1.1 기반이다.&lt;br /&gt;
*반면, gRPC는 바이너리 기반의 Protocol Buffers를 사용하고 HTTP/2 위에서 동작하기 때문에 다중 요청 처리 및 스트리밍에서 우수한 성능을 보인다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[RPC]]&lt;br /&gt;
*[[프로토콜 버퍼]]&lt;br /&gt;
*[[HTTP/2]]&lt;br /&gt;
*[[분산 시스템]]&lt;br /&gt;
*[[Ray]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Vaidyanathan, Varun et al. &#039;&#039;gRPC: A High Performance, Open Source Universal RPC Framework&#039;&#039;. Google Inc., 2016.&lt;br /&gt;
*The gRPC Authors. &#039;&#039;gRPC Official Documentation&#039;&#039;. https://grpc.io&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:네트워크]]&lt;br /&gt;
[[분류:오픈 소스]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40988</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40988"/>
		<updated>2025-05-13T20:38:24Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==아키텍처==&lt;br /&gt;
Ray 클러스터는 &#039;&#039;&#039;헤드 노드(head node)&#039;&#039;&#039;와 하나 이상의 &#039;&#039;&#039;워커 노드(worker node)&#039;&#039;&#039;로 구성된다.&lt;br /&gt;
===헤드 노드===&lt;br /&gt;
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;Global control store (GCS)&#039;&#039;&#039;: 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.&lt;br /&gt;
*&#039;&#039;&#039;Autoscaler&#039;&#039;&#039;: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.&lt;br /&gt;
헤드 노드는 기본적으로 &#039;&#039;&#039;단일 장애 지점(single point of failure)&#039;&#039;&#039;으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 &#039;&#039;&#039;고아 노드(orphaned node)&#039;&#039;&#039;가 되어 수동으로 제거해야 할 수 있다.&amp;lt;ref&amp;gt;Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== 워커 노드===&lt;br /&gt;
각 워커 노드는 &#039;&#039;&#039;Raylet&#039;&#039;&#039;이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.&lt;br /&gt;
*&#039;&#039;&#039;Object store&#039;&#039;&#039;: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.&lt;br /&gt;
*&#039;&#039;&#039;Scheduler&#039;&#039;&#039;: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.&lt;br /&gt;
==리모트 함수==&lt;br /&gt;
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.&lt;br /&gt;
*동일한 코드를 여러 코어나 머신에서 실행 가능&lt;br /&gt;
*오류 발생 시 자동 재시도 등 내결함성 제공&lt;br /&gt;
*큰 파라미터도 효율적으로 처리 가능&lt;br /&gt;
*프로세스 간 정보 전달이 용이함&lt;br /&gt;
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 &#039;&#039;&#039;ObjectRef&#039;&#039;&#039; 형태로 반환된다. ObjectRef란 실제 결과가 저장될 미래 객체에 대한 일종의 포인터이다.&lt;br /&gt;
===실행 방식===&lt;br /&gt;
*사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.&lt;br /&gt;
*ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.&lt;br /&gt;
*remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 동작 흐름 ===&lt;br /&gt;
&lt;br /&gt;
* 함수 호출자는 해당 작업의 &#039;&#039;&#039;소유자(owner)&#039;&#039;&#039;가 되며, ObjectRef를 관리한다.&lt;br /&gt;
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.&lt;br /&gt;
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.&lt;br /&gt;
*[[GRPC (RPC 프레임워크)|gRPC]]를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.&lt;br /&gt;
**작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.&lt;br /&gt;
===오류 처리===&lt;br /&gt;
*&#039;&#039;&#039;응용 수준 오류&#039;&#039;&#039;: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 수준 오류&#039;&#039;&#039;: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.&amp;lt;ref&amp;gt;max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
==리모트 액터==&lt;br /&gt;
Remote function은 상태를 갖지 않는(stateless) 함수의 병렬 실행에 적합하다. 그러나 상태를 유지해야 하는 경우에는 Remote Actor를 사용한다.&lt;br /&gt;
===개요===&lt;br /&gt;
*상태를 유지하는 객체를 분산 환경에서 사용할 수 있게 해주는 기능이다.&lt;br /&gt;
* &#039;&#039;&#039;@ray.remote&#039;&#039;&#039; 데코레이터를 클래스에 붙여 사용한다.&lt;br /&gt;
*액터는 하나의 프로세스로 실행되며, 그 안의 상태는 외부에서 접근할 수 없다.&lt;br /&gt;
*상태 변경은 해당 액터에 메시지를 보내는 방식으로만 가능하다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
class Counter(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.n = 0&lt;br /&gt;
&lt;br /&gt;
    def increment(self):&lt;br /&gt;
        self.n += 1&lt;br /&gt;
&lt;br /&gt;
    def read(self):&lt;br /&gt;
        return self.n&lt;br /&gt;
&lt;br /&gt;
counters = [Counter.remote() for i in range(4)]&lt;br /&gt;
[c.increment.remote() for c in counters]&lt;br /&gt;
futures = [c.read.remote() for c in counters]&lt;br /&gt;
print(ray.get(futures))  # [1, 1, 1, 1]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 액터 모델 ===&lt;br /&gt;
&lt;br /&gt;
* 액터는 고유 주소(handle)를 가진 프로세스이다.&lt;br /&gt;
&lt;br /&gt;
*내부 상태는 외부에서 직접 접근할 수 없으며, 메시지를 통해 간접적으로만 조작할 수 있다.&lt;br /&gt;
*각 액터는 메시지를 하나씩 순차적으로 처리하므로 상태 충돌이 발생하지 않는다.&lt;br /&gt;
*상태를 나누거나 복제할 수 있다면, 여러 액터 풀을 구성하여 처리량을 향상시킬 수 있다.&lt;br /&gt;
===동작 방식===&lt;br /&gt;
*Ray는 액터를 새로운 워커로 생성하고, 그 이후 모든 메서드는 해당 워커에서 실행된다.&lt;br /&gt;
*액터 생성은 GCS에 등록되어 메타데이터(IP, 포트 등)를 공유한다.&lt;br /&gt;
*각 클라이언트는 GCS를 재조회하지 않고, 캐시된 메타데이터로 직접 gRPC를 통해 액터에게 메시지를 전송한다.&lt;br /&gt;
*메서드 호출은 remote function과 동일하게 ObjectRef를 반환한다.&lt;br /&gt;
=== 장애 처리===&lt;br /&gt;
*액터는 상태를 가지므로 복구가 더 복잡하다.&lt;br /&gt;
*메시지 처리 중 실패 시 자동 재시도되지 않는다.&lt;br /&gt;
*메시지 사이에서 실패한 경우, Ray는 다음 호출 시 최대 설정된 횟수만큼 재시도한다.&lt;br /&gt;
*초기화 실패도 첫 메시지 실패와 동일하게 처리된다.&lt;br /&gt;
==장애 허용==&lt;br /&gt;
Ray는 애플리케이션 계층과 시스템 계층으로 구성되어 있으며, 두 계층 모두 장애 복구 기능을 갖추고 있다.&lt;br /&gt;
===시스템 계층 구성 요소===&lt;br /&gt;
*&#039;&#039;&#039;Global Control Store (GCS)&#039;&#039;&#039;: Ray의 전체 상태를 저장하는 중앙 구성 요소&lt;br /&gt;
*&#039;&#039;&#039;분산 스케줄러&#039;&#039;&#039;: 작업 분배 및 자원 할당을 담당&lt;br /&gt;
*&#039;&#039;&#039;분산 오브젝트 저장소&#039;&#039;&#039;: 객체 데이터를 클러스터 내에서 분산 관리&amp;lt;ref&amp;gt;GCS를 제외한 구성 요소는 수평 확장 및 장애 허용이 가능하다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Global Control Store (GCS)===&lt;br /&gt;
* GCS는 시스템 상태를 중앙에서 유지하여 나머지 구성 요소들이 무상태(stateless)로 설계되도록 한다.&lt;br /&gt;
*구성 요소가 장애로 인해 재시작되면, GCS에서 상태를 읽어와 복구한다.&lt;br /&gt;
*이를 통해 객체 저장소와 스케줄러를 독립적으로 확장할 수 있다.&lt;br /&gt;
*기본적으로 GCS는 헤드 노드에 존재하며, 단일 장애 지점(SPOF)이 된다.&lt;br /&gt;
===Remote Function의 장애 허용===&lt;br /&gt;
*Remote function은 상태가 없기 때문에 복구가 간단하다.&lt;br /&gt;
* 시스템 오류로 실패한 작업은 지정된 최대 횟수만큼 자동 재시도된다.&lt;br /&gt;
*응용 오류(Exception 발생)는 자동 재시도되지 않고, 예외 객체로 반환된다.&lt;br /&gt;
*최대 재시도 횟수는 `@ray.remote(max_retries=n)`으로 설정 가능하다.&lt;br /&gt;
=== Remote Actor의 장애 허용===&lt;br /&gt;
*액터는 상태를 갖기 때문에 복구가 더 복잡하다.&lt;br /&gt;
* 초기화, 메시지 처리 중, 메시지 사이 등 어떤 단계에서도 실패할 수 있다.&lt;br /&gt;
====메시지 처리 중 실패====&lt;br /&gt;
*자동 재시도되지 않음&lt;br /&gt;
*다음 메시지를 처리할 때까지 대기하며, 최대 max_restarts 횟수까지 액터를 재시작한다.&lt;br /&gt;
==== 메시지 사이 실패====&lt;br /&gt;
*다음 메시지 호출 시 자동으로 액터를 복구한다.&lt;br /&gt;
* 상태 복구 로직이 적절히 구현되어 있다면 실패는 느린 처리 외에는 큰 영향을 주지 않는다.&lt;br /&gt;
*상태 복구 로직이 없을 경우, 액터는 초기 상태로 재시작된다.&lt;br /&gt;
===기타 사항===&lt;br /&gt;
*대부분의 자원은 애플리케이션 종료 시 자동 정리된다.&lt;br /&gt;
*&#039;&#039;&#039;Detached&#039;&#039;&#039; 리소스(예: detached actor, placement group)는 클러스터가 유지되는 한 계속 유지된다.&amp;lt;ref&amp;gt;이로 인해 클러스터의 자동 스케일 다운이 방지될 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
==기타 설계 사항==&lt;br /&gt;
===직렬화(Serialization)===&lt;br /&gt;
*Ray는 Plasma in-memory object store를 사용하여 객체를 노드 간 및 프로세스 간 효율적으로 전달한다.&lt;br /&gt;
*NumPy 배열은 zero-copy 방식으로 같은 노드 내 여러 워커가 공유할 수 있다.&lt;br /&gt;
*Plasma에 저장된 객체는 불변이며(shared memory)에 저장된다.&lt;br /&gt;
*객체는 요청이 있을 때에만 다른 노드로 전송되며, 사전 복제되지 않는다.&lt;br /&gt;
===리소스 관리===&lt;br /&gt;
*기본적으로 함수와 액터는 동일한 자원(CPU 1개)을 요구한다.&lt;br /&gt;
*GPU, 메모리 등 필요한 자원을 명시할 수 있으며, 스케줄러는 이를 고려하여 실행 노드를 할당한다.&lt;br /&gt;
* 자원이 부족한 경우, 오토스케일러가 필요한 사양을 가진 노드를 추가한다.&lt;br /&gt;
===자동 스케일링(Autoscaler)===&lt;br /&gt;
*오토스케일러는 다음을 담당한다:&lt;br /&gt;
**워커 노드 생성&lt;br /&gt;
**워커 노드 제거&lt;br /&gt;
**워커 재시작&lt;br /&gt;
===배치 전략(Placement Groups)===&lt;br /&gt;
*Placement group은 작업과 자원을 함께 배치하기 위한 논리적 단위이다.&lt;br /&gt;
*사전 자원 할당(preallocation)을 통해 작업 지연을 줄일 수 있다.&lt;br /&gt;
*&#039;&#039;&#039;Pack&#039;&#039;&#039;: 하나의 노드에 최대한 묶어 배치하여 locality 향상&lt;br /&gt;
*&#039;&#039;&#039;Spread&#039;&#039;&#039;: 여러 노드에 분산 배치하여 신뢰성 및 부하 분산 확보&amp;lt;ref&amp;gt;Placement group은 CPU, GPU 등 자원 묶음 단위로 구성된다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
===네임스페이스(Namespaces)===&lt;br /&gt;
*Ray는 작업과 액터를 논리적으로 그룹화하기 위해 네임스페이스를 사용한다.&lt;br /&gt;
*기본적으로 익명 네임스페이스에서 실행된다.&lt;br /&gt;
*여러 프로그램에서 동일한 액터를 공유하려면 동일한 네임스페이스를 명시해야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ray.init(namespace=&amp;quot;bdad&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===의존성 관리===&lt;br /&gt;
*Conda 또는 virtualenv 기반으로 동적 환경 구성이 가능하다.&lt;br /&gt;
* 런타임 환경을 함수 단위로 설정할 수도 있다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ray.init(runtime_env={&amp;quot;pip&amp;quot;: &amp;quot;requirements.txt&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
@ray.remote(runtime_env={&amp;quot;conda&amp;quot;: [&amp;quot;some_package&amp;quot;]})&lt;br /&gt;
def some_function(x): ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Job API===&lt;br /&gt;
*클러스터에 작업을 제출하고 추적할 수 있는 API를 제공한다.&lt;br /&gt;
*작업 ID로 상태를 조회하거나 실행 로그를 확인할 수 있다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40987</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40987"/>
		<updated>2025-05-13T20:15:05Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==아키텍처==&lt;br /&gt;
Ray 클러스터는 &#039;&#039;&#039;헤드 노드(head node)&#039;&#039;&#039;와 하나 이상의 &#039;&#039;&#039;워커 노드(worker node)&#039;&#039;&#039;로 구성된다.&lt;br /&gt;
===헤드 노드===&lt;br /&gt;
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;Global control store (GCS)&#039;&#039;&#039;: 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.&lt;br /&gt;
*&#039;&#039;&#039;Autoscaler&#039;&#039;&#039;: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.&lt;br /&gt;
헤드 노드는 기본적으로 &#039;&#039;&#039;단일 장애 지점(single point of failure)&#039;&#039;&#039;으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 &#039;&#039;&#039;고아 노드(orphaned node)&#039;&#039;&#039;가 되어 수동으로 제거해야 할 수 있다.&amp;lt;ref&amp;gt;Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== 워커 노드===&lt;br /&gt;
각 워커 노드는 &#039;&#039;&#039;Raylet&#039;&#039;&#039;이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.&lt;br /&gt;
*&#039;&#039;&#039;Object store&#039;&#039;&#039;: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.&lt;br /&gt;
*&#039;&#039;&#039;Scheduler&#039;&#039;&#039;: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.&lt;br /&gt;
==리모트 함수==&lt;br /&gt;
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.&lt;br /&gt;
*동일한 코드를 여러 코어나 머신에서 실행 가능&lt;br /&gt;
*오류 발생 시 자동 재시도 등 내결함성 제공&lt;br /&gt;
*큰 파라미터도 효율적으로 처리 가능&lt;br /&gt;
*프로세스 간 정보 전달이 용이함&lt;br /&gt;
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 &#039;&#039;&#039;ObjectRef&#039;&#039;&#039; 형태로 반환된다. 이 ObjectRef는 실제 결과가 저장될 미래 객체에 대한 참조이다.&lt;br /&gt;
===실행 방식===&lt;br /&gt;
*사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.&lt;br /&gt;
*ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.&lt;br /&gt;
*remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 동작 흐름 ===&lt;br /&gt;
&lt;br /&gt;
* 함수 호출자는 해당 작업의 &#039;&#039;&#039;소유자(owner)&#039;&#039;&#039;가 되며, ObjectRef를 관리한다.&lt;br /&gt;
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.&lt;br /&gt;
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.&lt;br /&gt;
*gRPC를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.&lt;br /&gt;
**작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.&lt;br /&gt;
===오류 처리===&lt;br /&gt;
*&#039;&#039;&#039;응용 수준 오류&#039;&#039;&#039;: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 수준 오류&#039;&#039;&#039;: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.&lt;br /&gt;
*max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.&lt;br /&gt;
==리모트 액터==&lt;br /&gt;
Remote function은 상태를 갖지 않는(stateless) 함수의 병렬 실행에 적합하다. 그러나 상태를 유지해야 하는 경우에는 Remote Actor를 사용한다.&lt;br /&gt;
===개요===&lt;br /&gt;
*상태를 유지하는 객체를 분산 환경에서 사용할 수 있게 해주는 기능이다.&lt;br /&gt;
* &#039;&#039;&#039;@ray.remote&#039;&#039;&#039; 데코레이터를 클래스에 붙여 사용한다.&lt;br /&gt;
*액터는 하나의 프로세스로 실행되며, 그 안의 상태는 외부에서 접근할 수 없다.&lt;br /&gt;
*상태 변경은 해당 액터에 메시지를 보내는 방식으로만 가능하다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
class Counter(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.n = 0&lt;br /&gt;
&lt;br /&gt;
    def increment(self):&lt;br /&gt;
        self.n += 1&lt;br /&gt;
&lt;br /&gt;
    def read(self):&lt;br /&gt;
        return self.n&lt;br /&gt;
&lt;br /&gt;
counters = [Counter.remote() for i in range(4)]&lt;br /&gt;
[c.increment.remote() for c in counters]&lt;br /&gt;
futures = [c.read.remote() for c in counters]&lt;br /&gt;
print(ray.get(futures))  # [1, 1, 1, 1]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 액터 모델 ===&lt;br /&gt;
&lt;br /&gt;
* 액터는 고유 주소(handle)를 가진 프로세스이다.&lt;br /&gt;
&lt;br /&gt;
*내부 상태는 외부에서 직접 접근할 수 없으며, 메시지를 통해 간접적으로만 조작할 수 있다.&lt;br /&gt;
*각 액터는 메시지를 하나씩 순차적으로 처리하므로 상태 충돌이 발생하지 않는다.&lt;br /&gt;
*상태를 나누거나 복제할 수 있다면, 여러 액터 풀을 구성하여 처리량을 향상시킬 수 있다.&lt;br /&gt;
===동작 방식===&lt;br /&gt;
*Ray는 액터를 새로운 워커로 생성하고, 그 이후 모든 메서드는 해당 워커에서 실행된다.&lt;br /&gt;
*액터 생성은 GCS에 등록되어 메타데이터(IP, 포트 등)를 공유한다.&lt;br /&gt;
*각 클라이언트는 GCS를 재조회하지 않고, 캐시된 메타데이터로 직접 gRPC를 통해 액터에게 메시지를 전송한다.&lt;br /&gt;
*메서드 호출은 remote function과 동일하게 ObjectRef를 반환한다.&lt;br /&gt;
=== 장애 허용===&lt;br /&gt;
*액터는 상태를 가지므로 복구가 더 복잡하다.&lt;br /&gt;
*메시지 처리 중 실패 시 자동 재시도되지 않는다.&lt;br /&gt;
*메시지 사이에서 실패한 경우, Ray는 다음 호출 시 최대 설정된 횟수만큼 재시도한다.&lt;br /&gt;
*초기화 실패도 첫 메시지 실패와 동일하게 처리된다.&lt;br /&gt;
==장애 허용==&lt;br /&gt;
Ray는 애플리케이션 계층과 시스템 계층으로 구성되어 있으며, 두 계층 모두 장애 복구 기능을 갖추고 있다.&lt;br /&gt;
===시스템 계층 구성 요소===&lt;br /&gt;
*&#039;&#039;&#039;Global Control Store (GCS)&#039;&#039;&#039;: Ray의 전체 상태를 저장하는 중앙 구성 요소&lt;br /&gt;
*&#039;&#039;&#039;분산 스케줄러&#039;&#039;&#039;: 작업 분배 및 자원 할당을 담당&lt;br /&gt;
*&#039;&#039;&#039;분산 오브젝트 저장소&#039;&#039;&#039;: 객체 데이터를 클러스터 내에서 분산 관리&amp;lt;ref&amp;gt;GCS를 제외한 구성 요소는 수평 확장 및 장애 허용이 가능하다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Global Control Store (GCS)===&lt;br /&gt;
* GCS는 시스템 상태를 중앙에서 유지하여 나머지 구성 요소들이 무상태(stateless)로 설계되도록 한다.&lt;br /&gt;
*구성 요소가 장애로 인해 재시작되면, GCS에서 상태를 읽어와 복구한다.&lt;br /&gt;
*이를 통해 객체 저장소와 스케줄러를 독립적으로 확장할 수 있다.&lt;br /&gt;
*기본적으로 GCS는 헤드 노드에 존재하며, 단일 장애 지점(SPOF)이 된다.&lt;br /&gt;
===Remote Function의 장애 허용===&lt;br /&gt;
*Remote function은 상태가 없기 때문에 복구가 간단하다.&lt;br /&gt;
* 시스템 오류로 실패한 작업은 지정된 최대 횟수만큼 자동 재시도된다.&lt;br /&gt;
*응용 오류(Exception 발생)는 자동 재시도되지 않고, 예외 객체로 반환된다.&lt;br /&gt;
*최대 재시도 횟수는 `@ray.remote(max_retries=n)`으로 설정 가능하다.&lt;br /&gt;
=== Remote Actor의 장애 허용===&lt;br /&gt;
*액터는 상태를 갖기 때문에 복구가 더 복잡하다.&lt;br /&gt;
* 초기화, 메시지 처리 중, 메시지 사이 등 어떤 단계에서도 실패할 수 있다.&lt;br /&gt;
====메시지 처리 중 실패====&lt;br /&gt;
*자동 재시도되지 않음&lt;br /&gt;
*다음 메시지를 처리할 때까지 대기하며, 최대 `max_restarts` 횟수까지 액터를 재시작한다.&lt;br /&gt;
==== 메시지 사이 실패====&lt;br /&gt;
*다음 메시지 호출 시 자동으로 액터를 복구한다.&lt;br /&gt;
* 상태 복구 로직이 적절히 구현되어 있다면 실패는 느린 처리 외에는 큰 영향을 주지 않는다.&lt;br /&gt;
*상태 복구 로직이 없을 경우, 액터는 초기 상태로 재시작된다.&lt;br /&gt;
===기타 사항===&lt;br /&gt;
*대부분의 자원은 애플리케이션 종료 시 자동 정리된다.&lt;br /&gt;
*&#039;&#039;&#039;Detached&#039;&#039;&#039; 리소스(예: detached actor, placement group)는 클러스터가 유지되는 한 계속 유지된다.&amp;lt;ref&amp;gt;이로 인해 클러스터의 자동 스케일 다운이 방지될 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
==기타 설계 사항==&lt;br /&gt;
===직렬화(Serialization)===&lt;br /&gt;
*Ray는 Plasma in-memory object store를 사용하여 객체를 노드 간 및 프로세스 간 효율적으로 전달한다.&lt;br /&gt;
*NumPy 배열은 zero-copy 방식으로 같은 노드 내 여러 워커가 공유할 수 있다.&lt;br /&gt;
*Plasma에 저장된 객체는 불변이며(shared memory)에 저장된다.&lt;br /&gt;
*객체는 요청이 있을 때에만 다른 노드로 전송되며, 사전 복제되지 않는다.&lt;br /&gt;
===리소스 관리===&lt;br /&gt;
*기본적으로 함수와 액터는 동일한 자원(CPU 1개)을 요구한다.&lt;br /&gt;
*GPU, 메모리 등 필요한 자원을 명시할 수 있으며, 스케줄러는 이를 고려하여 실행 노드를 할당한다.&lt;br /&gt;
* 자원이 부족한 경우, 오토스케일러가 필요한 사양을 가진 노드를 추가한다.&lt;br /&gt;
===자동 스케일링(Autoscaler)===&lt;br /&gt;
*오토스케일러는 다음을 담당한다:&lt;br /&gt;
**워커 노드 생성&lt;br /&gt;
**워커 노드 제거&lt;br /&gt;
**워커 재시작&lt;br /&gt;
===배치 전략(Placement Groups)===&lt;br /&gt;
*Placement group은 작업과 자원을 함께 배치하기 위한 논리적 단위이다.&lt;br /&gt;
*사전 자원 할당(preallocation)을 통해 작업 지연을 줄일 수 있다.&lt;br /&gt;
*&#039;&#039;&#039;Pack&#039;&#039;&#039;: 하나의 노드에 최대한 묶어 배치하여 locality 향상&lt;br /&gt;
*&#039;&#039;&#039;Spread&#039;&#039;&#039;: 여러 노드에 분산 배치하여 신뢰성 및 부하 분산 확보&amp;lt;ref&amp;gt;Placement group은 CPU, GPU 등 자원 묶음 단위로 구성된다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
===네임스페이스(Namespaces)===&lt;br /&gt;
*Ray는 작업과 액터를 논리적으로 그룹화하기 위해 네임스페이스를 사용한다.&lt;br /&gt;
*기본적으로 익명 네임스페이스에서 실행된다.&lt;br /&gt;
*여러 프로그램에서 동일한 액터를 공유하려면 동일한 네임스페이스를 명시해야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ray.init(namespace=&amp;quot;bdad&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===의존성 관리===&lt;br /&gt;
*Conda 또는 virtualenv 기반으로 동적 환경 구성이 가능하다.&lt;br /&gt;
* 런타임 환경을 함수 단위로 설정할 수도 있다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ray.init(runtime_env={&amp;quot;pip&amp;quot;: &amp;quot;requirements.txt&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
@ray.remote(runtime_env={&amp;quot;conda&amp;quot;: [&amp;quot;some_package&amp;quot;]})&lt;br /&gt;
def some_function(x): ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Job API===&lt;br /&gt;
*클러스터에 작업을 제출하고 추적할 수 있는 API를 제공한다.&lt;br /&gt;
*작업 ID로 상태를 조회하거나 실행 로그를 확인할 수 있다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40986</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40986"/>
		<updated>2025-05-13T19:58:13Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==아키텍처==&lt;br /&gt;
Ray 클러스터는 &#039;&#039;&#039;헤드 노드(head node)&#039;&#039;&#039;와 하나 이상의 &#039;&#039;&#039;워커 노드(worker node)&#039;&#039;&#039;로 구성된다.&lt;br /&gt;
===헤드 노드===&lt;br /&gt;
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;Global control store (GCS)&#039;&#039;&#039;: 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.&lt;br /&gt;
*&#039;&#039;&#039;Autoscaler&#039;&#039;&#039;: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.&lt;br /&gt;
헤드 노드는 기본적으로 &#039;&#039;&#039;단일 장애 지점(single point of failure)&#039;&#039;&#039;으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 &#039;&#039;&#039;고아 노드(orphaned node)&#039;&#039;&#039;가 되어 수동으로 제거해야 할 수 있다.&amp;lt;ref&amp;gt;Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== 워커 노드===&lt;br /&gt;
각 워커 노드는 &#039;&#039;&#039;Raylet&#039;&#039;&#039;이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.&lt;br /&gt;
*&#039;&#039;&#039;Object store&#039;&#039;&#039;: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.&lt;br /&gt;
*&#039;&#039;&#039;Scheduler&#039;&#039;&#039;: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.&lt;br /&gt;
==리모트 함수==&lt;br /&gt;
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.&lt;br /&gt;
*동일한 코드를 여러 코어나 머신에서 실행 가능&lt;br /&gt;
*오류 발생 시 자동 재시도 등 내결함성 제공&lt;br /&gt;
*큰 파라미터도 효율적으로 처리 가능&lt;br /&gt;
*프로세스 간 정보 전달이 용이함&lt;br /&gt;
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 &#039;&#039;&#039;ObjectRef&#039;&#039;&#039; 형태로 반환된다. 이 ObjectRef는 실제 결과가 저장될 미래 객체에 대한 참조이다.&lt;br /&gt;
===실행 방식===&lt;br /&gt;
*사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.&lt;br /&gt;
*ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.&lt;br /&gt;
*remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 동작 흐름 ===&lt;br /&gt;
&lt;br /&gt;
* 함수 호출자는 해당 작업의 &#039;&#039;&#039;소유자(owner)&#039;&#039;&#039;가 되며, ObjectRef를 관리한다.&lt;br /&gt;
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.&lt;br /&gt;
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.&lt;br /&gt;
*gRPC를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.&lt;br /&gt;
**작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.&lt;br /&gt;
===오류 처리===&lt;br /&gt;
*&#039;&#039;&#039;응용 수준 오류&#039;&#039;&#039;: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 수준 오류&#039;&#039;&#039;: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.&lt;br /&gt;
*max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.&lt;br /&gt;
==리모트 액터==&lt;br /&gt;
Remote function은 상태를 갖지 않는(stateless) 함수의 병렬 실행에 적합하다. 그러나 상태를 유지해야 하는 경우에는 Remote Actor를 사용한다.&lt;br /&gt;
===개요===&lt;br /&gt;
*상태를 유지하는 객체를 분산 환경에서 사용할 수 있게 해주는 기능이다.&lt;br /&gt;
* &#039;&#039;&#039;@ray.remote&#039;&#039;&#039; 데코레이터를 클래스에 붙여 사용한다.&lt;br /&gt;
*액터는 하나의 프로세스로 실행되며, 그 안의 상태는 외부에서 접근할 수 없다.&lt;br /&gt;
*상태 변경은 해당 액터에 메시지를 보내는 방식으로만 가능하다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
class Counter(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.n = 0&lt;br /&gt;
&lt;br /&gt;
    def increment(self):&lt;br /&gt;
        self.n += 1&lt;br /&gt;
&lt;br /&gt;
    def read(self):&lt;br /&gt;
        return self.n&lt;br /&gt;
&lt;br /&gt;
counters = [Counter.remote() for i in range(4)]&lt;br /&gt;
[c.increment.remote() for c in counters]&lt;br /&gt;
futures = [c.read.remote() for c in counters]&lt;br /&gt;
print(ray.get(futures))  # [1, 1, 1, 1]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===액터 모델===*액터는 고유 주소(handle)를 가진 프로세스이다.&lt;br /&gt;
*내부 상태는 외부에서 직접 접근할 수 없으며, 메시지를 통해 간접적으로만 조작할 수 있다.&lt;br /&gt;
*각 액터는 메시지를 하나씩 순차적으로 처리하므로 상태 충돌이 발생하지 않는다.&lt;br /&gt;
*상태를 나누거나 복제할 수 있다면, 여러 액터 풀을 구성하여 처리량을 향상시킬 수 있다.&lt;br /&gt;
===동작 방식===&lt;br /&gt;
*Ray는 액터를 새로운 워커로 생성하고, 그 이후 모든 메서드는 해당 워커에서 실행된다.&lt;br /&gt;
*액터 생성은 GCS에 등록되어 메타데이터(IP, 포트 등)를 공유한다.&lt;br /&gt;
*각 클라이언트는 GCS를 재조회하지 않고, 캐시된 메타데이터로 직접 gRPC를 통해 액터에게 메시지를 전송한다.&lt;br /&gt;
*메서드 호출은 remote function과 동일하게 ObjectRef를 반환한다.&lt;br /&gt;
=== 장애 허용===&lt;br /&gt;
*액터는 상태를 가지므로 복구가 더 복잡하다.&lt;br /&gt;
*메시지 처리 중 실패 시 자동 재시도되지 않는다.&lt;br /&gt;
*메시지 사이에서 실패한 경우, Ray는 다음 호출 시 최대 설정된 횟수만큼 재시도한다.&lt;br /&gt;
*초기화 실패도 첫 메시지 실패와 동일하게 처리된다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40985</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40985"/>
		<updated>2025-05-13T19:38:12Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==아키텍처==&lt;br /&gt;
Ray 클러스터는 &#039;&#039;&#039;헤드 노드(head node)&#039;&#039;&#039;와 하나 이상의 &#039;&#039;&#039;워커 노드(worker node)&#039;&#039;&#039;로 구성된다.&lt;br /&gt;
===헤드 노드===&lt;br /&gt;
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;Global control store (GCS)&#039;&#039;&#039;: 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.&lt;br /&gt;
*&#039;&#039;&#039;Autoscaler&#039;&#039;&#039;: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.&lt;br /&gt;
헤드 노드는 기본적으로 &#039;&#039;&#039;단일 장애 지점(single point of failure)&#039;&#039;&#039;으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 &#039;&#039;&#039;고아 노드(orphaned node)&#039;&#039;&#039;가 되어 수동으로 제거해야 할 수 있다.&amp;lt;ref&amp;gt;Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== 워커 노드===&lt;br /&gt;
각 워커 노드는 &#039;&#039;&#039;Raylet&#039;&#039;&#039;이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.&lt;br /&gt;
*&#039;&#039;&#039;Object store&#039;&#039;&#039;: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.&lt;br /&gt;
*&#039;&#039;&#039;Scheduler&#039;&#039;&#039;: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.&lt;br /&gt;
==리모트 함수==&lt;br /&gt;
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.&lt;br /&gt;
*동일한 코드를 여러 코어나 머신에서 실행 가능&lt;br /&gt;
*오류 발생 시 자동 재시도 등 내결함성 제공&lt;br /&gt;
*큰 파라미터도 효율적으로 처리 가능&lt;br /&gt;
*프로세스 간 정보 전달이 용이함&lt;br /&gt;
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 &#039;&#039;&#039;ObjectRef&#039;&#039;&#039; 형태로 반환된다. 이 ObjectRef는 실제 결과가 저장될 미래 객체에 대한 참조이다.&lt;br /&gt;
===실행 방식===&lt;br /&gt;
*사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.&lt;br /&gt;
*ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.&lt;br /&gt;
*remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 동작 흐름 ===&lt;br /&gt;
&lt;br /&gt;
* 함수 호출자는 해당 작업의 &#039;&#039;&#039;소유자(owner)&#039;&#039;&#039;가 되며, ObjectRef를 관리한다.&lt;br /&gt;
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.&lt;br /&gt;
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.&lt;br /&gt;
*gRPC를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.&lt;br /&gt;
**작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.&lt;br /&gt;
===오류 처리===&lt;br /&gt;
*&#039;&#039;&#039;응용 수준 오류&#039;&#039;&#039;: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 수준 오류&#039;&#039;&#039;: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.&lt;br /&gt;
*max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40984</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40984"/>
		<updated>2025-05-13T19:37:20Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==아키텍처==&lt;br /&gt;
Ray 클러스터는 &#039;&#039;&#039;헤드 노드(head node)&#039;&#039;&#039;와 하나 이상의 &#039;&#039;&#039;워커 노드(worker node)&#039;&#039;&#039;로 구성된다.&lt;br /&gt;
===헤드 노드===&lt;br /&gt;
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;Global control store (GCS)&#039;&#039;&#039;: 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.&lt;br /&gt;
*&#039;&#039;&#039;Autoscaler&#039;&#039;&#039;: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.&lt;br /&gt;
헤드 노드는 기본적으로 &#039;&#039;&#039;단일 장애 지점(single point of failure)&#039;&#039;&#039;으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 &#039;&#039;&#039;고아 노드(orphaned node)&#039;&#039;&#039;가 되어 수동으로 제거해야 할 수 있다.&amp;lt;ref&amp;gt;Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== 워커 노드===&lt;br /&gt;
각 워커 노드는 &#039;&#039;&#039;Raylet&#039;&#039;&#039;이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.&lt;br /&gt;
*&#039;&#039;&#039;Object store&#039;&#039;&#039;: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.&lt;br /&gt;
*&#039;&#039;&#039;Scheduler&#039;&#039;&#039;: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.&lt;br /&gt;
==리모트 함수==&lt;br /&gt;
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.&lt;br /&gt;
*동일한 코드를 여러 코어나 머신에서 실행 가능&lt;br /&gt;
*오류 발생 시 자동 재시도 등 내결함성 제공&lt;br /&gt;
*큰 파라미터도 효율적으로 처리 가능&lt;br /&gt;
*프로세스 간 정보 전달이 용이함&lt;br /&gt;
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 &#039;&#039;&#039;ObjectRef&#039;&#039;&#039; 형태로 반환된다. 이 ObjectRef는 실제 결과가 저장될 미래 객체에 대한 참조이다.&lt;br /&gt;
===실행 방식===&lt;br /&gt;
*사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.&lt;br /&gt;
*ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.&lt;br /&gt;
*remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.&lt;br /&gt;
===예시 코드===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))  # [0, 1, 4, 9]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===동작 흐름===*함수 호출자는 해당 작업의 &#039;&#039;&#039;소유자(owner)&#039;&#039;&#039;가 되며, ObjectRef를 관리한다.&lt;br /&gt;
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.&lt;br /&gt;
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.&lt;br /&gt;
*gRPC를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.&lt;br /&gt;
**작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.&lt;br /&gt;
===오류 처리===&lt;br /&gt;
*&#039;&#039;&#039;응용 수준 오류&#039;&#039;&#039;: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 수준 오류&#039;&#039;&#039;: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.&lt;br /&gt;
*max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40983</id>
		<title>레이 (분산 컴퓨팅)</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A0%88%EC%9D%B4_(%EB%B6%84%EC%82%B0_%EC%BB%B4%ED%93%A8%ED%8C%85)&amp;diff=40983"/>
		<updated>2025-05-13T19:28:26Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다. ==개요== 레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
*파이썬 기반의 간단한 API 제공&lt;br /&gt;
*함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원&lt;br /&gt;
*스케일 아웃 가능한 병렬 처리 프레임워크&lt;br /&gt;
*다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)&lt;br /&gt;
*자동 리소스 관리 및 스케줄링 기능 포함&lt;br /&gt;
*강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Ray Core&#039;&#039;&#039;: 분산 태스크 및 액터 실행을 위한 기본 모듈&lt;br /&gt;
*&#039;&#039;&#039;Ray Tune&#039;&#039;&#039;: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리&lt;br /&gt;
*&#039;&#039;&#039;Ray RLlib&#039;&#039;&#039;: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크&lt;br /&gt;
*&#039;&#039;&#039;Ray Serve&#039;&#039;&#039;: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션&lt;br /&gt;
*&#039;&#039;&#039;Ray Data&#039;&#039;&#039;: 분산 데이터 로딩 및 전처리를 위한 컴포넌트&lt;br /&gt;
==예시 코드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ray&lt;br /&gt;
&lt;br /&gt;
ray.init()&lt;br /&gt;
&lt;br /&gt;
@ray.remote&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x * x&lt;br /&gt;
&lt;br /&gt;
futures = [f.remote(i) for i in range(4)]&lt;br /&gt;
print(ray.get(futures))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*대규모 강화 학습 환경 구축 및 실험(RLlib)&lt;br /&gt;
*수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)&lt;br /&gt;
*실시간 모델 예측 요청 처리(Ray Serve)&lt;br /&gt;
*분산 데이터 로딩 및 전처리(Ray Data)&lt;br /&gt;
*일반적인 병렬 처리 및 배치 작업 수행&lt;br /&gt;
==Ray와 다른 프레임워크 비교==&lt;br /&gt;
*Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.&lt;br /&gt;
*Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.&lt;br /&gt;
*Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[강화 학습]]&lt;br /&gt;
*[[하이퍼파라미터 최적화]]&lt;br /&gt;
*[[서버리스 컴퓨팅]]&lt;br /&gt;
*[[파이썬]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Moritz, Philipp et al. &#039;&#039;Ray: A Distributed Framework for Emerging AI Applications&#039;&#039;. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.&lt;br /&gt;
*Anyscale, Inc. &#039;&#039;The Ray Documentation&#039;&#039;. https://docs.ray.io/&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%9E%98%ED%94%84%ED%94%84%EB%A0%88%EC%9E%84&amp;diff=40982</id>
		<title>아파치 스파크 그래프프레임</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%9E%98%ED%94%84%ED%94%84%EB%A0%88%EC%9E%84&amp;diff=40982"/>
		<updated>2025-05-13T04:52:29Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 그레프프레임(GraphFrames for Apache Spark)은 스파크에서 그래프 이론 기반의 데이터 처리를 가능하게 해주는 라이브러리로, 그래프X(GraphX)의 기능을 데이터프레임 API로 확장한 것이다. ==개요== 그레프프레임은 정점(vertex)과 간선(edge)을 각각 데이터프레임으로 표현하며, 스파크 SQL과의 통합을 통해 강력한 질의 기능과 분산 처리 성능을 동시에 제공한다....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 그레프프레임(GraphFrames for Apache Spark)은 스파크에서 그래프 이론 기반의 데이터 처리를 가능하게 해주는 라이브러리로, 그래프X(GraphX)의 기능을 데이터프레임 API로 확장한 것이다.&lt;br /&gt;
==개요==&lt;br /&gt;
그레프프레임은 정점(vertex)과 간선(edge)을 각각 데이터프레임으로 표현하며, 스파크 SQL과의 통합을 통해 강력한 질의 기능과 분산 처리 성능을 동시에 제공한다. 그래프 알고리즘의 선언적 실행이 가능하며, 복잡한 관계형 데이터 처리에 적합하다. 스파크의 구조화된 API와 결합되어 생산성과 확장성이 뛰어나다.&lt;br /&gt;
==주요 기능==&lt;br /&gt;
*정점 및 간선을 데이터프레임으로 정의&lt;br /&gt;
*스파크 SQL과 통합된 그래프 질의 지원&lt;br /&gt;
*BFS(Breadth-First Search), 페이지랭크(PageRank), 연결 요소(Connected Components) 등 주요 그래프 알고리즘 내장&lt;br /&gt;
*모티프 탐색(Motif Finding)을 통한 패턴 기반 질의 지원&lt;br /&gt;
*정점 및 간선 속성에 대한 조건 필터링 및 조인 가능&lt;br /&gt;
*Python, Scala API 지원&lt;br /&gt;
==구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Vertices&#039;&#039;&#039;: 고유 ID를 가진 개체(예: 사용자, 상품 등)를 나타내는 데이터프레임&lt;br /&gt;
*&#039;&#039;&#039;Edges&#039;&#039;&#039;: 정점 간의 관계(예: 친구, 구매 등)를 나타내는 데이터프레임&lt;br /&gt;
*&#039;&#039;&#039;GraphFrame&#039;&#039;&#039;: 정점과 간선을 함께 포함하는 그래프 객체로, 다양한 알고리즘과 질의 기능을 수행&lt;br /&gt;
==모티프 탐색==&lt;br /&gt;
GraphFrames의 모티프 기능은 그래프 내에서 사용자가 지정한 구조적 패턴을 찾는 데 사용된다. 이 기능은 쿼리 언어를 통해 정점과 간선의 관계를 문자열로 표현하여 직관적으로 패턴을 탐색할 수 있게 해준다. 예를 들어, A → B → C 형태의 경로를 찾으려면 다음과 같이 표현할 수 있다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
motifs = g.find(&amp;quot;(a)-[e1]-&amp;gt;(b); (b)-[e2]-&amp;gt;(c)&amp;quot;)&lt;br /&gt;
motifs.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;이 기능은 사기 탐지, 추천 시스템, 소셜 네트워크 분석 등에서 유용하게 활용된다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
다음은 Python에서 GraphFrame을 생성하고 간단한 알고리즘을 수행하는 예시이다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
from graphframes import GraphFrame&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;GraphFrameExample&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
vertices = spark.createDataFrame([&lt;br /&gt;
    (&amp;quot;1&amp;quot;, &amp;quot;Alice&amp;quot;), (&amp;quot;2&amp;quot;, &amp;quot;Bob&amp;quot;), (&amp;quot;3&amp;quot;, &amp;quot;Charlie&amp;quot;)&lt;br /&gt;
], [&amp;quot;id&amp;quot;, &amp;quot;name&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
edges = spark.createDataFrame([&lt;br /&gt;
    (&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;friend&amp;quot;), (&amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;follow&amp;quot;)&lt;br /&gt;
], [&amp;quot;src&amp;quot;, &amp;quot;dst&amp;quot;, &amp;quot;relationship&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
g = GraphFrame(vertices, edges)&lt;br /&gt;
g.inDegrees.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==한계점==&lt;br /&gt;
*GraphFrames는 GraphX보다 느릴 수 있으며, 대규모 처리 시 성능 이슈가 발생할 수 있다.&lt;br /&gt;
*아직 일부 그래프 알고리즘의 구현은 제한적이며, 확장에는 별도 구현이 필요하다.&lt;br /&gt;
*Java API는 지원되지 않는다.&lt;br /&gt;
==관련 프로젝트==&lt;br /&gt;
*GraphX: RDD 기반의 그래프 처리 엔진으로 GraphFrames의 기반이 되는 프로젝트&lt;br /&gt;
*NetworkX: Python 기반의 그래프 처리 라이브러리&lt;br /&gt;
*Neo4j: 전용 그래프 데이터베이스 시스템&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[그래프 이론]]&lt;br /&gt;
*[[데이터프레임]]&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[Neo4j]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Joseph Bradley et al. &#039;&#039;GraphFrames: An Integrated API for Mixing Graph and Relational Queries&#039;&#039;. Databricks, 2016.&lt;br /&gt;
*Holden Karau, Andy Konwinski et al. &#039;&#039;Learning Spark&#039;&#039;. O&#039;Reilly Media, 2015.&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%A0%88%ED%94%84%ED%94%84%EB%A0%88%EC%9E%84&amp;diff=40981</id>
		<title>아파치 스파크 그레프프레임</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%A0%88%ED%94%84%ED%94%84%EB%A0%88%EC%9E%84&amp;diff=40981"/>
		<updated>2025-05-13T04:52:23Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 아파치 스파크 그래프프레임 문서로 넘겨주기&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#넘겨주기 [[아파치 스파크 그래프프레임]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%9E%98%ED%94%84%EC%97%91%EC%8A%A4&amp;diff=40980</id>
		<title>아파치 스파크 그래프엑스</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%9E%98%ED%94%84%EC%97%91%EC%8A%A4&amp;diff=40980"/>
		<updated>2025-05-13T04:51:55Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 그래프엑스(GraphX for Apache Spark)는 분산 병렬 처리를 지원하는 아파치 스파크 기반의 그래프 처리 라이브러리로, 정점과 간선으로 구성된 그래프 구조를 효과적으로 분석하고 조작할 수 있도록 설계되었다. ==개요== 그래프엑스는 RDD(Resilient Distributed Dataset)를 기반으로 동작하며, 정점(vertex)와 간선(edge)을 분산된 형태로 저장하고 처리할 수 있는 기능을...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 그래프엑스(GraphX for Apache Spark)는 분산 병렬 처리를 지원하는 아파치 스파크 기반의 그래프 처리 라이브러리로, 정점과 간선으로 구성된 그래프 구조를 효과적으로 분석하고 조작할 수 있도록 설계되었다.&lt;br /&gt;
==개요==&lt;br /&gt;
그래프엑스는 RDD(Resilient Distributed Dataset)를 기반으로 동작하며, 정점(vertex)와 간선(edge)을 분산된 형태로 저장하고 처리할 수 있는 기능을 제공한다. 소셜 네트워크 분석, 페이지랭크, 커뮤니티 탐지와 같은 복잡한 그래프 알고리즘을 효율적으로 수행할 수 있으며, 스파크의 다른 컴포넌트들과 통합이 용이하다.&lt;br /&gt;
==주요 기능==&lt;br /&gt;
*그래프 구조를 표현하기 위한 정점 및 간선 RDD 제공&lt;br /&gt;
*사용자 정의 속성을 갖는 그래프 처리 가능&lt;br /&gt;
*페이지랭크(PageRank), 연결 요소(Connected Components), 삼각형 개수 계산(Triangle Count) 등의 내장 알고리즘 포함&lt;br /&gt;
*Pregel API를 통한 사용자 정의 반복(graph-parallel) 연산 수행&lt;br /&gt;
*정점 및 간선 속성에 대한 필터링, 매핑, 조인 등 다양한 변환 함수 지원&lt;br /&gt;
==구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;VertexRDD&#039;&#039;&#039;: 정점 정보를 담는 RDD. 각 정점은 고유한 ID와 함께 사용자 정의 속성을 포함한다.&lt;br /&gt;
*&#039;&#039;&#039;EdgeRDD&#039;&#039;&#039;: 간선 정보를 담는 RDD. 각 간선은 출발지 ID, 도착지 ID, 속성을 가진다.&lt;br /&gt;
*&#039;&#039;&#039;Graph&#039;&#039;&#039;: 정점과 간선을 결합하여 구성되는 그래프 객체. 다양한 연산 및 알고리즘 실행의 기반이 된다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
다음은 Scala에서 간단한 그래프를 생성하고 페이지랭크 알고리즘을 적용하는 예시이다.&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
import org.apache.spark.graphx._&lt;br /&gt;
import org.apache.spark.rdd.RDD&lt;br /&gt;
&lt;br /&gt;
val vertexArray = Array(&lt;br /&gt;
  (1L, &amp;quot;Alice&amp;quot;), (2L, &amp;quot;Bob&amp;quot;), (3L, &amp;quot;Charlie&amp;quot;)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
val edgeArray = Array(&lt;br /&gt;
  Edge(1L, 2L, &amp;quot;follows&amp;quot;), Edge(2L, 3L, &amp;quot;likes&amp;quot;)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
val vertexRDD: RDD[(Long, String)] = sc.parallelize(vertexArray)&lt;br /&gt;
val edgeRDD: RDD[Edge[String]] = sc.parallelize(edgeArray)&lt;br /&gt;
&lt;br /&gt;
val graph = Graph(vertexRDD, edgeRDD)&lt;br /&gt;
val ranks = graph.pageRank(0.0001).vertices&lt;br /&gt;
ranks.collect.foreach(println)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==GraphFrames와의 비교==&lt;br /&gt;
*GraphX는 RDD 기반, GraphFrames는 DataFrame 기반으로 구현되어 있다.&lt;br /&gt;
*GraphFrames는 SQL 기반 질의 및 모티프 탐색 기능을 제공하지만, GraphX는 더 저수준의 제어와 성능 중심의 API를 제공한다.&lt;br /&gt;
*GraphFrames는 Python과 Scala를 지원하지만, GraphX는 Scala와 Java 중심이다.&lt;br /&gt;
==한계점==&lt;br /&gt;
*RDD 기반 구조로 인해 최적화 및 성능 면에서 DataFrame 기반보다 불리할 수 있다.&lt;br /&gt;
*Python API가 제공되지 않아, 비 Scala/Java 사용자에게는 진입 장벽이 있다.&lt;br /&gt;
*개발이 다소 정체되어 있으며, 일부 최신 기능은 업데이트가 느리다.&lt;br /&gt;
==관련 프로젝트==&lt;br /&gt;
*GraphFrames: GraphX의 기능을 데이터프레임 API로 확장한 라이브러리&lt;br /&gt;
*Pregel: Google에서 제안한 그래프 병렬 처리 모델로, GraphX의 메시지 전달 방식에 영향&lt;br /&gt;
*NetworkX: Python 기반의 그래프 처리 라이브러리&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[그래프 이론]]&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[GraphFrames]]&lt;br /&gt;
*[[RDD]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Xin, Reynold S. et al. &#039;&#039;GraphX: Unifying Data-Parallel and Graph-Parallel Analytics&#039;&#039;. Proceedings of the 11th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2014.&lt;br /&gt;
*Holden Karau, Andy Konwinski et al. &#039;&#039;Learning Spark&#039;&#039;. O&#039;Reilly Media, 2015.&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%A0%88%ED%94%84%ED%94%84%EB%A0%88%EC%9E%84&amp;diff=40978</id>
		<title>아파치 스파크 그레프프레임</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EA%B7%B8%EB%A0%88%ED%94%84%ED%94%84%EB%A0%88%EC%9E%84&amp;diff=40978"/>
		<updated>2025-05-13T04:02:48Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 그레프프레임(GraphFrames for Apache Spark)은 스파크에서 그래프 이론 기반의 데이터 처리를 가능하게 해주는 라이브러리로, 그래프X(GraphX)의 기능을 데이터프레임 API로 확장한 것이다. ==개요== 그레프프레임은 정점(vertex)과 간선(edge)을 각각 데이터프레임으로 표현하며, 스파크 SQL과의 통합을 통해 강력한 질의 기능과 분산 처리 성능을 동시에 제공한다....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 그레프프레임(GraphFrames for Apache Spark)은 스파크에서 그래프 이론 기반의 데이터 처리를 가능하게 해주는 라이브러리로, 그래프X(GraphX)의 기능을 데이터프레임 API로 확장한 것이다.&lt;br /&gt;
==개요==&lt;br /&gt;
그레프프레임은 정점(vertex)과 간선(edge)을 각각 데이터프레임으로 표현하며, 스파크 SQL과의 통합을 통해 강력한 질의 기능과 분산 처리 성능을 동시에 제공한다. 그래프 알고리즘의 선언적 실행이 가능하며, 복잡한 관계형 데이터 처리에 적합하다. 스파크의 구조화된 API와 결합되어 생산성과 확장성이 뛰어나다.&lt;br /&gt;
==주요 기능==&lt;br /&gt;
*정점 및 간선을 데이터프레임으로 정의&lt;br /&gt;
*스파크 SQL과 통합된 그래프 질의 지원&lt;br /&gt;
*BFS(Breadth-First Search), 페이지랭크(PageRank), 연결 요소(Connected Components) 등 주요 그래프 알고리즘 내장&lt;br /&gt;
*모티프 탐색(Motif Finding)을 통한 패턴 기반 질의 지원&lt;br /&gt;
*정점 및 간선 속성에 대한 조건 필터링 및 조인 가능&lt;br /&gt;
*Python, Scala API 지원&lt;br /&gt;
==구성 요소==&lt;br /&gt;
*&#039;&#039;&#039;Vertices&#039;&#039;&#039;: 고유 ID를 가진 개체(예: 사용자, 상품 등)를 나타내는 데이터프레임&lt;br /&gt;
*&#039;&#039;&#039;Edges&#039;&#039;&#039;: 정점 간의 관계(예: 친구, 구매 등)를 나타내는 데이터프레임&lt;br /&gt;
*&#039;&#039;&#039;GraphFrame&#039;&#039;&#039;: 정점과 간선을 함께 포함하는 그래프 객체로, 다양한 알고리즘과 질의 기능을 수행&lt;br /&gt;
==모티프 탐색==&lt;br /&gt;
GraphFrames의 모티프 기능은 그래프 내에서 사용자가 지정한 구조적 패턴을 찾는 데 사용된다. 이 기능은 쿼리 언어를 통해 정점과 간선의 관계를 문자열로 표현하여 직관적으로 패턴을 탐색할 수 있게 해준다. 예를 들어, A → B → C 형태의 경로를 찾으려면 다음과 같이 표현할 수 있다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
motifs = g.find(&amp;quot;(a)-[e1]-&amp;gt;(b); (b)-[e2]-&amp;gt;(c)&amp;quot;)&lt;br /&gt;
motifs.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;이 기능은 사기 탐지, 추천 시스템, 소셜 네트워크 분석 등에서 유용하게 활용된다.&lt;br /&gt;
==예시 코드==&lt;br /&gt;
다음은 Python에서 GraphFrame을 생성하고 간단한 알고리즘을 수행하는 예시이다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
from graphframes import GraphFrame&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;GraphFrameExample&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
vertices = spark.createDataFrame([&lt;br /&gt;
    (&amp;quot;1&amp;quot;, &amp;quot;Alice&amp;quot;), (&amp;quot;2&amp;quot;, &amp;quot;Bob&amp;quot;), (&amp;quot;3&amp;quot;, &amp;quot;Charlie&amp;quot;)&lt;br /&gt;
], [&amp;quot;id&amp;quot;, &amp;quot;name&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
edges = spark.createDataFrame([&lt;br /&gt;
    (&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;friend&amp;quot;), (&amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;follow&amp;quot;)&lt;br /&gt;
], [&amp;quot;src&amp;quot;, &amp;quot;dst&amp;quot;, &amp;quot;relationship&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
g = GraphFrame(vertices, edges)&lt;br /&gt;
g.inDegrees.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==한계점==&lt;br /&gt;
*GraphFrames는 GraphX보다 느릴 수 있으며, 대규모 처리 시 성능 이슈가 발생할 수 있다.&lt;br /&gt;
*아직 일부 그래프 알고리즘의 구현은 제한적이며, 확장에는 별도 구현이 필요하다.&lt;br /&gt;
*Java API는 지원되지 않는다.&lt;br /&gt;
==관련 프로젝트==&lt;br /&gt;
*GraphX: RDD 기반의 그래프 처리 엔진으로 GraphFrames의 기반이 되는 프로젝트&lt;br /&gt;
*NetworkX: Python 기반의 그래프 처리 라이브러리&lt;br /&gt;
*Neo4j: 전용 그래프 데이터베이스 시스템&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[그래프 이론]]&lt;br /&gt;
*[[데이터프레임]]&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[Neo4j]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Joseph Bradley et al. &#039;&#039;GraphFrames: An Integrated API for Mixing Graph and Relational Queries&#039;&#039;. Databricks, 2016.&lt;br /&gt;
*Holden Karau, Andy Konwinski et al. &#039;&#039;Learning Spark&#039;&#039;. O&#039;Reilly Media, 2015.&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%ED%94%8C%EB%A7%81%ED%81%AC&amp;diff=40977</id>
		<title>아파치 플링크</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%ED%94%8C%EB%A7%81%ED%81%AC&amp;diff=40977"/>
		<updated>2025-05-13T03:49:58Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 플링크(Apache Flink)는 실시간 및 배치 데이터 스트리밍 처리를 위한 오픈소스 분산 처리 프레임워크이다. ==개요== 아파치 플링크는 대규모 데이터 스트림 처리를 위한 고성능 분산 처리 엔진이다. 스트리밍 데이터를 기본 처리 단위로 삼지만, 배치 처리 또한 스트리밍의 특수한 형태로 간주하여 일관된 API를 제공한다. 플링크는 정확히 한 번(exactly-once)의 상태...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 플링크(Apache Flink)는 실시간 및 배치 데이터 스트리밍 처리를 위한 오픈소스 분산 처리 프레임워크이다.&lt;br /&gt;
==개요==&lt;br /&gt;
아파치 플링크는 대규모 데이터 스트림 처리를 위한 고성능 분산 처리 엔진이다. 스트리밍 데이터를 기본 처리 단위로 삼지만, 배치 처리 또한 스트리밍의 특수한 형태로 간주하여 일관된 API를 제공한다. 플링크는 정확히 한 번(exactly-once)의 상태 일관성과 이벤트 타임 처리 기능을 제공하여 신뢰성 높은 실시간 분석을 가능하게 한다.&lt;br /&gt;
==특징==&lt;br /&gt;
*실시간 스트리밍 및 배치 처리 지원&lt;br /&gt;
*상태 기반(Stateful) 스트리밍 처리&lt;br /&gt;
*정확히 한 번(exactly-once) 처리 보장&lt;br /&gt;
*이벤트 타임(Event Time) 및 윈도우(Window) 처리 기능&lt;br /&gt;
*다양한 소스 및 싱크 커넥터 지원(Kafka, HDFS, JDBC 등)&lt;br /&gt;
*Flink SQL 및 Table API를 통한 고수준 질의 처리&lt;br /&gt;
*고가용성 및 장애 복구 기능 지원&lt;br /&gt;
==구성 요소==&lt;br /&gt;
*JobManager: 작업의 전체 수명 주기를 관리하며, 작업 스케줄링 및 장애 복구를 담당한다.&lt;br /&gt;
*TaskManager: 실제 사용자 작업을 실행하며, 각각의 연산(Task)을 병렬로 처리한다.&lt;br /&gt;
*Dispatcher &amp;amp; ResourceManager: 클러스터 자원 관리를 담당하며, 다양한 배포 모드(Kubernetes, YARN 등)를 지원한다.&lt;br /&gt;
==주요 사용 사례==&lt;br /&gt;
*실시간 로그 분석 및 모니터링&lt;br /&gt;
*사기 탐지 시스템&lt;br /&gt;
*실시간 추천 시스템&lt;br /&gt;
*금융 거래 스트림 처리&lt;br /&gt;
*IoT 센서 데이터 분석&lt;br /&gt;
==역사==&lt;br /&gt;
아파치 플링크는 독일 베를린의 TU Berlin에서 시작된 Stratosphere 프로젝트에서 유래되었으며, 2014년 아파치 인큐베이터 프로젝트로 채택되었다. 2015년에는 정식 아파치 탑레벨 프로젝트로 승격되었다.&lt;br /&gt;
==관련 프로젝트==&lt;br /&gt;
*Apache Kafka: 메시지 브로커로 Flink와 자주 함께 사용된다.&lt;br /&gt;
*Apache Beam: Flink를 실행 엔진으로 사용할 수 있는 범용 데이터 처리 모델을 제공한다.&lt;br /&gt;
*Apache Spark: 유사한 기능을 제공하는 데이터 처리 프레임워크로 Flink와 비교된다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[아파치 카프카]]&lt;br /&gt;
*[[분산 처리]]&lt;br /&gt;
*[[스트리밍 데이터]]&lt;br /&gt;
*[[빅 데이터]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Kostas Tzoumas, Fabian Hueske. *Streaming Systems: The What, Where, When, and How of Large-Scale Data Processing*. O&#039;Reilly Media, 2019.&lt;br /&gt;
*Fabian Hueske. *Stream Processing with Apache Flink*. O&#039;Reilly Media, 2019.&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%B3%B4%EC%83%81_%ED%95%B4%ED%82%B9&amp;diff=40896</id>
		<title>보상 해킹</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%B3%B4%EC%83%81_%ED%95%B4%ED%82%B9&amp;diff=40896"/>
		<updated>2025-05-09T19:21:36Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 보상 해킹(Reward hacking)은 인공지능, 특히 강화학습 시스템에서 에이전트가 주어진 보상 함수를 의도하지 않은 방식으로 최대화함으로써 인간 설계자의 의도와 다른 행동을 수행하는 현상을 의미한다. ==개요== 보상 해킹은 보상 함수가 불완전하거나 불충분하게 설계되었을 때 발생하며, 에이전트는 보상 자체를 극대화하려는 목표를 따르기 때문에 시스템이 기대하...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;보상 해킹(Reward hacking)은 인공지능, 특히 강화학습 시스템에서 에이전트가 주어진 보상 함수를 의도하지 않은 방식으로 최대화함으로써 인간 설계자의 의도와 다른 행동을 수행하는 현상을 의미한다.&lt;br /&gt;
==개요==&lt;br /&gt;
보상 해킹은 보상 함수가 불완전하거나 불충분하게 설계되었을 때 발생하며, 에이전트는 보상 자체를 극대화하려는 목표를 따르기 때문에 시스템이 기대하는 방식과는 다른 편법적인 행동을 취할 수 있다. 이는 AI 안전성 및 윤리 문제와 밀접하게 연관되어 있으며, AI 시스템 설계 시 신중한 보상 설계가 필요함을 시사한다.&lt;br /&gt;
==예시==&lt;br /&gt;
보상 해킹의 대표적인 사례로는 다음과 같은 것들이 있다.&lt;br /&gt;
*게임 플레이 AI가 점수를 얻기 위해 버그를 악용하거나 규칙을 우회하는 행위&lt;br /&gt;
*로봇 청소기가 &#039;청소한 면적&#039;을 보상으로 받을 때, 실제로는 먼지를 제거하지 않고 움직이기만 하는 전략을 채택하는 경우&lt;br /&gt;
*언어 모델이 &#039;좋은 평가&#039;를 보상으로 받을 경우, 사실과 무관한 답변을 하여 평가 점수를 높이려는 시도&lt;br /&gt;
==원인==&lt;br /&gt;
*보상 함수 설계의 불완전성&lt;br /&gt;
*환경 모델의 불완전성 또는 단순화&lt;br /&gt;
*에이전트가 탐색 중 우연히 의도치 않은 보상 루트를 발견&lt;br /&gt;
*보상과 진짜 목표(Goodhart의 법칙 간 관계) 간 불일치&lt;br /&gt;
==관련 개념==&lt;br /&gt;
*Goodhart의 법칙: 측정 가능한 지표가 목표가 될 때, 그 지표는 더 이상 좋은 목표가 되지 않는다는 원리&lt;br /&gt;
*값정책(Value function)과 보상 설계 간의 차이&lt;br /&gt;
*인공지능 안전성(AI safety) 및 가치 정렬(Value alignment) 문제&lt;br /&gt;
==방지 방법==&lt;br /&gt;
*보상 함수를 가능한 한 명확하고 포괄적으로 설계&lt;br /&gt;
*인간 피드백을 통해 보상 수정(Human-in-the-loop)&lt;br /&gt;
*시뮬레이션을 통한 다양한 테스트 케이스 적용&lt;br /&gt;
*제약 기반 강화학습(Constrained RL)이나 반사람 중심 학습(Inverse Reinforcement Learning) 기법 활용&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[강화학습]]&lt;br /&gt;
*[[Goodhart의 법칙]]&lt;br /&gt;
*[[가치 정렬 문제]]&lt;br /&gt;
*[[AI 안전성]]&lt;br /&gt;
*[[강화학습의 탐험-활용 문제]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Amodei, Dario et al. &amp;quot;Concrete Problems in AI Safety.&amp;quot; arXiv preprint arXiv:1606.06565 (2016).&lt;br /&gt;
*Clark, Jack et al. &amp;quot;Faulty Reward Functions in the Wild.&amp;quot; DeepMind Technical Report (2017).&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:보안 공격]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%8F%99%EC%A0%81_%ED%83%80%EC%9E%85_%EC%96%B8%EC%96%B4&amp;diff=40895</id>
		<title>동적 타입 언어</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%8F%99%EC%A0%81_%ED%83%80%EC%9E%85_%EC%96%B8%EC%96%B4&amp;diff=40895"/>
		<updated>2025-05-09T19:20:10Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 동적 타입 언어(Dynamic typing language, 動的 - 語言)은 변수나 표현식의 타입이 실행 시점(runtime)에 결정되는 프로그래밍 언어를 의미한다. 이러한 언어에서는 컴파일 시점에 타입 검사가 이루어지지 않으며, 프로그램 실행 중에 타입 오류가 발생할 수 있다. ==개요== 동적 타입 언어는 개발자가 변수의 타입을 명시하지 않아도 되며, 변수는 다양한 타입의 값을 가질 수...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;동적 타입 언어(Dynamic typing language, 動的 - 語言)은 변수나 표현식의 타입이 실행 시점(runtime)에 결정되는 프로그래밍 언어를 의미한다. 이러한 언어에서는 컴파일 시점에 타입 검사가 이루어지지 않으며, 프로그램 실행 중에 타입 오류가 발생할 수 있다.&lt;br /&gt;
==개요==&lt;br /&gt;
동적 타입 언어는 개발자가 변수의 타입을 명시하지 않아도 되며, 변수는 다양한 타입의 값을 가질 수 있다. 이는 빠른 프로토타이핑과 유연한 코드 작성을 가능하게 하며, 생산성을 높이는 데 유리하다. 그러나 타입 오류가 실행 중에 발생하므로, 안정성과 성능 면에서는 불리할 수 있다.&lt;br /&gt;
==특징==&lt;br /&gt;
*런타임 시점의 타입 결정&lt;br /&gt;
*명시적인 타입 선언이 불필요함&lt;br /&gt;
*타입 오류가 실행 중에 발생할 수 있음&lt;br /&gt;
*높은 코드 유연성과 간결성&lt;br /&gt;
*빠른 개발과 프로토타이핑에 적합&lt;br /&gt;
==예시==&lt;br /&gt;
대표적인 동적 타입 언어에는 다음과 같은 언어들이 있다.&lt;br /&gt;
*Python&lt;br /&gt;
*JavaScript&lt;br /&gt;
*Ruby&lt;br /&gt;
*PHP&lt;br /&gt;
*Perl&lt;br /&gt;
*Lisp&lt;br /&gt;
==장단점==&lt;br /&gt;
===장점===&lt;br /&gt;
*코드가 간결하고 읽기 쉬움&lt;br /&gt;
*타입 선언이 없어 빠른 개발 가능&lt;br /&gt;
*다양한 형태의 데이터 처리에 유연함&lt;br /&gt;
*프로토타입 제작 및 스크립트 작성에 유리함&lt;br /&gt;
===단점===&lt;br /&gt;
*실행 중 타입 오류 발생 가능성 존재&lt;br /&gt;
*대규모 프로젝트에서 유지보수 어려움&lt;br /&gt;
*성능 최적화가 어려움&lt;br /&gt;
*정적 분석 및 리팩토링 도구의 한계&lt;br /&gt;
==동적 타입과 유사한 개념==&lt;br /&gt;
일부 언어는 동적 타입 기능을 제공하지만 선택적으로 정적 타입 선언도 허용한다. 예를 들어 TypeScript는 JavaScript에 정적 타입 기능을 추가한 언어이며, Python은 타입 힌트 기능을 통해 정적 분석을 도울 수 있다.&lt;br /&gt;
==동적 타입 언어와 정적 타입 언어의 비교==&lt;br /&gt;
동적 타입 언어는 개발 초기의 생산성과 유연성을 중시하며, 정적 타입 언어는 성능과 안정성을 중시한다. 선택은 프로젝트의 목적, 팀 규모, 유지보수 계획 등에 따라 달라진다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[정적 타입 언어 (프로그래밍)]]&lt;br /&gt;
*[[타입 시스템]]&lt;br /&gt;
*[[스크립트 언어]]&lt;br /&gt;
*[[인터프리터]]&lt;br /&gt;
*[[타입 힌트]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Van Roy, Peter and Haridi, Seif. *Concepts, Techniques, and Models of Computer Programming*. MIT Press, 2004.&lt;br /&gt;
*Sebesta, Robert W. *Concepts of Programming Languages*. Pearson, 12th ed., 2019.&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:프로그래밍 언어]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%A0%95%EC%A0%81_%ED%83%80%EC%9E%85_%EC%96%B8%EC%96%B4&amp;diff=40894</id>
		<title>정적 타입 언어</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%A0%95%EC%A0%81_%ED%83%80%EC%9E%85_%EC%96%B8%EC%96%B4&amp;diff=40894"/>
		<updated>2025-05-09T19:19:20Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 정적 타입 언어(Static typing language, 靜的 - 語言)은 프로그램의 변수나 표현식의 타입이 컴파일 시점에 결정되는 프로그래밍 언어를 의미한다. 이러한 언어에서는 타입 검사가 컴파일러에 의해 수행되며, 타입 오류는 프로그램 실행 전에 발견된다. ==개요== 정적 타입 언어는 프로그램의 안정성과 예측 가능성을 높이기 위해 변수와 표현식에 대한 명확한 타입 선언을...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;정적 타입 언어(Static typing language, 靜的 - 語言)은 프로그램의 변수나 표현식의 타입이 컴파일 시점에 결정되는 프로그래밍 언어를 의미한다. 이러한 언어에서는 타입 검사가 컴파일러에 의해 수행되며, 타입 오류는 프로그램 실행 전에 발견된다.&lt;br /&gt;
==개요==&lt;br /&gt;
정적 타입 언어는 프로그램의 안정성과 예측 가능성을 높이기 위해 변수와 표현식에 대한 명확한 타입 선언을 요구하거나, 타입 추론을 통해 타입을 결정한다. 이는 실행 시점에서 발생할 수 있는 타입 관련 오류를 줄이고, 최적화된 기계어 코드 생성을 가능하게 한다.&lt;br /&gt;
==특징==&lt;br /&gt;
*컴파일 시점의 타입 검사&lt;br /&gt;
*명시적 또는 암묵적 타입 선언&lt;br /&gt;
*타입 안전성 보장&lt;br /&gt;
*실행 속도 최적화에 유리함&lt;br /&gt;
*코드 자동 완성 및 리팩토링 지원에 유리함&lt;br /&gt;
==예시==&lt;br /&gt;
대표적인 정적 타입 언어로는 다음과 같은 언어들이 있다.&lt;br /&gt;
*C&lt;br /&gt;
*C++&lt;br /&gt;
*Java&lt;br /&gt;
*Rust&lt;br /&gt;
*Kotlin (기본적으로 정적 타입이지만 타입 추론을 지원함)&lt;br /&gt;
*Swift (정적 타입 기반이나 타입 추론 가능)&lt;br /&gt;
==장단점==&lt;br /&gt;
===장점===&lt;br /&gt;
*컴파일 시점에 오류를 발견할 수 있어 디버깅이 용이함&lt;br /&gt;
*최적화된 코드 생성으로 실행 성능이 뛰어남&lt;br /&gt;
*코드 구조와 타입이 명확하여 유지보수가 용이함&lt;br /&gt;
*IDE 지원을 통한 코드 완성 및 리팩토링이 강력함&lt;br /&gt;
===단점===&lt;br /&gt;
*코드 작성 시 타입 선언 필요로 인한 개발 초기 비용 증가&lt;br /&gt;
*복잡한 제네릭 타입 사용 시 가독성 저하&lt;br /&gt;
*유연성이 제한되어 빠른 프로토타이핑에는 부적합할 수 있음&lt;br /&gt;
==정적 타입 검사와 타입 추론==&lt;br /&gt;
정적 타입 언어라 하더라도 모든 변수에 대해 명시적 타입 선언이 필요한 것은 아니다. 예를 들어 Scala, Kotlin, Swift 등의 언어는 타입 추론 기능을 통해 개발자의 타입 선언 부담을 줄이면서도 정적 타입의 장점을 유지한다.&lt;br /&gt;
==정적 타입 언어와 동적 타입 언어의 비교==&lt;br /&gt;
정적 타입 언어는 컴파일 타임에 타입을 검사하는 반면, 동적 타입 언어는 런타임에 타입이 결정된다. 이에 따라 정적 타입 언어는 성능과 안정성 면에서 강점을 가지며, 동적 타입 언어는 유연성과 생산성 측면에서 이점을 가진다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[동적 타입 언어]]&lt;br /&gt;
*[[타입 시스템]]&lt;br /&gt;
*[[컴파일러]]&lt;br /&gt;
*[[타입 추론]]&lt;br /&gt;
*[[형 안정성]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Pierce, Benjamin C. *Types and Programming Languages*. MIT Press, 2002.&lt;br /&gt;
*Cardelli, Luca. “Type Systems.” In *The Computer Science and Engineering Handbook*, CRC Press, 1997.&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:프로그래밍 언어]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=Loudacre&amp;diff=40785</id>
		<title>Loudacre</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=Loudacre&amp;diff=40785"/>
		<updated>2025-04-26T02:06:28Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: Loudacre는 가상의 이동통신 및 기술 솔루션 회사이다. ==개요== Loudacre는 주로 이동통신 장비, 스마트 디바이스, IoT(사물인터넷) 솔루션 및 기업용 IT 서비스 분야에서 활동하는 가상의 기업으로 설정되어 있다. 이 회사는 다양한 기술 학습 자료, 빅데이터 분석 연습, 클라우드 컴퓨팅 실습 등에서 등장하는 예시 회사로 자주 활용된다. 이름은 명확한 어원적 배경 없이 &amp;#039;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Loudacre는 가상의 이동통신 및 기술 솔루션 회사이다.&lt;br /&gt;
==개요==&lt;br /&gt;
Loudacre는 주로 이동통신 장비, 스마트 디바이스, IoT(사물인터넷) 솔루션 및 기업용 IT 서비스 분야에서 활동하는 가상의 기업으로 설정되어 있다. 이 회사는 다양한 기술 학습 자료, 빅데이터 분석 연습, 클라우드 컴퓨팅 실습 등에서 등장하는 예시 회사로 자주 활용된다. 이름은 명확한 어원적 배경 없이 &#039;loud(시끄러운)&#039;와 &#039;acre(에이커, 토지 단위)&#039;를 조합하여 만들어졌으며, 대규모 통신 인프라나 기술적 진보를 연상시키는 어감을 의도한 것으로 보인다.&lt;br /&gt;
==특징==&lt;br /&gt;
*이동통신 기기 제조 및 판매&lt;br /&gt;
*스마트 홈 및 IoT 솔루션 제공&lt;br /&gt;
*빅데이터 분석 및 클라우드 인프라 도입&lt;br /&gt;
*엔터프라이즈 IT 솔루션 개발 및 지원&lt;br /&gt;
*기술 기반의 가상 비즈니스 시나리오 제공&lt;br /&gt;
==활용==&lt;br /&gt;
Loudacre는 Amazon Web Services(AWS)와 같은 클라우드 서비스 제공업체의 공식 교육 과정이나 가이드라인 문서에서 처음 등장하였다. 이후 Google Cloud, Microsoft Azure 등의 다른 클라우드 플랫폼에서도 학습용 시나리오로 채택되면서 널리 알려졌다. 시간이 지나면서 기술 업계에서는 Loudacre가 일종의 &#039;밈(meme)&#039;처럼 사용되기도 하였으며, 가상의 대기업을 패러디하거나 농담으로 등장하는 사례도 증가하였다.&lt;br /&gt;
*클라우드 서비스 플랫폼(예: AWS, Google Cloud) 학습 예제&lt;br /&gt;
*데이터 분석, 머신러닝, IoT 프로젝트의 실습용 시나리오&lt;br /&gt;
*네트워크 및 시스템 아키텍처 설계 연습&lt;br /&gt;
*교육용 샘플 데이터셋 및 프로젝트 기반 학습 자료&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[가상 기업]]&lt;br /&gt;
*[[클라우드 컴퓨팅]]&lt;br /&gt;
*[[빅데이터]]&lt;br /&gt;
*[[사물인터넷]]&lt;br /&gt;
*[[IT 교육]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_Structured_Streaming&amp;diff=40716</id>
		<title>아파치 스파크 Structured Streaming</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_Structured_Streaming&amp;diff=40716"/>
		<updated>2025-04-16T00:52:33Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 Structured Streaming은 아파치 스파크에서 제공하는 고수준 스트리밍 처리 엔진으로, 스트리밍 데이터를 &amp;#039;&amp;#039;&amp;#039;배치 처리처럼 선언적으로 다룰 수 있도록 설계된 API&amp;#039;&amp;#039;&amp;#039;이다. DStream 기반의 기존 스트리밍 모델보다 간단하고 강력하며, DataFrame, Dataset API를 그대로 사용할 수 있다. ==개념== *Structured Streaming은 스트리밍을 마치 정적인 테이블처럼 처리하는 &amp;#039;&amp;#039;&amp;#039;c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 Structured Streaming은 [[아파치 스파크]]에서 제공하는 고수준 스트리밍 처리 엔진으로, 스트리밍 데이터를 &#039;&#039;&#039;배치 처리처럼 선언적으로 다룰 수 있도록 설계된 API&#039;&#039;&#039;이다. [[DStream]] 기반의 기존 스트리밍 모델보다 간단하고 강력하며, DataFrame, Dataset API를 그대로 사용할 수 있다.&lt;br /&gt;
==개념==&lt;br /&gt;
*Structured Streaming은 스트리밍을 마치 정적인 테이블처럼 처리하는 &#039;&#039;&#039;continuous incremental query&#039;&#039;&#039; 모델을 기반으로 함&lt;br /&gt;
*입력 스트림을 테이블로 간주하고, SQL 또는 DataFrame 쿼리를 통해 연속적으로 처리&lt;br /&gt;
*결과는 출력 싱크(sink)에 주기적으로 업데이트됨&lt;br /&gt;
==특징==&lt;br /&gt;
*DataFrame / Dataset 기반 처리&lt;br /&gt;
*Catalyst Optimizer와 Tungsten 엔진을 통한 고속 최적화&lt;br /&gt;
*장애 발생 시 &#039;&#039;&#039;정확히 한 번 처리&#039;&#039;&#039;(exactly-once semantics) 보장&lt;br /&gt;
*[[Stateful Streaming]], [[아파치 스파크 DStream 윈도우|윈도우 연산]], 워터마크 기반 이벤트 타임 처리 지원&lt;br /&gt;
*Kafka, 소켓, 파일, Delta Lake 등 다양한 소스 및 싱크와 통합 가능&lt;br /&gt;
==처리 흐름==&lt;br /&gt;
#입력 소스 → 스트리밍 DataFrame으로 읽기&lt;br /&gt;
#SQL/DataFrame 연산 수행&lt;br /&gt;
#출력 싱크로 지속적으로 쓰기&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
from pyspark.sql.functions import explode, split&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;StructuredNetworkWordCount&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
lines = spark.readStream.format(&amp;quot;socket&amp;quot;) \&lt;br /&gt;
        .option(&amp;quot;host&amp;quot;, &amp;quot;localhost&amp;quot;) \&lt;br /&gt;
        .option(&amp;quot;port&amp;quot;, 9999).load()&lt;br /&gt;
&lt;br /&gt;
words = lines.select(explode(split(lines.value, &amp;quot; &amp;quot;)).alias(&amp;quot;word&amp;quot;))&lt;br /&gt;
wordCounts = words.groupBy(&amp;quot;word&amp;quot;).count()&lt;br /&gt;
&lt;br /&gt;
query = wordCounts.writeStream \&lt;br /&gt;
        .outputMode(&amp;quot;complete&amp;quot;) \&lt;br /&gt;
        .format(&amp;quot;console&amp;quot;) \&lt;br /&gt;
        .start()&lt;br /&gt;
&lt;br /&gt;
query.awaitTermination()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==출력 모드==&lt;br /&gt;
*&#039;&#039;&#039;append&#039;&#039;&#039;: 새로 추가된 행만 출력&lt;br /&gt;
*&#039;&#039;&#039;update&#039;&#039;&#039;: 변경된 행만 출력&lt;br /&gt;
*&#039;&#039;&#039;complete&#039;&#039;&#039;: 전체 결과를 매번 출력&lt;br /&gt;
==상태 관리==&lt;br /&gt;
*groupBy, 윈도우 연산 등을 사용할 경우 내부적으로 상태(state)를 유지&lt;br /&gt;
*정확히 한 번 처리 보장을 위해 checkpointLocation 설정이 필요함&lt;br /&gt;
*[[아파치 스파크 DStream 체크포인팅|체크포인팅]]과 유사한 개념으로 관리됨&lt;br /&gt;
==장점==&lt;br /&gt;
*배치와 스트리밍을 동일한 코드로 처리 가능&lt;br /&gt;
*SQL로 복잡한 스트리밍 쿼리 구성 가능&lt;br /&gt;
*정확히 한 번 처리 보장&lt;br /&gt;
*장애 발생 시 상태 복구 가능&lt;br /&gt;
==단점==&lt;br /&gt;
*낮은 수준의 제어가 필요한 경우 유연성 제한&lt;br /&gt;
*설정 복잡도 증가 (checkpoint, trigger 등)&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[DStream]]&lt;br /&gt;
*[[Stateful Streaming]]&lt;br /&gt;
*[[아파치 스파크 DStream 체크포인팅]]&lt;br /&gt;
*[[아파치 스파크 DStream 윈도우]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html&lt;br /&gt;
*Spark: The Definitive Guide (O&#039;Reilly)&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream_Stateful_Streaming&amp;diff=40715</id>
		<title>아파치 스파크 DStream Stateful Streaming</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream_Stateful_Streaming&amp;diff=40715"/>
		<updated>2025-04-15T23:42:39Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: DStream 기반의 Stateful Streaming은 &amp;#039;&amp;#039;&amp;#039;과거 배치의 처리 결과 또는 상태(state)를 현재 배치 처리에 활용하는 방식&amp;#039;&amp;#039;&amp;#039;이다. Stateless Streaming과 달리, 데이터 간의 시간적 연관성이나 누적 계산이 필요한 경우에 사용된다. 세션 추적, 누적 카운트, 상태 기반 경고 등에 적합하다. ==개념== *상태란 키(key)별로 유지되는 누적 값, 카운트, 집계 정보 등을 의미 *배치 간에 상태가...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DStream 기반의 Stateful Streaming은 &#039;&#039;&#039;과거 배치의 처리 결과 또는 상태(state)를 현재 배치 처리에 활용하는 방식&#039;&#039;&#039;이다. [[Stateless Streaming]]과 달리, 데이터 간의 시간적 연관성이나 누적 계산이 필요한 경우에 사용된다. 세션 추적, 누적 카운트, 상태 기반 경고 등에 적합하다.&lt;br /&gt;
==개념==&lt;br /&gt;
*상태란 키(key)별로 유지되는 누적 값, 카운트, 집계 정보 등을 의미&lt;br /&gt;
*배치 간에 상태가 이어지므로 &#039;&#039;&#039;데이터 처리 결과가 시간 축을 따라 누적됨&#039;&#039;&#039;&lt;br /&gt;
*내부적으로 각 키에 대한 상태를 메모리에서 유지하거나 [[체크포인팅]]을 통해 디스크에 저장&lt;br /&gt;
==주요 연산==&lt;br /&gt;
===updateStateByKey===&lt;br /&gt;
*가장 대표적인 상태 유지 연산&lt;br /&gt;
*키별로 상태를 갱신함&lt;br /&gt;
*함수 형식: `(new_values, previous_state) =&amp;gt; updated_state`&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def update_func(new_values, running_count):&lt;br /&gt;
    return sum(new_values) + (running_count or 0)&lt;br /&gt;
&lt;br /&gt;
word_counts = words.map(lambda w: (w, 1)) \&lt;br /&gt;
                   .updateStateByKey(update_func)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===mapWithState===&lt;br /&gt;
*updateStateByKey의 성능 향상 및 유연한 대체제&lt;br /&gt;
*[[타임아웃]], [[삭제된 키]] 처리 등 고급 기능 제공&lt;br /&gt;
*데이터 스트림과 상태를 함께 처리하는 구조 지원&lt;br /&gt;
==상태 저장==&lt;br /&gt;
*상태는 Executor의 메모리에 저장되며, 장애 시 복구를 위해 [[체크포인팅]] 필요&lt;br /&gt;
*체크포인트 디렉토리는 HDFS 등 외부 안정 저장소로 지정해야 함&lt;br /&gt;
==예시==&lt;br /&gt;
*단어별 누적 출현 횟수 계산&lt;br /&gt;
*사용자별 로그인 세션 추적&lt;br /&gt;
*센서별 누적 온도 변화 모니터링&lt;br /&gt;
*주문 상태별 누적 금액 계산&lt;br /&gt;
==장점==&lt;br /&gt;
*시간에 따른 상태 변화 추적 가능&lt;br /&gt;
*이벤트 기반 이상 감지 및 경고 처리 가능&lt;br /&gt;
*키별 누적 분석, 세션 추적에 필수적&lt;br /&gt;
==단점==&lt;br /&gt;
*상태 유지를 위한 메모리 비용 증가&lt;br /&gt;
*장애 복구를 위해 체크포인팅 필수&lt;br /&gt;
*클러스터 자원 소모 증가&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크 DStream]]&lt;br /&gt;
*[[Stateless Streaming]]&lt;br /&gt;
*[[체크포인팅]]&lt;br /&gt;
*[[스트럭처드 스트리밍]]&lt;br /&gt;
*[[마이크로 배치]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*https://spark.apache.org/docs/latest/streaming-programming-guide.html#stateful-operations&lt;br /&gt;
*Spark: The Definitive Guide (O&#039;Reilly)&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream_Stateless_Streaming&amp;diff=40714</id>
		<title>아파치 스파크 DStream Stateless Streaming</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream_Stateless_Streaming&amp;diff=40714"/>
		<updated>2025-04-15T23:41:42Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: DStream 기반의 Stateless Streaming은 각 마이크로 배치에서 수신된 데이터를 &amp;#039;&amp;#039;&amp;#039;이전 상태와 독립적으로 처리하는 방식&amp;#039;&amp;#039;&amp;#039;을 의미한다. 즉, 각 배치 단위의 RDD는 다른 배치와 관계없이 독립적으로 처리되며, &amp;#039;&amp;#039;&amp;#039;누적 상태(state)를 유지하지 않는다.&amp;#039;&amp;#039;&amp;#039; ==개념== *Stateless란 &amp;#039;&amp;#039;&amp;#039;이전 입력 데이터의 상태를 저장하지 않고&amp;#039;&amp;#039;&amp;#039; 매 배치마다 새로 계산하는 방식 *모든 계산은 &amp;#039;&amp;#039;&amp;#039;현재 배치...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DStream 기반의 Stateless Streaming은 각 마이크로 배치에서 수신된 데이터를 &#039;&#039;&#039;이전 상태와 독립적으로 처리하는 방식&#039;&#039;&#039;을 의미한다. 즉, 각 배치 단위의 RDD는 다른 배치와 관계없이 독립적으로 처리되며, &#039;&#039;&#039;누적 상태(state)를 유지하지 않는다.&#039;&#039;&#039;&lt;br /&gt;
==개념==&lt;br /&gt;
*Stateless란 &#039;&#039;&#039;이전 입력 데이터의 상태를 저장하지 않고&#039;&#039;&#039; 매 배치마다 새로 계산하는 방식&lt;br /&gt;
*모든 계산은 &#039;&#039;&#039;현재 배치에서 들어온 RDD만을 기반&#039;&#039;&#039;으로 수행됨&lt;br /&gt;
*예: 단어 수 세기, 필터링, 단순 매핑 등&lt;br /&gt;
==구조==&lt;br /&gt;
*매 배치 간격마다 들어온 데이터를 RDD로 변환&lt;br /&gt;
*변환된 RDD에 대해 map, reduceByKey, join 등의 연산 수행&lt;br /&gt;
*이전 RDD의 결과나 상태는 저장되지 않음&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 소켓에서 들어오는 텍스트 데이터&lt;br /&gt;
lines = ssc.socketTextStream(&amp;quot;localhost&amp;quot;, 9999)&lt;br /&gt;
&lt;br /&gt;
# 단어 분할 후 카운트 (Stateless 처리)&lt;br /&gt;
word_counts = lines.flatMap(lambda line: line.split(&amp;quot; &amp;quot;)) \&lt;br /&gt;
                   .map(lambda word: (word, 1)) \&lt;br /&gt;
                   .reduceByKey(lambda a, b: a + b)&lt;br /&gt;
&lt;br /&gt;
word_counts.pprint()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==특징==&lt;br /&gt;
*설계 및 디버깅이 상대적으로 간단&lt;br /&gt;
*고속 처리에 유리하며, [[체크포인팅]] 불필요&lt;br /&gt;
*정확도보다는 처리 속도가 중요한 경우 적합&lt;br /&gt;
==장점==&lt;br /&gt;
*상태 저장 비용과 복잡성 없음&lt;br /&gt;
*장애 발생 시 RDD lineage로 복구 가능&lt;br /&gt;
*클러스터 내 자원 효율성 향상&lt;br /&gt;
==단점==&lt;br /&gt;
*누적 합계, 세션 추적, 히스토리 기반 분석 등은 구현 불가&lt;br /&gt;
*데이터 간 관계가 있는 경우에는 사용이 어려움&lt;br /&gt;
*[[Stateful Streaming]]이 필요한 경우 제한적&lt;br /&gt;
==stateless 연산 예시==&lt;br /&gt;
*flatMap, map, filter&lt;br /&gt;
*reduceByKey, count, countByValue&lt;br /&gt;
*join (batch 간이 아닌 동시 배치 내에서만 가능)&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크 DStream]]&lt;br /&gt;
*[[Stateful Streaming]]&lt;br /&gt;
*[[체크포인팅]]&lt;br /&gt;
*[[마이크로 배치]]&lt;br /&gt;
*[[스트럭처드 스트리밍]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*https://spark.apache.org/docs/latest/streaming-programming-guide.html&lt;br /&gt;
*Spark: The Definitive Guide (O&#039;Reilly)&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream_transform&amp;diff=40713</id>
		<title>아파치 스파크 DStream transform</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream_transform&amp;diff=40713"/>
		<updated>2025-04-15T23:41:05Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: DStream의 transform 연산은 각 배치 간격마다 생성되는 RDD에 대해 &amp;#039;&amp;#039;&amp;#039;직접적인 RDD 연산을 적용&amp;#039;&amp;#039;&amp;#039;할 수 있게 해주는 고급 연산이다. DStream API의 고수준 추상화(map, reduceByKey 등)로는 처리할 수 없는 복잡한 연산이나 외부 RDD와의 연산을 가능하게 한다. ==개념== *transform 연산은 DStream 내부의 RDD를 직접 받아서 처리할 수 있는 유일한 API다 *즉, 각 배치 시점마다 다음과 같은...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DStream의 transform 연산은 각 배치 간격마다 생성되는 RDD에 대해 &#039;&#039;&#039;직접적인 RDD 연산을 적용&#039;&#039;&#039;할 수 있게 해주는 고급 연산이다. DStream API의 고수준 추상화(map, reduceByKey 등)로는 처리할 수 없는 복잡한 연산이나 외부 RDD와의 연산을 가능하게 한다.&lt;br /&gt;
==개념==&lt;br /&gt;
*transform 연산은 DStream 내부의 RDD를 직접 받아서 처리할 수 있는 유일한 API다&lt;br /&gt;
*즉, 각 배치 시점마다 다음과 같은 방식으로 동작:&lt;br /&gt;
**rdd → func(rdd) 를 수행한 결과로 새로운 RDD를 생성&lt;br /&gt;
*외부의 정적 RDD와 조인하거나, [[Spark SQL]]처럼 DStream 이외의 기능을 결합할 때 유용함&lt;br /&gt;
==문법==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
new_dstream = original_dstream.transform(lambda rdd: some_operation(rdd))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==예시 1: 외부 RDD와의 조인==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 정적 사용자 정보 RDD&lt;br /&gt;
user_info = sc.parallelize([(&amp;quot;user1&amp;quot;, &amp;quot;Alice&amp;quot;), (&amp;quot;user2&amp;quot;, &amp;quot;Bob&amp;quot;)])&lt;br /&gt;
&lt;br /&gt;
# DStream: (user_id, event)&lt;br /&gt;
events = ssc.socketTextStream(&amp;quot;localhost&amp;quot;, 9999) \&lt;br /&gt;
             .map(lambda line: line.split(&amp;quot;,&amp;quot;)) \&lt;br /&gt;
             .map(lambda fields: (fields[0], fields[1]))&lt;br /&gt;
&lt;br /&gt;
# 조인 연산&lt;br /&gt;
joined = events.transform(lambda rdd: rdd.join(user_info))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==예시 2: DStream 내 RDD를 동적으로 필터링==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_filter(rdd):&lt;br /&gt;
    blacklist = [&amp;quot;error&amp;quot;, &amp;quot;fail&amp;quot;, &amp;quot;unauthorized&amp;quot;]&lt;br /&gt;
    return rdd.filter(lambda word: word not in blacklist)&lt;br /&gt;
&lt;br /&gt;
filtered = word_dstream.transform(dynamic_filter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==특징==&lt;br /&gt;
*고급 사용자 정의 로직 삽입 가능&lt;br /&gt;
*정적 RDD 또는 외부 DB, 캐시 등과 통합 가능&lt;br /&gt;
*map, flatMap 등 기본 연산보다 자유도 높음&lt;br /&gt;
==주의사항==&lt;br /&gt;
*transform 함수 내부에서는 반드시 &#039;&#039;&#039;RDD 연산만 사용&#039;&#039;&#039;해야 하며, DStream 연산은 사용 불가&lt;br /&gt;
*외부 리소스에 접근할 경우 성능 및 안정성을 고려해 캐싱, 브로드캐스트 등의 전략 필요&lt;br /&gt;
*디버깅이 어렵기 때문에 체크포인팅과 로그 추적이 중요함&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크 DStream]]&lt;br /&gt;
*[[RDD]]&lt;br /&gt;
*[[Spark SQL]]&lt;br /&gt;
*[[체크포인팅]]&lt;br /&gt;
*[[카프카]]&lt;br /&gt;
*[[스트럭처드 스트리밍]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*https://spark.apache.org/docs/latest/streaming-programming-guide.html#transform&lt;br /&gt;
*Spark: The Definitive Guide (O&#039;Reilly)&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=RDD&amp;diff=40712</id>
		<title>RDD</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=RDD&amp;diff=40712"/>
		<updated>2025-04-15T23:30:46Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 아파치 스파크 RDD 문서로 넘겨주기&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#넘겨주기 [[아파치 스파크 RDD]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream&amp;diff=40711</id>
		<title>아파치 스파크 DStream</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_DStream&amp;diff=40711"/>
		<updated>2025-04-15T23:30:17Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 DStream(Discretized Stream)은 아파치 스파크 스트리밍에서 사용하는 &amp;#039;&amp;#039;&amp;#039;기본 스트리밍 데이터 추상화&amp;#039;&amp;#039;&amp;#039;로, &amp;#039;&amp;#039;&amp;#039;연속적인 RDD들의 시퀀스&amp;#039;&amp;#039;&amp;#039;로 구성된다. 실시간 스트리밍 데이터를 일정 시간 간격의 마이크로 배치로 나누어 처리하며, RDD 기반의 내결함성과 분산 처리 특성을 그대로 유지한다. ==개념== *DStream은 스트리밍 데이터를 정해진 간격으로 잘라서...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 DStream(Discretized Stream)은 [[아파치 스파크 스트리밍]]에서 사용하는 &#039;&#039;&#039;기본 스트리밍 데이터 추상화&#039;&#039;&#039;로, &#039;&#039;&#039;연속적인 RDD들의 시퀀스&#039;&#039;&#039;로 구성된다. 실시간 스트리밍 데이터를 일정 시간 간격의 마이크로 배치로 나누어 처리하며, [[RDD]] 기반의 내결함성과 분산 처리 특성을 그대로 유지한다.&lt;br /&gt;
==개념==&lt;br /&gt;
*DStream은 스트리밍 데이터를 정해진 간격으로 잘라서 생성된 &#039;&#039;&#039;시간 단위의 RDD 묶음&#039;&#039;&#039;이다.&lt;br /&gt;
*사용자 입장에서는 스트림처럼 보이지만, 내부적으로는 배치 처리의 연속&lt;br /&gt;
*마이크로 배치 방식: 실시간 데이터 처리와 기존 배치 모델 간의 통합을 가능하게 함&lt;br /&gt;
==구조==&lt;br /&gt;
*Input DStream: 외부 소스(Kafka, TCP 소켓 등)에서 데이터를 수신하여 생성&lt;br /&gt;
*Transformed DStream: 기존 DStream에 map, reduce, join 등의 변환 연산을 적용하여 생성&lt;br /&gt;
==동작 흐름==&lt;br /&gt;
#외부 시스템에서 실시간 데이터 수신&lt;br /&gt;
#일정 간격으로 데이터를 수집하여 RDD 생성&lt;br /&gt;
#생성된 RDD에 변환 연산 수행&lt;br /&gt;
#결과를 콘솔, 파일, DB 등에 출력&lt;br /&gt;
==연산==&lt;br /&gt;
*DStream은 RDD처럼 다음과 같은 연산을 지원함:&lt;br /&gt;
**map, flatMap, filter, reduceByKey, join, window, updateStateByKey 등&lt;br /&gt;
*대부분의 연산은 내부적으로 각 배치 RDD에 대해 수행됨&lt;br /&gt;
==장애 대응==&lt;br /&gt;
*[[RDD]]의 특성상 &#039;&#039;&#039;lineage 정보&#039;&#039;&#039;를 활용한 자동 복구 기능이 존재함&lt;br /&gt;
**노드 장애가 발생해도 이전 연산 정보를 바탕으로 손실된 RDD를 재생성 가능&lt;br /&gt;
*상태 기반 연산(updateStateByKey)이나 장기 상태 유지에는 &#039;&#039;&#039;체크포인팅(checkpointing)&#039;&#039;&#039; 필요&lt;br /&gt;
**일정 주기로 상태 정보를 HDFS 등에 저장해 장애 시 복구&lt;br /&gt;
*DStream 레벨에서는 스트리밍 입력의 복구를 위해 입력 소스(Kafka 등)의 재시작 또는 커밋 오프셋 기반 복구 전략이 중요&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from pyspark import SparkContext&lt;br /&gt;
from pyspark.streaming import StreamingContext&lt;br /&gt;
&lt;br /&gt;
sc = SparkContext(&amp;quot;local[2]&amp;quot;, &amp;quot;StreamingExample&amp;quot;)&lt;br /&gt;
ssc = StreamingContext(sc, 1)  # 배치 간격 1초&lt;br /&gt;
&lt;br /&gt;
lines = ssc.socketTextStream(&amp;quot;localhost&amp;quot;, 9999)&lt;br /&gt;
words = lines.flatMap(lambda line: line.split(&amp;quot; &amp;quot;))&lt;br /&gt;
pairs = words.map(lambda w: (w, 1))&lt;br /&gt;
counts = pairs.reduceByKey(lambda x, y: x + y)&lt;br /&gt;
&lt;br /&gt;
counts.pprint()&lt;br /&gt;
&lt;br /&gt;
ssc.start()&lt;br /&gt;
ssc.awaitTermination()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*[[RDD]] 기반으로 높은 신뢰성과 분산 처리 성능 확보&lt;br /&gt;
*배치와 스트리밍 처리의 통합 환경 제공&lt;br /&gt;
*[[Spark SQL]], [[MLlib]], [[GraphX]]와 함께 사용 가능&lt;br /&gt;
==단점==&lt;br /&gt;
*완전한 실시간(event-by-event) 처리가 아닌 마이크로 배치 기반&lt;br /&gt;
*[[Structured Streaming]]에 비해 API 수준이 낮고 복잡함&lt;br /&gt;
*최신 스파크 버전에서는 비권장(deprecated)으로 전환됨&lt;br /&gt;
==비교==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!항목!!DStream!!Structured Streaming&lt;br /&gt;
|-&lt;br /&gt;
|처리 방식||마이크로 배치||마이크로 배치 또는 연속 처리&lt;br /&gt;
|-&lt;br /&gt;
|추상화 단위||RDD 시퀀스||DataFrame/Dataset&lt;br /&gt;
|-&lt;br /&gt;
|연산 방식||RDD 연산 유사||SQL 및 선언적 쿼리&lt;br /&gt;
|-&lt;br /&gt;
|보장 수준||At least once||Exactly once&lt;br /&gt;
|-&lt;br /&gt;
|권장 여부||비권장 (deprecated)||기본 스트리밍 엔진&lt;br /&gt;
|}&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[아파치 스파크 스트리밍]]&lt;br /&gt;
*[[스트럭처드 스트리밍]]&lt;br /&gt;
*[[마이크로 배치]]&lt;br /&gt;
*[[우선순위 큐]]&lt;br /&gt;
*[[체크포인팅]]&lt;br /&gt;
*[[카프카]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*https://spark.apache.org/docs/latest/streaming-programming-guide.html&lt;br /&gt;
*Zaharia et al. (2013). Discretized Streams: Fault-Tolerant Streaming Computation at Scale&lt;br /&gt;
*Spark: The Definitive Guide (O&#039;Reilly)&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D&amp;diff=40710</id>
		<title>아파치 스파크 스트리밍</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D&amp;diff=40710"/>
		<updated>2025-04-15T23:23:43Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 스트리밍(Apache Spark Streaming)은 아파치 스파크에서 제공하는 &amp;#039;&amp;#039;&amp;#039;실시간 데이터 스트리밍 처리 기능&amp;#039;&amp;#039;&amp;#039;이다. 대규모 실시간 데이터를 마이크로 배치(micro-batch) 단위로 처리하며, 고속 데이터 처리와 확장성을 동시에 제공한다. ==개념== *스트리밍 데이터를 &amp;#039;&amp;#039;&amp;#039;작은 배치 단위로 분할&amp;#039;&amp;#039;&amp;#039;하여 처리 *실시간 데이터 수집 → 변환 → 분석 → 저장의 전 과정 지...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 스트리밍(Apache Spark Streaming)은 [[아파치 스파크]]에서 제공하는 &#039;&#039;&#039;실시간 데이터 스트리밍 처리 기능&#039;&#039;&#039;이다. 대규모 실시간 데이터를 마이크로 배치(micro-batch) 단위로 처리하며, 고속 데이터 처리와 확장성을 동시에 제공한다.&lt;br /&gt;
==개념==&lt;br /&gt;
*스트리밍 데이터를 &#039;&#039;&#039;작은 배치 단위로 분할&#039;&#039;&#039;하여 처리&lt;br /&gt;
*실시간 데이터 수집 → 변환 → 분석 → 저장의 전 과정 지원&lt;br /&gt;
*[[RDD]] 기반 처리 모델을 유지하되, 스트림 데이터에 맞춰 확장됨&lt;br /&gt;
==구성 방식==&lt;br /&gt;
스파크 스트리밍은 다음과 같은 방식으로 구현할 수 있다:&lt;br /&gt;
===1. DStream API (Discretized Streams)===&lt;br /&gt;
*Spark 1.x~2.x에서 사용된 기존 스트리밍 방식&lt;br /&gt;
*&#039;&#039;&#039;DStream은 시간 단위로 나눠진 RDD들의 시퀀스&#039;&#039;&#039;로 구성됨&lt;br /&gt;
*고수준 연산 지원: map, reduceByKey, join 등 RDD 연산 유사&lt;br /&gt;
===2. Structured Streaming===&lt;br /&gt;
*Spark 2.0 이후 도입된 고수준 API 기반의 새로운 스트리밍 모델&lt;br /&gt;
*[[DataFrame]], [[Dataset]] 기반으로 동작&lt;br /&gt;
*지속적 쿼리 방식 (continuous query model)&lt;br /&gt;
*기존 [[Spark SQL]], [[Catalyst Optimizer]]와 통합되어 더 강력한 최적화 지원&lt;br /&gt;
*정확히 한번 처리(exactly-once semantics) 보장&lt;br /&gt;
==외부 대체 기술==&lt;br /&gt;
아파치 스파크 스트리밍 외에도 실시간 처리를 위한 다음과 같은 대안들이 존재한다:&lt;br /&gt;
*[[Apache Flink]]&lt;br /&gt;
**완전 event-driven 방식&lt;br /&gt;
**true streaming model (배치 없음)&lt;br /&gt;
**상태 기반 처리에 강점&lt;br /&gt;
&lt;br /&gt;
*[[Apache Storm]]&lt;br /&gt;
**스파우트와 볼트(Spout &amp;amp; Bolt) 구조&lt;br /&gt;
**낮은 레이턴시, 높은 처리율 지향&lt;br /&gt;
**실시간 분석에 적합&lt;br /&gt;
&lt;br /&gt;
*[[Kafka Streams]]&lt;br /&gt;
**[[Apache Kafka]] 위에서 동작하는 경량 스트리밍 라이브러리&lt;br /&gt;
**애플리케이션 내부에서 직접 실행 가능 (서버리스 구조)&lt;br /&gt;
**마이크로서비스 아키텍처에 적합&lt;br /&gt;
==예시 (DStream 기반)==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from pyspark import SparkContext&lt;br /&gt;
from pyspark.streaming import StreamingContext&lt;br /&gt;
&lt;br /&gt;
sc = SparkContext(&amp;quot;local[2]&amp;quot;, &amp;quot;NetworkWordCount&amp;quot;)&lt;br /&gt;
ssc = StreamingContext(sc, 1)&lt;br /&gt;
&lt;br /&gt;
lines = ssc.socketTextStream(&amp;quot;localhost&amp;quot;, 9999)&lt;br /&gt;
words = lines.flatMap(lambda line: line.split(&amp;quot; &amp;quot;))&lt;br /&gt;
wordCounts = words.map(lambda w: (w, 1)).reduceByKey(lambda x, y: x + y)&lt;br /&gt;
&lt;br /&gt;
wordCounts.pprint()&lt;br /&gt;
ssc.start()&lt;br /&gt;
ssc.awaitTermination()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==비교 요약==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!시스템||처리 방식||언어/기반||처리 보장||특징&lt;br /&gt;
|-&lt;br /&gt;
|Spark DStream||마이크로 배치||RDD||At least once||전통적인 구조, 단순&lt;br /&gt;
|-&lt;br /&gt;
|Structured Streaming||마이크로 배치 또는 Continuous||DataFrame/Dataset||Exactly once||SQL과 통합, 권장 방식&lt;br /&gt;
|-&lt;br /&gt;
|Flink||이벤트 기반||Stream API||Exactly once||진정한 스트리밍, 고도화된 상태 관리&lt;br /&gt;
|-&lt;br /&gt;
|Storm||이벤트 기반||Bolt/Spout||At least once||낮은 지연 시간&lt;br /&gt;
|-&lt;br /&gt;
|Kafka Streams||이벤트 기반||Kafka 기반||Exactly once||서버리스, 마이크로서비스에 적합&lt;br /&gt;
|}&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크]]&lt;br /&gt;
*[[Structured Streaming]]&lt;br /&gt;
*[[Discretized Streams]]&lt;br /&gt;
*[[Apache Kafka]]&lt;br /&gt;
*[[Apache Flink]]&lt;br /&gt;
*[[Apache Storm]]&lt;br /&gt;
*[[Kafka Streams]]&lt;br /&gt;
*[[RDD]]&lt;br /&gt;
*[[데이터 스트리밍]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*https://spark.apache.org/streaming/&lt;br /&gt;
*Zaharia et al. (2013). Discretized Streams: Fault-Tolerant Streaming Computation at Scale&lt;br /&gt;
*Spark: The Definitive Guide (O&#039;Reilly)&lt;br /&gt;
*Apache Flink, Storm, Kafka Streams 공식 문서&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_ParamGridBuilder&amp;diff=40655</id>
		<title>아파치 스파크 ParamGridBuilder</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_ParamGridBuilder&amp;diff=40655"/>
		<updated>2025-04-09T00:57:36Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: ParamGridBuilder는 Apache Spark MLlib에서 하이퍼파라미터 튜닝을 위한 도구로, 여러 파라미터 조합을 생성해 CrossValidator나 TrainValidationSplit과 함께 사용된다. 이를 통해 모델의 하이퍼파라미터를 체계적으로 탐색하고 최적의 조합을 찾을 수 있다. ==개요== ParamGridBuilder는 ML 파이프라인 내 Estimator 객체의 파라미터를 대상으로 여러 후보 값을 설정하고, 가능한 모든 조합을 만...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ParamGridBuilder는 Apache Spark MLlib에서 하이퍼파라미터 튜닝을 위한 도구로, 여러 파라미터 조합을 생성해 CrossValidator나 TrainValidationSplit과 함께 사용된다. 이를 통해 모델의 하이퍼파라미터를 체계적으로 탐색하고 최적의 조합을 찾을 수 있다.&lt;br /&gt;
==개요==&lt;br /&gt;
ParamGridBuilder는 ML 파이프라인 내 Estimator 객체의 파라미터를 대상으로 여러 후보 값을 설정하고, 가능한 모든 조합을 만들어 파라미터 그리드를 생성한다. 생성된 파라미터 그리드는 교차 검증과 함께 사용되어 모델 성능을 평가하고 최적 파라미터를 결정한다.&lt;br /&gt;
==사용 목적==&lt;br /&gt;
*머신 러닝 모델의 성능을 높이기 위한 하이퍼파라미터 최적화&lt;br /&gt;
*다수의 하이퍼파라미터 조합을 테스트하여 최적 모델 탐색&lt;br /&gt;
*분산 환경에서 효율적인 튜닝 수행&lt;br /&gt;
==주요 메서드==&lt;br /&gt;
*addGrid(param, values)&lt;br /&gt;
**특정 파라미터에 대해 여러 후보값을 지정한다.&lt;br /&gt;
*build()&lt;br /&gt;
**지정된 모든 조합을 기반으로 파라미터 그리드를 반환한다.&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml.classification import LogisticRegression&lt;br /&gt;
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator&lt;br /&gt;
from pyspark.ml.evaluation import BinaryClassificationEvaluator&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;ParamGridExample&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
# 데이터 준비&lt;br /&gt;
data = spark.read.format(&amp;quot;libsvm&amp;quot;).load(&amp;quot;data/sample_libsvm_data.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 모델 정의&lt;br /&gt;
lr = LogisticRegression()&lt;br /&gt;
&lt;br /&gt;
# 파라미터 그리드 정의&lt;br /&gt;
paramGrid = ParamGridBuilder() \&lt;br /&gt;
    .addGrid(lr.regParam, [0.01, 0.1, 1.0]) \&lt;br /&gt;
    .addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]) \&lt;br /&gt;
    .build()&lt;br /&gt;
&lt;br /&gt;
# 평가자 및 교차 검증기 정의&lt;br /&gt;
evaluator = BinaryClassificationEvaluator()&lt;br /&gt;
cv = CrossValidator(estimator=lr,&lt;br /&gt;
                    estimatorParamMaps=paramGrid,&lt;br /&gt;
                    evaluator=evaluator,&lt;br /&gt;
                    numFolds=3)&lt;br /&gt;
&lt;br /&gt;
# 모델 학습 및 평가&lt;br /&gt;
cvModel = cv.fit(data)&lt;br /&gt;
print(&amp;quot;Best model params:&amp;quot;, cvModel.bestModel.extractParamMap())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===출력 예시===&lt;br /&gt;
파라미터 조합별 성능이 평가되며, 최적 조합은 다음과 같이 확인할 수 있다.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Best model params: {&lt;br /&gt;
    Param(parent=&#039;LogisticRegression_...&#039;, name=&#039;elasticNetParam&#039;, ...): 0.0,&lt;br /&gt;
    Param(parent=&#039;LogisticRegression_...&#039;, name=&#039;regParam&#039;, ...): 0.1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*복수 파라미터를 동시에 튜닝 가능&lt;br /&gt;
*CrossValidator 및 TrainValidationSplit과 통합되어 쉽게 성능 비교 가능&lt;br /&gt;
*Spark의 분산 처리 기반으로 대규모 데이터에도 적합&lt;br /&gt;
==단점==&lt;br /&gt;
*조합 수가 많아질 경우 실행 시간이 크게 증가&lt;br /&gt;
*각 조합에 대해 별도 모델 학습이 필요하므로 자원 소모가 큼&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[하이퍼파라미터]]&lt;br /&gt;
*[[그리드 서치]]&lt;br /&gt;
*[[교차 검증]]&lt;br /&gt;
*[[아파치 스파크 머신 러닝 파이프라인]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-tuning.html#model-selection-hyperparameter-tuning&lt;br /&gt;
*Karau, H., &amp;amp; Warren, R. (2017). High Performance Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%95%98%EC%9D%B4%ED%8D%BC%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0&amp;diff=40654</id>
		<title>하이퍼파라미터</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%95%98%EC%9D%B4%ED%8D%BC%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0&amp;diff=40654"/>
		<updated>2025-04-09T00:48:56Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:인공지능]][[분류:기술사 기출]]&lt;br /&gt;
;Hyperparameter; Hyper-parameter; Hyper Parameter; 초모수&lt;br /&gt;
하이퍼파라미터(hyperparameter)는 머신 러닝 모델의 학습 과정에서 사람이 사전에 설정해야 하는 값으로, 모델의 성능에 큰 영향을 미치지만 학습 데이터로부터 직접적으로 학습되지 않는다. 하이퍼파라미터는 모델의 구조나 학습 방법을 제어하는 변수이며, 일반적으로 실험적 탐색을 통해 최적화된다.&lt;br /&gt;
;* 기계학습에서 학습의 기준이 되는 주요 변수&lt;br /&gt;
;* 주로 자동으로 선정되지 않고 [[HITL|인간이 수작업]]으로 설정해줘야 하는 값&lt;br /&gt;
== 개요==&lt;br /&gt;
하이퍼파라미터는 모델 내부에서 자동으로 학습되는 파라미터(예: 가중치, 편향)와 달리, 외부에서 설정되어 모델의 학습 방식과 일반화 능력에 영향을 준다. 모델의 성능을 향상시키기 위해 하이퍼파라미터 튜닝(hyperparameter tuning)이 필수적인 과정으로 여겨진다.&lt;br /&gt;
==주요 하이퍼파라미터 예시==&lt;br /&gt;
*선형 회귀&lt;br /&gt;
**정규화 계수 (alpha, lambda)&lt;br /&gt;
&lt;br /&gt;
*결정 트리 / 랜덤 포레스트&lt;br /&gt;
**트리의 최대 깊이 (max_depth)&lt;br /&gt;
**분기 최소 샘플 수 (min_samples_split)&lt;br /&gt;
**트리 개수 (n_estimators)&lt;br /&gt;
&lt;br /&gt;
*SVM&lt;br /&gt;
**커널 함수 종류 (kernel)&lt;br /&gt;
**정규화 계수 C&lt;br /&gt;
**감마 (gamma)&lt;br /&gt;
&lt;br /&gt;
*신경망 (Neural Network)&lt;br /&gt;
**학습률 (learning rate)&lt;br /&gt;
**은닉층 수 및 각 층의 노드 수&lt;br /&gt;
**에포크 수 (epochs), 배치 크기 (batch size)&lt;br /&gt;
**옵티마이저 종류 (Adam, SGD 등)&lt;br /&gt;
**드롭아웃 비율 (dropout rate)&lt;br /&gt;
==하이퍼파라미터 vs 파라미터==&lt;br /&gt;
*파라미터&lt;br /&gt;
**학습을 통해 최적화되는 값 (예: 선형 회귀의 가중치, 신경망의 weight/bias)&lt;br /&gt;
&lt;br /&gt;
*하이퍼파라미터&lt;br /&gt;
**학습 전에 사람이 지정하는 설정값 (예: 학습률, 트리 깊이)&lt;br /&gt;
==튜닝 방법==&lt;br /&gt;
*그리드 서치 (Grid Search)&lt;br /&gt;
**하이퍼파라미터 값의 조합을 모두 탐색하여 최적 조합을 찾음&lt;br /&gt;
**계산 비용이 크지만 간단하고 직관적임&lt;br /&gt;
&lt;br /&gt;
*랜덤 서치 (Random Search)&lt;br /&gt;
**하이퍼파라미터 공간에서 무작위로 조합을 선택하여 평가&lt;br /&gt;
**시간 대비 효율성이 높은 경우가 많음&lt;br /&gt;
&lt;br /&gt;
*베이지안 최적화&lt;br /&gt;
**이전 탐색 결과를 기반으로 다음 시도를 조절하는 확률적 접근&lt;br /&gt;
**`Optuna`, `Hyperopt` 등의 라이브러리에서 제공&lt;br /&gt;
&lt;br /&gt;
*교차 검증과 결합&lt;br /&gt;
**각 하이퍼파라미터 조합에 대해 교차 검증을 적용하여 일반화 성능 평가&lt;br /&gt;
==예시 (scikit-learn)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from sklearn.model_selection import GridSearchCV&lt;br /&gt;
from sklearn.ensemble import RandomForestClassifier&lt;br /&gt;
&lt;br /&gt;
param_grid = {&lt;br /&gt;
    &#039;n_estimators&#039;: [50, 100],&lt;br /&gt;
    &#039;max_depth&#039;: [5, 10],&lt;br /&gt;
    &#039;min_samples_split&#039;: [2, 4]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
grid = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)&lt;br /&gt;
grid.fit(X_train, y_train)&lt;br /&gt;
print(grid.best_params_)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[모델 학습]]&lt;br /&gt;
*[[교차 검증]]&lt;br /&gt;
*[[과적합]]&lt;br /&gt;
*[[그리드 서치]]&lt;br /&gt;
*[[Optuna]]&lt;br /&gt;
*[[하이퍼파라미터 튜닝]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*Bengio, Y. (2012). Practical recommendations for gradient-based training of deep architectures. Neural Networks: Tricks of the Trade.&lt;br /&gt;
== 기술사 기출 ==&lt;br /&gt;
* 정보관리기술사 제120회 4교시&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A1%9C%EA%B7%B8_%EC%A0%95%EA%B7%9C_%EB%B6%84%ED%8F%AC&amp;diff=40653</id>
		<title>로그 정규 분포</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A1%9C%EA%B7%B8_%EC%A0%95%EA%B7%9C_%EB%B6%84%ED%8F%AC&amp;diff=40653"/>
		<updated>2025-04-09T00:45:04Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 로그 정규 분포와 일반 정규 분포 로그 정규 분포(로그 正規 分布, 영어: log-normal distribution)는 확률 변수의 로그가 정규 분포를 따르는 확률 분포이다. 즉, 확률 변수 X가 로그 정규 분포를 따른다는 것은 ln(X)가 정규 분포를 따른다는 것을 의미한다. 로그 정규 분포는 정수 값만을 가지는 데이터나, 0보다 큰 양수 데이터에 적합...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[파일:로그 정규 분포 비교.png|섬네일|로그 정규 분포와 일반 정규 분포]]&lt;br /&gt;
로그 정규 분포(로그 正規 分布, 영어: log-normal distribution)는 확률 변수의 로그가 정규 분포를 따르는 확률 분포이다. 즉, 확률 변수 X가 로그 정규 분포를 따른다는 것은 ln(X)가 정규 분포를 따른다는 것을 의미한다. 로그 정규 분포는 정수 값만을 가지는 데이터나, 0보다 큰 양수 데이터에 적합한 분포로 실무에서 널리 사용된다.&lt;br /&gt;
==정의==&lt;br /&gt;
확률 변수 X가 로그 정규 분포를 따른다고 할 때, Y = ln(X)는 정규 분포 N(μ, σ²)을 따른다. 이때 X는 로그 정규 분포라고 한다.&lt;br /&gt;
&lt;br /&gt;
X ~ LogNormal(μ, σ²) ⇔ ln(X) ~ N(μ, σ²)&lt;br /&gt;
==확률 밀도 함수==&lt;br /&gt;
로그 정규 분포의 확률 밀도 함수는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
f(x) = (1 / (xσ√(2π))) * exp(− (ln(x) − μ)² / (2σ²)), x &amp;gt; 0&lt;br /&gt;
==특징==&lt;br /&gt;
*정의역은 (0, ∞)로, 음수 값은 불가능하다.&lt;br /&gt;
*오른쪽으로 긴 꼬리를 가진 비대칭 분포이다 (positive skew).&lt;br /&gt;
*평균, 중앙값, 최빈값이 서로 다르며 다음 관계를 가진다.&lt;br /&gt;
==요약 통계==&lt;br /&gt;
*평균 (Expected value): exp(μ + σ² / 2)&lt;br /&gt;
*중앙값 (Median): exp(μ)&lt;br /&gt;
*분산 (Variance): [exp(σ²) − 1] * exp(2μ + σ²)&lt;br /&gt;
*최빈값 (Mode): exp(μ − σ²)&lt;br /&gt;
==사용 사례==&lt;br /&gt;
*금융: 자산 가격, 주가 수익률 분포&lt;br /&gt;
*공학: 제품 수명, 결함 발생 간격&lt;br /&gt;
*환경과학: 오염물질 농도, 입자 크기&lt;br /&gt;
*경제학: 소득 분포, 비용 구조&lt;br /&gt;
==정규 분포와의 관계==&lt;br /&gt;
*정규 분포는 실수 전체(−∞, ∞)를 정의역으로 하지만, 로그 정규 분포는 양수만을 다룬다.&lt;br /&gt;
*로그 정규 분포는 정규 분포를 지수 변환한 결과이다.&lt;br /&gt;
*로그 정규 분포의 분석에는 로그 스케일 변환을 적용하여 정규 분포 가정 하의 통계 기법을 활용할 수 있다.&lt;br /&gt;
==시각화 예시==&lt;br /&gt;
로그 정규 분포는 오른쪽 꼬리가 길고, 왼쪽은 0을 향해 빠르게 감소하는 모양을 가진다. 정규 분포와 달리 평균보다 중앙값이 작고, 최빈값은 더 작다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[정규 분포]]&lt;br /&gt;
*[[지수 분포]]&lt;br /&gt;
*[[확률 분포]]&lt;br /&gt;
*[[로그 변환]]&lt;br /&gt;
*[[중심 극한 정리]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Aitchison, J., &amp;amp; Brown, J. A. C. (1957). The Lognormal Distribution. Cambridge University Press.&lt;br /&gt;
*Papoulis, A., &amp;amp; Pillai, S. U. (2002). Probability, Random Variables and Stochastic Processes.&lt;br /&gt;
*이영조. (2021). 통계학 입문. 자유아카데미.&lt;br /&gt;
[[분류:통계학]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%8C%8C%EC%9D%BC:%EB%A1%9C%EA%B7%B8_%EC%A0%95%EA%B7%9C_%EB%B6%84%ED%8F%AC_%EB%B9%84%EA%B5%90.png&amp;diff=40652</id>
		<title>파일:로그 정규 분포 비교.png</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%8C%8C%EC%9D%BC:%EB%A1%9C%EA%B7%B8_%EC%A0%95%EA%B7%9C_%EB%B6%84%ED%8F%AC_%EB%B9%84%EA%B5%90.png&amp;diff=40652"/>
		<updated>2025-04-09T00:44:35Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;출처: http://www.ktword.co.kr/test/view/view.php?m_temp1=1556&amp;amp;id=973&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EA%B2%B0%EC%A0%95_%EA%B3%84%EC%88%98&amp;diff=40651</id>
		<title>결정 계수</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EA%B2%B0%EC%A0%95_%EA%B3%84%EC%88%98&amp;diff=40651"/>
		<updated>2025-04-09T00:38:46Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 결정 계수(決定係數, Coefficient of Determination)는 회귀 분석에서 예측된 결과가 실제 데이터를 얼마나 잘 설명하는지를 나타내는 지표로, 일반적으로 R² (R 제곱값)로 표기된다. 값의 범위는 0에서 1 사이이며, 1에 가까울수록 모델이 데이터를 잘 설명하고 있음을 의미한다. ==정의== 결정 계수는 총 변동 중에서 회귀 모형이 설명할 수 있는 변동의 비율이다.  R² = 1 − (RSS...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;결정 계수(決定係數, Coefficient of Determination)는 회귀 분석에서 예측된 결과가 실제 데이터를 얼마나 잘 설명하는지를 나타내는 지표로, 일반적으로 R² (R 제곱값)로 표기된다. 값의 범위는 0에서 1 사이이며, 1에 가까울수록 모델이 데이터를 잘 설명하고 있음을 의미한다.&lt;br /&gt;
==정의==&lt;br /&gt;
결정 계수는 총 변동 중에서 회귀 모형이 설명할 수 있는 변동의 비율이다.&lt;br /&gt;
&lt;br /&gt;
R² = 1 − (RSS / TSS)&lt;br /&gt;
&lt;br /&gt;
여기서,&lt;br /&gt;
*RSS (Residual Sum of Squares): 예측 오차의 제곱합&lt;br /&gt;
*TSS (Total Sum of Squares): 전체 데이터의 변동량&lt;br /&gt;
*R² = 1이면 완벽한 예측, R² = 0이면 평균으로 예측한 것과 동일한 수준&lt;br /&gt;
==수식==&lt;br /&gt;
R² = 1 − (Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; − ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;)² / Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; − ȳ)²)&lt;br /&gt;
*&amp;lt;big&amp;gt;y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 실제값&amp;lt;/big&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 예측값&amp;lt;/big&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;ȳ: 실제값의 평균&amp;lt;/big&amp;gt;&lt;br /&gt;
==특징==&lt;br /&gt;
*R² = 1: 완벽한 설명력 (예측값 = 실제값)&lt;br /&gt;
*R² = 0: 아무런 설명력 없음 (예측 = 평균)&lt;br /&gt;
*R² &amp;lt; 0: 모델이 평균보다 못한 예측을 할 때 (비정상적인 모델일 수 있음)&lt;br /&gt;
==예시==&lt;br /&gt;
실제값: [3, 4, 5, 6]  예측값: [2.8, 4.1, 5.2, 5.9]&lt;br /&gt;
*TSS = Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; − ȳ)² = (3−4.5)² + (4−4.5)² + (5−4.5)² + (6−4.5)² = 5&lt;br /&gt;
*RSS = Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; − ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;)² ≈ 0.10&lt;br /&gt;
*R² = 1 − (0.10 / 5) = 0.98 → 매우 높은 설명력&lt;br /&gt;
==해석 시 주의사항==&lt;br /&gt;
*R²이 높다고 항상 좋은 모델은 아님&lt;br /&gt;
**과적합된 모델도 R²이 높을 수 있음&lt;br /&gt;
**실제 예측 정확도는 RMSE, MAE 등과 함께 확인해야 함&lt;br /&gt;
&lt;br /&gt;
*비교 시 같은 데이터셋 기반이어야 유효&lt;br /&gt;
**서로 다른 데이터셋이나 문제에서의 R² 비교는 부정확&lt;br /&gt;
&lt;br /&gt;
*선형 회귀에선 의미가 명확하지만, 비선형 모델이나 변환된 변수 사용 시 해석에 주의 필요&lt;br /&gt;
==조정된 결정 계수==&lt;br /&gt;
변수 개수가 많아질수록 R²은 인위적으로 높아질 수 있으므로, 변수 수를 보정한 &#039;&#039;&#039;조정된 R²&#039;&#039;&#039;도 함께 사용하는 것이 좋다.&lt;br /&gt;
&lt;br /&gt;
조정 R² = 1 − [(1−R²) × (n−1)/(n−p−1)]&lt;br /&gt;
*n: 샘플 수&lt;br /&gt;
*p: 독립 변수 개수&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[회귀 분석]]&lt;br /&gt;
*[[평균 제곱근 오차]]&lt;br /&gt;
*[[평균 절대 오차]]&lt;br /&gt;
*[[과적합]]&lt;br /&gt;
*[[설명력]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*Montgomery, D. C., Peck, E. A., &amp;amp; Vining, G. G. (2012). Introduction to Linear Regression Analysis.&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%8F%89%EA%B7%A0_%EC%A0%9C%EA%B3%B1%EA%B7%BC_%EC%98%A4%EC%B0%A8&amp;diff=40650</id>
		<title>평균 제곱근 오차</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%8F%89%EA%B7%A0_%EC%A0%9C%EA%B3%B1%EA%B7%BC_%EC%98%A4%EC%B0%A8&amp;diff=40650"/>
		<updated>2025-04-09T00:36:04Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;평균 제곱근 오차(RMSE, Root Mean Squared Error)는 회귀 분석에서 예측값과 실제값 간의 차이를 측정하는 대표적인 평가 지표이다. 오차(Residual)의 제곱 평균에 루트를 씌운 값으로, 단위가 원래 데이터와 동일하여 해석이 직관적이다.&lt;br /&gt;
==정의==&lt;br /&gt;
평균 제곱근 오차는 다음 수식으로 정의된다.&lt;br /&gt;
&lt;br /&gt;
RMSE = sqrt( (1/n) * Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; - ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;)² )&lt;br /&gt;
&lt;br /&gt;
여기서,&lt;br /&gt;
*&amp;lt;big&amp;gt;y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 실제값&amp;lt;/big&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 예측값&amp;lt;/big&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;n: 샘플 수&amp;lt;/big&amp;gt;&lt;br /&gt;
==특징==&lt;br /&gt;
*오차가 클수록 RMSE 값도 커지며, &#039;&#039;&#039;큰 오차에 더 민감하게 반응&#039;&#039;&#039;한다.&lt;br /&gt;
*RMSE는 항상 0 이상의 값을 가지며, 0이면 완벽한 예측을 의미한다.&lt;br /&gt;
*단위가 원래 데이터와 같아 해석이 용이하다.&lt;br /&gt;
==예시==&lt;br /&gt;
실제값과 예측값이 다음과 같다고 하자.&lt;br /&gt;
*실제값: [3, 5, 2.5, 7]&lt;br /&gt;
*예측값: [2.5, 5, 4, 8]&lt;br /&gt;
오차 제곱합 = (3−2.5)² + (5−5)² + (2.5−4)² + (7−8)² = 0.25 + 0 + 2.25 + 1 = 3.5  RMSE = sqrt(3.5 / 4) ≈ 0.935&lt;br /&gt;
== 실제 활용 방법 ==&lt;br /&gt;
RMSE는 &#039;&#039;&#039;절대적인 수치로는 그 의미가 제한적&#039;&#039;&#039;이므로, 단독으로 해석하기보다는 다음과 같은 방식으로 활용된다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;모델 간 비교&#039;&#039;&#039;  &lt;br /&gt;
** 동일한 테스트 데이터셋에 대해 여러 회귀 모델을 평가하고, RMSE 값이 가장 작은 모델을 선택한다.  &lt;br /&gt;
** 예: 선형 회귀 vs 랜덤 포레스트 회귀 vs XGBoost 회귀 등&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;베이스라인 대비 성능 평가&#039;&#039;&#039;  &lt;br /&gt;
** 평균값을 예측하는 단순 모델의 RMSE와 비교하여, 학습된 모델이 얼마나 성능이 개선되었는지 판단한다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;비율 지표와 함께 사용&#039;&#039;&#039;  &lt;br /&gt;
** MAE, MAPE, R² 등 다른 지표와 함께 해석하여 오차의 절대값과 상대적 분산 설명력을 종합적으로 평가한다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;특정 도메인의 기준값과 비교&#039;&#039;&#039;  &lt;br /&gt;
** 도메인 지식이 있는 경우, 해당 산업이나 데이터셋 특성에 따라 &#039;허용 가능한 오차 수준&#039;과 비교한다.  &lt;br /&gt;
** 예: RMSE가 5인 경우, 부동산 가격 예측에서는 허용되지만, 체온 예측에서는 과도한 오차일 수 있음&lt;br /&gt;
&lt;br /&gt;
==장점==&lt;br /&gt;
*예측값과 실제값의 차이를 직관적으로 표현 가능&lt;br /&gt;
*단위가 원래 데이터와 같아 성능 해석에 유리함&lt;br /&gt;
*다른 모델과의 비교가 용이함&lt;br /&gt;
==단점==&lt;br /&gt;
*이상치에 민감함 (오차를 제곱하기 때문)&lt;br /&gt;
*각 샘플의 중요도가 동일하다고 가정&lt;br /&gt;
==활용==&lt;br /&gt;
*회귀 문제의 성능 평가 지표&lt;br /&gt;
*머신 러닝, 통계 모델, 시계열 분석 등에서 예측 정확도 측정&lt;br /&gt;
*하이퍼파라미터 튜닝의 목적 함수로 사용 가능&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[평균 제곱 오차]]&lt;br /&gt;
*[[평균 절대 오차]]&lt;br /&gt;
*[[평균 절대 백분율 오차]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[회귀 분석]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*Hyndman, R. J., &amp;amp; Athanasopoulos, G. (2018). Forecasting: Principles and Practice.&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%8F%89%EA%B7%A0_%EC%A0%9C%EA%B3%B1%EA%B7%BC_%EC%98%A4%EC%B0%A8&amp;diff=40649</id>
		<title>평균 제곱근 오차</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%8F%89%EA%B7%A0_%EC%A0%9C%EA%B3%B1%EA%B7%BC_%EC%98%A4%EC%B0%A8&amp;diff=40649"/>
		<updated>2025-04-09T00:34:06Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 평균 제곱근 오차(RMSE, Root Mean Squared Error)는 회귀 분석에서 예측값과 실제값 간의 차이를 측정하는 대표적인 평가 지표이다. 오차(Residual)의 제곱 평균에 루트를 씌운 값으로, 단위가 원래 데이터와 동일하여 해석이 직관적이다. ==정의== 평균 제곱근 오차는 다음 수식으로 정의된다.  RMSE = sqrt( (1/n) * Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; - ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;)² )  여기서, *&amp;lt;big&amp;gt;y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 실제값&amp;lt;/big&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;평균 제곱근 오차(RMSE, Root Mean Squared Error)는 회귀 분석에서 예측값과 실제값 간의 차이를 측정하는 대표적인 평가 지표이다. 오차(Residual)의 제곱 평균에 루트를 씌운 값으로, 단위가 원래 데이터와 동일하여 해석이 직관적이다.&lt;br /&gt;
==정의==&lt;br /&gt;
평균 제곱근 오차는 다음 수식으로 정의된다.&lt;br /&gt;
&lt;br /&gt;
RMSE = sqrt( (1/n) * Σ (y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; - ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;)² )&lt;br /&gt;
&lt;br /&gt;
여기서,&lt;br /&gt;
*&amp;lt;big&amp;gt;y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 실제값&amp;lt;/big&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;ŷ&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;: 예측값&amp;lt;/big&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;n: 샘플 수&amp;lt;/big&amp;gt;&lt;br /&gt;
==특징==&lt;br /&gt;
*오차가 클수록 RMSE 값도 커지며, &#039;&#039;&#039;큰 오차에 더 민감하게 반응&#039;&#039;&#039;한다.&lt;br /&gt;
*RMSE는 항상 0 이상의 값을 가지며, 0이면 완벽한 예측을 의미한다.&lt;br /&gt;
*단위가 원래 데이터와 같아 해석이 용이하다.&lt;br /&gt;
==예시==&lt;br /&gt;
실제값과 예측값이 다음과 같다고 하자.&lt;br /&gt;
*실제값: [3, 5, 2.5, 7]&lt;br /&gt;
*예측값: [2.5, 5, 4, 8]&lt;br /&gt;
오차 제곱합 = (3−2.5)² + (5−5)² + (2.5−4)² + (7−8)² = 0.25 + 0 + 2.25 + 1 = 3.5  RMSE = sqrt(3.5 / 4) ≈ 0.935&lt;br /&gt;
==장점==&lt;br /&gt;
*예측값과 실제값의 차이를 직관적으로 표현 가능&lt;br /&gt;
*단위가 원래 데이터와 같아 성능 해석에 유리함&lt;br /&gt;
*다른 모델과의 비교가 용이함&lt;br /&gt;
==단점==&lt;br /&gt;
*이상치에 민감함 (오차를 제곱하기 때문)&lt;br /&gt;
*각 샘플의 중요도가 동일하다고 가정&lt;br /&gt;
==활용==&lt;br /&gt;
*회귀 문제의 성능 평가 지표&lt;br /&gt;
*머신 러닝, 통계 모델, 시계열 분석 등에서 예측 정확도 측정&lt;br /&gt;
*하이퍼파라미터 튜닝의 목적 함수로 사용 가능&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[평균 제곱 오차]]&lt;br /&gt;
*[[평균 절대 오차]]&lt;br /&gt;
*[[평균 절대 백분율 오차]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[회귀 분석]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*Hyndman, R. J., &amp;amp; Athanasopoulos, G. (2018). Forecasting: Principles and Practice.&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_RFormula&amp;diff=40648</id>
		<title>아파치 스파크 RFormula</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_RFormula&amp;diff=40648"/>
		<updated>2025-04-09T00:30:35Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RFormula는 Apache Spark MLlib에서 제공하는 피처 엔지니어링 도구로, R 언어의 공식(formula) 문법을 사용하여 특성과 레이블을 자동으로 정의하고 전처리 과정을 단순화하는 기능을 제공한다. 이 기능은 범주형 변수 인코딩, 수치형 변수 선택, 다항식 식별 등을 간결한 구문으로 수행할 수 있어, 모델링 파이프라인 구성 시 유용하다.&lt;br /&gt;
==개요==&lt;br /&gt;
RFormula는 `&amp;quot;label ~ features&amp;quot;` 형식의 문자열 수식을 기반으로 입력 컬럼을 분석하고, 내부적으로 다음 작업을 수행한다.&lt;br /&gt;
*범주형 변수는 자동으로 StringIndexer + OneHotEncoder로 변환&lt;br /&gt;
*수치형 변수는 그대로 사용&lt;br /&gt;
*지정된 레이블은 숫자형 인코딩 처리&lt;br /&gt;
*결과로 `&amp;quot;features&amp;quot;` 벡터 컬럼과 `&amp;quot;label&amp;quot;` 숫자형 컬럼 생성&lt;br /&gt;
==문법 구조==&lt;br /&gt;
*`&amp;quot;y ~ x1 + x2 + x3&amp;quot;`&lt;br /&gt;
**레이블 `y`, 피처는 `x1`, `x2`, `x3`&lt;br /&gt;
*`&amp;quot;y ~ .&amp;quot;`&lt;br /&gt;
**레이블 `y`, 나머지 모든 컬럼을 피처로 사용&lt;br /&gt;
*`&amp;quot;y ~ x1 + x2 - x3&amp;quot;`&lt;br /&gt;
**`x3`은 피처에서 제외&lt;br /&gt;
*`&amp;quot;y ~ x1:x2&amp;quot;`&lt;br /&gt;
**상호작용(interaction) 항(term) 포함&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml.feature import RFormula&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;RFormulaExample&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
df = spark.createDataFrame([&lt;br /&gt;
    (1, &amp;quot;M&amp;quot;, 20.0),&lt;br /&gt;
    (0, &amp;quot;F&amp;quot;, 25.0),&lt;br /&gt;
    (1, &amp;quot;F&amp;quot;, 22.0)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;gender&amp;quot;, &amp;quot;age&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
formula = RFormula(formula=&amp;quot;label ~ gender + age&amp;quot;)&lt;br /&gt;
model = formula.fit(df)&lt;br /&gt;
output = model.transform(df)&lt;br /&gt;
output.select(&amp;quot;features&amp;quot;, &amp;quot;label&amp;quot;).show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===출력 예시===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!features!!label&lt;br /&gt;
|-&lt;br /&gt;
|[1.0,20.0]||1.0&lt;br /&gt;
|-&lt;br /&gt;
|[0.0,25.0]||0.0&lt;br /&gt;
|-&lt;br /&gt;
|[0.0,22.0]||1.0&lt;br /&gt;
|}&lt;br /&gt;
==장점==&lt;br /&gt;
*복잡한 피처 엔지니어링 단계를 간결하게 표현 가능&lt;br /&gt;
*자동으로 StringIndexer 및 OneHotEncoder 적용&lt;br /&gt;
*DataFrame 기반 파이프라인에 쉽게 통합 가능&lt;br /&gt;
*R 사용자에게 익숙한 공식 문법&lt;br /&gt;
==단점==&lt;br /&gt;
*수식 표현이 간단하지만, 세부 조정은 어려움&lt;br /&gt;
*자동 인코딩 결과를 세밀하게 제어하려면 별도 Transformer 사용 필요&lt;br /&gt;
==활용 시 주의==&lt;br /&gt;
*입력 DataFrame의 컬럼 타입에 따라 자동 처리 방식이 달라짐&lt;br /&gt;
*기존의 `features` 또는 `label` 컬럼이 있다면 덮어쓸 수 있음&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[StringIndexer]]&lt;br /&gt;
*[[One-hot encoding]]&lt;br /&gt;
*[[VectorAssembler]]&lt;br /&gt;
*[[아파치 스파크 머신 러닝 파이프라인]]&lt;br /&gt;
*[[피처 엔지니어링]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-features.html#rformula&lt;br /&gt;
*Karau, H., &amp;amp; Warren, R. (2017). High Performance Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_RFormula&amp;diff=40647</id>
		<title>아파치 스파크 RFormula</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_RFormula&amp;diff=40647"/>
		<updated>2025-04-09T00:30:15Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: RFormula는 Apache Spark MLlib에서 제공하는 피처 엔지니어링 도구로, R 언어의 공식(formula) 문법을 사용하여 특성과 레이블을 자동으로 정의하고 전처리 과정을 단순화하는 기능을 제공한다. 이 기능은 범주형 변수 인코딩, 수치형 변수 선택, 다항식 식별 등을 간결한 구문으로 수행할 수 있어, 모델링 파이프라인 구성 시 유용하다. ==개요== RFormula는 `&amp;quot;label ~ features&amp;quot;` 형식...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RFormula는 Apache Spark MLlib에서 제공하는 피처 엔지니어링 도구로, R 언어의 공식(formula) 문법을 사용하여 특성과 레이블을 자동으로 정의하고 전처리 과정을 단순화하는 기능을 제공한다. 이 기능은 범주형 변수 인코딩, 수치형 변수 선택, 다항식 식별 등을 간결한 구문으로 수행할 수 있어, 모델링 파이프라인 구성 시 유용하다.&lt;br /&gt;
==개요==&lt;br /&gt;
RFormula는 `&amp;quot;label ~ features&amp;quot;` 형식의 문자열 수식을 기반으로 입력 컬럼을 분석하고, 내부적으로 다음 작업을 수행한다.&lt;br /&gt;
*범주형 변수는 자동으로 StringIndexer + OneHotEncoder로 변환&lt;br /&gt;
*수치형 변수는 그대로 사용&lt;br /&gt;
*지정된 레이블은 숫자형 인코딩 처리&lt;br /&gt;
*결과로 `&amp;quot;features&amp;quot;` 벡터 컬럼과 `&amp;quot;label&amp;quot;` 숫자형 컬럼 생성&lt;br /&gt;
==문법 구조==&lt;br /&gt;
*`&amp;quot;y ~ x1 + x2 + x3&amp;quot;`&lt;br /&gt;
**레이블 `y`, 피처는 `x1`, `x2`, `x3`&lt;br /&gt;
*`&amp;quot;y ~ .&amp;quot;`&lt;br /&gt;
**레이블 `y`, 나머지 모든 컬럼을 피처로 사용&lt;br /&gt;
*`&amp;quot;y ~ x1 + x2 - x3&amp;quot;`&lt;br /&gt;
**`x3`은 피처에서 제외&lt;br /&gt;
*`&amp;quot;y ~ x1:x2&amp;quot;`&lt;br /&gt;
**상호작용(interaction) 항(term) 포함&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml.feature import RFormula&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;RFormulaExample&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
df = spark.createDataFrame([&lt;br /&gt;
    (1, &amp;quot;M&amp;quot;, 20.0),&lt;br /&gt;
    (0, &amp;quot;F&amp;quot;, 25.0),&lt;br /&gt;
    (1, &amp;quot;F&amp;quot;, 22.0)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;gender&amp;quot;, &amp;quot;age&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
formula = RFormula(formula=&amp;quot;label ~ gender + age&amp;quot;)&lt;br /&gt;
model = formula.fit(df)&lt;br /&gt;
output = model.transform(df)&lt;br /&gt;
output.select(&amp;quot;features&amp;quot;, &amp;quot;label&amp;quot;).show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===출력 예시===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!features!!label&lt;br /&gt;
|-&lt;br /&gt;
|[1.0,20.0]||1.0&lt;br /&gt;
|-&lt;br /&gt;
|[0.0,25.0]||0.0&lt;br /&gt;
|-&lt;br /&gt;
|[0.0,22.0]||1.0&lt;br /&gt;
|}&lt;br /&gt;
==장점==&lt;br /&gt;
*복잡한 피처 엔지니어링 단계를 간결하게 표현 가능&lt;br /&gt;
*자동으로 StringIndexer 및 OneHotEncoder 적용&lt;br /&gt;
*DataFrame 기반 파이프라인에 쉽게 통합 가능&lt;br /&gt;
*R 사용자에게 익숙한 공식 문법&lt;br /&gt;
==단점==&lt;br /&gt;
*수식 표현이 간단하지만, 세부 조정은 어려움&lt;br /&gt;
*자동 인코딩 결과를 세밀하게 제어하려면 별도 Transformer 사용 필요&lt;br /&gt;
==활용 시 주의==&lt;br /&gt;
*입력 DataFrame의 컬럼 타입에 따라 자동 처리 방식이 달라짐&lt;br /&gt;
*기존의 `features` 또는 `label` 컬럼이 있다면 덮어쓸 수 있음&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[StringIndexer]]&lt;br /&gt;
*[[One-hot encoding]]&lt;br /&gt;
*[[VectorAssembler]]&lt;br /&gt;
*[[아파치 스파크 머신 러닝 파이프라인]]&lt;br /&gt;
*[[피처 엔지니어링]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-features.html#rformula&lt;br /&gt;
*Karau, H., &amp;amp; Warren, R. (2017). High Performance Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_StringIndexer&amp;diff=40646</id>
		<title>아파치 스파크 StringIndexer</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_StringIndexer&amp;diff=40646"/>
		<updated>2025-04-09T00:28:35Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: StringIndexer는 Apache Spark MLlib에서 제공하는 범주형 문자열 데이터를 수치형 인덱스로 변환하는 변환기(Transformer)이다. 머신 러닝 알고리즘은 일반적으로 숫자형 입력을 필요로 하므로, 문자열로 표현된 범주형 변수를 정수형 인덱스로 매핑하는 데 사용된다. ==개요== StringIndexer는 입력 열(input column)에 포함된 고유한 문자열 레이블을 빈도 또는 알파벳 순에 따라 정수...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;StringIndexer는 Apache Spark MLlib에서 제공하는 범주형 문자열 데이터를 수치형 인덱스로 변환하는 변환기(Transformer)이다. 머신 러닝 알고리즘은 일반적으로 숫자형 입력을 필요로 하므로, 문자열로 표현된 범주형 변수를 정수형 인덱스로 매핑하는 데 사용된다.&lt;br /&gt;
==개요==&lt;br /&gt;
StringIndexer는 입력 열(input column)에 포함된 고유한 문자열 레이블을 빈도 또는 알파벳 순에 따라 정수 인덱스로 변환한다. 결과는 새 열(output column)에 저장된다. 이 작업은 머신 러닝 파이프라인에서 전처리 단계로 자주 사용되며, 이후 원-핫 인코딩과 함께 사용되기도 한다.&lt;br /&gt;
==동작 방식==&lt;br /&gt;
*가장 많이 등장하는 범주에 낮은 인덱스(보통 0)를 부여&lt;br /&gt;
*같은 빈도일 경우, 알파벳 순으로 우선순위 결정&lt;br /&gt;
*새로운 데이터에 대해 fit된 인덱싱 모델을 transform 단계에서 재사용 가능&lt;br /&gt;
==주요 파라미터==&lt;br /&gt;
*inputCol: 변환할 열 이름&lt;br /&gt;
*outputCol: 결과가 저장될 열 이름&lt;br /&gt;
*handleInvalid: &#039;skip&#039;, &#039;error&#039; (기본값), &#039;keep&#039; 중 선택&lt;br /&gt;
**학습 시 보지 못한 범주가 나왔을 경우 처리 방식 지정&lt;br /&gt;
==예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml.feature import StringIndexer&lt;br /&gt;
from pyspark.sql import SparkSession&lt;br /&gt;
&lt;br /&gt;
spark = SparkSession.builder.appName(&amp;quot;StringIndexerExample&amp;quot;).getOrCreate()&lt;br /&gt;
&lt;br /&gt;
data = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;사과&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;바나나&amp;quot;),&lt;br /&gt;
    (2, &amp;quot;사과&amp;quot;),&lt;br /&gt;
    (3, &amp;quot;포도&amp;quot;)&lt;br /&gt;
], [&amp;quot;id&amp;quot;, &amp;quot;fruit&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
indexer = StringIndexer(inputCol=&amp;quot;fruit&amp;quot;, outputCol=&amp;quot;fruitIndex&amp;quot;)&lt;br /&gt;
model = indexer.fit(data)&lt;br /&gt;
indexed = model.transform(data)&lt;br /&gt;
indexed.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===출력 예시===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!id!!fruit!!fruitIndex&lt;br /&gt;
|-&lt;br /&gt;
|0||사과||0.0&lt;br /&gt;
|-&lt;br /&gt;
|1||바나나||2.0&lt;br /&gt;
|-&lt;br /&gt;
|2||사과||0.0&lt;br /&gt;
|-&lt;br /&gt;
|3||포도||1.0&lt;br /&gt;
|}&lt;br /&gt;
==StringIndexerModel 저장 및 로드==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
model.save(&amp;quot;/path/to/model&amp;quot;)&lt;br /&gt;
from pyspark.ml.feature import StringIndexerModel&lt;br /&gt;
loaded_model = StringIndexerModel.load(&amp;quot;/path/to/model&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==StringIndexer와 OneHotEncoder 결합==&lt;br /&gt;
StringIndexer로 인덱싱한 결과를 OneHotEncoder에 연결하여 원-핫 인코딩을 수행할 수 있다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml.feature import OneHotEncoder&lt;br /&gt;
from pyspark.ml import Pipeline&lt;br /&gt;
&lt;br /&gt;
encoder = OneHotEncoder(inputCols=[&amp;quot;fruitIndex&amp;quot;], outputCols=[&amp;quot;fruitVec&amp;quot;])&lt;br /&gt;
pipeline = Pipeline(stages=[indexer, encoder])&lt;br /&gt;
model = pipeline.fit(data)&lt;br /&gt;
encoded = model.transform(data)&lt;br /&gt;
encoded.select(&amp;quot;fruit&amp;quot;, &amp;quot;fruitIndex&amp;quot;, &amp;quot;fruitVec&amp;quot;).show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*범주형 문자열 데이터를 머신 러닝에 적합한 수치형으로 변환 가능&lt;br /&gt;
*파이프라인과 쉽게 통합&lt;br /&gt;
*모델 직렬화 및 배포 가능&lt;br /&gt;
==단점==&lt;br /&gt;
*숫자 인덱스가 순서를 의미하지 않음에도, 일부 알고리즘이 이를 순서로 해석할 수 있음&lt;br /&gt;
*새로운 범주가 등장할 경우 별도 처리 필요 (`handleInvalid` 옵션 활용)&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 스파크 머신 러닝 파이프라인]]&lt;br /&gt;
*[[One-hot encoding]]&lt;br /&gt;
*[[pyspark.ml.feature]]&lt;br /&gt;
*[[피처 엔지니어링]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-features.html#stringindexer&lt;br /&gt;
*Karau, H., &amp;amp; Warren, R. (2017). High Performance Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40645</id>
		<title>아파치 스파크 머신 러닝 파이프라인</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40645"/>
		<updated>2025-04-09T00:22:16Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 머신 러닝 파이프라인(Spark ML Pipeline)은 Apache Spark의 머신 러닝 라이브러리인 MLlib에서 제공하는 고수준 API로, 데이터 전처리부터 모델 학습, 평가, 예측에 이르기까지 전체 머신 러닝 흐름을 구조화된 방식으로 구성할 수 있도록 지원한다. 파이프라인은 대규모 분산 처리 환경에서 확장성과 재현성을 높이기 위해 설계되었다.&lt;br /&gt;
==개요==&lt;br /&gt;
스파크 머신 러닝 파이프라인은 여러 처리 단계를 연결하여 순차적으로 실행할 수 있는 구조로, 각 단계는 변환기(Transformer) 또는 추정기(Estimator) 객체로 구성된다. 학습이 완료되면 전체 파이프라인이 하나의 모델(PipelineModel)로 저장되며, 동일한 방식으로 새로운 데이터에 적용할 수 있다.&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*DataFrame&lt;br /&gt;
**Spark ML 파이프라인은 입력 데이터로 DataFrame을 사용한다. 이 DataFrame은 구조화된 테이블 형태이며, 스키마를 포함한다.&lt;br /&gt;
&lt;br /&gt;
*Transformer&lt;br /&gt;
**입력 DataFrame을 다른 DataFrame으로 변환하는 객체&lt;br /&gt;
**예: Tokenizer, VectorAssembler, StandardScaler, 학습 완료된 모델&lt;br /&gt;
&lt;br /&gt;
*Estimator&lt;br /&gt;
**Transformer를 생성할 수 있는 객체. .fit() 메서드를 통해 학습하고 Transformer를 반환한다.&lt;br /&gt;
**예: LogisticRegression, DecisionTreeClassifier&lt;br /&gt;
&lt;br /&gt;
*Pipeline&lt;br /&gt;
**여러 개의 Transformer와 Estimator를 순서대로 연결한 구조&lt;br /&gt;
&lt;br /&gt;
*PipelineModel&lt;br /&gt;
**학습이 완료된 Pipeline 인스턴스. .transform()을 통해 예측 및 처리 수행 가능&lt;br /&gt;
==예제==&lt;br /&gt;
아래는 간단한 텍스트 분류 파이프라인 구성 예시이다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml import Pipeline&lt;br /&gt;
from pyspark.ml.feature import Tokenizer, HashingTF&lt;br /&gt;
from pyspark.ml.classification import LogisticRegression&lt;br /&gt;
&lt;br /&gt;
# 단계별 구성&lt;br /&gt;
tokenizer = Tokenizer(inputCol=&amp;quot;text&amp;quot;, outputCol=&amp;quot;words&amp;quot;)&lt;br /&gt;
hashingTF = HashingTF(inputCol=&amp;quot;words&amp;quot;, outputCol=&amp;quot;features&amp;quot;)&lt;br /&gt;
lr = LogisticRegression(maxIter=10, regParam=0.001)&lt;br /&gt;
&lt;br /&gt;
# 파이프라인 구성&lt;br /&gt;
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])&lt;br /&gt;
&lt;br /&gt;
# 학습 데이터&lt;br /&gt;
training = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;spark is great&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;hadoop is old&amp;quot;),&lt;br /&gt;
    (0, &amp;quot;spark is fast&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;mapreduce is slow&amp;quot;)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;text&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
# 파이프라인 학습&lt;br /&gt;
model = pipeline.fit(training)&lt;br /&gt;
&lt;br /&gt;
# 테스트 데이터 예측&lt;br /&gt;
test = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;spark wins again&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;hadoop struggles&amp;quot;)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;text&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
predictions = model.transform(test)&lt;br /&gt;
predictions.select(&amp;quot;text&amp;quot;, &amp;quot;prediction&amp;quot;).show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*분산 환경에서 대규모 데이터 처리 가능&lt;br /&gt;
*파이프라인 구조로 전처리, 학습, 예측 단계를 일관성 있게 정의&lt;br /&gt;
*모델과 파이프라인을 직렬화하여 저장 및 재사용 가능&lt;br /&gt;
*CrossValidator, TrainValidationSplit 등과 통합 가능&lt;br /&gt;
==단점==&lt;br /&gt;
*scikit-learn보다 낮은 수준의 유연성&lt;br /&gt;
*MLlib API가 아직 일부 알고리즘에 한정적일 수 있음&lt;br /&gt;
==관련 모듈==&lt;br /&gt;
*pyspark.ml.feature – 전처리용 Transformer 제공&lt;br /&gt;
*pyspark.ml.classification – 분류 모델&lt;br /&gt;
*pyspark.ml.regression – 회귀 모델&lt;br /&gt;
*pyspark.ml.tuning – 교차 검증, 하이퍼파라미터 튜닝&lt;br /&gt;
*pyspark.ml.evaluation – 평가 메트릭 제공&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[Apache Spark]]&lt;br /&gt;
*[[Spark MLlib]]&lt;br /&gt;
*[[머신 러닝 파이프라인]]&lt;br /&gt;
*[[Spark DataFrame]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[하이퍼파라미터 튜닝]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-guide.html&lt;br /&gt;
*Karau, H., Konwinski, A., Wendell, P., &amp;amp; Zaharia, M. (2015). Learning Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40644</id>
		<title>아파치 스파크 머신 러닝 파이프라인</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40644"/>
		<updated>2025-04-09T00:21:43Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 머신 러닝 파이프라인(Spark ML Pipeline)은 Apache Spark의 머신 러닝 라이브러리인 MLlib에서 제공하는 고수준 API로, 데이터 전처리부터 모델 학습, 평가, 예측에 이르기까지 전체 머신 러닝 흐름을 구조화된 방식으로 구성할 수 있도록 지원한다. 파이프라인은 대규모 분산 처리 환경에서 확장성과 재현성을 높이기 위해 설계되었다.&lt;br /&gt;
==개요==&lt;br /&gt;
스파크 머신 러닝 파이프라인은 여러 처리 단계를 연결하여 순차적으로 실행할 수 있는 구조로, 각 단계는 변환기(Transformer) 또는 추정기(Estimator) 객체로 구성된다. 학습이 완료되면 전체 파이프라인이 하나의 모델(PipelineModel)로 저장되며, 동일한 방식으로 새로운 데이터에 적용할 수 있다.&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*DataFrame&lt;br /&gt;
**Spark ML 파이프라인은 입력 데이터로 DataFrame을 사용한다. 이 DataFrame은 구조화된 테이블 형태이며, 스키마를 포함한다.&lt;br /&gt;
&lt;br /&gt;
*Transformer&lt;br /&gt;
**입력 DataFrame을 다른 DataFrame으로 변환하는 객체&lt;br /&gt;
**예: `Tokenizer`, `VectorAssembler`, `StandardScaler`, 학습 완료된 모델&lt;br /&gt;
&lt;br /&gt;
*Estimator&lt;br /&gt;
**Transformer를 생성할 수 있는 객체. `.fit()` 메서드를 통해 학습하고 Transformer를 반환한다.&lt;br /&gt;
**예: `LogisticRegression`, `DecisionTreeClassifier`&lt;br /&gt;
&lt;br /&gt;
*Pipeline&lt;br /&gt;
**여러 개의 Transformer와 Estimator를 순서대로 연결한 구조&lt;br /&gt;
&lt;br /&gt;
*PipelineModel&lt;br /&gt;
**학습이 완료된 Pipeline 인스턴스. `.transform()`을 통해 예측 및 처리 수행 가능&lt;br /&gt;
==예제==&lt;br /&gt;
아래는 간단한 텍스트 분류 파이프라인 구성 예시이다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml import Pipeline&lt;br /&gt;
from pyspark.ml.feature import Tokenizer, HashingTF&lt;br /&gt;
from pyspark.ml.classification import LogisticRegression&lt;br /&gt;
&lt;br /&gt;
# 단계별 구성&lt;br /&gt;
tokenizer = Tokenizer(inputCol=&amp;quot;text&amp;quot;, outputCol=&amp;quot;words&amp;quot;)&lt;br /&gt;
hashingTF = HashingTF(inputCol=&amp;quot;words&amp;quot;, outputCol=&amp;quot;features&amp;quot;)&lt;br /&gt;
lr = LogisticRegression(maxIter=10, regParam=0.001)&lt;br /&gt;
&lt;br /&gt;
# 파이프라인 구성&lt;br /&gt;
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])&lt;br /&gt;
&lt;br /&gt;
# 학습 데이터&lt;br /&gt;
training = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;spark is great&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;hadoop is old&amp;quot;),&lt;br /&gt;
    (0, &amp;quot;spark is fast&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;mapreduce is slow&amp;quot;)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;text&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
# 파이프라인 학습&lt;br /&gt;
model = pipeline.fit(training)&lt;br /&gt;
&lt;br /&gt;
# 테스트 데이터 예측&lt;br /&gt;
test = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;spark wins again&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;hadoop struggles&amp;quot;)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;text&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
predictions = model.transform(test)&lt;br /&gt;
predictions.select(&amp;quot;text&amp;quot;, &amp;quot;prediction&amp;quot;).show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*분산 환경에서 대규모 데이터 처리 가능&lt;br /&gt;
*파이프라인 구조로 전처리, 학습, 예측 단계를 일관성 있게 정의&lt;br /&gt;
*모델과 파이프라인을 직렬화하여 저장 및 재사용 가능&lt;br /&gt;
*`CrossValidator`, `TrainValidationSplit` 등과 통합 가능&lt;br /&gt;
==단점==&lt;br /&gt;
*scikit-learn보다 낮은 수준의 유연성&lt;br /&gt;
*MLlib API가 아직 일부 알고리즘에 한정적일 수 있음&lt;br /&gt;
==관련 모듈==&lt;br /&gt;
*`pyspark.ml.feature` – 전처리용 Transformer 제공&lt;br /&gt;
*`pyspark.ml.classification` – 분류 모델&lt;br /&gt;
*`pyspark.ml.regression` – 회귀 모델&lt;br /&gt;
*`pyspark.ml.tuning` – 교차 검증, 하이퍼파라미터 튜닝&lt;br /&gt;
*`pyspark.ml.evaluation` – 평가 메트릭 제공&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[Apache Spark]]&lt;br /&gt;
*[[Spark MLlib]]&lt;br /&gt;
*[[머신 러닝 파이프라인]]&lt;br /&gt;
*[[Spark DataFrame]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[하이퍼파라미터 튜닝]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-guide.html&lt;br /&gt;
*Karau, H., Konwinski, A., Wendell, P., &amp;amp; Zaharia, M. (2015). Learning Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40643</id>
		<title>머신 러닝 파이프라인</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40643"/>
		<updated>2025-04-09T00:21:17Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;머신 러닝 파이프라인(Machine Learning Pipeline)은 데이터 전처리부터 모델 학습, 예측, 평가, 배포까지 일련의 과정을 체계적으로 구성한 자동화 흐름이다. 파이프라인을 통해 반복 가능한 작업을 재사용 가능하고 일관성 있게 수행할 수 있으며, 실험 및 배포 환경에서 생산성을 크게 높인다.&lt;br /&gt;
==개요==&lt;br /&gt;
머신 러닝 파이프라인은 전체 모델링 과정에서 필요한 여러 단계를 순차적으로 연결한 구조이다. 각 단계는 독립적인 처리 블록으로 구성되며, 입력 데이터를 변환하거나 학습, 예측 등의 작업을 수행한다.&lt;br /&gt;
==주요 단계==&lt;br /&gt;
*데이터 수집 (Data Collection)&lt;br /&gt;
**외부 소스(API, DB, 파일 등)로부터 원시 데이터를 수집한다.&lt;br /&gt;
*데이터 전처리 (Data Preprocessing)&lt;br /&gt;
**결측값 처리, 이상치 제거, 정규화, 인코딩 등 모델 학습에 적합한 형태로 데이터를 가공한다.&lt;br /&gt;
*특성 선택 및 추출 (Feature Engineering)&lt;br /&gt;
**모델 성능에 영향을 줄 수 있는 유의미한 피처를 선택하거나, 새로 생성한다.&lt;br /&gt;
*학습 데이터 분리 (Train-Test Split)&lt;br /&gt;
**데이터셋을 학습용(train)과 평가용(test)으로 분할하여 과적합을 방지한다.&lt;br /&gt;
*모델 학습 (Model Training)&lt;br /&gt;
**머신 러닝 알고리즘에 학습 데이터를 공급하여 모델을 훈련시킨다.&lt;br /&gt;
*모델 평가 (Model Evaluation)&lt;br /&gt;
**정확도, 정밀도, 재현율, F1-score, RMSE 등 지표로 모델 성능을 측정한다.&lt;br /&gt;
*하이퍼파라미터 튜닝 (Hyperparameter Tuning)&lt;br /&gt;
**최적의 파라미터 조합을 찾기 위해 Grid Search, Random Search 등을 사용한다.&lt;br /&gt;
*모델 저장 및 배포 (Model Deployment)&lt;br /&gt;
**학습된 모델을 저장하고 API 형태로 서비스에 통합하거나, 운영 환경에 배포한다.&lt;br /&gt;
==시각적 예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 간단한 scikit-learn 파이프라인 예시&lt;br /&gt;
from sklearn.pipeline import Pipeline&lt;br /&gt;
from sklearn.preprocessing import StandardScaler&lt;br /&gt;
from sklearn.linear_model import LogisticRegression&lt;br /&gt;
&lt;br /&gt;
pipeline = Pipeline([&lt;br /&gt;
    (&#039;scaler&#039;, StandardScaler()),&lt;br /&gt;
    (&#039;classifier&#039;, LogisticRegression())&lt;br /&gt;
])&lt;br /&gt;
&lt;br /&gt;
pipeline.fit(X_train, y_train)&lt;br /&gt;
y_pred = pipeline.predict(X_test)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*일관성 있는 데이터 흐름 관리&lt;br /&gt;
*코드 재사용성 및 유지보수 용이&lt;br /&gt;
*실험 반복 및 비교가 쉬움&lt;br /&gt;
*운영 환경으로 전환이 용이 (MLOps와 통합 가능)&lt;br /&gt;
*데이터 누출(leakage) 방지&lt;br /&gt;
==활용 도구==&lt;br /&gt;
*scikit-learn&lt;br /&gt;
**`Pipeline`, `FeatureUnion` 등을 사용해 전처리와 모델을 연결&lt;br /&gt;
*TensorFlow Extended (TFX)&lt;br /&gt;
**TensorFlow 기반 파이프라인 구성 및 운영 자동화 도구&lt;br /&gt;
*Apache Airflow&lt;br /&gt;
**스케줄 기반 워크플로우 관리로 ML 작업 자동화&lt;br /&gt;
*MLflow&lt;br /&gt;
**실험 추적, 모델 관리, 배포 자동화에 적합&lt;br /&gt;
*Kubeflow&lt;br /&gt;
**Kubernetes 기반 머신러닝 파이프라인 구축용 플랫폼&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[특성 공학]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[하이퍼파라미터]]&lt;br /&gt;
*[[MLOps]]&lt;br /&gt;
*[[scikit-learn]]&lt;br /&gt;
*[[데이터 전처리]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*scikit-learn 공식 문서: https://scikit-learn.org/stable/modules/compose.html&lt;br /&gt;
*TensorFlow Extended (TFX): https://www.tensorflow.org/tfx&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%9B%90_%ED%95%AB_%EC%9D%B8%EC%BD%94%EB%94%A9&amp;diff=40642</id>
		<title>원 핫 인코딩</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%9B%90_%ED%95%AB_%EC%9D%B8%EC%BD%94%EB%94%A9&amp;diff=40642"/>
		<updated>2025-04-09T00:20:52Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 원 핫 인코딩(One-hot encoding)은 범주형(categorical) 데이터를 머신 러닝 알고리즘에서 사용할 수 있도록 수치형 데이터로 변환하는 기법 중 하나이다. 각 범주를 이진 벡터의 고유한 위치에 1로 표시하고, 나머지는 0으로 처리하여 범주 간의 순서 또는 크기 의미를 제거한다. ==개요== 범주형 데이터는 대부분 문자열로 표현되며, 모델 학습에 직접 사용할 수 없다. 이를 해...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;원 핫 인코딩(One-hot encoding)은 범주형(categorical) 데이터를 머신 러닝 알고리즘에서 사용할 수 있도록 수치형 데이터로 변환하는 기법 중 하나이다. 각 범주를 이진 벡터의 고유한 위치에 1로 표시하고, 나머지는 0으로 처리하여 범주 간의 순서 또는 크기 의미를 제거한다.&lt;br /&gt;
==개요==&lt;br /&gt;
범주형 데이터는 대부분 문자열로 표현되며, 모델 학습에 직접 사용할 수 없다. 이를 해결하기 위해 원 핫 인코딩을 적용하면 각 범주는 서로 독립적인 이진 변수로 변환되므로, 범주 간의 잘못된 거리 정보를 피할 수 있다.&lt;br /&gt;
*예: &#039;사과&#039;, &#039;바나나&#039;, &#039;포도&#039; 세 가지 범주가 있을 때&lt;br /&gt;
**사과 → [1, 0, 0]&lt;br /&gt;
**바나나 → [0, 1, 0]&lt;br /&gt;
**포도 → [0, 0, 1]&lt;br /&gt;
==특징==&lt;br /&gt;
*범주 수만큼 차원이 증가&lt;br /&gt;
*범주 간 순서나 우선순위가 포함되지 않음&lt;br /&gt;
*희소 행렬(sparse matrix)을 생성함&lt;br /&gt;
==구현 예시==&lt;br /&gt;
===pandas를 사용한 예시===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
df = pd.DataFrame({&#039;과일&#039;: [&#039;사과&#039;, &#039;바나나&#039;, &#039;사과&#039;, &#039;포도&#039;]})&lt;br /&gt;
encoded = pd.get_dummies(df[&#039;과일&#039;])&lt;br /&gt;
print(encoded)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===scikit-learn을 사용한 예시===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from sklearn.preprocessing import OneHotEncoder&lt;br /&gt;
&lt;br /&gt;
encoder = OneHotEncoder(sparse=False)&lt;br /&gt;
X = [[&#039;사과&#039;], [&#039;바나나&#039;], [&#039;사과&#039;], [&#039;포도&#039;]]&lt;br /&gt;
encoded = encoder.fit_transform(X)&lt;br /&gt;
print(encoded)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*범주형 데이터를 정량적으로 표현 가능&lt;br /&gt;
*범주 간 불필요한 순서를 부여하지 않아 모델의 오해를 방지&lt;br /&gt;
*대부분의 머신 러닝 모델에서 효율적으로 사용됨&lt;br /&gt;
==단점==&lt;br /&gt;
*범주의 수가 많을 경우 차원이 급격히 증가 (차원의 저주)&lt;br /&gt;
*희소 행렬로 인해 메모리 비효율 발생 가능&lt;br /&gt;
*테스트 데이터에 훈련 데이터에 없던 범주가 등장하면 에러 발생 가능&lt;br /&gt;
==변형 기법==&lt;br /&gt;
*[[Label Encoding]] – 범주를 정수값으로 변환하나, 순서가 부여되어 잘못된 해석 가능&lt;br /&gt;
*[[Binary Encoding]] – 차원 수를 줄이기 위해 각 범주를 2진수로 인코딩&lt;br /&gt;
*[[Target Encoding]] – 범주의 통계값(예: 평균)을 대신 사용&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[Label Encoding]]&lt;br /&gt;
*[[범주형 변수]]&lt;br /&gt;
*[[피처 엔지니어링]]&lt;br /&gt;
*[[scikit-learn]]&lt;br /&gt;
*[[pandas]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*scikit-learn 공식 문서: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html&lt;br /&gt;
*pandas 공식 문서: https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html&lt;br /&gt;
[[분류:인공지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40641</id>
		<title>아파치 스파크 머신 러닝 파이프라인</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%8A%A4%ED%8C%8C%ED%81%AC_%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40641"/>
		<updated>2025-04-08T23:29:28Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 아파치 스파크 머신 러닝 파이프라인(Spark ML Pipeline)은 Apache Spark의 머신 러닝 라이브러리인 MLlib에서 제공하는 고수준 API로, 데이터 전처리부터 모델 학습, 평가, 예측에 이르기까지 전체 머신 러닝 흐름을 구조화된 방식으로 구성할 수 있도록 지원한다. 파이프라인은 대규모 분산 처리 환경에서 확장성과 재현성을 높이기 위해 설계되었다. ==개요== 스파크 머신 러...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 스파크 머신 러닝 파이프라인(Spark ML Pipeline)은 Apache Spark의 머신 러닝 라이브러리인 MLlib에서 제공하는 고수준 API로, 데이터 전처리부터 모델 학습, 평가, 예측에 이르기까지 전체 머신 러닝 흐름을 구조화된 방식으로 구성할 수 있도록 지원한다. 파이프라인은 대규모 분산 처리 환경에서 확장성과 재현성을 높이기 위해 설계되었다.&lt;br /&gt;
==개요==&lt;br /&gt;
스파크 머신 러닝 파이프라인은 여러 처리 단계를 연결하여 순차적으로 실행할 수 있는 구조로, 각 단계는 변환기(Transformer) 또는 추정기(Estimator) 객체로 구성된다. 학습이 완료되면 전체 파이프라인이 하나의 모델(PipelineModel)로 저장되며, 동일한 방식으로 새로운 데이터에 적용할 수 있다.&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
*DataFrame&lt;br /&gt;
**Spark ML 파이프라인은 입력 데이터로 DataFrame을 사용한다. 이 DataFrame은 구조화된 테이블 형태이며, 스키마를 포함한다.&lt;br /&gt;
&lt;br /&gt;
*Transformer&lt;br /&gt;
**입력 DataFrame을 다른 DataFrame으로 변환하는 객체&lt;br /&gt;
**예: `Tokenizer`, `VectorAssembler`, `StandardScaler`, 학습 완료된 모델&lt;br /&gt;
&lt;br /&gt;
*Estimator&lt;br /&gt;
**Transformer를 생성할 수 있는 객체. `.fit()` 메서드를 통해 학습하고 Transformer를 반환한다.&lt;br /&gt;
**예: `LogisticRegression`, `DecisionTreeClassifier`&lt;br /&gt;
&lt;br /&gt;
*Pipeline&lt;br /&gt;
**여러 개의 Transformer와 Estimator를 순서대로 연결한 구조&lt;br /&gt;
&lt;br /&gt;
*PipelineModel&lt;br /&gt;
**학습이 완료된 Pipeline 인스턴스. `.transform()`을 통해 예측 및 처리 수행 가능&lt;br /&gt;
==예제==&lt;br /&gt;
아래는 간단한 텍스트 분류 파이프라인 구성 예시이다.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from pyspark.ml import Pipeline&lt;br /&gt;
from pyspark.ml.feature import Tokenizer, HashingTF&lt;br /&gt;
from pyspark.ml.classification import LogisticRegression&lt;br /&gt;
&lt;br /&gt;
# 단계별 구성&lt;br /&gt;
tokenizer = Tokenizer(inputCol=&amp;quot;text&amp;quot;, outputCol=&amp;quot;words&amp;quot;)&lt;br /&gt;
hashingTF = HashingTF(inputCol=&amp;quot;words&amp;quot;, outputCol=&amp;quot;features&amp;quot;)&lt;br /&gt;
lr = LogisticRegression(maxIter=10, regParam=0.001)&lt;br /&gt;
&lt;br /&gt;
# 파이프라인 구성&lt;br /&gt;
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])&lt;br /&gt;
&lt;br /&gt;
# 학습 데이터&lt;br /&gt;
training = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;spark is great&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;hadoop is old&amp;quot;),&lt;br /&gt;
    (0, &amp;quot;spark is fast&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;mapreduce is slow&amp;quot;)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;text&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
# 파이프라인 학습&lt;br /&gt;
model = pipeline.fit(training)&lt;br /&gt;
&lt;br /&gt;
# 테스트 데이터 예측&lt;br /&gt;
test = spark.createDataFrame([&lt;br /&gt;
    (0, &amp;quot;spark wins again&amp;quot;),&lt;br /&gt;
    (1, &amp;quot;hadoop struggles&amp;quot;)&lt;br /&gt;
], [&amp;quot;label&amp;quot;, &amp;quot;text&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
predictions = model.transform(test)&lt;br /&gt;
predictions.select(&amp;quot;text&amp;quot;, &amp;quot;prediction&amp;quot;).show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*분산 환경에서 대규모 데이터 처리 가능&lt;br /&gt;
*파이프라인 구조로 전처리, 학습, 예측 단계를 일관성 있게 정의&lt;br /&gt;
*모델과 파이프라인을 직렬화하여 저장 및 재사용 가능&lt;br /&gt;
*`CrossValidator`, `TrainValidationSplit` 등과 통합 가능&lt;br /&gt;
==단점==&lt;br /&gt;
*scikit-learn보다 낮은 수준의 유연성&lt;br /&gt;
*MLlib API가 아직 일부 알고리즘에 한정적일 수 있음&lt;br /&gt;
==관련 모듈==&lt;br /&gt;
*`pyspark.ml.feature` – 전처리용 Transformer 제공&lt;br /&gt;
*`pyspark.ml.classification` – 분류 모델&lt;br /&gt;
*`pyspark.ml.regression` – 회귀 모델&lt;br /&gt;
*`pyspark.ml.tuning` – 교차 검증, 하이퍼파라미터 튜닝&lt;br /&gt;
*`pyspark.ml.evaluation` – 평가 메트릭 제공&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[Apache Spark]]&lt;br /&gt;
*[[Spark MLlib]]&lt;br /&gt;
*[[머신 러닝 파이프라인]]&lt;br /&gt;
*[[Spark DataFrame]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[하이퍼파라미터 튜닝]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache Spark MLlib 공식 문서: https://spark.apache.org/docs/latest/ml-guide.html&lt;br /&gt;
*Karau, H., Konwinski, A., Wendell, P., &amp;amp; Zaharia, M. (2015). Learning Spark. O&#039;Reilly Media.&lt;br /&gt;
[[분류:인공 지능]]&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;br /&gt;
[[분류:아파치 스파크]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40640</id>
		<title>머신 러닝 파이프라인</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A8%B8%EC%8B%A0_%EB%9F%AC%EB%8B%9D_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&amp;diff=40640"/>
		<updated>2025-04-08T23:27:57Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: 머신 러닝 파이프라인(Machine Learning Pipeline)은 데이터 전처리부터 모델 학습, 예측, 평가, 배포까지 일련의 과정을 체계적으로 구성한 자동화 흐름이다. 파이프라인을 통해 반복 가능한 작업을 재사용 가능하고 일관성 있게 수행할 수 있으며, 실험 및 배포 환경에서 생산성을 크게 높인다. ==개요== 머신 러닝 파이프라인은 전체 모델링 과정에서 필요한 여러 단계를...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;머신 러닝 파이프라인(Machine Learning Pipeline)은 데이터 전처리부터 모델 학습, 예측, 평가, 배포까지 일련의 과정을 체계적으로 구성한 자동화 흐름이다. 파이프라인을 통해 반복 가능한 작업을 재사용 가능하고 일관성 있게 수행할 수 있으며, 실험 및 배포 환경에서 생산성을 크게 높인다.&lt;br /&gt;
==개요==&lt;br /&gt;
머신 러닝 파이프라인은 전체 모델링 과정에서 필요한 여러 단계를 순차적으로 연결한 구조이다. 각 단계는 독립적인 처리 블록으로 구성되며, 입력 데이터를 변환하거나 학습, 예측 등의 작업을 수행한다.&lt;br /&gt;
==주요 단계==&lt;br /&gt;
*데이터 수집 (Data Collection)&lt;br /&gt;
**외부 소스(API, DB, 파일 등)로부터 원시 데이터를 수집한다.&lt;br /&gt;
*데이터 전처리 (Data Preprocessing)&lt;br /&gt;
**결측값 처리, 이상치 제거, 정규화, 인코딩 등 모델 학습에 적합한 형태로 데이터를 가공한다.&lt;br /&gt;
*특성 선택 및 추출 (Feature Engineering)&lt;br /&gt;
**모델 성능에 영향을 줄 수 있는 유의미한 피처를 선택하거나, 새로 생성한다.&lt;br /&gt;
*학습 데이터 분리 (Train-Test Split)&lt;br /&gt;
**데이터셋을 학습용(train)과 평가용(test)으로 분할하여 과적합을 방지한다.&lt;br /&gt;
*모델 학습 (Model Training)&lt;br /&gt;
**머신 러닝 알고리즘에 학습 데이터를 공급하여 모델을 훈련시킨다.&lt;br /&gt;
*모델 평가 (Model Evaluation)&lt;br /&gt;
**정확도, 정밀도, 재현율, F1-score, RMSE 등 지표로 모델 성능을 측정한다.&lt;br /&gt;
*하이퍼파라미터 튜닝 (Hyperparameter Tuning)&lt;br /&gt;
**최적의 파라미터 조합을 찾기 위해 Grid Search, Random Search 등을 사용한다.&lt;br /&gt;
*모델 저장 및 배포 (Model Deployment)&lt;br /&gt;
**학습된 모델을 저장하고 API 형태로 서비스에 통합하거나, 운영 환경에 배포한다.&lt;br /&gt;
==시각적 예시==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 간단한 scikit-learn 파이프라인 예시&lt;br /&gt;
from sklearn.pipeline import Pipeline&lt;br /&gt;
from sklearn.preprocessing import StandardScaler&lt;br /&gt;
from sklearn.linear_model import LogisticRegression&lt;br /&gt;
&lt;br /&gt;
pipeline = Pipeline([&lt;br /&gt;
    (&#039;scaler&#039;, StandardScaler()),&lt;br /&gt;
    (&#039;classifier&#039;, LogisticRegression())&lt;br /&gt;
])&lt;br /&gt;
&lt;br /&gt;
pipeline.fit(X_train, y_train)&lt;br /&gt;
y_pred = pipeline.predict(X_test)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==장점==&lt;br /&gt;
*일관성 있는 데이터 흐름 관리&lt;br /&gt;
*코드 재사용성 및 유지보수 용이&lt;br /&gt;
*실험 반복 및 비교가 쉬움&lt;br /&gt;
*운영 환경으로 전환이 용이 (MLOps와 통합 가능)&lt;br /&gt;
*데이터 누출(leakage) 방지&lt;br /&gt;
==활용 도구==&lt;br /&gt;
*scikit-learn&lt;br /&gt;
**`Pipeline`, `FeatureUnion` 등을 사용해 전처리와 모델을 연결&lt;br /&gt;
*TensorFlow Extended (TFX)&lt;br /&gt;
**TensorFlow 기반 파이프라인 구성 및 운영 자동화 도구&lt;br /&gt;
*Apache Airflow&lt;br /&gt;
**스케줄 기반 워크플로우 관리로 ML 작업 자동화&lt;br /&gt;
*MLflow&lt;br /&gt;
**실험 추적, 모델 관리, 배포 자동화에 적합&lt;br /&gt;
*Kubeflow&lt;br /&gt;
**Kubernetes 기반 머신러닝 파이프라인 구축용 플랫폼&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[특성 공학]]&lt;br /&gt;
*[[모델 평가]]&lt;br /&gt;
*[[하이퍼파라미터]]&lt;br /&gt;
*[[MLOps]]&lt;br /&gt;
*[[scikit-learn]]&lt;br /&gt;
*[[데이터 전처리]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O&#039;Reilly Media.&lt;br /&gt;
*scikit-learn 공식 문서: https://scikit-learn.org/stable/modules/compose.html&lt;br /&gt;
*TensorFlow Extended (TFX): https://www.tensorflow.org/tfx&lt;br /&gt;
[[분류:인공 지능]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%95%98%EB%91%A1_%EC%97%90%EC%BD%94%EC%8B%9C%EC%8A%A4%ED%85%9C&amp;diff=40608</id>
		<title>하둡 에코시스템</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%95%98%EB%91%A1_%EC%97%90%EC%BD%94%EC%8B%9C%EC%8A%A4%ED%85%9C&amp;diff=40608"/>
		<updated>2025-04-03T21:38:44Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;하둡 에코시스템(Hadoop Ecosystem)은 [[아파치 하둡]]을 중심으로 분산 저장과 분산 처리를 수행하는 다양한 오픈소스 도구들과 기술들을 아우르는 개념이다. 하둡은 단순한 분산 파일 시스템과 맵리듀스 처리 엔진에서 시작했지만, 그 위에 다양한 기능을 제공하는 도구들이 결합되며 하나의 &#039;&#039;&#039;데이터 처리 플랫폼&#039;&#039;&#039;으로 발전했다.&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
하둡 에코시스템은 다음 네 가지 계층으로 구성된다:&lt;br /&gt;
===1. 저장(Storage) ===&lt;br /&gt;
* &#039;&#039;&#039;[[HDFS (Hadoop Distributed File System)]]&#039;&#039;&#039;** 하둡의 기본 분산 파일 시스템으로, 대용량 파일을 여러 노드에 분산 저장&lt;br /&gt;
*Apache HBase&lt;br /&gt;
**HDFS 위에 구축된 분산형 컬럼 기반 NoSQL 데이터베이스&lt;br /&gt;
===2. 자원 관리(Resource Management)===* &#039;&#039;&#039;[[YARN (Yet Another Resource Negotiator)]]&#039;&#039;&#039;&lt;br /&gt;
**클러스터 자원 관리 및 작업 스케줄링 담당&lt;br /&gt;
**다양한 처리 엔진(Hive, Spark, MapReduce 등)과 통합 가능&lt;br /&gt;
===3. 처리 엔진(Processing Frameworks) ===&lt;br /&gt;
*&#039;&#039;&#039;MapReduce&#039;&#039;&#039;** 초기 하둡의 기본 분산 처리 모델, 병렬 배치 처리에 적합&lt;br /&gt;
*&#039;&#039;&#039;Apache Spark&#039;&#039;&#039;&lt;br /&gt;
**인메모리 기반 분산 처리 프레임워크, MapReduce보다 빠르고 유연함&lt;br /&gt;
* Apache Tez**DAG 기반 고속 처리 엔진, Hive와 함께 사용됨&lt;br /&gt;
*Apache Flink&lt;br /&gt;
**스트리밍 처리 특화 프레임워크&lt;br /&gt;
=== 4. 상위 레벨 도구(High-Level Tools)===&lt;br /&gt;
*&#039;&#039;&#039;Apache Hive&#039;&#039;&#039;** SQL 유사 언어(HiveQL)로 하둡 데이터 처리&lt;br /&gt;
* &#039;&#039;&#039;Apache Pig&#039;&#039;&#039;&lt;br /&gt;
**데이터 흐름 기반 처리 언어(Pig Latin)&lt;br /&gt;
*&#039;&#039;&#039;Apache Sqoop&#039;&#039;&#039;&lt;br /&gt;
**관계형 DB와 하둡 간 대량 데이터 전송&lt;br /&gt;
* &#039;&#039;&#039;Apache Flume&#039;&#039;&#039;** 로그 및 실시간 데이터 수집 도구&lt;br /&gt;
*Apache Oozie&lt;br /&gt;
**워크플로우 기반 하둡 작업 스케줄링 도구&lt;br /&gt;
==부가 구성 요소==&lt;br /&gt;
* &#039;&#039;&#039;Apache Zookeeper&#039;&#039;&#039;** 분산 환경에서의 동기화, 리더 선출, 설정 관리 등&lt;br /&gt;
*Apache Ambari&lt;br /&gt;
**하둡 클러스터 설치, 관리, 모니터링 UI&lt;br /&gt;
*Apache Knox&lt;br /&gt;
**하둡 에코시스템의 보안 게이트웨이 역할 수행&lt;br /&gt;
*Apache Ranger&lt;br /&gt;
**세분화된 권한 제어 및 감사 로깅&lt;br /&gt;
&lt;br /&gt;
== 구성도 ==&lt;br /&gt;
                      ┌────────────────────────────┐&lt;br /&gt;
                      │        User Interface      │&lt;br /&gt;
                      │        (Hue, [[아파치 제플린|Zeppelin]])     │&lt;br /&gt;
                      └────────────┬───────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │       Processing / Compute Layer      │&lt;br /&gt;
                │  (MapReduce, Spark, Tez, Flink, Storm)│&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │         Resource Management Layer     │&lt;br /&gt;
                │               (YARN, Mesos)           │&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │        Storage Layer (HDFS, HBase)    │&lt;br /&gt;
                │   + External: S3, Cassandra, Alluxio  │&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │        Data Ingestion / ETL Layer     │&lt;br /&gt;
                │   (Flume, Sqoop, Kafka, NiFi, Oozie)  │&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │      Metadata / Coordination Layer    │&lt;br /&gt;
                │      (ZooKeeper, Atlas, Ranger)       │&lt;br /&gt;
                └───────────────────────────────────────┘&lt;br /&gt;
&lt;br /&gt;
== 특징==&lt;br /&gt;
*대규모 데이터 저장 및 분석을 위한 확장 가능한 아키텍처&lt;br /&gt;
*다양한 데이터 유형(정형/비정형)과 처리 방식(배치/스트리밍)에 대응&lt;br /&gt;
* 오픈소스 기반 → 기업 환경에 맞게 커스터마이징 가능&lt;br /&gt;
== 활용 분야==&lt;br /&gt;
*로그 분석, 클릭스트림 분석&lt;br /&gt;
*머신러닝 파이프라인 구축&lt;br /&gt;
*데이터 웨어하우징&lt;br /&gt;
*IoT 및 센서 데이터 수집 및 처리&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 하둡]]&lt;br /&gt;
*[[HDFS (Hadoop Distributed File System)]]&lt;br /&gt;
*[[YARN (Yet Another Resource Negotiator)]]&lt;br /&gt;
*[[Apache Hive]]&lt;br /&gt;
*[[Apache Spark]]&lt;br /&gt;
*[[Apache Zookeeper]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Tom White, &amp;quot;Hadoop: The Definitive Guide&amp;quot;, O&#039;Reilly&lt;br /&gt;
*The Apache Software Foundation: https://hadoop.apache.org/&lt;br /&gt;
*Cloudera, Hortonworks, MapR 등 하둡 배포판 문서&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%95%98%EB%91%A1_%EC%97%90%EC%BD%94%EC%8B%9C%EC%8A%A4%ED%85%9C&amp;diff=40607</id>
		<title>하둡 에코시스템</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%95%98%EB%91%A1_%EC%97%90%EC%BD%94%EC%8B%9C%EC%8A%A4%ED%85%9C&amp;diff=40607"/>
		<updated>2025-04-03T21:36:14Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서:                       ┌────────────────────────────┐                       │        User Interface      │                       │        (Hue, Zeppelin)     │                       └────────────┬───────────────┘                                    │                 ┌──────────────────▼─...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;                      ┌────────────────────────────┐&lt;br /&gt;
                      │        User Interface      │&lt;br /&gt;
                      │        (Hue, [[아파치 제플린|Zeppelin]])     │&lt;br /&gt;
                      └────────────┬───────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │       Processing / Compute Layer      │&lt;br /&gt;
                │  (MapReduce, Spark, Tez, Flink, Storm)│&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │         Resource Management Layer     │&lt;br /&gt;
                │               (YARN, Mesos)           │&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │        Storage Layer (HDFS, HBase)    │&lt;br /&gt;
                │   + External: S3, Cassandra, Alluxio  │&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │        Data Ingestion / ETL Layer     │&lt;br /&gt;
                │   (Flume, Sqoop, Kafka, NiFi, Oozie)  │&lt;br /&gt;
                └──────────────────┬────────────────────┘&lt;br /&gt;
                                   │&lt;br /&gt;
                ┌──────────────────▼────────────────────┐&lt;br /&gt;
                │      Metadata / Coordination Layer    │&lt;br /&gt;
                │      (ZooKeeper, Atlas, Ranger)       │&lt;br /&gt;
                └───────────────────────────────────────┘&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%A3%BC%ED%82%A4%ED%8D%BC_znode&amp;diff=40606</id>
		<title>아파치 주키퍼 znode</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EC%A3%BC%ED%82%A4%ED%8D%BC_znode&amp;diff=40606"/>
		<updated>2025-04-03T21:24:44Z</updated>

		<summary type="html">&lt;p&gt;빅데이터분석기사: 새 문서: znode는 아파치 주키퍼에서 사용되는 데이터 단위이자 노드로, 주키퍼의 트리 구조 네임스페이스를 구성하는 핵심 요소이다. 각각의 znode는 파일 시스템의 디렉토리나 파일처럼 취급되며, 데이터와 메타데이터를 포함할 수 있다. 클라이언트는 znode를 통해 정보를 저장하거나, 상태 변화를 감지하거나, 노드 간 동기화를 구현할 수 있다. ==개념== *znode는 주키퍼의...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;znode는 [[아파치 주키퍼]]에서 사용되는 데이터 단위이자 노드로, 주키퍼의 트리 구조 네임스페이스를 구성하는 핵심 요소이다. 각각의 znode는 파일 시스템의 디렉토리나 파일처럼 취급되며, 데이터와 메타데이터를 포함할 수 있다. 클라이언트는 znode를 통해 정보를 저장하거나, 상태 변화를 감지하거나, 노드 간 동기화를 구현할 수 있다.&lt;br /&gt;
==개념==&lt;br /&gt;
*znode는 주키퍼의 경로(path)를 구성하는 각 지점이며, 예: `/app/servers/server1`&lt;br /&gt;
*각 znode는 최대 1MB 크기의 데이터를 저장할 수 있음&lt;br /&gt;
*znode는 자식 노드를 가질 수 있으며, 이를 통해 계층적 트리 구조를 형성함&lt;br /&gt;
*메타데이터에는 버전, 생성 시간, 자식 수, ACL(Access Control List) 등이 포함됨&lt;br /&gt;
==znode의 종류==&lt;br /&gt;
#&#039;&#039;&#039;영속 노드(Persistent znode)&#039;&#039;&#039;&lt;br /&gt;
#*명시적으로 삭제되지 않는 한 유지됨&lt;br /&gt;
#*서비스 설정, 공유 상태 저장 등 지속적인 정보에 사용&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;&#039;임시 노드(Ephemeral znode)&#039;&#039;&#039;&lt;br /&gt;
#*znode를 생성한 클라이언트 세션이 종료되면 자동 삭제됨&lt;br /&gt;
#*리더 선출, 세션 감지, 임시 등록 등에 사용&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;&#039;시퀀스 노드(Sequential znode)&#039;&#039;&#039;&lt;br /&gt;
#*znode 생성 시 고유한 숫자가 자동으로 뒤에 붙음&lt;br /&gt;
#*&#039;&#039;&#039;영속 시퀀스&#039;&#039;&#039; 또는 &#039;&#039;&#039;임시 시퀀스&#039;&#039;&#039;로 생성 가능&lt;br /&gt;
#*예: `/queue/task-000000001`, `/queue/task-000000002`&lt;br /&gt;
==znode의 기능==&lt;br /&gt;
*&#039;&#039;&#039;데이터 저장&#039;&#039;&#039;: 클라이언트가 znode에 문자열 또는 바이트 배열을 저장&lt;br /&gt;
*&#039;&#039;&#039;노드 감시(Watch)&#039;&#039;&#039;: 특정 znode의 생성, 삭제, 변경 등을 클라이언트가 감시 가능&lt;br /&gt;
*&#039;&#039;&#039;노드 삭제&#039;&#039;&#039;: 클라이언트는 권한이 있을 경우 znode를 삭제 가능&lt;br /&gt;
*&#039;&#039;&#039;ACL 설정&#039;&#039;&#039;: 각 znode마다 접근 권한 설정 가능 (읽기/쓰기 등)&lt;br /&gt;
==사용 예시==&lt;br /&gt;
*`/services/web/instance1` → 웹 서비스 인스턴스 등록 (임시 znode)&lt;br /&gt;
*`/config/database/url` → 구성 설정 저장 (영속 znode)&lt;br /&gt;
*`/election/candidate0000000003` → 리더 선출 대기열 (시퀀스 znode)&lt;br /&gt;
==제약 사항==&lt;br /&gt;
*하나의 znode는 1MB를 넘는 데이터를 저장할 수 없음&lt;br /&gt;
*임시 znode는 자식 노드를 가질 수 없음&lt;br /&gt;
*동일 경로에 중복된 znode 생성 불가&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 주키퍼]]&lt;br /&gt;
*[[분산 락]]&lt;br /&gt;
*[[리더 선출]]&lt;br /&gt;
*[[분산 시스템]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Apache ZooKeeper 공식 문서: https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html&lt;br /&gt;
*&amp;quot;ZooKeeper: Wait-free coordination for internet-scale systems&amp;quot; – Hunt et al. (2010), USENIX ATC&lt;br /&gt;
[[분류:분산 컴퓨팅]]&lt;/div&gt;</summary>
		<author><name>빅데이터분석기사</name></author>
	</entry>
</feed>