This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git
The following commit(s) were added to refs/heads/master by this push:
new 636a16c7a465 docs(i18n): machine Korean translation candidates (#4546)
636a16c7a465 is described below
commit 636a16c7a46537fd2e78896d21d5ec50ae3083ca
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Thu Oct 29 02:00:02 2026 +0000
docs(i18n): machine Korean translation candidates (#4546)
## Korean translation candidate
Source commit: `38d51ed68f58649235d42916d51398dc7dab6934`
Model: `gpt-6-sol`; glossary: `1`
Review status: machine. Korean proofreading and the normal PR checks are
still required.
| Action | Version | English source | SHA-256 prefix | Generation |
| --- | --- | --- | --- | --- |
| update | current |
[`course/101/01-apache-doris-overview.mdx`](https://github.com/apache/doris-website/blob/38d51ed68f58649235d42916d51398dc7dab6934/course/101/01-apache-doris-overview.mdx)
| `2d17e48d80fd` | model call |
| update | current |
[`course/101/04-apache-doris-data-operations-guide.mdx`](https://github.com/apache/doris-website/blob/38d51ed68f58649235d42916d51398dc7dab6934/course/101/04-apache-doris-data-operations-guide.mdx)
| `dba85eb86436` | model call |
## Failed or skipped tasks
- `T06-COURSE-202165002458156`
(course/101/02-apache-doris-installation-guide.mdx): Protected content
changed (code, links, numbers, MDX, anchors, or metadata)
+ actual - expected
+ 'fd456e8cda208d3b03d3ed95a5848ad19aeeaa2e27691090dc6346c287a9a808'
- '55e64ec3c6de9a309807312c952968a411812ecd1d427f742a80503c4de7df07'
- `T06-COURSE-183942594637986`
(course/101/03-apache-doris-table-guide.mdx): Protected content changed
(code, links, numbers, MDX, anchors, or metadata)
+ actual - expected
+ '29fb7b0d777b731859922929b01471161eefcab6df62f40ff76b8940a5af4a21'
- '090a5ef113040938be25bf15a22e319776bb842b93cb9928a9f040ee9ffa145c'
- `T06-COURSE-138835438931070`
(course/101/05-apache-doris-query-data-guide.mdx): Glossary product term
changed: SQL
- `T06-COURSE-027383396421008`
(course/101/06-apache-doris-lakehouse-guide.mdx): Protected content
changed (code, links, numbers, MDX, anchors, or metadata)
+ actual - expected
+ '6ced16ac9e601e6d0495a5992e4d236a921cc20223ee2f8f85b1ce3eaf95ba11'
- '0cea80fcfd90942f1e4ba0a5bfb5f522e87e8fa0d8d896425e1518421e4dbd63'
## Candidates retained with warnings
None.
## Validation
Updates at or below 30% translate only changed Markdown/MDX blocks and
preserve other target blocks.
Change size is the sum of max(removed, added) non-empty English lines
per diff hunk, divided by the larger old/new line count.
New documents, larger updates, glossary changes or baselines that cannot
be aligned use full translation.
Generation uses at most three attempts per document. Deletions and
code-only updates may need no model call.
Each retry receives the earlier validation errors. Third-attempt content
issues are retained as warnings above.
Full attempt history and diagnostics are in generation.json and the page
state records.
Committed source hashes, managed paths and target/state hashes are
checked before applying candidates.
Master is checked before each model call and before publishing:
unrelated merges are allowed, a page changed on master is dropped, and a
translation configuration or tooling change discards the batch.
The publisher runs the shared PR translation-state, syntax and
internal-link checks before pushing.
The normal PR build and human proofreading are still required before
merging.
<!-- korean-translation-automation:v1
bot-head=6dce02d75691b3daa967d3e431d6b1b27ab3b023 -->
Shared PR admission checks: passed (translation state, syntax, internal
links).
Co-authored-by: morningman <[email protected]>
---
.../current/101/01-apache-doris-overview.mdx | 188 ++++++++++-----------
.../101/04-apache-doris-data-operations-guide.mdx | 164 +++++++++---------
.../101/apache-doris-data-operations-guide.json | 18 +-
.../course/current/101/apache-doris-overview.json | 18 +-
4 files changed, 204 insertions(+), 184 deletions(-)
diff --git
a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/01-apache-doris-overview.mdx
b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/01-apache-doris-overview.mdx
index 8ef09260fa65..e786e8f71943 100644
---
a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/01-apache-doris-overview.mdx
+++
b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/01-apache-doris-overview.mdx
@@ -1,6 +1,6 @@
---
title: Apache Doris 개요
-description: 데이터 구성, 스토리지 모델, 아키텍처, 쿼리 실행, 최적화를 다루는 아홉 개의 학습 단위를 통해 Apache
Doris의 핵심 개념을 알아보세요.
+description: 데이터 구성, 저장 모델, 아키텍처, 쿼리 실행과 최적화를 다루는 9개의 학습 단원을 통해 Apache Doris의
핵심 개념을 익힙니다.
slug: /101/01-apache-doris-overview
sidebar_position: 1
keywords:
@@ -35,21 +35,21 @@ import {
id="data-organization"
label="데이터 구성"
title={<>Doris는 데이터를 어떻게 <em>구성</em> 하나요?</>}
- summary="먼저 논리적 계층 구조를 살펴보세요. 그런 다음 테이블이 클러스터 전체에서 어떻게 나뉘고 분산되는지 자세히
알아봅니다."
- coachTitle="테이블은 논리적 구조가 실제 스토리지로 이어지는 지점입니다."
+ summary="먼저 논리적 계층 구조를 살펴봅니다. 이어서 테이블이 클러스터 전체에 어떻게 나뉘어 분산되는지 알아봅니다."
+ coachTitle="테이블에서는 논리 구조가 실제 저장 방식으로 이어집니다."
coach={
<p>
- Catalog는 데이터 소스를 식별하고, 데이터베이스는 논리적 경계를 만들며, 테이블은 스키마와 속성을
정의합니다. 테이블 안에서는 파티션이 데이터 범위를 나누고 버킷이 병렬 처리를 위해 데이터를 분산합니다.
+ Catalog는 데이터 소스를 식별하고, 데이터베이스는 논리적 경계를 만들며, 테이블은 스키마와 속성을
정의합니다. 테이블 안에서는 파티션이 데이터 범위를 구분하고 버킷이 병렬 처리를 위해 데이터를 분산합니다.
</p>
}
calloutTitle="이 차이를 기억하세요"
- callout={<p>파티션은 ‘어느 데이터 범위인가?’에 답하고, 버킷은 ‘데이터가 어디에 어떻게 분산되는가?’에
답합니다.</p>}
+ callout={<p>파티션은 “어느 데이터 범위인가?”에, 버킷은 “어디에 어떻게 분산되는가?”에 답합니다.</p>}
check={{
- question: "날짜 범위를 기준으로 데이터를 제외할 수 있게 해 주는 계층은 무엇인가요?",
+ question: "날짜 범위를 기준으로 데이터를 걸러내는 데 쓰이는 계층은 무엇인가요?",
options: ["버킷", "파티션"],
correctIndex: 1,
correctFeedback: "정답입니다. 파티션은 Doris가 제외할 수 있는 논리적 범위를 제공합니다.",
- incorrectFeedback: "아쉽지만 틀렸습니다. 버킷은 행을 분산하고, 파티션은 논리적 범위를 정의합니다.",
+ incorrectFeedback: "아쉽습니다. 버킷은 행을 분산하고, 파티션은 논리적 범위를 정의합니다.",
}}
>
<CourseConceptFlow
@@ -57,7 +57,7 @@ import {
focusIndex={2}
items={[
{ title: "Catalog", description: "데이터 소스" },
- { title: "데이터베이스", description: "비즈니스 영역의 경계" },
+ { title: "데이터베이스", description: "업무 영역" },
{ title: "테이블", description: "스키마 + 속성" },
{ title: "파티션", description: "논리적 범위" },
{ title: "버킷", description: "물리적 분산" },
@@ -67,28 +67,28 @@ import {
<CourseLessonUnit
id="columnar-storage"
- label="열 기반 스토리지"
- title={<>값을 왜 <em>열별로 저장할까요</em>?</>}
- summary="분석 쿼리는 많은 행에서 일부 열만 사용하는 경우가 많습니다. 열 기반 스토리지를 사용하면 Doris가 쿼리에
필요한 데이터만 읽고 처리할 수 있습니다."
- coachTitle="열 기반 배치는 불필요한 작업을 줄입니다."
- coach={<p>같은 열의 값은 자료형이 같고 분포도 비슷한 경우가 많습니다. 덕분에 인코딩, 압축, CPU 캐시 활용,
일괄 처리가 개선됩니다.</p>}
- calloutTitle="개념적 이해"
- callout={<p>행 기반 스토리지는 완전한 레코드를 함께 저장합니다. 열 기반 스토리지는 같은 필드의 값을 함께
저장합니다.</p>}
+ label="열 지향 저장"
+ title={<>값을 <em>열별로 저장하는 이유는 무엇일까요</em>?</>}
+ summary="분석 쿼리는 많은 행에서 일부 열만 참조하는 경우가 많습니다. 열 지향 저장을 사용하면 Doris는 쿼리에
필요한 데이터만 읽고 처리할 수 있습니다."
+ coachTitle="열 지향 배치는 불필요한 작업을 줄입니다."
+ coach={<p>같은 열의 값은 자료형이 같고 분포도 비슷한 경우가 많습니다. 따라서 인코딩, 압축, CPU 캐시 지역성,
일괄 처리에 유리합니다.</p>}
+ calloutTitle="이렇게 이해하세요"
+ callout={<p>행 지향 저장은 완전한 레코드를 한데 모으고, 열 지향 저장은 같은 필드의 값을 한데 모읍니다.</p>}
check={{
- question: "쿼리가 80개 열 중 3개를 읽습니다. 가장 큰 장점은 무엇인가요?",
+ question: "쿼리가 80개 열 중 3개만 읽는다면 가장 큰 이점은 무엇인가요?",
options: ["불필요한 값을 덜 읽습니다", "테이블 복제본을 더 많이 만듭니다"],
correctIndex: 0,
- correctFeedback: "정답입니다. Doris는 관련 없는 열 데이터 대부분을 읽지 않아도 됩니다.",
- incorrectFeedback: "복제본은 가용성을 높입니다. 열 기반 배치의 주된 이점은 불필요한 I/O를 줄이는
것입니다.",
+ correctFeedback: "정답입니다. Doris는 관련 없는 열의 데이터를 대부분 읽지 않아도 됩니다.",
+ incorrectFeedback: "복제본은 가용성을 높입니다. 열 지향 배치는 주로 불필요한 I/O를 줄입니다.",
}}
>
<CourseConceptGrid
- ariaLabel="열 기반 스토리지의 이점"
+ ariaLabel="열 지향 저장의 이점"
columns={3}
items={[
- { tag: 'I/O', title: "읽는 양 줄이기", description: "쿼리가 참조하는 열만
스캔합니다." },
- { tag: 'ZIP', title: "압축률 높이기", description: "자료형이 비슷한 값은 더
간결하게 인코딩할 수 있습니다." },
- { tag: 'CPU', title: "일괄 처리하기", description: "연속된 벡터는 캐시 활용도를
높이고 SIMD 처리를 가능하게 합니다." },
+ { tag: 'I/O', title: "읽기량 감소", description: "쿼리가 참조하는 열만
스캔합니다." },
+ { tag: 'ZIP', title: "압축 효율 향상", description: "자료형이 같고 비슷한 값은
더 작은 크기로 인코딩하기 쉽습니다." },
+ { tag: 'CPU', title: "일괄 처리", description: "연속된 벡터는 캐시 활용도를
높이고 SIMD를 사용할 수 있게 합니다." },
]}
/>
</CourseLessonUnit>
@@ -96,26 +96,26 @@ import {
<CourseLessonUnit
id="table-models"
label="테이블 모델"
- title={<>키가 <em>반복되면 어떻게 될까요</em>?</>}
- summary="테이블 모델은 Doris가 모든 행을 유지할지, 값을 결합할지, 각 Key마다 하나의 논리적 행을 유지할지를
결정합니다."
+ title={<>키가 중복되면 무엇이 <em>달라질까요</em>?</>}
+ summary="테이블 모델은 Doris가 모든 행을 보존할지, 값을 결합할지, 각 Key마다 하나의 논리적 행을 유지할지를
결정합니다."
coachTitle="데이터를 적재하기 전에 행의 처리 방식을 선택하세요."
- coach={<p>Duplicate Key는 변경되지 않는 상세 데이터에 적합하고, Aggregate Key는 지정된 사전
집계 결과를 저장하며, Unique Key는 UPSERT 방식으로 변경 가능한 레코드를 지원합니다.</p>}
+ coach={<p>Duplicate Key는 변경되지 않는 상세 데이터에 적합하고, Aggregate Key는 선언된 방식에
따라 사전 집계한 값을 저장하며, Unique Key는 UPSERT 방식으로 변경되는 레코드를 지원합니다.</p>}
calloutTitle="운영 환경에서의 원칙"
- callout={<p>테이블을 만든 뒤에는 테이블 모델을 변경할 수 없습니다. 모델을 선택하기 전에 업데이트 동작을
확인하세요.</p>}
+ callout={<p>테이블을 만든 뒤에는 테이블 모델을 변경할 수 없습니다. 선택하기 전에 필요한 업데이트 동작을
확인하세요.</p>}
check={{
- question: "고객 프로필에 대한 CDC 업데이트에는 어떤 모델이 적합한가요?",
+ question: "CDC로 고객 프로필을 업데이트할 때 적합한 모델은 무엇인가요?",
options: ["Duplicate Key", "Aggregate Key", "Unique Key"],
correctIndex: 2,
- correctFeedback: "정답입니다. Unique Key는 각 Key마다 하나의 논리적 행을 유지하며
UPSERT 방식을 지원합니다.",
- incorrectFeedback: "다시 생각해 보세요. 변경 가능한 레코드는 각 Key마다 현재 상태를 나타내는
논리적 행이 하나씩 필요합니다.",
+ correctFeedback: "정답입니다. Unique Key는 각 Key마다 하나의 논리적 행을 유지하고
UPSERT 의미 체계를 지원합니다.",
+ incorrectFeedback: "다시 생각해 보세요. 변경되는 레코드는 각 Key마다 현재 상태를 나타내는 논리적
행 하나가 필요합니다.",
}}
>
<CourseConceptGrid
ariaLabel="Apache Doris 테이블 모델"
columns={3}
items={[
- { tag: 'DUP', title: "Duplicate Key", description: "이벤트 상세 정보와
로그를 위해 입력된 모든 행을 유지합니다." },
- { tag: 'AGG', title: "Aggregate Key", description: "지정된 집계 함수를
사용해 Value 열을 병합합니다." },
+ { tag: 'DUP', title: "Duplicate Key", description: "이벤트 상세
데이터와 로그에 적합하며, 입력된 모든 행을 보존합니다." },
+ { tag: 'AGG', title: "Aggregate Key", description: "선언된 집계 함수를
사용해 Value 열을 병합합니다." },
{ tag: 'UNI', title: "Unique Key", description: "업데이트와 CDC를 위해
각 Key마다 하나의 논리적 행을 유지합니다." },
]}
/>
@@ -124,26 +124,26 @@ import {
<CourseLessonUnit
id="integrated-architecture"
label="통합 아키텍처"
- title={<>전통적인 <em>FE + BE</em> 클러스터를 살펴보세요.</>}
- summary="통합 아키텍처에서는 Frontend 노드가 시스템을 조율하고, Backend 노드가 쿼리를 실행하며 태블릿
복제본을 로컬 스토리지에 영구 저장합니다."
- coachTitle="제어와 데이터 처리는 서로 다른 역할을 맡습니다."
- coach={<p>FE는 인증, SQL 파싱과 계획 수립, 메타데이터, 조율을 담당합니다. BE는 태블릿을 저장하고, 벡터화
연산자를 실행하며, 데이터를 컴팩션하고, 복구와 균형 조정에 참여합니다.</p>}
+ title={<>전통적인 <em>FE + BE</em> 클러스터를 살펴봅시다.</>}
+ summary="통합 아키텍처에서는 Frontend 노드가 시스템을 조정하고, Backend 노드가 쿼리를 실행하며
tablet 복제본을 로컬 저장소에 영구 저장합니다."
+ coachTitle="제어와 데이터 처리의 역할이 구분됩니다."
+ coach={<p>FE는 인증, SQL 파싱과 계획 수립, 메타데이터 관리, 조정을 담당합니다. BE는 tablet을 저장하고
벡터화 연산자를 실행하며 데이터를 압축 정리하고 복구와 균형 조정에 참여합니다.</p>}
calloutTitle="고가용성"
- callout={<p>운영 환경에서는 여러 FE 노드와 설정 가능한 수의 태블릿 복제본을 사용합니다. FE 메타데이터 복제에는
BDB JE를 사용하며 ZooKeeper는 필요하지 않습니다.</p>}
+ callout={<p>운영 환경에서는 여러 FE 노드를 사용하고 tablet 복제본 수를 설정할 수 있습니다. FE 메타데이터
복제에는 BDB JE를 사용하며 ZooKeeper는 필요하지 않습니다.</p>}
check={{
question: "분산 쿼리 계획을 만드는 노드는 무엇인가요?",
options: ["Frontend", "Backend"],
correctIndex: 0,
- correctFeedback: "정답입니다. FE는 계획을 세우고 조율하며, BE는 실행하고 데이터를 저장합니다.",
- incorrectFeedback: "BE는 계획 조각을 실행하지만, 계획을 만들고 조율하는 것은 FE입니다.",
+ correctFeedback: "정답입니다. FE는 계획을 세우고 조정하며, BE는 쿼리를 실행하고 데이터를
저장합니다.",
+ incorrectFeedback: "BE는 계획 조각을 실행하지만, 계획을 만들고 조정하는 것은 FE입니다.",
}}
>
<CourseConceptFlow
- ariaLabel="통합 Apache Doris의 요청 처리 흐름"
+ ariaLabel="Apache Doris 통합 아키텍처의 요청 흐름"
focusIndex={1}
items={[
{ title: "SQL 클라이언트", description: "MySQL 프로토콜" },
- { title: "Frontend", description: "파싱 + 계획 수립 + 조율" },
+ { title: "Frontend", description: "파싱 + 계획 수립 + 조정" },
{ title: "Backend", description: "저장 + 실행" },
]}
/>
@@ -151,56 +151,56 @@ import {
<CourseLessonUnit
id="decoupled-architecture"
- label="분리형 아키텍처"
+ label="스토리지와 컴퓨팅 분리 아키텍처"
title={<>스토리지와 컴퓨팅이 <em>분리되면 무엇이 달라질까요</em>?</>}
- summary="상태를 유지하지 않는 컴퓨팅 그룹은 독립적으로 확장할 수 있으며, 영구 데이터는 공유 스토리지에 남습니다."
- coachTitle="탄력적인 확장에는 운영할 계층이 하나 더 필요합니다."
- coach={<p>FE는 요청과 SQL 계층의 메타데이터를 처리하고, Meta Service는 데이터 계층의 메타데이터를
관리합니다. 상태를 유지하지 않는 BE 노드는 자주 사용하는 데이터를 캐시하고 공유 영구 스토리지의 데이터를 대상으로 연산합니다.</p>}
- calloutTitle="운영상 고려 사항"
- callout={<p>공유 스토리지는 안정적이어야 합니다. 캐시에 없는 데이터를 읽으면 지연 시간이 늘어날 수 있으며, 플랫폼
팀은 추가 서비스도 운영해야 합니다.</p>}
+ summary="영구 데이터는 공유 저장소에 두고, 상태를 유지하지 않는 컴퓨팅 그룹은 독립적으로 확장하거나 축소할 수
있습니다."
+ coachTitle="탄력적인 확장에는 운영해야 할 계층이 하나 더 필요합니다."
+ coach={<p>FE는 요청과 SQL 계층의 메타데이터를 처리하고, Meta Service는 데이터 계층의 메타데이터를
관리합니다. 상태를 유지하지 않는 BE 노드는 자주 사용하는 데이터를 캐시하면서 공유 영구 저장소의 데이터를 대상으로 연산합니다.</p>}
+ calloutTitle="운영상의 절충점"
+ callout={<p>공유 저장소는 안정적이어야 합니다. 캐시에 없는 데이터를 읽으면 지연이 늘어날 수 있으며, 플랫폼 팀은
추가 서비스도 운영해야 합니다.</p>}
check={{
- question: "데이터의 영구 복사본은 어디에 저장되나요?",
- options: ["BE 캐시에만 저장됩니다", "공유 스토리지에 저장됩니다"],
+ question: "데이터의 영구 복사본은 어디에 있나요?",
+ options: ["BE 캐시에만 있습니다", "공유 저장소에 있습니다"],
correctIndex: 1,
- correctFeedback: "정답입니다. 컴퓨팅 노드는 데이터를 캐시하고, 공유 스토리지는 영구 복사본을
보관합니다.",
- incorrectFeedback: "BE 캐시는 데이터 접근 속도를 높이지만 영구 스토리지 계층은 아닙니다.",
+ correctFeedback: "정답입니다. 컴퓨팅 노드는 데이터를 캐시하고, 공유 저장소는 영구 복사본을
보관합니다.",
+ incorrectFeedback: "BE 캐시는 데이터 접근 속도를 높이지만 영구 저장 계층은 아닙니다.",
}}
>
<CourseLayerStack
- ariaLabel="분리형 Apache Doris 아키텍처의 계층"
+ ariaLabel="Apache Doris 스토리지와 컴퓨팅 분리 아키텍처의 계층"
items={[
{ title: "SQL 및 메타데이터 계층", description: "FE는 SQL 요청을 처리하고,
Meta Service는 데이터 계층의 메타데이터를 관리합니다." },
{ title: "컴퓨팅 그룹", description: "상태를 유지하지 않는 BE 노드는 작업을 실행하고
자주 사용하는 데이터를 캐시합니다." },
- { title: "공유 스토리지", description: "객체 스토리지나 지원되는 분산 파일 시스템에
데이터를 영구 저장합니다." },
+ { title: "공유 저장소", description: "객체 저장소 또는 지원되는 분산 파일 시스템에
데이터를 영구 저장합니다." },
]}
/>
</CourseLessonUnit>
<CourseLessonUnit
id="choose-architecture"
- label="아키텍처 선택하기"
- title={<>기술이 얼마나 <em>새로운지보다 제약 조건을 먼저 살펴보세요</em>.</>}
- summary="통합형 배포와 컴퓨팅·스토리지 분리형 배포는 서로 다른 운영 환경에 맞춰 최적화됩니다. 어느 아키텍처가 항상
더 나은 것은 아닙니다."
- coachTitle="단순성과 탄력성은 서로 다른 방향의 요구 사항입니다."
- coach={<p>통합형 배포는 보통 시작하기가 더 쉽습니다. 공유 스토리지, 플랫폼 운영 주체, 독립적인 확장 또는 격리된
컴퓨팅 그룹이 실제로 필요하다면 분리형 배포가 적합합니다.</p>}
+ label="아키텍처 선택"
+ title={<>실제 제약 조건에서 출발하세요. 단지 <em>더 새롭다는 이유로 선택하지 마세요</em>.</>}
+ summary="통합형 배포와 분리형 배포는 각각 다른 운영 환경에 최적화되어 있습니다. 어느 아키텍처가 항상 더 나은 것은
아닙니다."
+ coachTitle="단순성과 탄력적 확장성 사이에는 절충이 필요합니다."
+ coach={<p>대체로 통합형 배포가 시작하기 더 쉽습니다. 공유 스토리지, 플랫폼 팀의 운영 책임, 컴퓨팅 자원의 독립적인
확장, 격리된 컴퓨팅 그룹이 실제 요구사항이라면 분리형 배포가 적합합니다.</p>}
calloutTitle="선택 기준"
- callout={<p>더 새롭다는 이유만으로 분리형 아키텍처를 선택하지 마세요. 추가되는 구성 요소가 구체적인 요구 사항을
해결해야 합니다.</p>}
+ callout={<p>단지 더 새로운 방식이라는 이유로 분리형 아키텍처를 선택하지 마세요. 추가되는 구성 요소가 구체적인
제약을 해결해야 합니다.</p>}
check={{
- question: "로컬 디스크를 사용할 수 있고 컴퓨팅과 스토리지를 함께 확장해도 된다면, 어떤 아키텍처로 시작해야
할까요?",
+ question: "로컬 디스크를 사용할 수 있고 컴퓨팅 자원을 스토리지와 함께 확장할 수 있다면, 어떤 아키텍처로
시작해야 할까요?",
options: ["통합형 아키텍처", "분리형 아키텍처"],
correctIndex: 0,
- correctFeedback: "정답입니다. 이런 조건에서는 통합형 아키텍처가 더 간단하고 적합합니다.",
- incorrectFeedback: "컴퓨팅의 독립적인 확장이나 공유 스토리지가 필요할 때 분리형 아키텍처의 이점이
커집니다.",
+ correctFeedback: "정답입니다. 이러한 조건에서는 통합형 아키텍처가 더 단순하고 적합합니다.",
+ incorrectFeedback: "컴퓨팅 자원의 독립적인 탄력적 확장이나 공유 스토리지가 필요할 때 분리형 아키텍처의
가치가 커집니다.",
}}
>
<CourseComparison
ariaLabel="통합형 아키텍처와 분리형 아키텍처 비교"
leftTitle="통합형"
- leftLead="상태를 유지하는 BE 노드가 연산을 수행하고 데이터를 로컬에 영구 저장합니다."
- leftItems={["낮은 운영 복잡도", "로컬 스토리지에 접근", "컴퓨팅과 스토리지를 함께 확장"]}
+ leftLead="상태를 유지하는 BE 노드가 컴퓨팅을 수행하고 데이터를 로컬에 영구 저장합니다."
+ leftItems={["운영 복잡도 감소", "로컬 스토리지 접근", "컴퓨팅과 스토리지를 함께 확장"]}
rightTitle="분리형"
rightLead="상태를 유지하지 않는 컴퓨팅 그룹이 영구 스토리지를 공유합니다."
- rightItems={["독립적인 탄력적 확장", "워크로드별로 격리된 컴퓨팅 그룹", "더 많은 플랫폼 구성 요소에
의존"]}
+ rightItems={["독립적인 탄력적 확장", "워크로드가 격리된 컴퓨팅 그룹", "더 많은 플랫폼 구성 요소에
의존"]}
/>
</CourseLessonUnit>
@@ -208,27 +208,27 @@ import {
id="engine-modules"
label="핵심 엔진 모듈"
title={<>두 엔진이 협력해 <em>작업을 줄이고 처리 속도를 높입니다</em>.</>}
- summary="스토리지 엔진은 데이터와 접근 경로를 구성합니다. 쿼리 엔진은 SQL을 분산된 벡터화 파이프라인으로
변환합니다."
+ summary="스토리지 엔진은 데이터와 접근 경로를 구성합니다. 쿼리 엔진은 SQL을 분산형 벡터화 파이프라인으로
변환합니다."
coachTitle="최적화는 실행 전에 시작됩니다."
coach={<p>정렬 키, 파티션, 인덱스, 테이블 모델은 접근해야 할 데이터의 양을 줄입니다. MPP, 벡터화,
Pipeline 스케줄링, 옵티마이저는 남은 데이터를 처리하는 비용을 줄입니다.</p>}
calloutTitle="MPP와 Pipeline 비교"
- callout={<p>MPP는 노드 간에 작업을 분산합니다. Pipeline 실행은 각 노드 내의 코어에 연산자 작업을
배치합니다.</p>}
+ callout={<p>MPP는 작업을 여러 노드에 분산합니다. Pipeline 실행은 각 노드에서 여러 코어에 걸쳐 연산자
작업을 스케줄링합니다.</p>}
check={{
- question: "BE 노드 간에 작업을 분산하는 방식은 무엇인가요?",
+ question: "여러 BE 노드에 작업을 분산하는 메커니즘은 무엇인가요?",
options: ["MPP", "Pipeline 스케줄링"],
correctIndex: 0,
correctFeedback: "정답입니다. MPP는 노드 수준의 병렬 처리를 제공합니다.",
- incorrectFeedback: "Pipeline은 노드 내부의 작업을 배치하고, MPP는 노드 간에 작업을
분산합니다.",
+ incorrectFeedback: "Pipeline은 노드 내부에서 작업을 스케줄링하고, MPP는 여러 노드에 작업을
분산합니다.",
}}
>
<CourseConceptGrid
ariaLabel="Apache Doris의 핵심 엔진 모듈"
columns={4}
items={[
- { tag: 'COL', title: "컬럼형 저장 방식", description: "필요한 컬럼만 읽고 분석
데이터를 압축합니다." },
- { tag: 'IDX', title: "인덱스", description: "Prefix, Min/Max,
Bloom, 역인덱스를 사용해 스캔 범위를 줄입니다." },
- { tag: 'MPP', title: "분산 처리", description: "쿼리 실행 작업을 Backend
노드에 분산합니다." },
- { tag: 'OPT', title: "옵티마이저", description: "규칙 기반, 비용 기반, 이력
기반 전략을 적용합니다." },
+ { tag: 'COL', title: "열 기반 스토리지", description: "필요한 열을 읽고 분석
데이터를 압축합니다." },
+ { tag: 'IDX', title: "인덱스", description: "Prefix, Min/Max,
Bloom, 역색인은 스캔 범위를 줄입니다." },
+ { tag: 'MPP', title: "분산 처리", description: "여러 Backend 노드에 쿼리
실행을 분산합니다." },
+ { tag: 'OPT', title: "옵티마이저", description: "규칙, 비용, 이력에 기반한
전략을 적용합니다." },
]}
/>
</CourseLessonUnit>
@@ -237,17 +237,17 @@ import {
id="query-execution"
label="쿼리 실행"
title={<>SQL 텍스트가 <em>분산 파이프라인으로 이어지는 과정을 살펴보세요</em>.</>}
- summary="쿼리는 검증과 최적화를 거쳐 프래그먼트와 인스턴스로 나뉩니다. 그런 다음 BE 노드에서 실행되고, 실행 결과가
하나로 합쳐집니다."
+ summary="쿼리는 검증과 최적화를 거쳐 프래그먼트와 인스턴스로 나뉘고, 여러 BE 노드에서 실행된 뒤 하나의 결과로
합쳐집니다."
coachTitle="프래그먼트는 작업을 정의하고, 인스턴스는 그 작업을 수행합니다."
- coach={<p>프래그먼트는 분산 실행 계획의 논리적 부분입니다. 인스턴스는 BE에서 실행되는 프래그먼트의 물리적
복제본입니다. 데이터를 다시 분산해야 할 때는 Exchange 연산자가 인스턴스 간에 행을 이동합니다.</p>}
+ coach={<p>프래그먼트는 분산 실행 계획의 논리적 부분입니다. 인스턴스는 BE에서 실행되는 물리적 복사본입니다. 데이터를
다시 분산해야 할 때 Exchange 연산자가 인스턴스 사이에서 행을 이동합니다.</p>}
calloutTitle="벡터화 실행"
- callout={<p>연산자는 행을 하나씩 처리하는 대신 컬럼을 배치 단위로 처리해 행별 처리 오버헤드를 줄이고 CPU 효율을
높입니다.</p>}
+ callout={<p>연산자는 행을 하나씩 처리하는 대신 열 단위의 배치를 처리합니다. 이를 통해 행마다 발생하는 오버헤드를
줄이고 CPU 효율을 높입니다.</p>}
check={{
- question: "프래그먼트 인스턴스 간에 행을 이동하는 것은 무엇인가요?",
+ question: "프래그먼트 인스턴스 사이에서 행을 이동하는 것은 무엇인가요?",
options: ["Exchange 연산자", "Catalog"],
correctIndex: 0,
- correctFeedback: "정답입니다. 실행 계획에서 데이터 재분산이 필요하면 Exchange가 행을
전달합니다.",
- incorrectFeedback: "Catalog는 데이터 소스를 식별하고, Exchange는 분산 실행 계획의
인스턴스를 연결합니다.",
+ correctFeedback: "정답입니다. 실행 계획에서 데이터를 다시 분산해야 할 때 Exchange가 행을
전송합니다.",
+ incorrectFeedback: "Catalog는 데이터 소스를 식별하고, Exchange는 분산 실행 계획의
인스턴스들을 연결합니다.",
}}
>
<CourseConceptFlow
@@ -255,39 +255,39 @@ import {
focusIndex={2}
items={[
{ title: "파싱", description: "SQL 검증" },
- { title: "계획 수립", description: "재작성 + 비용 평가" },
- { title: "프래그먼트 분할", description: "분산 작업 분할" },
+ { title: "계획 수립", description: "재작성 + 비용 추정" },
+ { title: "프래그먼트", description: "분산 작업 분할" },
{ title: "실행", description: "벡터화 파이프라인 실행" },
- { title: "결과 반환", description: "결과 결합" },
+ { title: "반환", description: "결과 취합" },
]}
/>
</CourseLessonUnit>
<CourseLessonUnit
id="optimization-recap"
- label="최적화와 핵심 내용 복습"
- title={<>가장 빨리 끝나는 작업은 Doris가 <em>하지 않아도 되는 작업입니다</em>.</>}
+ label="최적화와 요약"
+ title={<>가장 빠른 작업은 Doris가 <em>생략할 수 있는 작업입니다</em>.</>}
summary="Doris는 사전 계산, 논리적 재작성, 통계 기반 계획 수립, 런타임 필터링을 결합해 실행 전과 실행 중에
처리할 데이터의 양을 줄입니다."
coachTitle="최적화는 여러 단계에서 이루어집니다."
- coach={<p>구체화된 뷰는 반복 계산을 대신할 수 있고, RBO는 실행 계획을 단순화하며, CBO는 예상 비용을
비교합니다. 런타임 필터는 조인 중에 불필요한 행을 조기에 제외합니다.</p>}
- calloutTitle="다음 강의로 넘어가기 전에"
+ coach={<p>구체화된 뷰는 반복 계산을 대체할 수 있고, RBO는 실행 계획을 단순화하며, CBO는 추정 비용을
비교합니다. 런타임 필터는 조인 중에 행을 일찍 걸러냅니다.</p>}
+ calloutTitle="다음 학습으로 넘어가기 전에"
callout={<p>데이터 구성 계층, FE와 BE의 역할 구분, 두 가지 아키텍처 선택지, 계획 수립부터 분산 실행까지의
흐름을 기억하세요.</p>}
check={{
- question: "CBO가 여러 실행 계획을 정확하게 비교하는 데 도움이 되는 것은 무엇인가요?",
- options: ["데이터를 잘 대표하는 테이블 및 컬럼 통계", "더 많은 SQL 주석"],
+ question: "CBO가 대안 실행 계획을 정확하게 비교하는 데 도움이 되는 것은 무엇인가요?",
+ options: ["대표성 있는 테이블 및 열 통계 정보", "더 많은 SQL 주석"],
correctIndex: 0,
- correctFeedback: "정답입니다. 최신 통계는 카디널리티와 비용 추정의 정확도를 높입니다.",
- incorrectFeedback: "주석은 사람이 SQL을 이해하는 데 도움이 되지만, CBO에는 데이터를 잘 대표하는
통계가 필요합니다.",
+ correctFeedback: "정답입니다. 최신 통계 정보는 카디널리티와 비용 추정의 정확도를 높입니다.",
+ incorrectFeedback: "주석은 사람이 SQL을 이해하는 데 도움이 되지만, CBO에는 대표성 있는 통계
정보가 필요합니다.",
}}
>
<CourseConceptGrid
- ariaLabel="Apache Doris 쿼리 최적화 계층"
+ ariaLabel="Apache Doris의 쿼리 최적화 계층"
columns={4}
items={[
- { tag: 'MV', title: "구체화된 뷰", description: "쿼리 재작성을 통해 미리 계산된
결과를 재사용합니다." },
- { tag: 'RBO', title: "규칙 기반", description: "정해진 규칙에 따라 논리적 변환을
적용합니다." },
- { tag: 'CBO', title: "비용 기반", description: "통계를 사용해 물리적 실행 계획을
비교합니다." },
- { tag: 'RF', title: "런타임 필터", description: "필터를 스캔 단계에 가깝게 적용해
불필요한 행을 조기에 제외합니다." },
+ { tag: 'MV', title: "구체화된 뷰", description: "쿼리 재작성을 통해 사전 계산된
결과를 재사용합니다." },
+ { tag: 'RBO', title: "규칙 기반", description: "결정적인 논리 변환을
적용합니다." },
+ { tag: 'CBO', title: "비용 기반", description: "통계 정보를 사용해 물리 실행
계획을 비교합니다." },
+ { tag: 'RF', title: "런타임 필터", description: "필터를 스캔 단계로 밀어 넣어
행을 일찍 걸러냅니다." },
]}
/>
</CourseLessonUnit>
diff --git
a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/04-apache-doris-data-operations-guide.mdx
b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/04-apache-doris-data-operations-guide.mdx
index 5d6926b56b04..763884cb8a8e 100644
---
a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/04-apache-doris-data-operations-guide.mdx
+++
b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/04-apache-doris-data-operations-guide.mdx
@@ -1,6 +1,6 @@
---
title: Apache Doris 데이터 작업 가이드
-description: 7개의 단계별 워크플로 단원을 통해 Apache Doris에서 데이터 적재, 업데이트, 삭제, 내보내기 방법을
선택하는 법을 알아봅니다.
+description: 일곱 개의 단계별 학습 단위를 통해 Apache Doris의 데이터 적재, 업데이트, 삭제, 내보내기 방법을 선택하는
법을 알아봅니다.
slug: /101/04-apache-doris-data-operations-guide
sidebar_position: 4
keywords:
@@ -33,29 +33,29 @@ import {
<CourseLessonUnit
id="data-lifecycle"
label="작업 개요"
- title={<>작업을 선택할 때 고려할 것은 <em>데이터 수명 주기입니다</em>.</>}
- summary="데이터 적재, 업데이트, 삭제, 내보내기에는 각각 정확성과 처리량에 관한 제약이 있습니다. 원하는 데이터
상태의 변화부터 파악하세요."
- coachTitle="워크로드에 맞춰 방법을 선택하세요."
- coach={<p>명령이나 API를 선택하기 전에 소스 위치, 배치 크기, 목표 지연 시간, 재시도 방식, 테이블의 동작
방식, 출력 대상을 파악하세요.</p>}
- calloutTitle="원자성부터 확인하세요"
- callout={<p>재시도할 때 데이터가 모르는 사이에 중복되거나 일부만 반영되지 않도록 각 데이터 적재 방법의 트랜잭션
경계와 레이블 동작을 이해하세요.</p>}
+ title={<>작업을 선택할 때는 <em>데이터 수명 주기를 기준으로 하세요</em>.</>}
+ summary="데이터 적재, 업데이트, 삭제, 내보내기는 정확성과 처리량에 관한 제약이 서로 다릅니다. 원하는 데이터 상태
변화부터 명확히 하세요."
+ coachTitle="작업 부하에 맞춰 방법을 선택하세요."
+ coach={<p>명령이나 API를 선택하기 전에 데이터 소스의 위치, 배치 크기, 목표 지연 시간, 재시도 방식, 테이블
모델의 의미 체계, 출력 대상을 확인하세요.</p>}
+ calloutTitle="원자성을 먼저 고려하세요"
+ callout={<p>재시도할 때 데이터가 조용히 중복되거나 일부만 반영되지 않도록 각 데이터 적재 방법의 트랜잭션 경계와
레이블 동작을 이해하세요.</p>}
check={{
question: "데이터 적재 방법을 선택하기 전에 무엇을 정의해야 하나요?",
- options: ["소스, 데이터 양, 지연 시간, 재시도 요구사항", "임의의 API 엔드포인트"],
+ options: ["데이터 소스, 데이터 양, 지연 시간, 재시도 요구 사항", "임의의 API 엔드포인트"],
correctIndex: 0,
- correctFeedback: "정답입니다. 워크로드의 제약에 따라 적절한 작업이 결정됩니다.",
- incorrectFeedback: "엔드포인트는 구현 세부 사항이지 워크로드의 정의가 아닙니다.",
+ correctFeedback: "정답입니다. 작업 부하의 제약에 따라 적절한 작업이 결정됩니다.",
+ incorrectFeedback: "엔드포인트는 구현 세부 사항이며, 작업 부하를 정의하지는 않습니다.",
}}
>
<CourseConceptFlow
ariaLabel="Apache Doris 데이터 작업 수명 주기"
focusIndex={0}
items={[
- { title: "적재", description: "데이터 가져오기" },
+ { title: "데이터 적재", description: "데이터 가져오기" },
{ title: "업데이트", description: "논리적 행 변경" },
{ title: "삭제", description: "지정된 범위의 데이터 제거" },
{ title: "내보내기", description: "결과 내보내기" },
- { title: "관찰", description: "모든 작업 확인" },
+ { title: "모니터링", description: "모든 작업 검증" },
]}
/>
</CourseLessonUnit>
@@ -63,17 +63,17 @@ import {
<CourseLessonUnit
id="choose-load-method"
label="데이터 적재 방법 선택"
- title={<>소스와 지연 시간에 맞는 <em>데이터 적재 경로를 선택하세요</em>.</>}
- summary="Doris는 동기식 HTTP 적재, 지속적인 Kafka 수집, SQL 기반 수집, 비동기 배치 워크플로를
지원합니다."
- coachTitle="요구사항을 충족하는 가장 구체적인 방법을 선택하세요."
- coach={<p>파일이나 HTTP 스트림에는 Stream Load를, 관리형 Kafka 데이터 수집에는 Routine
Load를, SQL 변환과 외부 소스에는 INSERT INTO SELECT를, 빈번한 소규모 쓰기에는 Group Commit을
사용하세요.</p>}
+ title={<>데이터 소스와 지연 시간에 맞는 <em>데이터 적재 경로를 선택하세요</em>.</>}
+ summary="Doris는 동기식 HTTP 데이터 적재, 지속적인 Kafka 데이터 수집, SQL 기반 데이터 수집, 비동기
배치 작업 흐름을 지원합니다."
+ coachTitle="요구 사항에 맞는 가장 구체적인 방법을 우선 선택하세요."
+ coach={<p>파일이나 HTTP 스트림에는 Stream Load, 관리형 Kafka 소비에는 Routine Load,
SQL 변환과 외부 소스에는 INSERT INTO SELECT, 빈번한 소규모 쓰기에는 Group Commit을 사용하세요.</p>}
calloutTitle="기존 배치 방식"
- callout={<p>객체 스토리지나 HDFS에는 적용 가능한 경우 현재의 Catalog 또는 테이블 값 함수 기반 워크플로를
우선 사용하세요. Broker Load는 기존 방식으로 취급하고 버전별 지침을 확인하세요.</p>}
+ callout={<p>객체 스토리지나 HDFS에는 적용 가능한 경우 현재 권장되는 Catalog 또는 테이블 값 함수 작업
흐름을 우선 사용하세요. Broker Load는 기존 방식으로 취급하고 버전별 지침을 확인하세요.</p>}
check={{
- question: "Kafka 데이터를 지속적으로 수집할 때 적합한 방법은 무엇인가요?",
+ question: "지속적인 Kafka 데이터 수집에 적합한 방법은 무엇인가요?",
options: ["Routine Load", "TRUNCATE TABLE"],
correctIndex: 0,
- correctFeedback: "정답입니다. Routine Load는 장시간 실행되는 Kafka 데이터 수집 작업을
관리합니다.",
+ correctFeedback: "정답입니다. Routine Load는 장시간 실행되는 Kafka 소비 작업을
관리합니다.",
incorrectFeedback: "TRUNCATE는 데이터를 제거하며 스트림을 수집하지 않습니다.",
}}
>
@@ -81,11 +81,11 @@ import {
ariaLabel="Apache Doris 데이터 적재 방법 개요"
columns={3}
items={[
- { tag: 'HTTP', title: "Stream Load", description: "작업 결과를 즉시
확인할 수 있는 동기식 파일 또는 스트림 적재." },
- { tag: 'KFK', title: "Routine Load", description: "진행 상태가 관리되는
지속적인 Kafka 데이터 수집." },
- { tag: 'SQL', title: "INSERT SELECT", description: "테이블,
Catalog 또는 파일 TVF의 데이터를 변환하고 적재합니다." },
- { tag: 'JDBC', title: "INSERT VALUES", description: "대량 처리량보다
간편함이 중요한 소규모 SQL 쓰기." },
- { tag: 'GC', title: "Group Commit", description: "자주 발생하는 소규모
쓰기를 묶어 효율적으로 커밋합니다." },
+ { tag: 'HTTP', title: "Stream Load", description: "파일이나 스트림을
동기식으로 적재하고 작업 결과를 즉시 받습니다." },
+ { tag: 'KFK', title: "Routine Load", description: "진행 상태를
관리하면서 Kafka 데이터를 지속적으로 소비합니다." },
+ { tag: 'SQL', title: "INSERT SELECT", description: "테이블,
Catalog 또는 파일 TVF의 데이터를 변환해 적재합니다." },
+ { tag: 'JDBC', title: "INSERT VALUES", description: "대량 처리량보다
간편함이 중요한 소규모 SQL 쓰기에 적합합니다." },
+ { tag: 'GC', title: "Group Commit", description: "빈번한 소규모 쓰기를
효율적인 커밋으로 묶습니다." },
{ tag: 'ASYNC', title: "배치 작업", description: "규모가 큰 비동기 작업을
레이블과 상태로 추적합니다." },
]}
/>
@@ -94,28 +94,28 @@ import {
<CourseLessonUnit
id="reliable-loading"
label="안정적인 데이터 적재"
- title={<>모든 데이터 적재를 <em>관찰하고 재시도할 수 있게 설계하세요</em>.</>}
- summary="레이블, 품질 임계값, 오류 샘플, 작업 상태, 소스 오프셋을 활용하면 데이터 수집을 단순한 요청에서 관리
가능한 워크플로로 바꿀 수 있습니다."
- coachTitle="작업을 제출했다고 성공한 것은 아닙니다."
- coach={<p>지원되는 경우 일관된 레이블을 지정하고, 수용되거나 필터링된 행 수를 확인하고, 소스 체크포인트를 보관하고,
일시 중지되거나 실패한 작업에 알림을 설정하세요. 형식, 열 매핑, 필터 설정을 명시하세요.</p>}
+ title={<>모든 데이터 적재 작업을 <em>모니터링하고 재시도할 수 있도록 설계하세요</em>.</>}
+ summary="레이블, 품질 임계값, 오류 샘플, 작업 상태, 소스 오프셋을 활용하면 데이터 수집을 단순한 요청이 아닌 관리
가능한 작업 흐름으로 만들 수 있습니다."
+ coachTitle="작업을 제출했다고 해서 성공한 것은 아닙니다."
+ coach={<p>지원되는 경우 일관된 레이블을 지정하고, 수락된 행과 필터링된 행의 수를 확인하고, 데이터 소스 체크포인트를
보관하고, 작업이 일시 중지되거나 실패하면 알림을 보내세요. 데이터 형식, 열 매핑, 필터 설정을 명시하세요.</p>}
calloutTitle="데이터 품질"
- callout={<p>필터 허용치를 목적에 맞게 설정하세요. 임계값이 너무 높으면 형식이 잘못된 입력을 놓칠 수 있고, 너무
낮으면 복구 가능한 배치도 중단될 수 있습니다.</p>}
+ callout={<p>필터 허용치를 의도에 맞게 설정하세요. 임계값이 너무 높으면 형식이 잘못된 입력을 놓칠 수 있고, 너무
낮으면 복구 가능한 배치도 중단될 수 있습니다.</p>}
check={{
question: "데이터 적재를 더 안전하게 재시도하려면 무엇이 필요한가요?",
- options: ["일관된 작업 레이블과 기록된 소스 위치", "재시도할 때마다 스키마 변경"],
+ options: ["일관된 작업 레이블과 기록된 데이터 소스 위치", "재시도할 때마다 스키마 변경"],
correctIndex: 0,
correctFeedback: "정답입니다. 작업 식별 정보와 체크포인트는 중복 작업을 감지하거나 방지하는 데 도움이
됩니다.",
- incorrectFeedback: "계획하지 않은 스키마 변경은 재시도 결과를 파악하기 어렵게 만듭니다.",
+ incorrectFeedback: "계획에 없는 스키마 변경은 재시도 동작을 파악하기 어렵게 만듭니다.",
}}
>
<CourseConceptFlow
- ariaLabel="안정적인 Apache Doris 데이터 적재 워크플로"
+ ariaLabel="안정적인 Apache Doris 데이터 적재 작업 흐름"
focusIndex={2}
items={[
{ title: "정의", description: "형식 + 매핑" },
- { title: "식별", description: "레이블 + 소스 범위" },
+ { title: "식별", description: "레이블 + 데이터 소스 범위" },
{ title: "제출", description: "원자적 트랜잭션" },
- { title: "관찰", description: "행 + 오류 + 상태" },
+ { title: "모니터링", description: "행 수 + 오류 + 상태" },
{ title: "재시도", description: "신중하게 재개" },
]}
/>
@@ -124,55 +124,55 @@ import {
<CourseLessonUnit
id="update-data"
label="업데이트"
- title={<>테이블 모델에 따라 <em>업데이트 동작을 정의하세요</em>.</>}
- summary="Unique Key 테이블은 UPSERT 동작과 SQL UPDATE를 지원하고, Aggregate Key
테이블은 선언된 집계 함수를 통해 업데이트됩니다."
- coachTitle="전체 행 업데이트와 부분 업데이트는 비용이 다릅니다."
- coach={<p>전체 행 UPSERT는 완전한 논리적 행을 제공합니다. 일부 열만 업데이트하면 열이 많은 레코드에서 제공할
필드가 줄어들지만, 지원되는 테이블 및 데이터 적재 설정이 필요하고 읽기나 병합 비용이 추가될 수 있습니다.</p>}
- calloutTitle="스키마 계약"
- callout={<p>전체 행 UPSERT에서 생략한 값은 기본값이나 NULL이 될 수 있습니다. 의도한 동작과 테이블 구현이
지원할 때만 일부 열 업데이트 모드를 사용하세요.</p>}
+ title={<>테이블 모델에 따라 <em>업데이트 의미 체계를 정의하세요</em>.</>}
+ summary="Unique Key 테이블은 UPSERT 동작과 SQL UPDATE를 지원하고, Aggregate Key
테이블은 선언된 집계 함수를 통해 업데이트합니다."
+ coachTitle="전체 행 업데이트와 일부 열 업데이트는 비용이 다릅니다."
+ coach={<p>전체 행 UPSERT는 완전한 논리적 행을 제공합니다. 일부 열 업데이트는 열이 많은 레코드에서 전달할 필드
수를 줄이지만, 테이블과 데이터 적재 설정이 이를 지원해야 하며 읽기 또는 병합 오버헤드가 추가될 수 있습니다.</p>}
+ calloutTitle="스키마 규약"
+ callout={<p>전체 행 UPSERT에서 생략한 값은 기본값이나 NULL이 될 수 있습니다. 의도한 의미 체계와 테이블
구현이 모두 지원하는 경우에만 일부 열 모드를 사용하세요.</p>}
check={{
- question: "최신 상태의 CDC 행을 자연스럽게 표현하는 모델은 무엇인가요?",
+ question: "CDC 행의 최신 상태를 자연스럽게 표현하는 모델은 무엇인가요?",
options: ["Unique Key", "Duplicate Key"],
correctIndex: 0,
- correctFeedback: "정답입니다. Unique Key는 키를 기준으로 UPSERT 동작을 적용합니다.",
+ correctFeedback: "정답입니다. Unique Key는 키를 기준으로 UPSERT 의미 체계를 적용합니다.",
incorrectFeedback: "Duplicate Key는 현재의 논리적 행 하나만 유지하는 대신 모든 버전을
보관합니다.",
}}
>
<CourseComparison
ariaLabel="전체 행 업데이트와 일부 열 업데이트"
leftTitle="전체 행 UPSERT"
- leftLead="완전한 새 논리적 행을 씁니다."
- leftItems={["더 단순한 동작", "기본 방식에서 가장 높은 처리량", "생략한 값에 주의 필요"]}
+ leftLead="새 논리적 행 전체를 씁니다."
+ leftItems={["더 단순한 의미 체계", "기본 방식에서 가장 높은 처리량", "생략한 값에 주의 필요"]}
rightTitle="일부 열 업데이트"
rightLead="열이 많은 행에서 선택한 필드만 씁니다."
- rightItems={["클라이언트가 보내는 데이터 양 감소", "지원되는 모드 필요", "추가 병합 비용"]}
+ rightItems={["클라이언트가 전송하는 데이터 감소", "지원되는 모드 필요", "추가 병합 오버헤드"]}
/>
</CourseLessonUnit>
<CourseLessonUnit
id="delete-data"
label="삭제"
- title={<>가장 좁으면서 안전한 <em>삭제 범위를 선택하세요</em>.</>}
- summary="Predicate DELETE는 지원되는 행 필터를 처리하고, 데이터 적재 시 삭제 표시는 배치를 처리하며,
TRUNCATE는 테이블이나 파티션을 빠르게 비웁니다."
- coachTitle="범위에 따라 속도와 위험이 모두 달라집니다."
- coach={<p>조건식은 모델별 제약 범위 안에서만 사용하세요. 키 집합이 크다면 통제된 배치를 통해 삭제 표시를
수집하세요. 파티션이나 테이블의 전체 데이터를 제거하려는 경우에만 해당 범위를 비우세요.</p>}
+ title={<>안전한 범위 내에서 가장 좁은 <em>삭제 범위를 선택하세요</em>.</>}
+ summary="조건부 DELETE는 지원되는 행 필터를 처리하고, 데이터 적재 시 사용하는 삭제 표시는 배치 삭제를
처리하며, TRUNCATE는 테이블이나 파티션을 빠르게 비웁니다."
+ coachTitle="삭제 범위에 따라 속도와 위험이 모두 달라집니다."
+ coach={<p>조건식을 사용할 때는 테이블 모델별 제한을 지키세요. 키가 많다면 통제된 배치로 삭제 표시를 적재하세요.
파티션이나 테이블 전체를 제거해야 할 때만 해당 범위를 비우세요.</p>}
calloutTitle="복구 가능성"
- callout={<p>대상 버전에서 휴지통 복구가 가능한지 확인하고, 영구 삭제가 명시적으로 필요한 경우가 아니라면 FORCE
작업을 피하세요.</p>}
+ callout={<p>대상 버전에서 휴지통 복구가 가능한지 확인하고, 영구 삭제가 명시적으로 필요한 경우가 아니면 FORCE
작업을 피하세요.</p>}
check={{
- question: "오래된 시간 파티션 전체를 제거할 때 적합한 작업은 무엇인가요?",
- options: ["TRUNCATE 또는 파티션 삭제", "관련 없는 값 열 업데이트"],
+ question: "오래된 시간 분할 영역 전체를 제거하려면 어떤 작업이 적합할까요?",
+ options: ["TRUNCATE를 사용하거나 해당 분할 영역 삭제", "관련 없는 값 열 업데이트"],
correctIndex: 0,
- correctFeedback: "맞습니다. 파티션 단위 삭제가 제거하려는 범위에 맞는 직접적인 방법입니다.",
- incorrectFeedback: "값을 업데이트해도 파티션은 제거되지 않습니다.",
+ correctFeedback: "정답입니다. 분할 영역 단위로 제거하면 원하는 범위의 데이터를 직접 삭제할 수
있습니다.",
+ incorrectFeedback: "값을 업데이트해도 분할 영역은 제거되지 않습니다.",
}}
>
<CourseConceptGrid
- ariaLabel="Apache Doris 삭제 방법"
+ ariaLabel="Apache Doris 데이터 삭제 방법"
columns={3}
items={[
- { tag: 'WHERE', title: "조건부 DELETE", description: "범위가 정해진 조건에
일치하는 행을 지원 범위 내에서 삭제합니다." },
- { tag: 'BATCH', title: "삭제 표시 데이터 적재", description: "데이터 적재를
통해 키로 지정한 대량의 삭제를 적용합니다." },
- { tag: 'ALL', title: "TRUNCATE", description: "행을 필터링하지 않고
테이블이나 파티션 전체를 비웁니다." },
+ { tag: 'WHERE', title: "조건부 DELETE", description: "지원되는 조건으로
범위를 지정해 일치하는 행을 삭제합니다." },
+ { tag: 'BATCH', title: "삭제 표시 데이터 적재", description: "데이터 적재를
통해 키를 기준으로 대량의 삭제 작업을 적용합니다." },
+ { tag: 'ALL', title: "TRUNCATE", description: "행별 필터링 없이 테이블이나
분할 영역 전체를 비웁니다." },
]}
/>
</CourseLessonUnit>
@@ -180,27 +180,27 @@ import {
<CourseLessonUnit
id="export-data"
label="데이터 내보내기"
- title={<>출력 형태를 <em>데이터 사용 대상에 맞추세요.</em>.</>}
- summary="SELECT INTO OUTFILE은 변환된 쿼리 결과를 내보내고, EXPORT는 규모가 큰 비동기 추출
작업을 실행하며, mysqldump는 스키마나 소규모 논리 데이터셋을 추출합니다."
- coachTitle="형식과 저장 위치도 데이터 전달 규약의 일부입니다."
- coach={<p>분석 시스템에는 Parquet 또는 ORC를, 폭넓은 호환성이 필요할 때는 CSV를 선택하고, 객체
스토리지나 HDFS에는 안전하게 관리되는 자격 증명을 사용하세요. 데이터를 읽을 후속 시스템에 맞춰 파일 수와 병렬 처리 수준을
계획하세요.</p>}
+ title={<>출력 형식을 <em>데이터 사용 주체에 맞추세요</em>.</>}
+ summary="SELECT INTO OUTFILE은 변환된 쿼리 결과를 내보내고, EXPORT는 더 큰 규모의 비동기 추출
작업을 실행하며, mysqldump는 스키마나 소규모 논리 데이터셋을 추출합니다."
+ coachTitle="형식과 저장 위치도 데이터 처리 요구 사항의 일부입니다."
+ coach={<p>분석 시스템에는 Parquet 또는 ORC를, 폭넓은 호환성이 필요하면 CSV를 선택하세요. 객체 스토리지나
HDFS에 접근할 때는 자격 증명을 안전하게 관리하세요. 후속 시스템의 읽기 방식을 고려해 파일 수와 병렬 처리 수준을 계획하세요.</p>}
calloutTitle="동기식과 비동기식"
- callout={<p>OUTFILE은 유연하며 쿼리와 연결됩니다. 규모가 큰 백그라운드 작업은 EXPORT로 추적하기가 더
쉽습니다. 어느 쪽도 검증된 백업 및 복구 전략을 대체하지는 못합니다.</p>}
+ callout={<p>OUTFILE은 쿼리와 연결되어 있어 유연하게 사용할 수 있습니다. EXPORT는 규모가 큰 백그라운드
작업을 추적하기에 더 편리합니다. 어느 쪽도 검증된 백업 및 복구 전략을 대체하지는 못합니다.</p>}
check={{
- question: "내보낼 결과에 SQL 변환을 적용할 수 있는 방법은 무엇인가요?",
+ question: "내보낼 결과에 SQL 변환을 적용할 수 있는 방법은 무엇일까요?",
options: ["SELECT INTO OUTFILE", "SHOW BACKENDS"],
correctIndex: 0,
- correctFeedback: "맞습니다. OUTFILE이 기록하기 전에 SELECT로 데이터의 형태를 만들 수
있습니다.",
- incorrectFeedback: "SHOW BACKENDS는 클러스터 구성 정보를 보여주며, 데이터 내보내기 방법이
아닙니다.",
+ correctFeedback: "정답입니다. SELECT가 데이터의 형태를 결정한 뒤 OUTFILE이 이를
기록합니다.",
+ incorrectFeedback: "SHOW BACKENDS는 클러스터 구성원을 보여주는 명령으로, 데이터 내보내기
방법이 아닙니다.",
}}
>
<CourseConceptGrid
ariaLabel="Apache Doris 데이터 내보내기 방법"
columns={3}
items={[
- { tag: 'SQL', title: "SELECT OUTFILE", description: "변환 가능한
결과를 CSV, Parquet 또는 ORC 형식으로 동기식으로 내보냅니다." },
- { tag: 'JOB', title: "EXPORT", description: "규모가 큰 테이블이나 파티션을
대상으로 비동기 추출을 수행합니다." },
- { tag: 'DDL', title: "mysqldump", description: "MySQL 도구를 사용해
스키마를 내보내거나 소규모 논리 백업을 만듭니다." },
+ { tag: 'SQL', title: "SELECT OUTFILE", description: "변환 가능한
결과를 CSV, Parquet 또는 ORC 형식으로 동기식 내보내기를 수행합니다." },
+ { tag: 'JOB', title: "EXPORT", description: "더 큰 범위의 테이블이나 분할
영역에서 데이터를 비동기식으로 추출합니다." },
+ { tag: 'DDL', title: "mysqldump", description: "MySQL 도구를 사용해
스키마를 내보내고 소규모 논리 백업을 만듭니다." },
]}
/>
</CourseLessonUnit>
@@ -208,29 +208,29 @@ import {
<CourseLessonUnit
id="operations-recap"
label="데이터 작업 요약"
- title={<>데이터 이동을 <em>제어된 상태 전환으로 다루세요.</em>.</>}
- summary="신뢰할 수 있는 작업에는 명확한 범위, 정합성 보장 경계, 관찰 가능한 결과, 재시도 전략, 후속 검증이
필요합니다."
- coachTitle="정상 실행 경로는 설계의 절반에 불과합니다."
- coach={<p>담당자, 자격 증명, 레이블, 소스 위치, 품질 정책, 알림, 정리 방식을 기록하세요. 부분 실패 상황에
대비해 연습하고, 완료 후 행 수나 비즈니스 수준의 불변 조건을 검증하세요.</p>}
- calloutTitle="다음 강의에 앞서"
- callout={<p>신뢰할 수 있는 데이터가 준비되었다면, 다음 모듈에서는 분석을 표현하고 Doris가 효율적으로 실행할 수
있는 쿼리 구조를 선택하는 방법을 다룹니다.</p>}
+ title={<>데이터 이동을 <em>제어된 상태 전환으로 다루세요</em>.</>}
+ summary="안정적인 작업에는 명확한 범위, 정확성이 보장되는 경계, 확인 가능한 결과, 재시도 전략, 후속 검증이
필요합니다."
+ coachTitle="정상적으로 실행되는 경우만 고려해서는 설계가 완성되지 않습니다."
+ coach={<p>담당자, 자격 증명, 레이블, 데이터 원본 위치, 품질 정책, 알림, 정리 방식을 기록하세요. 부분 실패
상황을 연습하고, 작업이 끝나면 행 수나 비즈니스 수준의 불변 조건을 확인하세요.</p>}
+ calloutTitle="다음 강의를 시작하기 전에"
+ callout={<p>신뢰할 수 있는 데이터가 준비되었다면, 다음 모듈에서는 분석 요구를 표현하고 Doris가 효율적으로
실행할 수 있는 쿼리 구조를 선택하는 방법을 다룹니다.</p>}
check={{
- question: "작업이 성공한 후에는 무엇으로 절차를 마무리해야 하나요?",
- options: ["예상한 데이터 상태 검증", "모든 작업 메타데이터 즉시 폐기"],
+ question: "작업이 성공한 뒤 절차를 마무리하려면 무엇을 해야 할까요?",
+ options: ["데이터가 예상한 상태인지 확인", "모든 작업 메타데이터를 즉시 삭제"],
correctIndex: 0,
- correctFeedback: "맞습니다. 결과로 생성된 행, 파티션 또는 파일이 의도한 상태와 일치하는지
확인하세요.",
+ correctFeedback: "정답입니다. 결과로 생성된 행, 분할 영역 또는 파일이 의도한 상태와 일치하는지
확인하세요.",
incorrectFeedback: "작업 메타데이터는 감사와 문제 진단에 유용한 근거입니다.",
}}
>
<CourseConceptFlow
- ariaLabel="Apache Doris 작업 관리 절차"
+ ariaLabel="Apache Doris 데이터 작업 관리 절차"
focusIndex={4}
items={[
- { title: "범위", description: "상태 변경 정의" },
+ { title: "범위 지정", description: "변경할 데이터 상태 정의" },
{ title: "실행", description: "적합한 방법 사용" },
{ title: "모니터링", description: "상태 + 품질 추적" },
- { title: "복구", description: "재시도 또는 보정" },
- { title: "검증", description: "결과 입증" },
+ { title: "복구", description: "재시도 또는 보완 조치" },
+ { title: "검증", description: "결과 확인" },
]}
/>
</CourseLessonUnit>
diff --git
a/translations/state/ko/pages/course/current/101/apache-doris-data-operations-guide.json
b/translations/state/ko/pages/course/current/101/apache-doris-data-operations-guide.json
index 1e3c3d5c4a76..a69eaa483129 100644
---
a/translations/state/ko/pages/course/current/101/apache-doris-data-operations-guide.json
+++
b/translations/state/ko/pages/course/current/101/apache-doris-data-operations-guide.json
@@ -8,13 +8,23 @@
"sourceLocale": "en",
"sourcePath": "course/101/04-apache-doris-data-operations-guide.mdx",
"targetPath":
"i18n/ko/docusaurus-plugin-content-docs-course/current/101/04-apache-doris-data-operations-guide.mdx",
- "sourceCommit": "b260cd3d3f68f6e64faf12da4415e0df977e571a",
+ "sourceCommit": "38d51ed68f58649235d42916d51398dc7dab6934",
"sourceHash":
"dba85eb86436c4121708351d23e5737b03701c3ee9415a4bb9b5a3449a8a33fd",
"sourceTechnicalHash":
"bab25688682f4666e72b084675b66e4a265ca54dc9612e89f9bf91333eaf8653",
- "targetHash":
"66feefc728d6c6df390694ba560701673581856ca14cc978c133bd5146e2556d",
+ "targetHash":
"69754dc8c0324b9d1b911bafd70995061d9550b3c3b24abd09c351c4c0c41221",
"reviewStatus": "machine",
"ownership": "machine",
- "translatedAt": "2026-10-25T05:17:45.753Z",
- "glossaryVersion": "1"
+ "translatedAt": "2026-10-28T19:38:44.959Z",
+ "glossaryVersion": "1",
+ "sourceRevisions": {
+ "en": {
+ "path": "course/101/04-apache-doris-data-operations-guide.mdx",
+ "blob": "1b38b0a1aafd813d5bc02833393c6515618fa6ae"
+ },
+ "zh-CN": {
+ "path":
"i18n/zh-CN/docusaurus-plugin-content-docs-course/current/101/04-apache-doris-data-operations-guide.mdx",
+ "blob": "5ad6ef82c9b2f2927bab3c1bec0f31e7c54946c6"
+ }
+ }
}
}
diff --git
a/translations/state/ko/pages/course/current/101/apache-doris-overview.json
b/translations/state/ko/pages/course/current/101/apache-doris-overview.json
index 19a6197c7480..2ec860371818 100644
--- a/translations/state/ko/pages/course/current/101/apache-doris-overview.json
+++ b/translations/state/ko/pages/course/current/101/apache-doris-overview.json
@@ -8,13 +8,23 @@
"sourceLocale": "en",
"sourcePath": "course/101/01-apache-doris-overview.mdx",
"targetPath":
"i18n/ko/docusaurus-plugin-content-docs-course/current/101/01-apache-doris-overview.mdx",
- "sourceCommit": "6cda2dc3be8a96374d29b14b1162c8c3bdae9138",
+ "sourceCommit": "38d51ed68f58649235d42916d51398dc7dab6934",
"sourceHash":
"2d17e48d80fdb26f103a42b2eb331cdca70e5162cca95a151e83bdc33edc076e",
"sourceTechnicalHash":
"726b7fd50f03dfb6ba2d4a9f463ab2fc4a8f393d2714e022be9aa91079e907e8",
- "targetHash":
"aa456a3da306fc34e6cbcdddfc34f9f6390930d346d2dd3d025bfda88ff9eb93",
+ "targetHash":
"36ef303e6d7f168c7f34fb8fff82879a6aff5350191823443203e3f3c5e74533",
"reviewStatus": "machine",
"ownership": "machine",
- "translatedAt": "2026-10-25T17:25:54.074Z",
- "glossaryVersion": "1"
+ "translatedAt": "2026-10-28T19:33:14.582Z",
+ "glossaryVersion": "1",
+ "sourceRevisions": {
+ "en": {
+ "path": "course/101/01-apache-doris-overview.mdx",
+ "blob": "fe09967e83eb12182b0dc12ab91e5219cd02c700"
+ },
+ "zh-CN": {
+ "path":
"i18n/zh-CN/docusaurus-plugin-content-docs-course/current/101/01-apache-doris-overview.mdx",
+ "blob": "24965a0819a16fdd8963bd35660d4674bec19cdc"
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]