Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

ETL на Python

3.028 visualizaciones

Publicado el

Обзор инструментов для построения дата пайплайнов в Python

Publicado en: Datos y análisis
  • Sé el primero en comentar

ETL на Python

  1. 1. ETL на Python, или построение идемпотентных дата пайплайнов
  2. 2. ~$ whoami ● Пишу на Python 8 лет ● Tech Lead в Playrix (Marketing) ● Веду блог khashtamov.com
  3. 3. ● 100TB+ данных ● 1000+ распределенных сотрудников ● 100+ миллионов событий в день ● 10+ миллионов игроков в день
  4. 4. Что такое ETL (Extract Transform Load):
  5. 5. Как оно бывает ● Кастомные скриптики/процедуры/вьюхи ● Ручной деплой ● Крон для запуска batch задач
  6. 6. Проблемы ● Задачи растут как снежный ком ● Зависимые задачи ● Мониторинг ● Retry механизм
  7. 7. Apache Airflow
  8. 8. ● Разработан Spotify, открыт в 2012 ● S3, Amazon, Hadoop, Spark, PostgreSQL… ● удобный retry механизм ● удобное определение зависимостей ● оповещения и хуки ● простой код
  9. 9. class DownloadFileTask(luigi.Task): def run(self): url = f'https://s3.amazonaws.com/nyc-tlc/trip+data/file.csv' self.output().makedirs() # in case path does not exist response = requests.get(url, stream=True) response.raise_for_status() with self.output().open(mode='w') as f: for chunk in response.iter_lines(): f.write('{}n'.format(chunk.decode('utf-8'))) def output(self): return luigi.LocalTarget(os.path.join('data', self.filename))
  10. 10. class AggregateTaxiTripTask(luigi.Task): def requires(self): return DownloadTaxiTripTask() def run(self): with self.input().open() as input, self.output().open('w') as output: self.output().makedirs() result = aggregate_taxi_data(input) output.write(result) def output(self): return luigi.LocalTarget(os.path.join('data', f'nyc-taxi-agg.csv'))
  11. 11. TASK
  12. 12. TARGET
  13. 13. Недостатки ● нет планировщика (есть координатор) ● проблемы с масштабированием “In the future, Luigi might implement its own triggering. The dependency on crontab (or any external triggering mechanism) is a bit awkward and it would be nice to avoid” https://luigi.readthedocs.io/en/stable/execution_model.html#scheduler
  14. 14. Apache Airflow ● Разработан AirBnB (Maxime Beauchemin) ● Мощный каркас для сложных пайплайнов ● Flask + Celery
  15. 15. Killer фичи ● Мощный Web UI с планировщиком, базой и логами ● Легко масштабируется за счет очередей (Celery/Dask) ● Хранилище конфигов (с шифрованием) ● Набор готовых операторов (Redshift, Hadoop, Bash, Python)
  16. 16. Operator
  17. 17. from airflow.operators.redshift_to_s3_operator import RedshiftToS3Transfer run_this = RedshiftToS3Transfer( schema='public', table='my_very_big_table', s3_bucket='my-s3-bucket', s3_key='unload-airflow', redshift_conn_id='my_redshift_conn', aws_conn_id='my_s3_conn', task_id='redshift_unload', dag=dag )
  18. 18. Операторы ● BashOperator ● PostgresOperator ● EmailOperator ● PythonOperator ● ….
  19. 19. DAG
  20. 20. from datetime import datetime from airflow.models import DAG args = { 'owner': 'airflow', 'start_date': datetime(2018, 10, 5), } dag = DAG( dag_id='my_unload_redshift', default_args=args, schedule_interval=None )
  21. 21. Sensor
  22. 22. Тестирование ● Unit-тесты ● Не пишите логику в тасках (Luigi) ● localstack для AWS
  23. 23. А можно ещё ?
  24. 24. ● Apache NiFi ● Prefect ● RQ ● Celery ● Dask
  25. 25. Что выбрать?
  26. 26. ¿Q & A? @adilkhash telegram: @dataeng_chat

×