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
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
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
3yum 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
5export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
0thiế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
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
2chạy
khởi tạo db
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
3chạy lịch trình và máy chủ web
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
4giế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
5thiết lập logrotate
e. g. thêm tập tin
export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
7export AIRFLOW_HOME=~/airflow
pip install apache-airflow
airflow version
0dao 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ề AirflowLuồ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
8Sau đó 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
9export AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
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
0 rút gọn xúc tích thay vì phải nhập 1 đường dài ngoằn ngoèoCREATE DATABASE air; CREATE USER 'air'@'%' IDENTIFIED BY 'password'; GRANT USAGE,EXECUTE ON *.* TO 'air'@'%'; GRANT ALL PRIVILEGES ON air.* TO 'air'@'%'; FLUSH PRIVILEGES;
- 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
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ớiCREATE 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ủaCREATE 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ốtCREATE DATABASE air; CREATE USER 'air'@'%' IDENTIFIED BY 'password'; GRANT USAGE,EXECUTE ON *.* TO 'air'@'%'; GRANT ALL PRIVILEGES ON air.* TO 'air'@'%'; FLUSH PRIVILEGES;
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ì
2 của gke đã làm rất tốtCREATE DATABASE air; CREATE USER 'air'@'%' IDENTIFIED BY 'password'; GRANT USAGE,EXECUTE ON *.* TO 'air'@'%'; GRANT ALL PRIVILEGES ON air.* TO 'air'@'%'; FLUSH PRIVILEGES;
- 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 +
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;
6CREATE DATABASE air; CREATE USER 'air'@'%' IDENTIFIED BY 'password'; GRANT USAGE,EXECUTE ON *.* TO 'air'@'%'; GRANT ALL PRIVILEGES ON air.* TO 'air'@'%'; FLUSH PRIVILEGES;
- 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ó
7 để chọn nút khác khi cầnCREATE DATABASE air; CREATE USER 'air'@'%' IDENTIFIED BY 'password'; GRANT USAGE,EXECUTE ON *.* TO 'air'@'%'; GRANT ALL PRIVILEGES ON air.* TO 'air'@'%'; FLUSH PRIVILEGES;
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
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 problemsexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
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ợ
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 SSDexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
- 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
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 KubernetesPodOperatorexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
- 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
- Hiện tại mình luôn khuyến khích các bạn Data Scientist thay vì viết
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ụ.
93,export AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
94,export AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
95export AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
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.
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ồiexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
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
97. Sau đóexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
98 lại add thêmexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
97 nữaexport AIRFLOW_HOME=~/airflow pip install apache-airflow airflow version
- Không chạy được do entrypoint trong docker đã có sẵn lệnh
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ị
00 của KubernetesPodOperator tự động nhận diện cái env bắt đầu bằngCREATE 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ỗiCREATE DATABASE air; CREATE USER 'air'@'%' IDENTIFIED BY 'password'; GRANT USAGE,EXECUTE ON *.* TO 'air'@'%'; GRANT ALL PRIVILEGES ON air.* TO 'air'@'%'; FLUSH PRIVILEGES;
- 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
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