dbhose-airflow 0.0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,432 @@
1
+ Metadata-Version: 2.4
2
+ Name: dbhose_airflow
3
+ Version: 0.0.0.1
4
+ Summary: airflow class for exchanging data between DBMSs in native binary formats.
5
+ Home-page: https://github.com/0xMihalich/dbhose
6
+ Author: 0xMihalich
7
+ Author-email: bayanmobile87@gmail.com
8
+ Description-Content-Type: text/markdown
9
+ License-File: README.md
10
+ License-File: CHANGELOG.md
11
+ Requires-Dist: apache-airflow>=2.4.3
12
+ Requires-Dist: dbhose-utils==0.0.0.6
13
+ Requires-Dist: native-dumper==0.3.2.2
14
+ Requires-Dist: pgpack-dumper==0.3.2.0
15
+ Dynamic: author
16
+ Dynamic: author-email
17
+ Dynamic: description
18
+ Dynamic: description-content-type
19
+ Dynamic: home-page
20
+ Dynamic: license-file
21
+ Dynamic: summary
22
+
23
+ # DBHose
24
+
25
+ Клиент для обмена данными между СУБД в нативных бинарных форматах
26
+
27
+ ```ascii
28
+ ( )
29
+ ( ( ) )\ ) ( ( /(
30
+ )\))( ' ( ( ) ( ( /( (()/( ( )\ )\()) (
31
+ ((_)()\ ) ))\ )\ ( ( ( ))\ )\()) ( /(_)) )((_) ((_)\ ( ( ))\
32
+ _(())\_)() /((_) (( ) )\ )\ )\ ' /((_) (_))/ )\ (_))_ ((_)_ _((_) )\ )\ /((_)
33
+ \ \((_)/ /(_)) | | ((_) ((_) _((_)) (_)) | |_ ((_) | \ | _ ) | || | ((_) ((_) (_))
34
+ \ \/\/ / / -_) | | / _| / _ \ | ' \() / -_) | _| / _ \ | |) | | _ \ | __ | / _ \ (_-< / -_)
35
+ \_/\_/ \___| |_| \__| \___/ |_|_|_| \___| \__| \___/ |___/ |___/ |_||_| \___/ /__/ \___|
36
+ ```
37
+
38
+
39
+ ## Аннотация
40
+
41
+ DBHose предназначен для обмена данными между различными СУБД с использованием их нативных бинарных форматов.
42
+ Решение позволяет избежать накладных расходов, связанных с промежуточными преобразованиями, обеспечивая производительность при переносе больших объемов данных.
43
+ На текущем этапе реализована поддержка PostgreSQL, Greenplum и ClickHouse, так же предусмотрена возможность расширения за счет подключения новых модулей.
44
+
45
+ ## Архитектура и Ключевые Компоненты
46
+
47
+ Платформа построена по модульному принципу и состоит из нескольких взаимосвязанных библиотек, каждая из которых решает свою задачу.
48
+
49
+ ## Низкоуровневые библиотеки для работы с бинарными форматами
50
+
51
+ ### pgcopylib (PostgreSQL/Greenplum)
52
+
53
+ https://github.com/0xMihalich/pgcopylib
54
+
55
+ Назначение
56
+
57
+ * Парсинг и генерация бинарного формата COPY для PostgreSQL и совместимых СУБД.
58
+
59
+ Реализация
60
+
61
+ * Низкоуровневые функции на Cython для прямого доступа к структуре данных при сериализации и десериализации.
62
+
63
+ ### pgpack (PostgreSQL/Greenplum) контейнер для хранения дампов pgcopy
64
+
65
+ https://github.com/0xMihalich/pgpack
66
+
67
+ Назначение
68
+
69
+ * Специализированный контейнер для локального хранения бинарных дампов.
70
+
71
+ Структура
72
+
73
+ * Заголовок b"PGPACK\n\x00" 8 байт
74
+ * Контрольная сумма метадаты zlib.crc32 4 байта
75
+ * Размер упакованного в zlib блока метадаты 4 байта
76
+ * Упакованный в zlib блок метадаты
77
+ * Метод компрессии 1 байт
78
+ * Размер упакованного блока pgcopy 8 байт
79
+ * Размер распакованного блока pgcopy 8 байт
80
+ * Упакованный блок pgcopy
81
+
82
+ Интерфейс
83
+
84
+ * PGPackReader для извлечения данных в виде списков Python объектов или pandas/polars DataFrame.
85
+ * PGPackWriter для записи данных из списков Python объектов или pandas/polars DataFrame.
86
+
87
+ ### nativelib (ClickHouse)
88
+
89
+ https://github.com/0xMihalich/nativelib
90
+
91
+ Назначение
92
+
93
+ * Работа с нативным бинарным форматом ClickHouse.
94
+
95
+ Реализация
96
+
97
+ * Низкоуровневые функции на Cython.
98
+ Ключевое отличие от принципа работы clickhouse-driver — обход стандартного требования ClickHouse к использованию CityHash128 для каждого блока данных за счет использования HTTP-протокола, который позволяет применять сжатие ко всему потоку, что упрощает процесс и повышает скорость.
99
+
100
+ ## light-compressor модуль для работы с компрессией в реальном времени (zstd, lz4)
101
+
102
+ https://github.com/0xMihalich/light_compressor
103
+
104
+ Назначение
105
+
106
+ * Оптимизированные компрессоры и декомпрессоры.
107
+
108
+ Реализация
109
+
110
+ * Переработанные низкоуровневые модули LZ4 и Zstandard с использованием Cython поверх CFFI и PyO3.
111
+ Оптимизировано для достижения максимально возможной скорости при взаимодействии с python для упаковки и распаковки.
112
+
113
+ ## Драйверы для взаимодействия с СУБД
114
+
115
+ ### pgpack_dumper (PostgreSQL/Greenplum)
116
+
117
+ https://github.com/0xMihalich/pgpack_dumper
118
+
119
+ Назначение
120
+
121
+ * Прием и отправка данных из таблиц, представлений, SQL запросов (поддерживается Multiquery), локальных файлов или представлений.
122
+
123
+ Реализация
124
+
125
+ * Использует psycopg с активацией бинарного режима COPY.
126
+
127
+ Принцип работы
128
+
129
+ Сохранение в файл формата PGPack
130
+
131
+ * получение метаданных -> получение pgcopy stream -> создание pgpack
132
+
133
+ ```ascii
134
+ ┌─────────────────────────────────────────────────┐
135
+ │ СОХРАНЕНИЕ В PGPACK │
136
+ └─────────────────────────────────────────────────┘
137
+
138
+ ┌─────────────┐ 1. Метаданные ┌─────────────┐
139
+ │ │ ──────────────────► │ │
140
+ │ PostgreSQL │ │ PGPack │
141
+ │ │ 2. PGCopy Stream │ Container │
142
+ │ Table │ ──────────────────► │ │
143
+ │ │ │• Schema │
144
+ │ │ 3. Создание │• Data │
145
+ │ │ контейнера │• Compression│
146
+ └─────────────┘ └─────────────┘
147
+ │ │
148
+ │ psycopg binary COPY │ pgpack
149
+ ▼ ▼
150
+ [Table Schema] → [Binary Stream] → [Zlib Schema] → [Compressed Data]
151
+ ```
152
+
153
+ Запись из формата PGPack
154
+
155
+ * открытие PGPackReader -> получение pgcopy stream -> передача в целевую таблицу
156
+
157
+ ```ascii
158
+ ┌─────────────────────────────────────────────────┐
159
+ │ ЗАПИСЬ ИЗ PGPACK │
160
+ └─────────────────────────────────────────────────┘
161
+
162
+ ┌─────────────┐ 1. Открытие ┌─────────────┐
163
+ │ │ ◄────────────────── │ │
164
+ │ PostgreSQL │ │ PGPack │
165
+ │ │ 2. PGCopy Stream │ Container │
166
+ │ Table │ ◄────────────────── │ │
167
+ │ │ │• Schema │
168
+ │ │ 3. Передача │• Data │
169
+ │ │ в таблицу │• Compression│
170
+ └─────────────┘ └─────────────┘
171
+ │ │
172
+ │ psycopg binary COPY │ pgpack
173
+ ▼ ▼
174
+ [INSERT] ← [Binary Stream] ← [Zlib Decompress] ← [LZ4 Decompress]
175
+ ```
176
+
177
+ Прямой обмен (PG/GP <-> PG/GP)
178
+
179
+ * Данные передаются без конвертации в режиме stream
180
+
181
+ ```ascii
182
+ ┌─────────────────────────────────────────────────┐
183
+ │ ПРЯМОЙ ОБМЕН PG/GP ↔ PG/GP │
184
+ └─────────────────────────────────────────────────┘
185
+
186
+ ┌─────────────┐ ┌─────────────┐
187
+ │ Source │ │ Target │
188
+ │ PostgreSQL │ ─────────────────► │ PostgreSQL │
189
+ │ │ PGCopy Stream │ │
190
+ │ Table A │ (без конвертации)│ Table B │
191
+ │ │ ◄───────────────── │ │
192
+ └─────────────┘ └─────────────┘
193
+ │ │
194
+ │ │
195
+ ▼ ▼
196
+ [Binary COPY] → [Network] → [Binary COPY]
197
+ ```
198
+
199
+ Кросс-платформенная отправка (PG/GP -> ClickHouse)
200
+
201
+ * получение метаданных -> получение pgcopy stream -> преобразование в native stream -> передача в целевую таблицу
202
+
203
+ ```ascii
204
+ ┌─────────────────────────────────────────────────┐
205
+ │ PG/GP → ClickHouse (ОТПРАВКА) │
206
+ └─────────────────────────────────────────────────┘
207
+
208
+ ┌─────────────┐ 1. Метаданные ┌─────────────┐
209
+ │ PostgreSQL │ ────┐ ┌───────── │ ClickHouse │
210
+ │ │ ▼ ▼ │ │
211
+ │ Table │ 2. PGCopy Stream │ Table │
212
+ │ │ ────┐ │ │
213
+ └─────────────┘ │ └─────────────┘
214
+ │ │ ▲
215
+ │ pgcopylib │ 4. Native Stream │ native_dumper
216
+ ▼ │ │
217
+ [Binary COPY] → [Конвертер] → → [Native Format]
218
+
219
+ 3. Преобразование
220
+ PGCopy → Native
221
+
222
+ nativelib + light_compressor
223
+ ```
224
+
225
+ Кросс-платформенный прием (ClickHouse -> PG/GP)
226
+
227
+ * получение метаданных -> получение native stream -> преобразование в pgcopy stream -> передача в целевую таблицу
228
+
229
+ ```ascii
230
+ ┌─────────────────────────────────────────────────┐
231
+ │ ClickHouse → PG/GP (ПРИЕМ) │
232
+ └─────────────────────────────────────────────────┘
233
+
234
+ ┌─────────────┐ 1. Метаданные ┌─────────────┐
235
+ │ ClickHouse │ ────┐ ┌───────── │ PostgreSQL │
236
+ │ │ ▼ ▼ │ │
237
+ │ Table │ 2. Native Stream │ Table │
238
+ │ │ ────┐ │ │
239
+ └─────────────┘ │ └─────────────┘
240
+ │ │ ▲
241
+ │ nativelib │ 4. PGCopy Stream │ pgpack_dumper
242
+ ▼ │ │
243
+ [Native Format] → [Конвертер] → → [Binary COPY]
244
+
245
+ 3. Преобразование
246
+ Native → PGCopy
247
+
248
+ pgcopylib + light_compressor
249
+ ```
250
+
251
+ ### native_dumper (ClickHouse)
252
+
253
+ https://github.com/0xMihalich/native_dumper
254
+
255
+ Назначение
256
+
257
+ * Прием и отправка данных из таблиц, представлений, SQL запросов (поддерживается Multiquery), локальных файлов или представлений.
258
+
259
+ Реализация
260
+
261
+ * Кастомный HTTP-клиент, написанный на Rust, для работы с ClickHouse в формате Native.
262
+ Поддерживаемые типы сжатия LZ4, ZSTD или NONE (без компрессии).
263
+
264
+ Принцип работы
265
+
266
+ Сохранение в файл формата Native
267
+
268
+ * получение stream -> сохранение в файл
269
+
270
+ ```ascii
271
+ ┌─────────────────────────────────────────────────┐
272
+ │ СОХРАНЕНИЕ В NATIVE ФАЙЛ │
273
+ └─────────────────────────────────────────────────┘
274
+
275
+ ┌─────────────┐ ┌─────────────┐
276
+ │ ClickHouse │ │ Native File │
277
+ │ │ │ │
278
+ │ Table │ ─────────────────► │ Format │
279
+ │ │ Native Stream │ │
280
+ │ │ │• Blocks │
281
+ │ │ │• Headers │
282
+ │ │ │• Compression│
283
+ └─────────────┘ └─────────────┘
284
+ │ │
285
+ │ native_dumper │ File.write()
286
+ ▼ ▼
287
+ [Native Blocks] → → → → → → → → → [File]
288
+ ```
289
+
290
+ Запись из формата Native
291
+
292
+ * определение кодека сжатия -> принятие решения менять компрессор или передавать как есть -> передача в целевую таблицу
293
+
294
+ ```ascii
295
+ ┌─────────────────────────────────────────────────┐
296
+ │ ЗАПИСЬ ИЗ NATIVE ФАЙЛА │
297
+ └─────────────────────────────────────────────────┘
298
+
299
+ ┌─────────────┐ ┌─────────────┐
300
+ │ ClickHouse │ │ Native File │
301
+ │ │ │ │
302
+ │ Table │ ◄───────────────── │ Format │
303
+ │ │ Native Stream │ │
304
+ │ │ │• Blocks │
305
+ │ │ │• Headers │
306
+ │ │ │• Compression│
307
+ └─────────────┘ └─────────────┘
308
+ │ │
309
+ │ native_dumper │ File.read()
310
+ ▼ ▼
311
+ [INSERT] ← [Native Blocks] ← [Decompression] ← [File Read]
312
+
313
+ Определение кодека сжатия
314
+ → Решение: менять компрессор или оставить как есть
315
+ ```
316
+
317
+ Прямой обмен (ClickHouse <-> ClickHouse)
318
+
319
+ * получение stream -> принятие решения менять компрессор или передавать как есть -> передача в целевую таблицу
320
+
321
+ ```ascii
322
+ ┌─────────────────────────────────────────────────┐
323
+ │ ПРЯМОЙ ОБМЕН CH ↔ ClickHouse │
324
+ └─────────────────────────────────────────────────┘
325
+
326
+ ┌─────────────┐ ┌─────────────┐
327
+ │ Source │ │ Target │
328
+ │ ClickHouse │ ─────────────────► │ ClickHouse │
329
+ │ │ Native Stream │ │
330
+ │ Table A │ (минимальная │ Table B │
331
+ │ │ конвертация) │ │
332
+ │ │ ◄───────────────── │ │
333
+ └─────────────┘ └─────────────┘
334
+ │ │
335
+ │ native_dumper │ native_dumper
336
+ ▼ ▼
337
+ [Native Format] → [Compression Decision] → [Native Format]
338
+
339
+ Анализ сжатия:
340
+ • Оставить исходный компрессор
341
+ • Или изменить на оптимальный
342
+ ```
343
+
344
+ Кросс-платформенная отправка (ClickHouse -> PG/GP)
345
+
346
+ * получение метаданных PG/GP -> получение native stream -> преобразование в pgcopy stream -> передача в целевую таблицу
347
+
348
+ ```ascii
349
+ ┌─────────────────────────────────────────────────┐
350
+ │ ClickHouse → PG/GP (ОТПРАВКА) │
351
+ └─────────────────────────────────────────────────┘
352
+
353
+ ┌─────────────┐ 1. Метаданные ┌─────────────┐
354
+ │ ClickHouse │ ┌───────────── │ PostgreSQL │
355
+ │ │ ▼ │ │
356
+ │ Table │ 2. Native Stream │ Table │
357
+ │ │ ────┐ │ │
358
+ └─────────────┘ │ └─────────────┘
359
+ │ │ ▲
360
+ │ nativelib │ 4. PGCopy Stream │ pgpack_dumper
361
+ ▼ │ │
362
+ [Native Format] → [Конвертер] → → [Binary COPY]
363
+
364
+ 3. Преобразование
365
+ Native → light_compressor → PGCopy
366
+
367
+ pgcopylib
368
+ ```
369
+
370
+ Кросс-платформенный прием (PG/GP -> ClickHouse)
371
+
372
+ * получение метаданных Clickhouse -> получение pgcopy stream -> преобразование в native stream -> передача в целевую таблицу
373
+
374
+ ```ascii
375
+ ┌─────────────────────────────────────────────────┐
376
+ │ PG/GP → ClickHouse (ПРИЕМ) │
377
+ └─────────────────────────────────────────────────┘
378
+
379
+ ┌─────────────┐ 1. Метаданные ┌─────────────┐
380
+ │ PostgreSQL │ ┌────────────── │ ClickHouse │
381
+ │ │ ▼ │ │
382
+ │ Table │ 2. PGCopy Stream │ Table │
383
+ │ │ ────┐ │ │
384
+ └─────────────┘ │ └─────────────┘
385
+ │ │ ▲
386
+ │ pgcopylib │ 4. Native Stream │ native_dumper
387
+ ▼ │ │
388
+ [Binary COPY] → [Конвертер] → → [Native Format]
389
+
390
+ 3. Преобразование
391
+ PGCopy → Native
392
+
393
+ nativelib + light_compressor
394
+ ```
395
+
396
+ ## DBHouse Utils
397
+
398
+ https://github.com/0xMihalich/dbhose_utils
399
+
400
+ Назначение
401
+
402
+ * Набор инструментов для конвертации между форматами Native, PGPack и PGCopy
403
+
404
+ Реализация
405
+
406
+ * Функция dump_detective для автоматического определения формата входного файла дампа и выбора соответствующего ридера
407
+ * Функция dump_convertor для конвертации дампа в другой формат либо смены кодека сжатия / распаковки в формат без компрессии
408
+
409
+ ## Ключевые особенности
410
+
411
+ * Производительность: Использование нативных форматов и низкоуровневых оптимизаций на Cython/Rust минимизирует накладные расходы.
412
+ * Сжатие: Интеграция с алгоритмами LZ4 и ZSTD на уровне контейнера (pgpack) и сетевого протокола.
413
+ * Модульность: Архитектура позволяет добавлять поддержку других СУБД путем добавления новых библиотек.
414
+ * Использование: Каждая библиотека может быть использована как отдельный модуль, так же в разработке общий CLI-интерфейс.
415
+
416
+ ## Дальнейшее развитие проекта
417
+
418
+ Ближайшее время
419
+
420
+ CLI с рабочим названием DBHose, который предоставит единую точку входа для управления всеми модулями и операциями по переносу данных.
421
+
422
+ Среднесрочная перспектива
423
+
424
+ * Багфикс того, что будет найдено в процессе тестирования
425
+ * Добавление поддержки других типов данных Clickhouse (nativelib)
426
+ * Добавление конвертации в формат parquiet
427
+
428
+ Долгосрочная перспектива
429
+
430
+ * Добавить модуль для работы с SQL Server (MS SQL)
431
+ * Добавить модуль для работы с MySQL
432
+ * Добавить модуль для работы с Oracle
@@ -0,0 +1,11 @@
1
+ dbhose_airflow/__init__.py,sha256=koEcB4BSaS7H2nvShUvtjA0lqE88pfgL3P3V0iZIRIw,14308
2
+ dbhose_airflow/airflow_connect.py,sha256=unsRItnK4Q_ieMiGKEsCw8Q_8wkaXdVOfaSWLNRyujM,906
3
+ dbhose_airflow/dq_check.py,sha256=VoAw8qieA5LM1a7jaMPO3AQ7QXe_-ThZ8Gy868ozjHw,689
4
+ dbhose_airflow/dumper.py,sha256=9BEJ36yUJ9gH5PiVirLXymSKPOgABtp7Ee8U6MtEckY,1843
5
+ dbhose_airflow/move_method.py,sha256=c4g7wuiwDKudrKSWP4ov1atJGIFknHCgPnY9FMf9Ymc,477
6
+ dbhose_airflow-0.0.0.1.dist-info/licenses/CHANGELOG.md,sha256=VSADpjzH2GZfjSM6ZZAficIrxpJlnvbwz2VzQwxXl3A,75
7
+ dbhose_airflow-0.0.0.1.dist-info/licenses/README.md,sha256=_HIKpo1Cs3G25Xa91Viajyjdxk_EPE6TKO9jnNFpWqA,24201
8
+ dbhose_airflow-0.0.0.1.dist-info/METADATA,sha256=VP91T5ddFaXOvMyuR_FuFU9x4TTpQkf55Zbz4yCVy5c,24842
9
+ dbhose_airflow-0.0.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
+ dbhose_airflow-0.0.0.1.dist-info/top_level.txt,sha256=VlTXT0CLGGcVhbG9QPw2_a8H5UV03QMjvZ-NrPy6_jM,15
11
+ dbhose_airflow-0.0.0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,5 @@
1
+ # Version History
2
+
3
+ ## 0.0.0.1
4
+
5
+ First version of the library dbhose_airflow