146 |
147 |

148 |
149 |

150 |
151 |

152 |
153 |

154 |
155 |

156 |
157 |
158 |
--------------------------------------------------------------------------------
/SPARK/ADVANCED/ARCHITECTURE/README.md:
--------------------------------------------------------------------------------
1 | ## Куратор раздела
2 |
3 |

4 |
5 | **Подвальный Артем**,
6 | _Data Engineer/Data Scientist_
7 |
8 | [Канал Data Engineer Lab](https://t.me/dataengineerlab)
9 |
10 | Хочешь перейти в дата-инженерию, но не знаешь с чего начать? Пиши - составим резюме, продумаем твое развитие [https://t.me/ampodvalniy](https://t.me/ampodvalniy)
11 |
12 |
13 | Хочешь улучшить текущий раздел, внести недостающее или поправить формулировку? Предлагай PR и тегай [@Artemlin6231](https://github.com/Artemlin6231)
14 |
15 | ## Немного об этой главе
16 | Apache spark - это распределенный фреймворк обработки данных, ставший де-факто стандартом в обработке больших данных. Требуется практически повсевместо в работе дата-инженера.
17 |
18 | Приятного изучения)
19 |
20 | # Основы Apache Spark и RDD
21 |
22 | ## Введение
23 |
24 | **Apache Spark** — это масштабируемая платформа для распределённой обработки данных, которая позволяет выполнять вычисления в памяти, обеспечивая высокую производительность и гибкость. Она подходит как для пакетной (batch), так и для потоковой (streaming) обработки данных.
25 |
26 | ---
27 |
28 | ## Ключевые идеи Apache Spark
29 |
30 | - **Эффективная DAG-модель вычислений**
31 | Spark строит направленный ациклический граф (DAG), отображающий зависимости между этапами обработки. Это обеспечивает более гибкое и оптимизированное планирование по сравнению с классическим MapReduce.
32 |
33 | - **Ленивая модель исполнения**
34 | Преобразования не выполняются сразу. Spark откладывает их выполнение до вызова операции-действия, что позволяет эффективно планировать и объединять задачи.
35 |
36 | - **Гибкое управление памятью**
37 | - Предпочтение хранения данных в памяти
38 | - Сброс данных на диск при нехватке ресурсов
39 | - Возможность комбинированного хранения
40 | - Поддержка различных форматов сериализации
41 |
42 | - **Широкая поддержка языков**
43 | Поддерживаются API для **Scala**, **Java**, **Python** и **R**
44 |
45 | - **Единый API для batch и streaming обработки**
46 |
47 | ---
48 |
49 | ## RDD (Resilient Distributed Dataset)
50 |
51 | **RDD** — основная абстракция данных в Spark, представляющая собой неизменяемую, распределённую коллекцию объектов.
52 |
53 | ### Основные свойства RDD:
54 |
55 | - **Неизменяемость и отказоустойчивость (fault tolerance)**
56 | Все операции над RDD являются детерминированными и безопасными к сбоям.
57 |
58 | - **Два типа операций:**
59 | - **Transformations** — возвращают новый RDD, операции ленивые
60 | Примеры: `map`, `filter`, `join`
61 | - **Actions** — инициируют выполнение вычислений
62 | Примеры: `count`, `collect`, `save`
63 |
64 | - **Партиционирование**
65 | Данные разбиты на независимые части (partition), которые обрабатываются параллельно.
66 |
67 | - **Кэширование данных**
68 | Поддерживаются различные уровни хранения:
69 | - `memory`
70 | - `disk`
71 | - `memory & disk`
72 | - `external*` (при внешней настройке)
73 |
74 |
75 | ## Архитектура и модель вычислений Spark
76 |
77 |
78 |
79 |
80 |
81 | ### Компоненты архитектуры
82 |
83 | - **Driver Program**
84 | Главный управляющий процесс, с которого начинается выполнение приложения Spark. Он:
85 | - инициализирует `SparkContext`;
86 | - строит DAG вычислений;
87 | - управляет разбиением на задачи;
88 | - распределяет задачи по `executors`.
89 |
90 | - **SparkContext**
91 | Ядро взаимодействия приложения с кластером. Он:
92 | - подключается к `Cluster Manager`;
93 | - планирует вычисления;
94 | - отслеживает выполнение задач и собирает результаты.
95 |
96 | - **Cluster Manager**
97 | Менеджер ресурсов, который:
98 | - отслеживает доступные ресурсы;
99 | - выделяет `worker`-узлы;
100 | - запускает `executors`.
101 | Поддерживаемые варианты: **Standalone**, **YARN**, **Kubernetes**, **Mesos**.
102 |
103 | - **Worker Node**
104 | Узел, на котором исполняются задачи Spark. Каждый узел может запускать один или несколько `executors`.
105 |
106 | - **Executor**
107 | Процесс, который:
108 | - исполняет задачи;
109 | - кэширует промежуточные данные;
110 | - взаимодействует с `driver` для отправки результатов.
111 |
112 | - **Task**
113 | Минимальная единица вычислений в Spark. Каждое преобразование над данными разбивается на множество `tasks`, которые распределяются между `executors`.
114 |
115 | - **Cache**
116 | Используется для хранения данных в памяти или на диске с целью ускорения повторных вычислений.
117 |
118 | ---
119 |
120 | ### Как работает модель вычислений Spark
121 |
122 | 1. Пользователь пишет Spark-программу с использованием `RDD`, `DataFrame` или `Dataset`.
123 | 2. Программа запускается, и `Driver` создаёт `SparkContext`.
124 | 3. Spark строит **DAG (направленный ациклический граф)** всех ленивых операций (`transformations`).
125 | 4. DAG разбивается на **этапы (stages)**, каждый из которых состоит из задач (`tasks`).
126 | 5. Через `Cluster Manager`, Spark запускает `executor`'ы на `worker`-узлах.
127 | 6. `Tasks` исполняются параллельно на `executors`.
128 | 7. Промежуточные данные могут кэшироваться.
129 | 8. После завершения все результаты собираются и возвращаются `Driver`-у.
130 |
131 |
132 | # Экосистема Apache Spark
133 |
134 | Apache Spark — представляет собой целую экосистему модулей, предоставляющую мощные средства для работы с данными в различных форматах и задачах: от SQL-запросов и машинного обучения до потоковой обработки и анализа графов.
135 |
136 |
137 |
138 |
139 |
140 | ---
141 |
142 | ## Архитектура уровней
143 |
144 | Экосистема Spark построена на **многоуровневой архитектуре**, где каждый уровень отвечает за свою часть функциональности.
145 |
146 | ### 1. Spark Core
147 |
148 | Базовый компонент Spark, реализующий:
149 |
150 | - Распределённое планирование и выполнение задач
151 | - Управление памятью
152 | - Отказоустойчивость
153 | - Модель RDD (Resilient Distributed Dataset)
154 |
155 | Все остальные компоненты построены поверх `Spark Core`.
156 |
157 | ---
158 |
159 | ### 2. DataFrame API
160 |
161 | Предоставляет более высокоуровневую абстракцию над RDD — **DataFrame** (табличное представление данных). Обеспечивает:
162 |
163 | - SQL-подобный синтаксис
164 | - Оптимизацию исполнения через **Catalyst Optimizer**
165 | - Поддержку различных источников данных через **Data Source API**
166 |
167 | ---
168 |
169 | ### 3. Библиотеки Spark
170 |
171 | На верхнем уровне располагаются модули для специализированных задач:
172 |
173 | | Модуль | Назначение |
174 | |--------|------------|
175 | | **Spark SQL** | Выполнение SQL-запросов, работа с таблицами, интеграция с Hive |
176 | | **Spark Streaming** | Обработка потоковых данных в реальном времени |
177 | | **MLlib** | Машинное обучение: классификация, регрессия, кластеризация и др. |
178 | | **GraphX** | Графовые вычисления и анализ социальных сетей |
179 | | **Packages** | Расширения и сторонние библиотеки, добавляемые через Spark Packages |
180 |
181 | ---
182 |
183 | ### 4. Data Source API
184 |
185 | Позволяет подключаться к множеству внешних источников данных:
186 |
187 | - **Hadoop / HDFS**
188 | - **Apache Hive**
189 | - **Apache HBase**
190 | - **PostgreSQL**, **MySQL**
191 | - **CSV**, **JSON**, **Parquet**
192 | - **Elasticsearch** и другие
193 |
194 | Spark автоматически оптимизирует чтение, запись и обработку данных из этих источников.
195 |
196 |
197 | ---
198 |
199 | ## Поддерживаемые языки
200 |
201 | Spark поддерживает API на нескольких языках:
202 |
203 | - **Scala** (родной язык для Spark)
204 | - **Java**
205 | - **Python (PySpark)**
206 | - **R (SparkR)**
207 |
208 | # DataFrame API и Catalyst Optimizer в Apache Spark
209 |
210 | ---
211 |
212 | ## Что такое DataFrame API?
213 |
214 | **DataFrame** — это одна из высокоуровневых абстракций в Apache Spark, представляющая собой распределённую коллекцию данных в виде таблицы (аналогично таблице в реляционной базе или датафрейму в Pandas/R).
215 |
216 | DataFrame API предоставляет удобные и декларативные средства работы с данными:
217 |
218 | - SQL-подобный синтаксис (`select`, `filter`, `groupBy` и т.д.)
219 | - Поддержка различных источников: JSON, CSV, Parquet, Hive, JDBC, и т.д.
220 | - Поддержка нескольких языков: Scala, Python (PySpark), Java, R
221 | - Интеграция с **Catalyst Optimizer** для автоматической оптимизации запросов
222 |
223 | ---
224 |
225 | ## Как работает Catalyst Optimizer?
226 |
227 | **Catalyst** — это движок оптимизации запросов в Spark SQL и DataFrame API. Он обеспечивает автоматическую трансформацию запросов в эффективные планы выполнения с учётом структуры данных и статистики.
228 |
229 |
230 |
231 |
232 | ---
233 |
234 | ### Этапы обработки запроса в Catalyst:
235 |
236 | 1. ### SQL или DataFrame запрос
237 | Пользователь пишет SQL-запрос или использует DataFrame API.
238 |
239 | 2. ### Unresolved Logical Plan
240 | Spark строит первоначальный **логический план**, который ещё не содержит информации о типах данных и таблицах.
241 |
242 | 3. ### Analysis
243 | С помощью **каталога** (catalog) Spark разрешает имена таблиц, столбцов и типов данных. Получается **разрешённый логический план** (`Logical Plan`).
244 |
245 | 4. ### Logical Optimization
246 | На этом этапе Spark применяет **правила оптимизации**, такие как:
247 | - удаление ненужных столбцов (projection pruning),
248 | - фильтрация как можно раньше (predicate pushdown),
249 | - переупорядочивание `joins`.
250 |
251 | Результат — **оптимизированный логический план** (`Optimized Logical Plan`).
252 |
253 | 5. ### Physical Planning
254 | Spark генерирует несколько вариантов **физического плана** — конкретных стратегий выполнения операций.
255 |
256 | 6. ### Cost Model
257 | Для выбора наилучшего плана Spark применяет **модель стоимости**, оценивая ресурсоёмкость каждого варианта.
258 |
259 | 7. ### Code Generation
260 | Выбранный физический план используется для **генерации Java/Scala кода**, который преобразуется в **RDD-процессы**.
261 |
262 | ---
263 |
264 | ## Преимущества Catalyst и DataFrame API
265 |
266 | | Преимущество | Описание |
267 | |-----------------------------|----------|
268 | | Высокая производительность | Благодаря автоматической оптимизации |
269 | | Упрощение разработки | SQL-подобный синтаксис, декларативный подход |
270 | | Поддержка многих форматов | CSV, Parquet, JSON, Hive, JDBC и др. |
271 | | Расширяемость | Поддержка пользовательских функций (UDF) и типов данных |
272 | | Совместимость | Интеграция с MLlib, GraphX, Streaming и др. |
273 |
274 | ---
275 |
276 | ## Заключение
277 |
278 | DataFrame API и движок Catalyst являются основой гибкости и производительности Spark. Они позволяют пользователям сосредоточиться на логике анализа данных, а оптимизация и исполнение остаются на стороне платформы.
279 |
280 | > _Spark SQL и DataFrame API дают декларативный уровень, а Catalyst автоматически превращает его в оптимальный код._
281 |
282 |
--------------------------------------------------------------------------------
/SPARK/ARCHITECTURE/README.md:
--------------------------------------------------------------------------------
1 | ## Куратор раздела
2 |
3 |

4 |
5 | **Подвальный Артем**,
6 | _Data Engineer/Data Scientist_
7 |
8 | [Канал Data Engineer Lab](https://t.me/dataengineerlab)
9 |
10 | Хочешь перейти в дата-инженерию, но не знаешь с чего начать? Пиши - составим резюме, продумаем твое развитие [https://t.me/ampodvalniy](https://t.me/ampodvalniy)
11 |
12 |
13 | Хочешь улучшить текущий раздел, внести недостающее или поправить формулировку? Предлагай PR и тегай [@Artemlin6231](https://github.com/Artemlin6231)
14 |
15 | ## Немного об этой главе
16 | Apache spark - это распределенный фреймворк обработки данных, ставший де-факто стандартом в обработке больших данных. Требуется практически повсевместо в работе дата-инженера.
17 |
18 | Приятного изучения)
19 |
20 | # Основы Apache Spark и RDD
21 |
22 | ## Введение
23 |
24 | **Apache Spark** — это масштабируемая платформа для распределённой обработки данных, которая позволяет выполнять вычисления в памяти, обеспечивая высокую производительность и гибкость. Она подходит как для пакетной (batch), так и для потоковой (streaming) обработки данных.
25 |
26 | ---
27 |
28 | ## Ключевые идеи Apache Spark
29 |
30 | - **Эффективная DAG-модель вычислений**
31 | Spark строит направленный ациклический граф (DAG), отображающий зависимости между этапами обработки. Это обеспечивает более гибкое и оптимизированное планирование по сравнению с классическим MapReduce.
32 |
33 | - **Ленивая модель исполнения**
34 | Преобразования не выполняются сразу. Spark откладывает их выполнение до вызова операции-действия, что позволяет эффективно планировать и объединять задачи.
35 |
36 | - **Гибкое управление памятью**
37 | - Предпочтение хранения данных в памяти
38 | - Сброс данных на диск при нехватке ресурсов
39 | - Возможность комбинированного хранения
40 | - Поддержка различных форматов сериализации
41 |
42 | - **Широкая поддержка языков**
43 | Поддерживаются API для **Scala**, **Java**, **Python** и **R**
44 |
45 | - **Единый API для batch и streaming обработки**
46 |
47 | ---
48 |
49 | ## RDD (Resilient Distributed Dataset)
50 |
51 | **RDD** — основная абстракция данных в Spark, представляющая собой неизменяемую, распределённую коллекцию объектов.
52 |
53 | ### Основные свойства RDD:
54 |
55 | - **Неизменяемость и отказоустойчивость (fault tolerance)**
56 | Все операции над RDD являются детерминированными и безопасными к сбоям.
57 |
58 | - **Два типа операций:**
59 | - **Transformations** — возвращают новый RDD, операции ленивые
60 | Примеры: `map`, `filter`, `join`
61 | - **Actions** — инициируют выполнение вычислений
62 | Примеры: `count`, `collect`, `save`
63 |
64 | - **Партиционирование**
65 | Данные разбиты на независимые части (partition), которые обрабатываются параллельно.
66 |
67 | - **Кэширование данных**
68 | Поддерживаются различные уровни хранения:
69 | - `memory`
70 | - `disk`
71 | - `memory & disk`
72 | - `external*` (при внешней настройке)
73 |
74 |
75 | ## Архитектура и модель вычислений Spark
76 |
77 |
78 |
79 |
80 |
81 | ### Компоненты архитектуры
82 |
83 | - **Driver Program**
84 | Главный управляющий процесс, с которого начинается выполнение приложения Spark. Он:
85 | - инициализирует `SparkContext`;
86 | - строит DAG вычислений;
87 | - управляет разбиением на задачи;
88 | - распределяет задачи по `executors`.
89 |
90 | - **SparkContext**
91 | Ядро взаимодействия приложения с кластером. Он:
92 | - подключается к `Cluster Manager`;
93 | - планирует вычисления;
94 | - отслеживает выполнение задач и собирает результаты.
95 |
96 | - **Cluster Manager**
97 | Менеджер ресурсов, который:
98 | - отслеживает доступные ресурсы;
99 | - выделяет `worker`-узлы;
100 | - запускает `executors`.
101 | Поддерживаемые варианты: **Standalone**, **YARN**, **Kubernetes**, **Mesos**.
102 |
103 | - **Worker Node**
104 | Узел, на котором исполняются задачи Spark. Каждый узел может запускать один или несколько `executors`.
105 |
106 | - **Executor**
107 | Процесс, который:
108 | - исполняет задачи;
109 | - кэширует промежуточные данные;
110 | - взаимодействует с `driver` для отправки результатов.
111 |
112 | - **Task**
113 | Минимальная единица вычислений в Spark. Каждое преобразование над данными разбивается на множество `tasks`, которые распределяются между `executors`.
114 |
115 | - **Cache**
116 | Используется для хранения данных в памяти или на диске с целью ускорения повторных вычислений.
117 |
118 | ---
119 |
120 | ### Как работает модель вычислений Spark
121 |
122 | 1. Пользователь пишет Spark-программу с использованием `RDD`, `DataFrame` или `Dataset`.
123 | 2. Программа запускается, и `Driver` создаёт `SparkContext`.
124 | 3. Spark строит **DAG (направленный ациклический граф)** всех ленивых операций (`transformations`).
125 | 4. DAG разбивается на **этапы (stages)**, каждый из которых состоит из задач (`tasks`).
126 | 5. Через `Cluster Manager`, Spark запускает `executor`'ы на `worker`-узлах.
127 | 6. `Tasks` исполняются параллельно на `executors`.
128 | 7. Промежуточные данные могут кэшироваться.
129 | 8. После завершения все результаты собираются и возвращаются `Driver`-у.
130 |
131 |
132 | # Экосистема Apache Spark
133 |
134 | Apache Spark — представляет собой целую экосистему модулей, предоставляющую мощные средства для работы с данными в различных форматах и задачах: от SQL-запросов и машинного обучения до потоковой обработки и анализа графов.
135 |
136 |
137 |
138 |
139 |
140 | ---
141 |
142 | ## Архитектура уровней
143 |
144 | Экосистема Spark построена на **многоуровневой архитектуре**, где каждый уровень отвечает за свою часть функциональности.
145 |
146 | ### 1. Spark Core
147 |
148 | Базовый компонент Spark, реализующий:
149 |
150 | - Распределённое планирование и выполнение задач
151 | - Управление памятью
152 | - Отказоустойчивость
153 | - Модель RDD (Resilient Distributed Dataset)
154 |
155 | Все остальные компоненты построены поверх `Spark Core`.
156 |
157 | ---
158 |
159 | ### 2. DataFrame API
160 |
161 | Предоставляет более высокоуровневую абстракцию над RDD — **DataFrame** (табличное представление данных). Обеспечивает:
162 |
163 | - SQL-подобный синтаксис
164 | - Оптимизацию исполнения через **Catalyst Optimizer**
165 | - Поддержку различных источников данных через **Data Source API**
166 |
167 | ---
168 |
169 | ### 3. Библиотеки Spark
170 |
171 | На верхнем уровне располагаются модули для специализированных задач:
172 |
173 | | Модуль | Назначение |
174 | |--------|------------|
175 | | **Spark SQL** | Выполнение SQL-запросов, работа с таблицами, интеграция с Hive |
176 | | **Spark Streaming** | Обработка потоковых данных в реальном времени |
177 | | **MLlib** | Машинное обучение: классификация, регрессия, кластеризация и др. |
178 | | **GraphX** | Графовые вычисления и анализ социальных сетей |
179 | | **Packages** | Расширения и сторонние библиотеки, добавляемые через Spark Packages |
180 |
181 | ---
182 |
183 | ### 4. Data Source API
184 |
185 | Позволяет подключаться к множеству внешних источников данных:
186 |
187 | - **Hadoop / HDFS**
188 | - **Apache Hive**
189 | - **Apache HBase**
190 | - **PostgreSQL**, **MySQL**
191 | - **CSV**, **JSON**, **Parquet**
192 | - **Elasticsearch** и другие
193 |
194 | Spark автоматически оптимизирует чтение, запись и обработку данных из этих источников.
195 |
196 |
197 | ---
198 |
199 | ## Поддерживаемые языки
200 |
201 | Spark поддерживает API на нескольких языках:
202 |
203 | - **Scala** (родной язык для Spark)
204 | - **Java**
205 | - **Python (PySpark)**
206 | - **R (SparkR)**
207 |
208 | # DataFrame API и Catalyst Optimizer в Apache Spark
209 |
210 | ---
211 |
212 | ## Что такое DataFrame API?
213 |
214 | **DataFrame** — это одна из высокоуровневых абстракций в Apache Spark, представляющая собой распределённую коллекцию данных в виде таблицы (аналогично таблице в реляционной базе или датафрейму в Pandas/R).
215 |
216 | DataFrame API предоставляет удобные и декларативные средства работы с данными:
217 |
218 | - SQL-подобный синтаксис (`select`, `filter`, `groupBy` и т.д.)
219 | - Поддержка различных источников: JSON, CSV, Parquet, Hive, JDBC, и т.д.
220 | - Поддержка нескольких языков: Scala, Python (PySpark), Java, R
221 | - Интеграция с **Catalyst Optimizer** для автоматической оптимизации запросов
222 |
223 | ---
224 |
225 | ## Как работает Catalyst Optimizer?
226 |
227 | **Catalyst** — это движок оптимизации запросов в Spark SQL и DataFrame API. Он обеспечивает автоматическую трансформацию запросов в эффективные планы выполнения с учётом структуры данных и статистики.
228 |
229 |
230 |
231 |
232 | ---
233 |
234 | ### Этапы обработки запроса в Catalyst:
235 |
236 | 1. ### SQL или DataFrame запрос
237 | Пользователь пишет SQL-запрос или использует DataFrame API.
238 |
239 | 2. ### Unresolved Logical Plan
240 | Spark строит первоначальный **логический план**, который ещё не содержит информации о типах данных и таблицах.
241 |
242 | 3. ### Analysis
243 | С помощью **каталога** (catalog) Spark разрешает имена таблиц, столбцов и типов данных. Получается **разрешённый логический план** (`Logical Plan`).
244 |
245 | 4. ### Logical Optimization
246 | На этом этапе Spark применяет **правила оптимизации**, такие как:
247 | - удаление ненужных столбцов (projection pruning),
248 | - фильтрация как можно раньше (predicate pushdown),
249 | - переупорядочивание `joins`.
250 |
251 | Результат — **оптимизированный логический план** (`Optimized Logical Plan`).
252 |
253 | 5. ### Physical Planning
254 | Spark генерирует несколько вариантов **физического плана** — конкретных стратегий выполнения операций.
255 |
256 | 6. ### Cost Model
257 | Для выбора наилучшего плана Spark применяет **модель стоимости**, оценивая ресурсоёмкость каждого варианта.
258 |
259 | 7. ### Code Generation
260 | Выбранный физический план используется для **генерации Java/Scala кода**, который преобразуется в **RDD-процессы**.
261 |
262 | ---
263 |
264 | ## Преимущества Catalyst и DataFrame API
265 |
266 | | Преимущество | Описание |
267 | |-----------------------------|----------|
268 | | Высокая производительность | Благодаря автоматической оптимизации |
269 | | Упрощение разработки | SQL-подобный синтаксис, декларативный подход |
270 | | Поддержка многих форматов | CSV, Parquet, JSON, Hive, JDBC и др. |
271 | | Расширяемость | Поддержка пользовательских функций (UDF) и типов данных |
272 | | Совместимость | Интеграция с MLlib, GraphX, Streaming и др. |
273 |
274 | ---
275 |
276 | ## Заключение
277 |
278 | DataFrame API и движок Catalyst являются основой гибкости и производительности Spark. Они позволяют пользователям сосредоточиться на логике анализа данных, а оптимизация и исполнение остаются на стороне платформы.
279 |
280 | > _Spark SQL и DataFrame API дают декларативный уровень, а Catalyst автоматически превращает его в оптимальный код._
281 |
--------------------------------------------------------------------------------
/SPARK/BASE/README.md:
--------------------------------------------------------------------------------
1 | ## Куратор раздела
2 |
3 |

4 |
5 | **Виндюков Евгений**,
6 | _Data Engineer_
7 |
8 | [Канал Я – Дата Инженер](https://t.me/halltape_data)
9 |
10 | Если нужна помощь в обучении или в составлении резюме – пиши [@halltape](https://t.me/halltape)
11 |
12 |
13 | Хочешь улучшить текущий раздел, внести недостающее или поправить формулировку? Предлагай PR и тегай [@halltape](https://github.com/halltape)
14 |
15 |
16 | # Что такое Spark?
17 |
18 |
19 |
20 |
21 |
22 | **Apache Spark** - это супер быстрый фреймворк. Нужен он для того, чтобы обрабатывать большие данные на огромных кластерах (нескольких серверах). Работает он до 100 раз быстрее, чем Hadoop MapReduce в памяти или в 10 раз быстрее, чем на диске.
23 |
24 | Визуально его код выглядит так, будто скрестили SQL и Python:
25 |
26 |
27 |
28 |
29 | ***
30 |
31 | ## Откуда может читать данные Apache Spark
32 |
33 | ### Файловые системы
34 | - **HDFS**
35 | - **S3**
36 | - **Локальная файловая система**
37 | - **Azure Blob Storage**, **ADLS** (Azure Data Lake Storage)
38 | - **Google Cloud Storage**
39 |
40 | ### Форматы файлов
41 | - **CSV**
42 | - **JSON**
43 | - **Parquet**
44 | - **ORC**
45 | - **Avro**
46 | - **Text**
47 |
48 | ### Базы данных и хранилища (через коннекторы)
49 | - **JDBC** (PostgreSQL, MySQL, MSSQL и другие базы)
50 | - **ClickHouse**
51 | - **Greenplum**
52 | - **Hive**
53 | - **HBase**
54 | - **Cassandra**
55 | - **MongoDB**
56 | - **Elasticsearch**
57 |
58 | ### Системы стриминга
59 | - **Kafka**
60 | - **Kinesis** (AWS)
61 |
62 | ### Другие источники через коннекторы и плагины
63 |
64 | - **Delta Lake**
65 | - **Iceberg**
66 | - **Hudi**
67 | - **Google BigQuery**
68 |
69 |
70 |
71 |
72 |
73 | и так далее...
74 |
75 | ***
76 |
77 | ## А в чем разница между Spark и Pandas?
78 |
79 |
80 |
81 |
82 | Внешне код на pandas и на spark действительно похожи. Но pandas работает на одной машине и иногда дата инженеры могут его использовать для обработки маленьких кусочков данных (например из API), когда данные помещаются в оперативную память одного компьютера.
83 |
84 | ***
85 |
86 | ## Где запускается Spark?
87 |
88 |
89 |
90 |
91 |
92 | На работе под вашу команду будет выделено некоторое кол-во серверов. Собственно это физически может быть несколько стоек с серверами. Именно на них и будет запускаться ваш Spark. В бигтехах (больших компаниях, типа Банки) вы можете пользоваться коммунальным кластером. Это значит, что помимо вас, эти ресурсами будут пользоваться несколько команд. Соответственно здесь надо будет грамотно рассчитывать используемые ресурсы серверов, чтобы дать считать свои данные и другим. Подробнее про ресурсы будет пониже.
93 |
94 | ***
95 | ## Из чего состоит Spark?
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 | Если очень просто, то для того, чтобы посчитать сборку витрины данных, вам нужно будет запустить Spark приложение с конкретным кол-вом CPU и RAM. Эти значения вы указываете самостоятельно. Очевидно, что если вы укажите слишком много, то это может занять весь КЛАСТЕР. Таким образом вы отберете ресурсы от других пользователей. Поэтому в Spark нужно уже начинать думать об этом заранее.
109 | ***
110 |
111 | ## Как Spark читает данные?
112 |
113 |
114 |
115 |
116 |
117 | Spark можно очень гибко настраивать, но по умолчанию он часто читает файл и разбивает его на кусочки (типа на 128Мб). Этот параметр может меняться в зависимости от источника, настроек системы и так далее. Возьмем вариант в 128Mb.
118 |
119 | **Исходные данные:**
120 | - Файл весом **10 Gb**
121 | - **8 серверов** (один сервер: 2 ядра CPU и 16Gb RAM)
122 |
123 | **В Spark:**
124 | - 1 ядро (core) может выполнять 1 задачу (task) одновременно.
125 | - Установим каждому executor’у 2 ядра, тогда он может одновременно обрабатывать 2 tasks.
126 |
127 | **ВАЖНО!**
128 |
129 | Мы можем вручную указать кол-во executors и выделяемое им кол-во CPU и RAM.
130 | Совершенно необязательно, что на одном сервере будет запускаться один executor. Если хватает CPU и RAM для двух и более, то запуститься сразу несколько.
131 |
132 |
133 |
134 |
135 |
136 | ```
137 | Если Spark читает файл размером 10Gb, значит он поделит его на
138 | 10 * 1024 Mb / 128 Mb = 80 partitions
139 | ```
140 |
141 | **Что получаем:**
142 | - Кластер может одновременно обрабатывать 16 tasks (8 серверов по 2 tasks).
143 | - Поскольку партций 80, Spark сначала запустит 16 задач параллельно (на 8 executors).
144 | - Как только один task завершается, на освободившемся ядре сразу стартует следующий task.
145 | - И так, пока все 80 партций не будут обработаны.
146 |
147 | Т.е. наш Spark уже при чтении разбил данные на небольшие кусочки и раскидал их по серверам, чтобы обработать их параллельно. Важный момент, что кол-во executors мы можем, как увеличить, так и уменьшить. Это позволяет напрямую влиять на скорость обработки данных.
148 | ***
149 |
150 | ## Что такое Shuffle?
151 |
152 |
153 |
154 |
155 | Shuffle происходит, когда Spark нужно перемешать данные между executor, например для выполнения операции JOIN и так далее. Представьте, что данные с одним и тем же ключем для join у вас лежат на разных executors. Очевидно, что нужно все перетасовать между собой. Более подробное объяснения можете почитать [тут](../ADVANCED/README.md#Shuffle-в-Spark) !
156 |
157 | ***
158 |
159 | ## Сколько нужно выделять executors?
160 |
161 | Ниже небольшое объяснение, почему слишком большое или слишком маленькое кол-во executors не всегда хорошо. На практике, особенно на junior позициях, вам не придется сильно заморачиваться с расчетом ресурсов. Ваш TeamLead выдаст вам готовый конфиг с уже настроенными параметрами. Ваша задача будет только запустить его. Но если вас спросят об этом на собесе – это будет огромным плюсом!
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 | Ниже по ссылке можете посмотреть, как рассчитываются ресурсы для Spark приложения:
172 | - [Онлайн расчет ресурсов для Spark](https://sparkconfigoptimizer.com)
173 |
174 | ***
175 |
176 | ## На что расходуется память в Spark?
177 |
178 |
179 |
180 |
181 |
182 | Эта информация скорее для Advanced уровня и о ней почти не спрашивают на собесах. Это понадобится вам только в том случае, когда вы начнете вручную настраивать кол-во выделяемых ресурсов для executor и увидите, что ваши Gb на самом деле пилятся внутри Spark еще на много чего полезного. Условно, будто вы купили диск на 1Gb, а в реальности там оказалось только 500Мб полезной нагрузки.
183 |
184 | ***
185 |
186 | ## Есть ли у Spark UI?
187 |
188 | Да, у Spark есть интерфейс, где можно отслеживать план выполнения вашего запроса. Это реально удобная вещь. Визуально это выглядит вот так:
189 |
190 |
191 |
192 |
193 |
194 | Для того, чтобы разобраться еще и UI, ниже хорошая статья:
195 | - [Как пользоваться Spark UI?](https://habr.com/ru/companies/avito/articles/764996/)
196 |
197 | ***
198 |
199 | ## Где учить Spark?
200 |
201 | Одна из хороших практик для обучения - переписывать запросы с SQL на Spark и наоборот.
202 | Результаты, очевидно, должны быть одинаковыми.
203 |
204 | **Вот пример двух одинаковых запросов на SQL и на PySpark**
205 |
206 | ```sql
207 | SELECT
208 | d.department_name,
209 | AVG(s.salary) AS average_salary
210 | FROM employees e
211 | JOIN departments d ON e.department_id = d.department_id
212 | JOIN salaries s ON e.employee_id = s.employee_id
213 | WHERE s.salary >= 3000
214 | GROUP BY d.department_name
215 | ORDER BY average_salary DESC;
216 | ```
217 |
218 |
219 | ```python
220 | result_df = employees_df\
221 | .join(departments_df, "department_id")\
222 | .join(salaries_df, "employee_id")
223 | .filter(salaries_df.salary >= 3000)
224 | .groupBy("department_name")
225 | .agg(F.avg("salary").alias("average_salary"))
226 | .orderBy(F.desc("average_salary"))
227 | result_df.show()
228 | ```
229 |
230 | Также рекомендую порешать несколько задачек отсюда:
231 |
232 | ➜ [Leetcode по PySpark](https://platform.stratascratch.com/coding?code_type=6)
233 |
234 | Чтобы попробовать Spark локально, можно развернуть мини кластер у себя локально:
235 |
236 | ➜ [Разверни свой Spark кластер](https://github.com/halltape/HalltapeSparkCluster/tree/main)
--------------------------------------------------------------------------------
/change_log:
--------------------------------------------------------------------------------
1 | Версия 2.1:
2 |
3 | - Добавлена новая инфа по Spark- Переписана полностью инфа по Hadoop
4 | - Добавлен новый автор Артем Подвальный - https://t.me/dataengineerlab
5 | - Добавлен контент по "Оптимизации запросов" и "Кейс оптимизации" по Greenplum
6 | - Разделены вопросы собеседований по темам
7 | - Добавлена новая часть видео "Вопросы собеседований по SQL - часть 5"
8 | - Добавлена новая часть видео "Вопросы собеседований по Базам Данных - часть 1"
9 |
10 | Версия 2.0:
11 |
12 | - Тут должно быть херова тьма пунков, но по сути тут самое начало создания Роадмапа, поэтому забиваем большой болт))))
--------------------------------------------------------------------------------
/files/Apache Airflow.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/files/Apache Airflow.pdf
--------------------------------------------------------------------------------
/files/data_vault.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/files/data_vault.pdf
--------------------------------------------------------------------------------
/files/deep_dive_hdfs_pdf.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/files/deep_dive_hdfs_pdf.pdf
--------------------------------------------------------------------------------
/files/greenplum.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/files/greenplum.pdf
--------------------------------------------------------------------------------
/files/normal_tables.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/files/normal_tables.pdf
--------------------------------------------------------------------------------
/png/Apache_Kafka.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/Apache_Kafka.png
--------------------------------------------------------------------------------
/png/BASH_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/BASH_logo.png
--------------------------------------------------------------------------------
/png/CH_col_oriented.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/CH_col_oriented.jpg
--------------------------------------------------------------------------------
/png/af_arfitecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/af_arfitecture.png
--------------------------------------------------------------------------------
/png/af_connection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/af_connection.png
--------------------------------------------------------------------------------
/png/af_dag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/af_dag.png
--------------------------------------------------------------------------------
/png/af_final_task.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/af_final_task.png
--------------------------------------------------------------------------------
/png/af_start_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/af_start_page.png
--------------------------------------------------------------------------------
/png/airflow_logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/airflow_logo.jpg
--------------------------------------------------------------------------------
/png/amp.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/amp.jpg
--------------------------------------------------------------------------------
/png/batch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/batch.png
--------------------------------------------------------------------------------
/png/cases.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/cases.jpg
--------------------------------------------------------------------------------
/png/ch_column_oriented.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_column_oriented.gif
--------------------------------------------------------------------------------
/png/ch_filename.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_filename.jpg
--------------------------------------------------------------------------------
/png/ch_filename.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_filename.png
--------------------------------------------------------------------------------
/png/ch_filename.png.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_filename.png.jpg
--------------------------------------------------------------------------------
/png/ch_logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_logo.jpg
--------------------------------------------------------------------------------
/png/ch_mater_col.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_mater_col.png
--------------------------------------------------------------------------------
/png/ch_merge.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_merge.gif
--------------------------------------------------------------------------------
/png/ch_minmax.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_minmax.jpg
--------------------------------------------------------------------------------
/png/ch_minmax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_minmax.png
--------------------------------------------------------------------------------
/png/ch_no_column.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_no_column.png
--------------------------------------------------------------------------------
/png/ch_partition.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_partition.jpg
--------------------------------------------------------------------------------
/png/ch_set_idx.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_set_idx.jpg
--------------------------------------------------------------------------------
/png/ch_table.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ch_table.jpg
--------------------------------------------------------------------------------
/png/data_mart.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/data_mart.jpeg
--------------------------------------------------------------------------------
/png/data_warehouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/data_warehouse.png
--------------------------------------------------------------------------------
/png/dbt_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dbt_logo.png
--------------------------------------------------------------------------------
/png/de1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/de1.jpg
--------------------------------------------------------------------------------
/png/de1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/de1.png
--------------------------------------------------------------------------------
/png/de2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/de2.png
--------------------------------------------------------------------------------
/png/de3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/de3.png
--------------------------------------------------------------------------------
/png/de4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/de4.png
--------------------------------------------------------------------------------
/png/de5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/de5.png
--------------------------------------------------------------------------------
/png/docker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/docker_logo.png
--------------------------------------------------------------------------------
/png/dv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dv.png
--------------------------------------------------------------------------------
/png/dwh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dwh.png
--------------------------------------------------------------------------------
/png/dwh_ai_acid_dirty_reading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dwh_ai_acid_dirty_reading.png
--------------------------------------------------------------------------------
/png/dwh_ai_acid_lost_data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dwh_ai_acid_lost_data.png
--------------------------------------------------------------------------------
/png/dwh_ai_acid_non_repetitive_reading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dwh_ai_acid_non_repetitive_reading.png
--------------------------------------------------------------------------------
/png/dwh_ai_acid_phantom_reading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/dwh_ai_acid_phantom_reading.png
--------------------------------------------------------------------------------
/png/exp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/exp.png
--------------------------------------------------------------------------------
/png/git_fork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/git_fork.png
--------------------------------------------------------------------------------
/png/git_fork2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/git_fork2.png
--------------------------------------------------------------------------------
/png/git_github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/git_github.png
--------------------------------------------------------------------------------
/png/git_ssh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/git_ssh.png
--------------------------------------------------------------------------------
/png/git_ssh2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/git_ssh2.png
--------------------------------------------------------------------------------
/png/git_ssh3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/git_ssh3.png
--------------------------------------------------------------------------------
/png/github_pics.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/github_pics.jpg
--------------------------------------------------------------------------------
/png/gp_advanced_mirrors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_advanced_mirrors.png
--------------------------------------------------------------------------------
/png/gp_advanced_mirrors_fail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_advanced_mirrors_fail.png
--------------------------------------------------------------------------------
/png/gp_ao_colum_orientir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_ao_colum_orientir.png
--------------------------------------------------------------------------------
/png/gp_ao_string_orientir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_ao_string_orientir.png
--------------------------------------------------------------------------------
/png/gp_ao_table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_ao_table.png
--------------------------------------------------------------------------------
/png/gp_arhitecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_arhitecture.png
--------------------------------------------------------------------------------
/png/gp_b_tree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_b_tree.png
--------------------------------------------------------------------------------
/png/gp_distributed_broadcast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_distributed_broadcast.png
--------------------------------------------------------------------------------
/png/gp_distributed_by_key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_distributed_by_key.png
--------------------------------------------------------------------------------
/png/gp_distributed_random.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_distributed_random.png
--------------------------------------------------------------------------------
/png/gp_explain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_explain.png
--------------------------------------------------------------------------------
/png/gp_explain_analyze.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_explain_analyze.png
--------------------------------------------------------------------------------
/png/gp_external_table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_external_table.png
--------------------------------------------------------------------------------
/png/gp_gpfgist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_gpfgist.png
--------------------------------------------------------------------------------
/png/gp_group_mirrors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_group_mirrors.png
--------------------------------------------------------------------------------
/png/gp_group_mirrors_fail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_group_mirrors_fail.png
--------------------------------------------------------------------------------
/png/gp_heap_table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_heap_table.png
--------------------------------------------------------------------------------
/png/gp_inc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_inc.jpg
--------------------------------------------------------------------------------
/png/gp_index.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_index.png
--------------------------------------------------------------------------------
/png/gp_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_logo.png
--------------------------------------------------------------------------------
/png/gp_master_fail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_master_fail.png
--------------------------------------------------------------------------------
/png/gp_mirrors_master.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_mirrors_master.png
--------------------------------------------------------------------------------
/png/gp_mpp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_mpp.png
--------------------------------------------------------------------------------
/png/gp_partitions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_partitions.png
--------------------------------------------------------------------------------
/png/gp_partitions_comb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_partitions_comb.png
--------------------------------------------------------------------------------
/png/gp_partitions_list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_partitions_list.png
--------------------------------------------------------------------------------
/png/gp_partitions_range.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_partitions_range.png
--------------------------------------------------------------------------------
/png/gp_pxf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_pxf.png
--------------------------------------------------------------------------------
/png/gp_simple_load_save_data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_simple_load_save_data.png
--------------------------------------------------------------------------------
/png/gp_sql_operations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/gp_sql_operations.png
--------------------------------------------------------------------------------
/png/hadoop_arch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/hadoop_arch.png
--------------------------------------------------------------------------------
/png/hadoop_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/hadoop_logo.png
--------------------------------------------------------------------------------
/png/hadoop_rep.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/hadoop_rep.png
--------------------------------------------------------------------------------
/png/hadoop_secondary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/hadoop_secondary.png
--------------------------------------------------------------------------------
/png/halltape.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/halltape.jpg
--------------------------------------------------------------------------------
/png/ind_part_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/ind_part_logo.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_bitmap1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_bitmap1.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_bitmap2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_bitmap2.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_bitmap3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_bitmap3.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_btree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_btree.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_btree_revers1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_btree_revers1.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_btree_revers2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_btree_revers2.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_clust_vs_non_clust.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_clust_vs_non_clust.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_hash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_hash.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_part_bag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_part_bag.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/ind_part_three_bags.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/ind_part_three_bags.png
--------------------------------------------------------------------------------
/png/indexes_and_partitions/partitions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/indexes_and_partitions/partitions.png
--------------------------------------------------------------------------------
/png/inmon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/inmon.png
--------------------------------------------------------------------------------
/png/intern.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/intern.png
--------------------------------------------------------------------------------
/png/kafka_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/kafka_logo.png
--------------------------------------------------------------------------------
/png/kafka_producers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/kafka_producers.png
--------------------------------------------------------------------------------
/png/kappa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/kappa.png
--------------------------------------------------------------------------------
/png/kimbal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/kimbal.png
--------------------------------------------------------------------------------
/png/lakehouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/lakehouse.png
--------------------------------------------------------------------------------
/png/lambda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/lambda.png
--------------------------------------------------------------------------------
/png/links.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/links.jpeg
--------------------------------------------------------------------------------
/png/mail_pet_project.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/mail_pet_project.gif
--------------------------------------------------------------------------------
/png/models_data.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/models_data.jpeg
--------------------------------------------------------------------------------
/png/normal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/normal.jpg
--------------------------------------------------------------------------------
/png/normal_table.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/normal_table.jpg
--------------------------------------------------------------------------------
/png/olap_oltp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/olap_oltp.png
--------------------------------------------------------------------------------
/png/pengwin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/pengwin.jpg
--------------------------------------------------------------------------------
/png/pet_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/pet_project.png
--------------------------------------------------------------------------------
/png/pp_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/pp_2.png
--------------------------------------------------------------------------------
/png/que.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/que.jpg
--------------------------------------------------------------------------------
/png/resume.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/resume.jpg
--------------------------------------------------------------------------------
/png/shust.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/shust.jpg
--------------------------------------------------------------------------------
/png/snowflake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/snowflake.png
--------------------------------------------------------------------------------
/png/spark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark.png
--------------------------------------------------------------------------------
/png/spark_arch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_arch.png
--------------------------------------------------------------------------------
/png/spark_catalyst.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_catalyst.jpg
--------------------------------------------------------------------------------
/png/spark_eco.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_eco.png
--------------------------------------------------------------------------------
/png/spark_images/SPARK.001.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.001.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.002.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.002.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.003.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.003.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.004.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.004.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.005.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.005.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.006.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.006.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.007.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.007.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.008.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.008.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.009.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.009.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.010.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.010.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.011.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.011.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.012.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.012.jpeg
--------------------------------------------------------------------------------
/png/spark_images/SPARK.013.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/SPARK.013.jpeg
--------------------------------------------------------------------------------
/png/spark_images/spark_ui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_images/spark_ui.png
--------------------------------------------------------------------------------
/png/spark_join.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_join.jpg
--------------------------------------------------------------------------------
/png/spark_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_logo.png
--------------------------------------------------------------------------------
/png/spark_stages.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/spark_stages.jpg
--------------------------------------------------------------------------------
/png/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/star.png
--------------------------------------------------------------------------------
/png/stream.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/stream.png
--------------------------------------------------------------------------------
/png/yarn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/yarn.png
--------------------------------------------------------------------------------
/png/yarn_eco.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/yarn_eco.png
--------------------------------------------------------------------------------
/png/yarn_map_reduce.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/halltape/HalltapeRoadmapDE/59cf92354171b7f0e00b9651c55014c4c95fa1d1/png/yarn_map_reduce.jpg
--------------------------------------------------------------------------------