Linux cho DE 1 — Vì sao cần Linux & shell
Vì sao data engineer bắt buộc phải thạo Linux
Có một sự thật ít khi được nói thẳng ở các khoá học dữ liệu: bạn có thể viết SQL và pandas rất giỏi trên laptop Windows hay macOS, nhưng đến ngày code của bạn chạy production thì nó gần như chắc chắn chạy trên Linux. Không phải vì Linux "ngầu" hơn, mà vì cả ngành hạ tầng dữ liệu được xây trên nền đó.
Hãy nhìn vào bức tranh thực tế của một team dữ liệu ngân hàng như NCB:
- Server ETL, database, API cài trên các máy chủ chạy Linux (thường là RHEL, CentOS/Rocky, Ubuntu Server). Bạn SSH vào để deploy, xem log, sửa cấu hình.
- Container Docker — image cơ sở (
python:3.11-slim,postgres:16) đều là Linux. Khi bạndocker execvào container để debug, bạn đang gõ lệnh Linux. - Cluster Spark, cụm Airflow, Kubernetes — mỗi node là một máy Linux. Executor Spark chạy trên Linux, scheduler Airflow chạy trên Linux, pod trong K8s chạy trên Linux.
- Cron job, systemd service để lên lịch pipeline — chỉ tồn tại trên Linux.
- Cloud (AWS, GCP, Azure) — hầu hết VM và dịch vụ managed bên dưới là Linux.
Nói cách khác: kỹ năng data engineering của bạn được triển khai và vận hành qua giao diện Linux. Khi pipeline nửa đêm báo lỗi, không ai đưa cho bạn một giao diện đồ hoạ đẹp đẽ — bạn SSH vào server, cd tới thư mục log, grep dòng lỗi, tail -f để theo dõi, rồi kill process treo. Nếu không quen những thao tác này, bạn sẽ bị phụ thuộc hoàn toàn vào đội DevOps cho cả những việc nhỏ nhất, và thời gian xử lý sự cố kéo dài từ phút thành giờ.
Series này (từ bài 1 tới bài 8) sẽ đưa bạn từ con số 0 tới đủ tự tin vận hành pipeline dữ liệu trên môi trường Linux. Bài mở đầu này xây nền: hiểu tại sao Linux được thiết kế như vậy, để những lệnh bạn học sau này không phải học vẹt mà là hiểu logic.
Triết lý Unix: nền tảng của mọi thứ
Linux kế thừa tư tưởng thiết kế từ Unix (những năm 1970). Bốn nguyên tắc dưới đây giải thích vì sao dòng lệnh Linux mạnh đến vậy — và một khi hiểu, bạn sẽ thấy các công cụ ghép lại với nhau rất tự nhiên.
1. Mỗi công cụ làm một việc, và làm thật tốt. Không có một lệnh "vạn năng". Thay vào đó có grep (tìm dòng khớp mẫu), sort (sắp xếp), wc (đếm), cut (cắt cột), sed (thay thế văn bản), awk (xử lý theo cột). Mỗi cái nhỏ, đơn giản, dễ hiểu.
2. Kết hợp các công cụ qua pipe. Sức mạnh không nằm ở từng lệnh mà ở việc nối chúng. Ký hiệu | (pipe) lấy đầu ra của lệnh trước làm đầu vào cho lệnh sau. Ví dụ đếm số dòng lỗi ERROR trong log rồi lấy 10 loại lỗi phổ biến nhất:
grep "ERROR" pipeline.log | cut -d' ' -f5- | sort | uniq -c | sort -rn | head -10
Chuỗi này không cần viết một chương trình nào — nó lắp ghép 6 công cụ nhỏ thành một công cụ phân tích log mạnh. Đây chính là "tư duy Unix". Chúng ta sẽ đào sâu pipe trong bài về pipes & redirection.
3. Mọi thứ là file. Trên Linux, không chỉ tài liệu là file. Ổ đĩa là file (/dev/sda), thông tin tiến trình là file (/proc/1234/status), thậm chí đầu vào bàn phím và đầu ra màn hình cũng là "file" (stream). Điều này nghĩa là bạn dùng cùng một bộ công cụ (cat, grep, >) để đọc/ghi mọi thứ. Muốn xem dung lượng RAM? cat /proc/meminfo. Muốn xem tham số kernel? Đọc file trong /proc/sys.
4. Văn bản (text) là giao diện chung. Đầu vào và đầu ra của phần lớn công cụ là văn bản thuần. Nhờ vậy chúng nối được với nhau, và bạn — con người — đọc được trực tiếp. Cấu hình dạng text (YAML, .conf, .env), log dạng text, kết quả lệnh dạng text. Đây là lý do bạn có thể diff hai file cấu hình, đưa chúng vào Git, và tự động hoá mọi thứ bằng script.
Bốn nguyên tắc này không phải lịch sử suông — chúng là lý do vì sao một data engineer có thể xử lý một file CSV 5GB bằng vài lệnh awk/sort mà không cần mở Python hay Excel.
Terminal, shell, kernel: đừng nhầm lẫn
Ba từ này hay bị dùng lẫn. Phân biệt rõ giúp bạn hiểu chuyện gì xảy ra khi gõ một lệnh.
- Kernel (nhân): phần lõi của hệ điều hành, quản lý CPU, bộ nhớ, ổ đĩa, thiết bị. Bạn không nói chuyện trực tiếp với kernel.
- Shell: chương trình thông dịch lệnh. Bạn gõ
ls, shell hiểu ý bạn, yêu cầu kernel thực thi, rồi trả kết quả về. Shell mặc định trên hầu hết Linux là bash (Bourne Again SHell). Một số hệ dùngzsh,sh,dash. Trong series này ta dùng bash. - Terminal (hay terminal emulator): cửa sổ/giao diện để bạn gõ chữ và nhìn kết quả. Nó chỉ là "màn hình", không xử lý lệnh. Ví dụ: cửa sổ Terminal trên máy, hoặc phiên PuTTY/SSH khi bạn kết nối server.
Luồng đi qua các tầng như sau:
Hiểu sơ đồ này giải thích nhiều thứ. Khi bạn SSH vào server, terminal ở máy bạn, nhưng shell và kernel ở server từ xa. Khi container Docker chạy, nó dùng chung kernel với máy host nhưng có shell và filesystem riêng — đó là lý do container "nhẹ" hơn máy ảo.
Cấu trúc một lệnh Linux
Mọi lệnh đều theo một khuôn chung:
command [options] [arguments]
- command: tên chương trình cần chạy (
ls,grep,cp). - options (cờ, flags): điều chỉnh cách lệnh hoạt động. Dạng ngắn một gạch (
-l,-a) hoặc dạng dài hai gạch (--all,--human-readable). Cờ ngắn gộp được:-la=-l -a. - arguments: đối tượng lệnh tác động lên (tên file, thư mục, mẫu tìm kiếm).
Ví dụ mổ xẻ:
ls -lh /var/log
ls là lệnh (liệt kê), -lh là hai cờ (-l chi tiết dạng danh sách, -h dung lượng dễ đọc như "5.2M"), /var/log là đối số (thư mục cần liệt kê). Một ví dụ khác gần với công việc DE:
grep -i -c "timeout" /var/log/airflow/scheduler.log
Tìm (không phân biệt hoa thường, -i) và đếm (-c) số dòng chứa "timeout" trong log scheduler.
Cách tra cứu khi quên
Không ai nhớ hết cờ. Ba công cụ tra cứu, từ chi tiết tới nhanh gọn:
| Công cụ | Dùng khi | Ví dụ |
|---|---|---|
man <lệnh> | Cần tài liệu đầy đủ, chính thống | man ls (nhấn q để thoát, / để tìm) |
<lệnh> --help | Muốn xem nhanh danh sách cờ | tar --help |
tldr <lệnh> | Chỉ cần vài ví dụ thực dụng | tldr rsync |
man là "kinh thánh" nhưng dày và khô. --help gọn hơn, luôn có sẵn. tldr (cần cài thêm) cho ngay ví dụ hay dùng nhất — cực hợp khi bạn chỉ cần nhớ cú pháp tar để giải nén. Mẹo: nếu chưa biết tên lệnh, dùng apropos <từ khoá> để tìm.
Filesystem Hierarchy Standard (FHS): bản đồ của Linux
Trên Windows bạn có ổ C:, D:. Trên Linux mọi thứ nằm dưới một gốc duy nhất là / (root). Cấu trúc thư mục tuân theo chuẩn FHS, nên server nào cũng gần giống nhau — đây là điều bạn phải thuộc lòng vì nó quyết định biết đi tìm cái gì ở đâu.
Các thư mục quan trọng với một data engineer:
| Thư mục | Chứa gì | Vì sao DE quan tâm |
|---|---|---|
/etc | File cấu hình toàn hệ thống (dạng text) | Cấu hình PostgreSQL (/etc/postgresql/), cron (/etc/crontab), user, network. Sửa ở đây để đổi hành vi dịch vụ. |
/var/log | Log của mọi dịch vụ | Nơi bạn tới đầu tiên khi sự cố. Log Airflow, Postgres, Nginx, syslog đều ở đây. |
/home | Thư mục riêng từng user (/home/deuser) | Nơi bạn để script, notebook, key SSH cá nhân. ~ là viết tắt của home của bạn. |
/tmp | File tạm, bị xoá khi khởi động lại | Dùng cho file trung gian của pipeline. Không lưu gì quan trọng ở đây. |
/opt | Phần mềm bên thứ ba cài thủ công | Nhiều tổ chức cài Spark, Airflow, ứng dụng nội bộ vào /opt (ví dụ /opt/ncb_project). |
/usr/bin, /usr/local/bin | File thực thi (binary) của lệnh | Khi gõ python3, hệ thống tìm nó ở đây. /usr/local/bin cho phần mềm cài thêm. |
Một số thư mục khác cần biết: /proc và /sys (thông tin kernel/tiến trình dạng "file ảo"), /dev (thiết bị), /mnt và /media (ổ đĩa gắn thêm), /root (home của user quản trị root — khác /).
Quy tắc ghi nhớ nhanh: cấu hình ở /etc, log ở /var/log, code cá nhân ở /home, phần mềm lớn ở /opt. Bốn địa chỉ này chiếm 90% việc bạn cần tìm hàng ngày. Bài tiếp theo di chuyển & thao tác file sẽ dạy cách đi lại giữa các thư mục này thành thạo.
Đăng nhập server qua SSH (sơ lược)
Trong ngân hàng, bạn gần như không bao giờ ngồi trực tiếp trước server. Bạn kết nối từ xa qua SSH (Secure Shell) — giao thức mã hoá để mở một phiên shell trên máy khác. Cú pháp cơ bản:
Nghĩa là: đăng nhập với tài khoản deuser vào máy có IP 10.20.30.40. Lần đầu nó hỏi xác thực host (gõ yes), rồi hỏi mật khẩu. Sau khi vào, dấu nhắc (prompt) đổi để cho biết bạn đang ở server khác.
Thực tế production hiếm khi dùng mật khẩu — an toàn hơn là khoá SSH (cặp private/public key). Bạn tạo khoá bằng ssh-keygen, gửi phần public cho admin thêm vào server, và từ đó đăng nhập không cần mật khẩu:
ssh -i ~/.ssh/id_ed25519 [email protected]
Cờ -i chỉ định file khoá riêng. Ngoài mở shell, SSH còn dùng để copy file (scp, rsync) và tạo tunnel (chuyển tiếp cổng để truy cập database nội bộ qua bastion host) — những kỹ năng ta sẽ chạm tới ở các bài sau. Điểm cần nhớ lúc này: SSH là cánh cửa để bạn bước vào mọi server dữ liệu.
Prompt và biến $PATH
Khi vào shell, bạn thấy một dòng chờ lệnh gọi là prompt. Một prompt điển hình:
deuser@dwh-prod:/opt/ncb_project/etl$
Đọc được: user là deuser, đang trên host dwh-prod, thư mục hiện tại là /opt/ncb_project/etl. Ký tự cuối cho biết quyền: $ = user thường, # = root (siêu quyền — cẩn thận, mọi lệnh đều có thể phá hệ thống). Chỉ cần liếc prompt, bạn biết mình là ai và đang ở đâu — thói quen này tránh được vô số tai nạn kiểu "xoá nhầm ở production".
Còn $PATH là một biến môi trường quan trọng: nó là danh sách các thư mục, phân tách bằng dấu :, mà shell tìm kiếm khi bạn gõ tên lệnh. Xem nó bằng:
echo $PATH
# ví dụ: /usr/local/bin:/usr/bin:/bin:/home/deuser/.local/bin
Khi bạn gõ python3, shell duyệt lần lượt các thư mục trong $PATH từ trái sang phải, thấy /usr/bin/python3 thì chạy. Điều này giải thích hai tình huống DE hay gặp:
- "command not found" dù đã cài phần mềm — thường vì thư mục chứa nó chưa nằm trong
$PATH. Ví dụ pip cài công cụ vào~/.local/binnhưng thư mục đó chưa được thêm. - Chạy nhầm phiên bản — nếu có hai
pythonở hai thư mục, cái nào đứng trước trong$PATHsẽ thắng. Đây là lý do virtual environment hoạt động: nó chèn thư mục của mình lên đầu$PATH.
Ta sẽ nói kỹ về biến môi trường và $PATH khi học shell scripting.
Use case thực tế
Bối cảnh. 6h30 sáng, pipeline nạp dữ liệu giao dịch thẻ đêm hôm trước vào kho dữ liệu của NCB báo trạng thái failed trên Airflow. Báo cáo phòng Rủi ro cần dữ liệu này trước 8h00. Bạn — data engineer trực — có 90 phút để xử lý, và tất cả chỉ có một phiên SSH.
Các bước xử lý, thuần Linux:
-
Vào server scheduler:
Prompt đổi thành
deuser@airflow-prod:~$— xác nhận đã vào đúng máy. -
Tới nơi chứa log (nhớ FHS: log ở
/var/log):cd /var/log/airflow/dag_id=load_card_txn ls -lht | headCờ
-tsắp theo thời gian mới nhất, thấy ngay file log của lần chạy vừa fail. -
Tìm nguyên nhân bằng tư duy pipe:
grep -i "error\|exception\|timeout" attempt=1.log | tail -20Kết quả cho thấy:
psycopg2.OperationalError: connection timeout— kết nối tới Postgres bị treo, có thể do một tiến trình khoá bảng. -
Kiểm tra tiến trình treo (mọi thứ là file — tiến trình cũng vậy):
ps aux | grep "COPY card_txn" | grep -v grepPhát hiện một job import cũ còn treo từ đêm. Xử lý tiến trình sẽ học ở bài processes & jobs.
-
Xác nhận dung lượng đĩa không đầy (một nguyên nhân phổ biến khác):
df -h /var/lib/postgresql
Kết quả. Trong khoảng 15 phút, bạn khoanh vùng được lỗi (kết nối DB timeout do process treo), báo DBA giải phóng khoá, và trigger lại DAG. Báo cáo Rủi ro kịp giờ. Toàn bộ chỉ dùng kiến thức nền của bài này: SSH vào máy, hiểu FHS để tìm log, dùng pipe để lọc, hiểu "mọi thứ là file" để xem tiến trình. Không có kiến thức này, bạn sẽ phải chờ đội DevOps và gần như chắc chắn trễ deadline.
Ghi nhớ
- Mọi hạ tầng dữ liệu chạy Linux: server, Docker, Spark, Airflow, K8s, cloud. Kỹ năng DE của bạn được vận hành qua giao diện Linux, nên thạo Linux là bắt buộc, không phải tuỳ chọn.
- Triết lý Unix: mỗi công cụ làm một việc tốt → ghép qua pipe (
|) → mọi thứ là file → text là giao diện chung. Đây là lý do dòng lệnh mạnh và tự động hoá được. - Phân biệt ba tầng: terminal (cửa sổ nhập/xuất) ≠ shell (thông dịch lệnh, mặc định là bash) ≠ kernel (quản lý phần cứng). Luồng: user → terminal → shell → kernel → hardware.
- Cấu trúc lệnh:
command [options] [arguments]. Cờ ngắn-l, cờ dài--all, gộp được-la. Tra cứu bằngman,--help,tldr. - FHS — nhớ 4 địa chỉ: cấu hình ở
/etc, log ở/var/log, code cá nhân ở/home(~), phần mềm lớn ở/opt. Linux có một gốc/duy nhất. - SSH là cánh cửa vào server từ xa (
ssh user@host); production dùng khoá thay mật khẩu. - Prompt cho biết bạn là ai và đang ở đâu:
$= user thường,#= root (nguy hiểm). $PATH là danh sách thư mục shell dùng để tìm lệnh — giải thích lỗi "command not found" và việc chạy nhầm phiên bản. - Series này chạy từ bài 1 (bài này) tới bài 8; bài kế tiếp là di chuyển & thao tác file. Nếu chưa nắm bối cảnh DevOps chung, xem DevOps là gì và Docker.
Bài viết liên quan
Ba trụ cột logging–metrics–tracing, Prometheus/Grafana, alerting, SLI/SLO/SLA và golden signals.
Continuous Integration/Delivery/Deployment, cấu trúc pipeline, ví dụ GitHub Actions và chiến lược release.
Container vs máy ảo, image/layer, Dockerfile, volume, network, Docker Compose và best practices.
API là bề mặt tấn công chính của hệ thống dữ liệu hiện đại. Bài đi qua toàn bộ OWASP API Security Top 10 (2023) từ BOLA/IDOR tới quản lý inventory, biện pháp phòng thủ cốt lõi (authz mọi tầng, rate limit, schema, API gateway), khác biệt REST/GraphQL/gRPC, và bối cảnh Open Banking ngân hàng.