-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocker-compose.yaml
398 lines (373 loc) · 15.3 KB
/
docker-compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
# Название проекта Docker Compose
name: hse_python_final
# Определение общих переменных окружения для PostgreSQL
x-postgresql-connection-env: &pg-connect
POSTGRESQL_APP_HOST: ${POSTGRESQL_APP_HOST}
POSTGRESQL_APP_DB: ${POSTGRESQL_APP_DB}
POSTGRESQL_APP_SCHEMA: ${POSTGRESQL_APP_SCHEMA}
POSTGRESQL_APP_USER: ${POSTGRESQL_APP_USER}
POSTGRESQL_APP_PASSWORD: ${POSTGRESQL_APP_PASSWORD}
# Определение общих переменных окружения для MySQL
x-mysql-connection-env: &mysql-connect
MYSQL_APP_HOST: ${MYSQL_APP_HOST}
MYSQL_APP_DB: ${MYSQL_APP_DB}
MYSQL_APP_USER: ${MYSQL_APP_USER}
MYSQL_APP_PASSWORD: ${MYSQL_APP_PASSWORD}
# Определение общих переменных окружения для Airflow
x-airflow-common-env: &airflow-common-env
AIRFLOW__CORE__EXECUTOR: ${AIRFLOW__CORE__EXECUTOR}
AIRFLOW__CORE__LOAD_EXAMPLES: ${AIRFLOW__CORE__LOAD_EXAMPLES}
AIRFLOW__CORE__DAG_CONCURRENCY: ${AIRFLOW__CORE__DAG_CONCURRENCY}
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: ${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}
AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: ${AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK}
AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW__WEBSERVER__SECRET_KEY}
AIRFLOW_UID: ${AIRFLOW_UID}
_AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME}
_AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD}
SPARK_MASTER_HOST: ${SPARK_MASTER_HOST}
SPARK_MASTER_PORT: ${SPARK_MASTER_PORT}
# Определение общих переменных окружения для Spark
x-spark-common-env: &spark-common-env
SPARK_RPC_AUTHENTICATION_ENABLED: ${SPARK_RPC_AUTHENTICATION_ENABLED}
SPARK_RPC_ENCRYPTION_ENABLED: ${SPARK_RPC_ENCRYPTION_ENABLED}
SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED: ${SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED}
SPARK_SSL_ENABLED: ${SPARK_SSL_ENABLED}
# Определение общих переменных окружения для Kafka
x-kafka-common-env: &kafka-common-env
KAFKA_INTERNAL_CONNECT_PATH: ${KAFKA_INTERNAL_CONNECT_PATH}
KAFKA_TOPIC_NAME: ${KAFKA_TOPIC_NAME}
# Определение сервисов
services:
# ================================
# Секция RDBMS (Системы Управления Реляционными Базами Данных)
# ================================
# Сервис PostgreSQL
postgresql:
build: setup/db/postgresql
container_name: postgresql
environment:
<<: *pg-connect # Включение общих переменных окружения для PostgreSQL
# Пароль для пользователя root в PostgreSQL
POSTGRES_PASSWORD: ${POSTGRESQL_ROOT_PASSWORD}
ports:
# Проброс порта 5432 контейнера на локальный хост для доступа к базе данных
- "5432:5432"
volumes:
# Монтирование тома для сохранения данных PostgreSQL вне контейнера
- postgresql-data:/var/lib/postgres/data
healthcheck:
# Проверка готовности PostgreSQL сервиса
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s # Интервал между проверками
timeout: 5s # Время ожидания ответа
retries: 5 # Количество попыток проверки перед признанием сервиса неработоспособным
deploy:
resources:
limits:
cpus: '0.5' # Ограничение по использованию CPU
memory: 512M # Ограничение по использованию памяти
# Сервис MySQL
mysql:
build: setup/db/mysql
container_name: mysql
environment:
<<: *mysql-connect # Включение общих переменных окружения для MySQL
# Пароль для пользователя root в MySQL
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
# Проброс порта 3306 контейнера на локальный хост для доступа к базе данных
- "3306:3306"
volumes:
# Монтирование тома для сохранения данных MySQL вне контейнера
- mysql-data:/var/lib/mysql
healthcheck:
# Проверка готовности MySQL сервиса
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 5s
timeout: 5s
retries: 5
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# ================================
# Секция Месседжинга (Обмен сообщениями между сервисами)
# ================================
# Сервис Zookeeper
zookeeper:
build: setup/messaging/zookeeper
container_name: zookeeper
environment:
ZOOKEEPER_CLIENT_PORT: '2181' # Порт для подключения клиентов к Zookeeper
ports:
- "2181:2181" # Проброс порта 2181 на локальный хост
healthcheck:
# Проверка готовности Zookeeper сервиса
test: ["CMD", "echo", "ruok", "|", "nc", "localhost", "2181"]
interval: 5s
timeout: 5s
retries: 5
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# Сервис Kafka
kafka:
build: setup/messaging/kafka
hostname: kafka
container_name: kafka
depends_on:
zookeeper:
condition: service_healthy # Зависимость от успешной проверки готовности Zookeeper
ports:
- "29092:9092" # Проброс порта Kafka на локальный хост
environment:
<<: *kafka-common-env # Включение общих переменных окружения для Kafka
KAFKA_BROKER_ID: ${KAFKA_BROKER_ID}
KAFKA_ZOOKEEPER_CONNECT: ${KAFKA_ZOOKEEPER_CONNECT}
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: ${KAFKA_LISTENER_SECURITY_PROTOCOL_MAP}
KAFKA_ADVERTISED_LISTENERS: ${KAFKA_ADVERTISED_LISTENERS}
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: ${KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR}
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: ${KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS}
healthcheck:
# Проверка готовности Kafka сервиса
test: ["CMD", "kafka-broker-api-versions", "--bootstrap-server", "localhost:9092"]
interval: 5s
timeout: 30s
retries: 5
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# Сервис инициализации Kafka
kafka-init:
build: setup/messaging/kafka_init
container_name: kafka-init
depends_on:
kafka:
condition: service_healthy # Зависимость от успешной проверки готовности Kafka
environment:
<<: *kafka-common-env # Включение общих переменных окружения для Kafka
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# ================================
# Секция Apache Spark
# ================================
# Сервис Spark Master
spark-master:
build: setup/spark/spark-master
container_name: spark-master
environment:
<<: *spark-common-env # Включение общих переменных окружения для Spark
SPARK_MODE: master # Режим работы Spark – мастер
SPARK_MASTER_WEBUI_PORT: 8081 # Порт веб-интерфейса Spark Master
SPARK_DRIVER_MEMORY: 2g # Память, выделенная для драйвера Spark
SPARK_EXECUTOR_MEMORY: 2g # Память, выделенная для исполнителей Spark
SPARK_WORKER_CORES: 2 # Количество ядер для каждого воркера Spark
SPARK_WORKER_MEMORY: 2g # Память, выделенная для каждого воркера Spark
ports:
- "8081:8081" # Проброс порта веб-интерфейса Spark Master на локальный хост
volumes:
# Монтирование тома для сохранения данных Spark вне контейнера
- spark-data:/bitnami
healthcheck:
# Проверка готовности Spark Master сервиса
test: ["CMD-SHELL", "curl -f http://localhost:8081"]
interval: 10s
timeout: 5s
retries: 5
deploy:
resources:
limits:
cpus: '2'
memory: 2G
# Сервисы Spark Workers
spark-worker1:
build: setup/spark/spark-worker
container_name: spark-worker1
environment:
<<: *spark-common-env # Включение общих переменных окружения для Spark
SPARK_MODE: worker # Режим работы Spark – воркер
SPARK_MASTER_URL: spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT} # URL для подключения к Spark Master
SPARK_DRIVER_MEMORY: 2g
SPARK_EXECUTOR_MEMORY: 2g
SPARK_WORKER_CORES: 2
SPARK_WORKER_MEMORY: 2g
volumes:
- spark-data:/bitnami
depends_on:
spark-master:
condition: service_healthy # Зависимость от успешной проверки готовности Spark Master
deploy:
resources:
limits:
cpus: '2'
memory: 2G
spark-worker2:
build: setup/spark/spark-worker
container_name: spark-worker2
environment:
<<: *spark-common-env
SPARK_MODE: worker
SPARK_MASTER_URL: spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT}
SPARK_DRIVER_MEMORY: 2g
SPARK_EXECUTOR_MEMORY: 2g
SPARK_WORKER_CORES: 2
SPARK_WORKER_MEMORY: 2g
volumes:
- spark-data:/bitnami
depends_on:
spark-master:
condition: service_healthy
deploy:
resources:
limits:
cpus: '2'
memory: 2G
spark-worker3:
build: setup/spark/spark-worker
container_name: spark-worker3
environment:
<<: *spark-common-env
SPARK_MODE: worker
SPARK_MASTER_URL: spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT}
SPARK_DRIVER_MEMORY: 2g
SPARK_EXECUTOR_MEMORY: 2g
SPARK_WORKER_CORES: 2
SPARK_WORKER_MEMORY: 2g
volumes:
- spark-data:/bitnami
depends_on:
spark-master:
condition: service_healthy
deploy:
resources:
limits:
cpus: '2'
memory: 2G
# ================================
# Секция Генерации Данных (Datagen)
# ================================
# Сервис генерации данных для PostgreSQL
pg-datagen:
build: setup/datagen/pg_datagen
container_name: pg-datagen
depends_on:
postgresql:
condition: service_healthy # Зависимость от успешной проверки готовности PostgreSQL
environment:
<< : *pg-connect # Включение общих переменных окружения для PostgreSQL
# Параметры генерации данных
PG_DATAGEN_NUM_USERS: ${PG_DATAGEN_NUM_USERS}
PG_DATAGEN_NUM_PRODUCTS: ${PG_DATAGEN_NUM_PRODUCTS}
PG_DATAGEN_NUM_ORDERS: ${PG_DATAGEN_NUM_ORDERS}
PG_DATAGEN_NUM_ORDER_DETAILS_MIN: ${PG_DATAGEN_NUM_ORDER_DETAILS_MIN}
PG_DATAGEN_NUM_ORDER_DETAILS_MAX: ${PG_DATAGEN_NUM_ORDER_DETAILS_MAX}
PG_DATAGEN_NUM_REVIEWS: ${PG_DATAGEN_NUM_REVIEWS}
PG_DATAGEN_NUM_LOYALTY_POINTS: ${PG_DATAGEN_NUM_LOYALTY_POINTS}
volumes:
# Монтирование директории с кодом генерации данных в контейнер
- ./code/datagen/datagen_postgres:/app/src
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# Сервис генерации данных для Kafka
kafka-datagen:
build: setup/datagen/kafka_datagen
container_name: kafka-datagen
depends_on:
kafka-init:
condition: service_completed_successfully # Зависимость от успешного завершения kafka-init
environment:
<< : *kafka-common-env # Включение общих переменных окружения для Kafka
# Параметры генерации данных
KAFKA_DATAGEN_PERIOD_SECS: ${KAFKA_DATAGEN_PERIOD_SECS}
volumes:
- ./code/datagen/kafka_datagen:/app/src
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# ================================
# Секция Apache Airflow
# ================================
# Сервис инициализации Airflow
airflow-init:
build: setup/airflow/init
container_name: airflow-init
depends_on:
postgresql:
condition: service_healthy
mysql:
condition: service_healthy
kafka:
condition: service_healthy
spark-master:
condition: service_healthy
kafka-init:
condition: service_completed_successfully
pg-datagen:
condition: service_completed_successfully
environment:
<<: [*airflow-common-env, *pg-connect, *mysql-connect] # Включение общих переменных окружения для Airflow, PostgreSQL и MySQL
volumes:
# Монтирование директорий с DAG'ами и скриптами в контейнер
- ./code/airflow/dags:/opt/airflow/dags
- ./code/airflow/scripts:/opt/airflow/scripts
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# Сервис планировщика Airflow
airflow-scheduler:
build: setup/airflow/scheduler
container_name: airflow-scheduler
environment:
<<: [*airflow-common-env, *kafka-common-env] # Включение общих переменных окружения для Airflow и Kafka
restart: always # Автоматический перезапуск контейнера в случае сбоя
depends_on:
airflow-init:
condition: service_completed_successfully # Зависимость от успешной инициализации Airflow
volumes:
- ./code/airflow/dags:/opt/airflow/dags
- ./code/airflow/scripts:/opt/airflow/scripts
deploy:
resources:
limits:
cpus: '1'
memory: 1G
# Сервис веб-сервера Airflow
airflow-webserver:
build: setup/airflow/webserver
container_name: airflow-webserver
environment:
<<: *airflow-common-env # Включение общих переменных окружения для Airflow
ports:
- "8079:8080" # Проброс порта веб-сервера Airflow на локальный хост
restart: always
depends_on:
airflow-init:
condition: service_completed_successfully # Зависимость от успешной инициализации Airflow
volumes:
- ./code/airflow/dags:/opt/airflow/dags
- ./code/airflow/scripts:/opt/airflow/scripts
deploy:
resources:
limits:
cpus: '1'
memory: 1G
# Определение томов для сохранения данных вне контейнеров
volumes:
postgresql-data:
mysql-data:
spark-data: