рд╣реЕрд▓реЛ, рд╣реЕрдмреНрд░! рдпрд╛ рд▓реЗрдЦрд╛рдд рдорд▓рд╛ рдмреЕрдЪ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХрд╛ рдЙрддреНрддрдо рд╕рд╛рдзрдирд╛рдмрджреНрджрд▓ рдмреЛрд▓рд╛рдпрдЪреЗ рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдбреАрдбрдмреНрд▓реНрдпреВрдПрдЪ рдХрд┐рдВрд╡рд╛ рддреБрдордЪреНрдпрд╛ рдбреЗрдЯрд╛рд▓реЗрдХрдЪреНрдпрд╛ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдордзреНрдпреЗ. рдЖрдореНрд╣реА Apache Airflow (рдпрд╛рдкреБрдвреЗ Airflow рдореНрд╣рдгреВрди рд╕рдВрджрд░реНрднрд┐рдд) рдмрджреНрджрд▓ рдмреЛрд▓реВ. рд╣реЗ Habr├й рд╡рд░ рдЕрдиреНрдпрд╛рдпрдХрд╛рд░рдХрдкрдгреЗ рд▓рдХреНрд╖ рджреЗрдгреНрдпрд╛рдкрд╛рд╕реВрди рд╡рдВрдЪрд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рдореБрдЦреНрдп рднрд╛рдЧрд╛рдд рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдкрдЯрд╡реВрди рджреЗрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди рдХреА рддреБрдордЪреНрдпрд╛ ETL/ELT рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рд╢реЗрдбреНрдпреБрд▓рд░ рдирд┐рд╡рдбрддрд╛рдирд╛ рдХрд┐рдорд╛рди Airflow рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ.
рдкреВрд░реНрд╡реА, рдореА рдЯрд┐рдВрдХреЙрдл рдмрдБрдХреЗрдд рдХрд╛рдо рдХрд░рддрд╛рдирд╛ DWH рд╡рд┐рд╖рдпрд╛рд╡рд░ рд▓реЗрдЦрд╛рдВрдЪреА рдорд╛рд▓рд┐рдХрд╛ рд▓рд┐рд╣рд┐рд▓реА рд╣реЛрддреА. рдЖрддрд╛ рдореА Mail.Ru рдЧреНрд░реБрдк рдЯреАрдордЪрд╛ рднрд╛рдЧ рдЭрд╛рд▓реЛ рдЖрд╣реЗ рдЖрдгрд┐ рдЧреЗрдорд┐рдВрдЧ рдХреНрд╖реЗрддреНрд░рд╛рдд рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рдПрдХ рд╡реНрдпрд╛рд╕рдкреАрда рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдд рдЖрд╣реЗ. рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдмрд╛рддрдореНрдпрд╛ рдЖрдгрд┐ рдордиреЛрд░рдВрдЬрдХ рдЙрдкрд╛рдп рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реНрдпрд╛рд╡рд░, рдореА рдЖрдгрд┐ рдорд╛рдЭреА рдЯреАрдо рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордмрджреНрджрд▓ рдпреЗрдереЗ рдмреЛрд▓реВ.
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рддрд░, рдЪрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛. рдПрдЕрд░рдлреНрд▓реЛ рдореНрд╣рдгрдЬреЗ рдХрд╛рдп? рд╣реА рд▓рд╛рдпрдмреНрд░рд░реА рдЖрд╣реЗ (рдХрд┐рдВрд╡рд╛
рдЖрддрд╛ рдПрдЕрд░рдлреНрд▓реЛрдЪреНрдпрд╛ рдореБрдЦреНрдп рдШрдЯрдХрд╛рдВрдХрдбреЗ рдкрд╛рд╣реВ. рддреНрдпрд╛рдВрдЪреЗ рд╕рд╛рд░ рдЖрдгрд┐ рдЙрджреНрджреЗрд╢ рд╕рдордЬреВрди рдШреЗрдКрди, рддреБрдореНрд╣реА рддреБрдордЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реВ рд╢рдХрддрд╛. рдХрджрд╛рдЪрд┐рдд рдореБрдЦреНрдп рдШрдЯрдХ рдбрд╛рдпрд░реЗрдХреНрдЯреЗрдб рдЕреЕрд╕рд╛рдпрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл (рдпрд╛рдкреБрдвреЗ DAG рдореНрд╣рдгреВрди рд╕рдВрджрд░реНрднрд┐рдд) рдЖрд╣реЗ.
рджрд┐рд╡рд╕
рдбреАрдПрдЬреА рд╣реА рддреБрдордЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдВрдЪреА рдХрд╛рд╣реА рдЕрд░реНрдердкреВрд░реНрдг рд╕рдВрдШрдЯрдирд╛ рдЖрд╣реЗ рдЬреА рддреБрдореНрд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдХрд╛рдЯреЗрдХреЛрд░рдкрдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд░рдорд╛рдиреЗ рдкреВрд░реНрдг рдХрд░реВ рдЗрдЪреНрдЫрд┐рддрд╛. рдПрдЕрд░рдлреНрд▓реЛ DAGs рдЖрдгрд┐ рдЗрддрд░ рдШрдЯрдХрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдпреАрд╕реНрдХрд░ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ:
DAG рдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕реВ рд╢рдХрддреЗ:
рд╡рд┐рдХрд╛рд╕рдХ, рдбреАрдПрдЬреАрдЪреА рд░рдЪрдирд╛ рдХрд░рддрд╛рдирд╛, рдСрдкрд░реЗрдЯрд░рдЪрд╛ рдПрдХ рд╕рдВрдЪ рдареЗрд╡рддреЛ рдЬреНрдпрд╛рд╡рд░ DAG рдЕрдВрддрд░реНрдЧрдд рдХрд╛рд░реНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддреАрд▓. рдпреЗрдереЗ рдЖрдкрдг рдЖрдгрдЦреА рдПрдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреНрдпрд╛ рдШрдЯрдХрд╛рдХрдбреЗ рдЖрд▓реЛ рдЖрд╣реЛрдд: рдПрдЕрд░рдлреНрд▓реЛ рдСрдкрд░реЗрдЯрд░.
рдСрдкрд░реЗрдЯрд░
рдСрдкрд░реЗрдЯрд░ рд╣реА рдПрдХ рд╕рдВрд╕реНрдерд╛ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзрд╛рд░рд╛рд╡рд░ рдиреЛрдХрд░реАрдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд, рдЬреА рдиреЛрдХрд░реАрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрджрд░рдореНрдпрд╛рди рдХрд╛рдп рдШрдбреЗрд▓ рдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ.
- рдмреЕрд╢рдСрдкрд░реЗрдЯрд░ - рдмреЕрд╢ рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкрд░реЗрдЯрд░.
- PythonOperator - Python рдХреЛрдб рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкрд░реЗрдЯрд░.
- EmailOperator тАФ рдИрдореЗрд▓ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкрд░реЗрдЯрд░.
- HTTPOperator - HTTP рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкрд░реЗрдЯрд░.
- SqlOperator - SQL рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкрд░реЗрдЯрд░.
- рд╕реЗрдиреНрд╕рд░ рд╣рд╛ рдЗрд╡реНрд╣реЗрдВрдЯрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдгрд╛рд░рд╛ рдСрдкрд░реЗрдЯрд░ рдЖрд╣реЗ (рдЖрд╡рд╢реНрдпрдХ рд╡реЗрд│реЗрдЪреЗ рдЖрдЧрдорди, рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓рдЪреЗ рд╕реНрд╡рд░реВрдк, рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рдПрдХ рдУрд│, API рдХрдбреВрди рдкреНрд░рддрд┐рд╕рд╛рдж рдЗ. рдЗ.).
рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ рдЖрд╣реЗрдд: DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator.
рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪрд╛ рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдд рд╡рд╛рдкрд░ рдХрд░реВ рд╢рдХрддрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА MongoDBToHiveViaHdfsTransfer, рдореЛрдВрдЧреЛрдбреАрдмреА рд╡рд░реВрди Hive рдордзреНрдпреЗ рджрд╕реНрддрдРрд╡рдЬ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкрд░реЗрдЯрд░ рдЖрдгрд┐ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдСрдкрд░реЗрдЯрд░ рддрдпрд╛рд░ рдХреЗрд▓реЗ
рдкреБрдвреЗ, рдХрд╛рд░реНрдпрд╛рдВрдЪреА рд╣реА рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрддрд╛ рдЖрдкрдг рд╢реЗрдбреНрдпреВрд▓рд░рдмрджреНрджрд▓ рдмреЛрд▓реВ.
рд╢реЗрдбреНрдпреБрд▓рд░
рдПрдЕрд░рдлреНрд▓реЛрдЪреЗ рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреБрд▓рд░ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ
рдкреНрд░рддреНрдпреЗрдХ рдкреВрд▓рдордзреНрдпреЗ рд╕реНрд▓реЙрдЯрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрд╡рд░ рдорд░реНрдпрд╛рджрд╛ рдЕрд╕рддреЗ. DAG рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛, рддреНрдпрд╛рд▓рд╛ рдПрдХ рдкреВрд▓ рджрд┐рд▓рд╛ рдЬрд╛рддреЛ:
ALERT_MAILS = Variable.get("gv_mail_admin_dwh")
DAG_NAME = 'dma_load'
OWNER = 'Vasya Pupkin'
DEPENDS_ON_PAST = True
EMAIL_ON_FAILURE = True
EMAIL_ON_RETRY = True
RETRIES = int(Variable.get('gv_dag_retries'))
POOL = 'dma_pool'
PRIORITY_WEIGHT = 10
start_dt = datetime.today() - timedelta(1)
start_dt = datetime(start_dt.year, start_dt.month, start_dt.day)
default_args = {
'owner': OWNER,
'depends_on_past': DEPENDS_ON_PAST,
'start_date': start_dt,
'email': ALERT_MAILS,
'email_on_failure': EMAIL_ON_FAILURE,
'email_on_retry': EMAIL_ON_RETRY,
'retries': RETRIES,
'pool': POOL,
'priority_weight': PRIORITY_WEIGHT
}
dag = DAG(DAG_NAME, default_args=default_args)
dag.doc_md = __doc__
DAG рд╕реНрддрд░рд╛рд╡рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рдкреВрд▓ рдХрд╛рд░реНрдп рд╕реНрддрд░рд╛рд╡рд░ рдЕрдзрд┐рд▓рд┐рдЦрд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.
рдПрдХ рд╡реЗрдЧрд│реА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рд╢реЗрдбреНрдпреБрд▓рд░, рдПрдЕрд░рдлреНрд▓реЛрдордзреАрд▓ рд╕рд░реНрд╡ рдХрд╛рд░реНрдпреЗ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ. рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рд╢реЗрдбреНрдпреБрд▓рд░ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдпрд╛рдВрддреНрд░рд┐рдХреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ. рдХрд╛рд░реНрдп рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЕрдиреЗрдХ рдЯрдкреНрдкреНрдпрд╛рдВрддреВрди рдЬрд╛рддреЗ:
- DAG рдордзреНрдпреЗ рдкреВрд░реНрд╡реАрдЪреА рдХрд╛рдореЗ рдкреВрд░реНрдг рдЭрд╛рд▓реА рдЖрд╣реЗрдд; рдирд╡реАрди рдХрд╛рд░реНрдп рд░рд╛рдВрдЧреЗрдд рд▓рд╛рд╡рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
- рдХрд╛рд░реНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд░рд╛рдВрдЧреЗрдЪреА рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рд▓реА рдЬрд╛рддреЗ (рдкреНрд░рд╛рдзрд╛рдиреНрдпрдХреНрд░рдо рджреЗрдЦреАрд▓ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд), рдЖрдгрд┐ рдЬрд░ рдкреВрд▓рдордзреНрдпреЗ рдПрдХ рд╡рд┐рдирд╛рдореВрд▓реНрдп рд╕реНрд▓реЙрдЯ рдЕрд╕реЗрд▓, рддрд░ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
- рдЬрд░ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗрд▓реЗрд░реА рдЕрд╕реЗрд▓ рддрд░, рдХрд╛рд░реНрдп рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рдкрд╛рдард╡рд▓реЗ рдЬрд╛рддреЗ; рдЖрдкрдг рд╕рдорд╕реНрдпреЗрдордзреНрдпреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗрд▓реЗрд▓реЗ рдХрд╛рд░реНрдп рдПрдХ рдХрд┐рдВрд╡рд╛ рджреБрд╕рд░реНрдпрд╛ рдСрдкрд░реЗрдЯрд░рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рд╕реБрд░реВ рд╣реЛрддреЗ.
рдкреБрд░реЗрд╢реА рд╕рд╛рдзреА.
рд╢реЗрдбреНрдпреБрд▓рд░ рд╕рд░реНрд╡ DAGs рдЖрдгрд┐ DAGs рдордзреАрд▓ рд╕рд░реНрд╡ рдХрд╛рд░реНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реЗрдЯрд╡рд░ рдЪрд╛рд▓рддреЗ.
рд╢реЗрдбреНрдпреБрд▓рд░рдиреЗ DAG рд╕реЛрдмрдд рдХрд╛рдо рд╕реБрд░реВ рдХрд░рдгреНтАНрдпрд╛рд╕рд╛рдареА, DAG рдиреЗ рд╢реЗрдбреНрдпреВрд▓ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНтАНрдпрдХ рдЖрд╣реЗ:
dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='@hourly')
рддрдпрд╛рд░ рдкреНрд░реАрд╕реЗрдЯрдЪрд╛ рд╕рдВрдЪ рдЖрд╣реЗ: @once
, @hourly
, @daily
, @weekly
, @monthly
, @yearly
.
рдЖрдкрдг рдХреНрд░реЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддреА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛:
dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='*/10 * * * *')
рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рддрд╛рд░реАрдЦ
рдПрдЕрд░рдлреНрд▓реЛ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, DAG рд╕рд╛рдареА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рддрд╛рд░реАрдЦ рдХрд╛рдп рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рдПрдЕрд░рдлреНрд▓реЛрдордзреНрдпреЗ, DAG рд▓рд╛ рдПрдХ рдПрдХреНрдЭрд┐рдХреНрдпреВрд╢рди рдбреЗрдЯ рдбрд╛рдпрдореЗрдВрд╢рди рдЕрд╕рддреЗ, рдореНрд╣рдгрдЬреЗ, DAG рдЪреНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╢реЗрдбреНрдпреВрд▓рдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрдЭрд┐рдХреНрдпреВрд╢рди рдбреЗрдЯрд╕рд╛рдареА рдЯрд╛рд╕реНрдХ рдЗрдиреНрд╕реНрдЯрдиреНрд╕ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреНрдпрд╛ рддрд╛рд░рдЦреЗрд╕рд╛рдареА, рдХрд╛рд░реНрдпреЗ рдкреБрдиреНрд╣рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд - рдХрд┐рдВрд╡рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, DAG рдЕрдиреЗрдХ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рддрд╛рд░рдЦрд╛рдВрдордзреНрдпреЗ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддреЗ. рд╣реЗ рдпреЗрдереЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рджрд░реНрд╢рд╡рд┐рд▓реЗ рдЖрд╣реЗ:
рджреБрд░реНрджреИрд╡рд╛рдиреЗ (рдХрд┐рдВрд╡рд╛ рдХрджрд╛рдЪрд┐рдд рд╕реБрджреИрд╡рд╛рдиреЗ: рддреЗ рдкрд░рд┐рд╕реНрдерд┐рддреАрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ), рдЬрд░ DAG рдордзреАрд▓ рдХрд╛рд░реНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджреБрд░реБрд╕реНрдд рдХреЗрд▓реА рдЧреЗрд▓реА, рддрд░ рдорд╛рдЧреАрд▓ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреНрдпрд╛ рддрд╛рд░рдЦреЗрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕рдорд╛рдпреЛрдЬрдиреЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдКрди рдкреБрдвреЗ рдЬрд╛рдИрд▓. рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╛рдкрд░реВрди рдорд╛рдЧреАрд▓ рдХрд╛рд▓рд╛рд╡рдзреАрддреАрд▓ рдбреЗрдЯрд╛рдЪреА рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд░рд╛рдпрдЪреА рдЕрд╕реЗрд▓ рддрд░ рд╣реЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЗ рд╡рд╛рдИрдЯ рдЖрд╣реЗ рдХрд╛рд░рдг рдкрд░рд┐рдгрд╛рдорд╛рдЪреА рдкреБрдирд░реБрддреНрдкрд╛рджрди рдХреНрд╖рдорддрд╛ рдЧрдорд╛рд╡рд▓реА рдЖрд╣реЗ (рдЕрд░реНрдерд╛рддрдЪ, Git рд╡рд░реВрди рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдЪреА рдЖрд╡рд╢реНрдпрдХ рдЖрд╡реГрддреНрддреА рдкрд░рдд рдХрд░рдгреНрдпрд╛рд╕ рдХреЛрдгреАрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрд░рд╛рд╕ рджреЗрдд рдирд╛рд╣реА рдЖрдгрд┐ рдХрд╛рдп рдЧрдгрдирд╛ рдХрд░рд╛. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХ рд╡реЗрд│ рд╣рд╡рд╛ рдЖрд╣реЗ, рдЬреНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рддреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ).
рдХрд╛рд░реНрдпреЗ рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреЗ
DAG рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╣рд╛ Python рдордзреАрд▓ рдХреЛрдб рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХрд╛рдо рдХрд░рддрд╛рдирд╛ рдХреЛрдбрдЪреЗ рдкреНрд░рдорд╛рдг рдХрдореА рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдЕрддрд┐рд╢рдп рд╕реЛрдпреАрдЪрд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╢рд╛рд░реНрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрд╕рд╣. рд╕рдордЬрд╛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рд╕реНрддреНрд░реЛрдд рдореНрд╣рдгреВрди рддреАрди MySQL рд╢рд╛рд░реНрдбреНрд╕ рдЖрд╣реЗрдд, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдордзреНрдпреЗ рдЪрдвреВрди рдХрд╛рд╣реА рдбреЗрдЯрд╛ рдЙрдЪрд▓рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рд╢рд┐рд╡рд╛рдп, рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЖрдгрд┐ рд╕рдорд╛рдВрддрд░. рдбреАрдПрдЬреА рдордзреАрд▓ рдкрд╛рдпрдерди рдХреЛрдб рдпрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕реВ рд╢рдХрддреЛ:
connection_list = lv.get('connection_list')
export_profiles_sql = '''
SELECT
id,
user_id,
nickname,
gender,
{{params.shard_id}} as shard_id
FROM profiles
'''
for conn_id in connection_list:
export_profiles = SqlToHiveViaHdfsTransfer(
task_id='export_profiles_from_' + conn_id,
sql=export_profiles_sql,
hive_table='stg.profiles',
overwrite=False,
tmpdir='/data/tmp',
conn_id=conn_id,
params={'shard_id': conn_id[-1:], },
compress=None,
dag=dag
)
export_profiles.set_upstream(exec_truncate_stg)
export_profiles.set_downstream(load_profiles)
рдбреАрдПрдЬреА рдЕрд╕реЗ рджрд┐рд╕рддреЗ:
рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рддреБрдореНрд╣реА рдлрдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реВрди рдЖрдгрд┐ DAG рдЕрджреНрдпрддрдирд┐рдд рдХрд░реВрди рд╢рд╛рд░реНрдб рдЬреЛрдбреВ рдХрд┐рдВрд╡рд╛ рдХрд╛рдвреВ рд╢рдХрддрд╛. рдЖрд░рд╛рдорджрд╛рдпрдХ!
рдЖрдкрдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЛрдб рдЬрдирд░реЗрд╢рди рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдбреЗрдЯрд╛рдмреЗрд╕рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╕реНрддреНрд░реЛрддрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рд╛ рдХрд┐рдВрд╡рд╛ рдЯреЗрдмрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдЪреЗ рд╡рд░реНрдгрди рдХрд░рд╛, рдЯреЗрдмрд▓рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЖрдгрд┐ DWH рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░рдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдКрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдпрд╛рд░ рдХрд░рд╛. рддреБрдордЪреНрдпрд╛ рд╕реНрдЯреЛрд░реЗрдЬрдордзреНрдпреЗ N рдЯреЗрдмрд▓ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рдХрд┐рдВрд╡рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдкреАрдЖрдпрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рдЬреЗ рд╕реВрдЪреАрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдкреЕрд░рд╛рдореАрдЯрд░рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА, рддреБрдореНрд╣реА рдпрд╛ рд╕реВрдЪреАрдордзреВрди DAG рдордзреНрдпреЗ N рдХрд╛рд░реНрдпреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░реВ рд╢рдХрддрд╛, API рдордзреАрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреА рд╕рдорд╛рдВрддрд░рддрд╛ рдкреВрд▓рдордзреНрдпреЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╕реНрдХреНрд░реЕрдк рдХрд░реВ рд╢рдХрддрд╛. API рдХрдбреВрди рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛. рд▓рд╡рдЪрд┐рдХ!
рднрд╛рдВрдбрд╛рд░
рдПрдЕрд░рдлреНрд▓реЛрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдмреЕрдХрдПрдВрдб рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдЖрд╣реЗ, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ (рдорд╛рдпрдПрд╕рдХреНрдпреВрдПрд▓ рдХрд┐рдВрд╡рд╛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдЕрд╕реВ рд╢рдХрддреЛ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдЖрд╣реЗ), рдЬреЗ рдХрд╛рд░реНрдпрд╛рдВрдЪреА рд╕реНрдерд┐рддреА, рдбреАрдПрдЬреА, рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрдЬ, рдЧреНрд▓реЛрдмрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЗ. рдЗрддреНрдпрд╛рджреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ. рдпреЗрдереЗ рдорд▓рд╛ рдЕрд╕реЗ рдореНрд╣рдгрд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА рдПрдЕрд░рдлреНрд▓реЛ рдордзреАрд▓ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдЕрдЧрджреА рд╕реЛрдкреА рдЖрд╣реЗ (рд╕реБрдорд╛рд░реЗ 20 рдЯреЗрдмрд▓реНрд╕) рдЖрдгрд┐ рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░ рддреЗ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ. рдорд▓рд╛ рдЗрдиреНрдлреЙрд░реНрдореЗрдЯрд┐рдХрд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреАрд▓ 100500 рдЯреЗрдмрд▓реНрд╕ рдЖрдард╡рддрд╛рдд, рдЬреНрдпрд╛рдЪрд╛ рдкреНрд░рд╢реНрди рдХрд╕рд╛ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдкреВрд░реНрд╡реА рдмрд░рд╛рдЪ рдХрд╛рд│ рдЕрднреНрдпрд╛рд╕ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛.
рджреЗрдЦрд░реЗрдЦ
рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЪреА рд╕рд╛рдзреЗрдкрдгрд╛ рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд╛, рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдпреАрд╕реНрдХрд░ рдХрд╛рд░реНрдп рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛. рдЖрдореНрд╣реА рдЭреЗрдкреЗрд▓рд┐рдирдордзреНрдпреЗ рдиреЛрдЯрдкреЕрдб рд╡рд╛рдкрд░рддреЛ, рдЬрд┐рдереЗ рдЖрдореНрд╣реА рдХрд╛рд░реНрдпрд╛рдВрдЪреА рд╕реНрдерд┐рддреА рдкрд╛рд╣рддреЛ:
рд╣реЗ рд╕реНрд╡рддрдГ Airflow рдЪреЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рджреЗрдЦреАрд▓ рдЕрд╕реВ рд╢рдХрддреЗ:
рдПрдЕрд░рдлреНрд▓реЛ рдХреЛрдб рдУрдкрди рд╕реЛрд░реНрд╕ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдЯреЗрд▓реАрдЧреНрд░рд╛рдордордзреНрдпреЗ рдЕреЕрд▓рд░реНрдЯрд┐рдВрдЧ рдЬреЛрдбрд▓реЗ рдЖрд╣реЗ. рдХрд╛рд░реНрдпрд╛рдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд▓реВ рдЙрджрд╛рд╣рд░рдг, рдПрдЦрд╛рджреА рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛рд╕, рдЯреЗрд▓реАрдЧреНрд░рд╛рдордордзреАрд▓ рдЧрдЯрд╛рд▓рд╛ рд╕реНрдкреЕрдо рдХрд░рддреЗ, рдЬрд┐рдереЗ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рдХрд╛рд╕ рдЖрдгрд┐ рд╕рдорд░реНрдерди рд╕рдВрдШ рдЕрд╕рддреЛ.
рдЖрдореНрд╣рд╛рд▓рд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо (рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕) рджреНрд╡рд╛рд░реЗ рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рд╕рд╛рдж рдорд┐рд│рддреЛ рдЖрдгрд┐ рдЭреЗрдкреЗрд▓рд┐рдирджреНрд╡рд╛рд░реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдЕрд░рдлреНрд▓реЛрдордзреАрд▓ рдХрд╛рд░реНрдпрд╛рдВрдЪреЗ рдПрдХрдВрджрд░ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ.
рдПрдХреВрдг
рдПрдЕрд░рдлреНрд▓реЛ рд╣рд╛ рдореБрдЦреНрдпрддрдГ рдореБрдХреНрдд рд╕реНрд░реЛрдд рдЖрд╣реЗ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреНрдпрд╛рддреВрди рдЪрдорддреНрдХрд╛рд░рд╛рдЪреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реВ рдирдпреЗ. рдХрд╛рд░реНрдп рдХрд░рдгрд╛рд░реЗ рдЙрдкрд╛рдп рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрд│ рдЖрдгрд┐ рдкреНрд░рдпрддреНрди рдХрд░рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рд░рд╣рд╛. рдзреНрдпреЗрдп рд╕рд╛рдзреНрдп рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдЖрд╣реЗ, рдорд╛рдЭреНрдпрд╛рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рд╛, рддреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ. рд╡рд┐рдХрд╛рд╕рд╛рдЪреА рдЧрддреА, рд▓рд╡рдЪрд┐рдХрддрд╛, рдирд╡реАрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рд╕реБрд▓рднрддрд╛ - рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдЖрд╡рдбреЗрд▓. рдирдХреНрдХреАрдЪ, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рд╕рдВрд╕реНрдереЗрдХрдбреЗ, рдПрдЕрд░рдлреНрд▓реЛрдЪреА рд╕реНрдерд┐рд░рддрд╛ рдпрд╛рд╡рд░ рдЦреВрдк рд▓рдХреНрд╖ рджреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рдЪрдорддреНрдХрд╛рд░ рдШрдбрдд рдирд╛рд╣реАрдд.
рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рджрд░рд░реЛрдЬ рдПрдЕрд░рдлреНрд▓реЛ рдХрд╛рд░реНрдпрд░рдд рдЖрд╣реЗ рд╕реБрдорд╛рд░реЗ 6,5 рд╣рдЬрд╛рд░ рдХрд╛рд░реНрдпреЗ. рддреЗ рдЪрд╛рд░рд┐рддреНрд░реНрдпрд╛рдиреЗ рдЕрдЧрджреА рд╡реЗрдЧрд│реЗ рдЖрд╣реЗрдд. рдореБрдЦреНрдп DWH рдордзреНрдпреЗ рдЕрдиреЗрдХ рднрд┐рдиреНрди рдЖрдгрд┐ рдЕрддрд┐рд╢рдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрддреНрд░реЛрддрд╛рдВрдХрдбреВрди рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪреА рдХрд╛рд░реНрдпреЗ рдЖрд╣реЗрдд, рдореБрдЦреНрдп DWH рдордзреНрдпреЗ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯреНрд╕рдЪреА рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рдЪреА рдХрд╛рд░реНрдпреЗ рдЖрд╣реЗрдд, рд╡реЗрдЧрд╡рд╛рди DWH рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХрд╛рд░реНрдпреЗ рдЖрд╣реЗрдд, рдЕрдиреЗрдХ, рдЕрдиреЗрдХ рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЗ рдЖрд╣реЗрдд - рдЖрдгрд┐ рдПрдЕрд░рдлреНрд▓реЛ рддреЗ рд╕рд░реНрд╡ рджрд┐рд╡рд╕реЗрдВрджрд┐рд╡рд╕ рдЪрдШрд│рддреЗ. рд╕рдВрдЦреНрдпреЗрдиреЗ рдмреЛрд▓рдгреЗ, рд╣реЗ рдЖрд╣реЗ 2,3 рд╣рдЬрд╛рд░ DWH (Hadoop) рдордзреНрдпреЗ рд╡рд┐рд╡рд┐рдз рдЬрдЯрд┐рд▓рддреЗрдЪреА ELT рдХрд╛рд░реНрдпреЗ, рдЕрдВрджрд╛рдЬреЗ. рдЕрдбреАрдЪрд╢реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрд░реЛрдд, рд╣рд╛ рд╕рдВрдШ рдЖрд╣реЗ 4 ETL рд╡рд┐рдХрд╛рд╕рдХ, рдЬреЗ DWH рдордзреНрдпреЗ ETL рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЖрдгрд┐ DWH рдордзреНрдпреЗ ELT рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓реЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ рдЕрдзрд┐рдХ рдПрдХ рдкреНрд░рд╢рд╛рд╕рдХ, рдЬреЛ рд╕реЗрд╡реЗрдЪреНрдпрд╛ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ.
рднрд╡рд┐рд╖реНрдпрд╛рд╕рд╛рдареА рдпреЛрдЬрдирд╛
рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдпрдкрдгреЗ рд╡рд╛рдврдд рдЖрд╣реЗ рдЖрдгрд┐ рдПрдЕрд░рдлреНрд▓реЛ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдЖрдореНрд╣реА рдореБрдЦреНрдп рдЧреЛрд╖реНрдЯ рдХрд░рдгрд╛рд░ рдЖрд╣реЛрдд рддреЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдЖрд╣реЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдПрдЕрд░рдлреНрд▓реЛ рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ, рд╕реЗрд▓реЗрд░реА рдХрд╛рдордЧрд╛рд░рд╛рдВрд╕рд╛рдареА рдкрд╛рдпрд╛рдВрдЪреА рдПрдХ рдЬреЛрдбреА рд╡рд╛рдЯрдк рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗ рдЖрдгрд┐ рдЬреЙрдм рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рднрд╛рдВрдбрд╛рд░рд╛рд╕рд╣ рд╕реЗрд▓реНрдл-рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЗрдб рдмрдирд╡рд╛рдпрдЪреЗ рдЖрд╣реЗ.
рдПрдкрд┐рд▓реЛрдЧ
рд╣реЗ, рдЕрд░реНрдерд╛рддрдЪ, рдореА рдПрдЕрд░рдлреНрд▓реЛрдмрджреНрджрд▓ рд╕рд╛рдВрдЧреВ рдЗрдЪреНрдЫрд┐рдд рд╕рд░реНрд╡рдХрд╛рд╣реА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдореА рдореБрдЦреНрдп рдореБрджреНрджреЗ рд╣рд╛рдпрд▓рд╛рдЗрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛. рднреВрдХ рдЦрд╛рдгреНрдпрд╛рдиреЗ рд▓рд╛рдЧрддреЗ, рдХрд░реВрди рдкрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рдбреЗрд▓ :)
рд╕реНрддреНрд░реЛрдд: www.habr.com