Cấu hình luồng không khí với mysql

Cho rằng

  • tất cả các lệnh python và pip phải được thực thi trong môi trường python 3

thiết lập cơ sở dữ liệu MySQL
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
1 và người dùng
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
1

CREATE DATABASE air;
CREATE USER 'air'@'%' IDENTIFIED BY 'password';
GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
FLUSH PRIVILEGES;

cài đặt luồng không khí

Tải xuống thành phần cơ bản và chạy một lần

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version

nếu nó phàn nàn về thành phần mysql, hãy cài đặt

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
3

yum install python-devel
yum install mysql-devel
pip install mysqlclient

nếu nó phàn nàn về xung đột phiên bản mariadb, hãy gỡ cài đặt mariadb ref

sudo yum -y remove mariadb-libs

nếu nó phàn nàn về HTMLString, hãy cài đặt

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
4 ref

________số 8

để vận hành docker, hãy cài đặt

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
5

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
0

thiết lập một số cấu hình trong
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
6

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
2

chạy

khởi tạo db

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
3

chạy lịch trình và máy chủ web

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
4

giết và thiết lập lại

tại nhà luồng không khí,

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
5

thiết lập logrotate

e. g. thêm tập tin

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
7

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
0

dao bảo trì

  • https. //github. com/teamclairvoyant/airflow-maintenance-dags

giới thiệu

  • https. // luồng không khí. apache. org/docs/ổn định/bắt đầu. html
  • https. // tài liệu. sqlalchemy. org/en/13/core/engines. html#mysql
  • https. // stackoverflow. com/câu hỏi/14087598/python-3-importerror-no-module-named-configparser
  • https. // stackoverflow. com/câu hỏi/39073443/how-do-i-restart-airflow-webserver
  • https. //unix. giao dịch cổ phiếu. com/questions/530828/airflow-log-rotation

Do dòng đời xô đẩy nên tôi quay lại viết tiếp đây. Chủ đề hôm nay là Airflow, chi tiết sẽ có trong các mục bên dưới

Do lượng kiến ​​thức về framework này khá lớn nên tôi sẽ cố gắng viết các phần kết nối khác nhau, bạn đọc chú ý

Khái niệm về Airflow

Luồng khí là một công cụ lập lịch trình cho luồng công việc của bạn cũng như hỗ trợ quản lý, theo dõi từng phần trong quy trình giúp bạn sửa lỗi, bảo trì mã thuận tiện và dễ dàng

Nền tảng dữ liệu nhóm của Tiki sử dụng Apache Airflow từ những ngày đầu thành lập nhóm từ năm 2017. Cho đến hôm nay kiến ​​trúc & cách sử dụng luồng không khí cũng thay đổi khá đáng kể. Bài viết này sẽ chia sẻ cách sử dụng Team Data của luồng khí, ưu nhược điểm của các cách sử dụng

Ngày xửa ngày xưa

Khi mình vào TIKI vào T9/2018, 1 lần được cho vào con air chính, một cách ngây thơ cập nhật 1 gói

export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
8

Sau đó tắt máy đi ngủ, tới chiều anh em ping nhau, Airflow ra đi rồi các bác ạ, Rì pọt ra đi hết rồi anh giáo ạ. Nghe xong tè ra quần luôn

sai lầm

  • Không sao lưu virtualenv trước khi chạy
    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    9
Nông dân tập thành cloud #

1 năm sau [T9/2019]

Thời điểm này TIKI di chuyển từ Data Center lên [GCP] Google Cloud Platform. Thế là phải chuẩn bị sẵn hệ thống một lần nữa

Ở thời điểm này có 3 luồng không khí đang chạy

  • 1 con run jobs ETL [Airflow 1. số 8]
  • 1 con chạy sync snapshot từ MySQL/Postgres lên BigQuery [Airflow 1. số 8]

Nghĩ, giờ lên mây mà xài công nghệ hết ngày thì nông dân quá. Quyết tâm chơi cài đặt luồng không khí mới nhất luôn. DAG thì chắc chỉ cần copy qua là xong, không bị gãy gì cả

Được cấp 1 con VM mới trên GCP & ssh vào pip install liền

Đang đợi thì tự đánh cái bếp. Học Infras As Code thứ rồi mà lại tay chân thế. Thế là ngồi viết ansible để cài luồng gió =]]. Pip install thì vài phút, ngồi viết mất vài tiếng

Copy dag nào thì dags đó gãy

  • Phát hiện ra là đường dẫn nhập khẩu & tham số đã thay đổi khá nhiều từ 1. 8 lên 1. 10. [Lúc này còn thơ ngây mà]
  • Hành đầy mặt rồi, kiểu này di chuyển chắc tới tết, trong khi anh em lúc đó còn 15 ngày để cắt giảm

ôm nghĩ, mếu được, thế này sau kiểu này cũng sẽ gặp trường hợp tương tự

Lúc này sau 1 khoảng thời gian được rèn luyện ansible và tập làm văn kubernetes manifests bắt đầu có ý tưởng chế 1 yaml để viết config & build nó thành dag

Xem bài viết này

TLDR

  • Mình viết thêm 1 lớp để đặt mặc định [giá trị mặc định của các trường], tên
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    0 rút gọn xúc tích thay vì phải nhập 1 đường dài ngoằn ngoèo
  • Tự động phân quyền cho dag, callback cảnh báo vào slack/telegram khi dag fail
  • Mỗi đội có 1 thư mục riêng trong git or favorite thì cho hăn luôn 1 git repo riêng

Tiếp theo là giờ sẽ triển khai ở đâu đây?

Tuy là nông dân nhưng vẫn rất thích đú trend Cờ lâu nây típ [Cloud Native] thế là bắt tay vào nghiên cứu để chạy trên kubernetes luôn

  • Cần TâyExecutor. có sẵn biểu đồ luồng khí lái để cài đặt. Tuy nhiên, lại gặp vấn đề là chúng ta phải tạo trước công nhân & quy mô công việc tự động cũng không dễ dàng gì
  • KubernetesExecutor. can't auto create
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    1 to run task which don't have to make worker before. Nếu người thi hành này kết nối với
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    2 & Preemtible Pool của
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    3 thì tuyệt vời ông mặt zời. Chốt nhanh chốt

Nghiên cứu mấy cái này thì cũng bắt đầu vào thiết kế & bắt tay vào viết k8s manifest

Những tiêu chí khi triển khai luồng không khí trên k8s

  • Phải chi tiết. nút tỷ lệ bằng cách tự động khi cần [điều này thì
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    2 của gke đã làm rất tốt
  • Một cách khác mình nghĩ tới là sử dụng Preemptible VM của GCP. Với loại VM này thì thời gian tối đa của nó là 24h sau khi được tạo. Google có thể lấy lại [reclaim] bất kỳ thời điểm nào

Với những yêu cầu như trên thì mình thiết kế các triển khai riêng như sau

  • Người lập kế hoạch. Cốt lõi của toàn hệ thống phải cực kỳ ổn định, nên mình quyết định chọn nút tiêu chuẩn. [Lõi chết thì cậu vàng cũng phải bán đi mới mua bánh mì ăn được]
  • Web Server thành 1 lần triển khai riêng [chạy trên cuộc thăm dò ưu tiên] để tiết kiệm điện và để HA thì mình tăng ≥ 2 bản sao +
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    5 cấu trúc liên kết là
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    6
  • Pod được tạo ra từ bộ lập lịch luồng không khí mình đặt mặc định chạy qua nhóm ưu tiên [tiết kiếm tiền để mua bánh mì] & tất nhiên là có
    CREATE DATABASE air;
    CREATE USER 'air'@'%' IDENTIFIED BY 'password';
    GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
    GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
    FLUSH PRIVILEGES;
    
    7 để chọn nút khác khi cần

Về docker image. Thời điểm luồng không khí này chưa có hình ảnh chính thức và docker cộng đồng vẫn còn thiếu và nhiều thứ. Mình quyết định viết riêng 1 dockerfile & đưa vào những phụ thuộc cần thiết đủ để luồng khí chạy được

Sau khi đủ các nguyên liệu thì bắt đầu up đồ thôi

Ngoài cách triển khai luồng khí thì còn những bài toán sau cần giải quyết

Tiết kiệm chi phí so với ổn định

  • Để đảm bảo task chạy ổn định trên Preemtible VM, cần phải bật auto retry cho full dag trên hệ thống [việc này cực kì đơn giản nhờ vào config engine]

Lưu file yaml ở đâu?

  • Việc sử dụng 1 file config riêng, mình hoàn toàn có thể hỗ trợ giao diện để viết config hay hơn là kéo thả
  • Nhưng nghĩ đi nghĩ lại thì build 1 UI như vậy khá tốn thời gian & lại phát sinh thêm phải xử lý xung đột khi nhiều người cùng sửa 1 dag
  • Vì thế mình đã buộc mọi người dùng Git. Mã yaml sẽ được đồng bộ khi triển khai
    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    90, tại đây yaml sẽ được xác thực & chuyển đổi thành tệp DAG python. Sau khi có tệp DAG, to the next problems

Lưu dag ở đâu?

  • Save thẳng in images. có nhược điểm là phải build image liên tục khi có thay đổi → Khó tối ưu được thời gian khởi động Pod phải kiểm tra Pull Image. Build docker có 1 nhược điểm là khá chậm
  • Lưu tại Cửa hàng được chia sẻ. Hiện tại Persistent Disk của gke chưa hỗ trợ
    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    91 , điều này dẫn đến việc phải sử dụng NFS. IOPS của NFS cực kỳ thấp so với SSD
  • Lựa chọn lưu trữ nào phụ thuộc rất nhiều vào kiến ​​trúc của luồng không khí. Sau khi nghiên cứu 1 hồi thì mình nhận thấy là luồng không khí sẽ tuần tự dag vào cơ sở dữ liệu, máy chủ web & các worker đều đọc từ cơ sở dữ liệu này

⇒ Vì vậy mình chọn shared storages. không ảnh hưởng nhiều đến thời gian chạy tác vụ, 1 điểm ưu tiên nữa là nó đơn giản hơn kiến ​​trúc sư của hệ thống

Đăng nhập như thế nào?

  • Khi up tùy chọn kubernetes bắt buộc là phải chọn 1 remote logging [cụ thể thì mình chọn gcs để lưu]
  • Nhưng đăng nhập từ xa gặp phải vấn đề là không xem được khi tác vụ đang chạy
  • Dẫn đến mình phải giải quyết bằng cách sử dụng 1 tệp hệ thống tạm thời để lưu nhật ký của tác vụ đang chạy. Còn những trường nào ngoài NFS nữa đâu

Uỷ quyền xác thực

  • Mình định hướng xây dựng Airflow trở thành 1 nền tảng mở, mọi người đều có thể viết config & chạy. Đối mặt với định hướng như vậy, bắt buộc phải phân quyền thật kỹ & tốt nhất là ở cấp độ DAG
  • Cũng có thể là luồng không khí hỗ trợ Oauth2 & cả quyền truy cập ở cấp độ DAG
  • Lệnh này trở nên khá đơn giản khi hệ thống cấu hình đã thêm sẵn DAG vào mỗi vai trò

Giám sát và cảnh báo

  • With system config, mình has been nung sẵn task_failed_callback. Mỗi đội sẽ tự tạo 1 kết nối riêng [có thể là slack/telegram] & lúc fail thì dag nhà ai nhận & tự đi check
  • Đối với luồng không khí, mình sử dụng Statsd Exporter để hiển thị API số liệu cho prometheus và lên grafana tạo bảng điều khiển/cảnh báo

Backfill dags như thế nào?

  • Ngày trước cái trên VM thì hay ssh vào server để chạy chèn lấp luồng không khí
  • Còn trên k8s thì ssh đâu mà vào. Vào nhóm để thực thi thì nó lại bị giới hạn bởi một vài kỹ sư của bạn
  • Vì thế mình đã custom lại 1 mã nguồn mở là Airflow-backfill-util & share quyền cho mọi người vào backfill

second Sensation

  • NFS ở khắp mọi nơi
  • Nói là Preemtible VM nhưng mình cảm nhận là khá ổn định, sau 2 năm sử dụng thì mình chưa gặp vấn đề gì quá lớn [Có thể thiết kế system pro quá nên không bị lỗi. ">]
    • Lâu lâu có vài task chạy hơn 5h bị down, đối với mấy task này mình hỏi ngược lại tại sao nó lại chạy lâu thế →optimize DAG
    • Đối tác với Nhóm nhà khoa học dữ liệu. Mình white list cho viết sẵn Python code luôn, cho select node mích để chạy. ngắm model train cũng hết ngày nữa
  • Khi chạy luồng không khí trên K8S thì Airflow không còn đơn thuần là chỉ ETL nữa, mà có thể chạy mọi thứ, cảm ơn KubernetesPodOperator
    • Hiện tại mình luôn khuyến khích các bạn Data Scientist thay vì viết
      export AIRFLOW_HOME=~/airflow
      pip install apache-airflow
      airflow version
      
      92 & nhờ mình cài đặt thêm các phụ thuộc vào hình ảnh cơ sở, sau đó viết một Dockerfile chứ không phải mọi thứ cần thiết trong đó [ML Libs, C++ Libs, Code…] & config KubernetesPodOperator
    • Việc làm này vừa đảm bảo tính ổn định, không cần thêm những thứ không cần thiết vào hình ảnh cơ sở sẽ tốn thời gian để kéo → giảm thời gian khởi động
Luồng không khí 2 #

Phiên bản 2. 0 được phát hành vào ngày 18-12-2020 thế nhưng mình chưa cập nhật ngay, vì trước giờ mỗi lần cập nhật phiên bản vá lỗi duy nhất của airflow không què Đây thì Mạt kia. Mà lỗi gặp nhiều nhất vẫn là google oauth2, và phần lớn là do error depedencies 😐

Sau hơn 8h delay tháng thì quyết tâm làm 1 lần sau cuối

Lên danh sách những công việc cần làm

  • Coi day. chọn ngày tốt mới nâng cấp [kiểm tra xemngay. com]
  • Làm theo hướng dẫn nâng cấp. https. // luồng không khí. apache. org/docs/apache-airflow/stable/upgrading-to-2. html
    • Lên luồng gió 1. 10. 15
    • Cài đặt nhà cung cấp backport & cập nhật module_path vào cái toán tử [đơn giản là cập nhật vào cấu hình của bí danh toán tử]
    • Tạo pod_template_file
    • Chạy luồng không khí upgrade_check & fix. Số lỗi mình gặp phải do các DAG viết bằng python của nhóm Data Scientist. Không còn cách nào khác là phải đi sửa tay từng ngày, cũng rất có thể là khoảng chưa tới 20 ngày

Sau khi lên cầu & chọn ngày lành tháng tốt. Bắt đầu nâng cấp luồng không khí 2. Ở tiki thì DAG đa số được chạy vào ban đêm & buổi sáng. Riêng buổi chiều & tối thì rất ít. Golden time is here

  • Sao lưu siêu dữ liệu DB. Viết tâm thư gửi anh em hệ thống để lỡ mà sự việc không thành, vẫn còn đừong quay về nhà

  • Giảm quy mô tất cả các dịch vụ.

    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    93,
    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    94,
    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    95

  • Merge Pull Request to Build & Deploy

  • Bắt đầu 1 máy chủ web bản sao, thực hiện bash và chạy.

    export AIRFLOW_HOME=~/airflow
    pip install apache-airflow
    airflow version
    
    96 vừa ngồi vừa nghe nhạc để tự trấn an mình =]], ngộ lúc đó cũng teo hết thứ rồi

  • Chờ khoàng 30 phút thì di chuyển chạy xong. Mình bắt đầu lên web ui để kiểm tra xem có bị hỏng gì không. Thấy mọi thứ đều ổn

  • Lập lịch tỷ lệ lên 1 bản sao. See DAG đang chạy, bắt đầu xanh cmn mặt

    • Không chạy được do entrypoint trong docker đã có sẵn lệnh
      export AIRFLOW_HOME=~/airflow
      pip install apache-airflow
      airflow version
      
      97. Sau đó
      export AIRFLOW_HOME=~/airflow
      pip install apache-airflow
      airflow version
      
      98 lại add thêm
      export AIRFLOW_HOME=~/airflow
      pip install apache-airflow
      airflow version
      
      97 nữa
  • Sau khi fix error command thì thấy DAG bắt đầu chạy. đi kiểm tra một vòng thì đa số DAG chạy ok, có một số lỗi vặt khá dị

    • CREATE DATABASE air;
      CREATE USER 'air'@'%' IDENTIFIED BY 'password';
      GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
      GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
      FLUSH PRIVILEGES;
      
      00 của KubernetesPodOperator tự động nhận diện cái env bắt đầu bằng
      CREATE DATABASE air;
      CREATE USER 'air'@'%' IDENTIFIED BY 'password';
      GRANT USAGE,EXECUTE ON *.* TO 'air'@'%';
      GRANT ALL PRIVILEGES ON air.* TO 'air'@'%';
      FLUSH PRIVILEGES;
      
      01 thành tệp mẫu → dẫn đến nhóm bắt đầu lỗi
    • Lỗi hay nhất là admin không được chỉnh sửa quyền của người dùng nữa. Phải ngồi đợi bản sửa tiếp theo thôi
    • ghi nhật ký. Không còn sử dụng connection_id để lấy thông tin đăng nhập cho gcs mà phải gắn thông tin đăng nhập vào nhóm
    • Một số lỗi nhỏ khác do sử dụng chức năng nội bộ của luồng không khí

Phần cảm nhận về Airflow 2

  • Hiệu suất khủng khiếp. Khi số lượng DAG tăng lên từ vài trăm đến gần năm 2000, một vấn đề rất lớn phải đối mặt với luồng không khí 1 là thời gian trễ giữa các tác vụ trong dag rất lớn. Phải mất từ ​​5 - 15p giữa các nhiệm vụ & thời gian khởi động DAG delay khoàng 5 phút so với giờ được đặt. Khi up version 2 thì near as about 0. Điều này cực kỳ có ý nghĩa đối với những nhiệm vụ chạy mỗi 1 hoặc 2 phút
  • UI mới nhìn đẹp hơn sẵn & thực tế là ai cũng khen [chê xấu là vô tài khoản nhé]
  • Việc nâng cấp lần này tạm dừng so với dự tính của mình là không thể nâng cấp được
    • Vì mình thấy được qua các lần nâng cấp trước nên hỏng rất nhiều
Kết luận #

Còn chờ đợi gì mà không lên luồng không khí 2 ngay và thôi. Mình đã nâng cấp thành công bạn cũng thế. Và nhớ coi ngày trước khi nâng cấp nha

Chủ Đề