Behind the Pins: Building Analytics

Bài tóm tắt Pinterest 2014 2. Tăng trưởng Độ khó: Trung bình

Pinterest · 2014 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc

Site chặn crawler; ghi chú viết từ bản đọc qua trình duyệt.

Bối cảnh

  • 8/2014 Pinterest ra bản 2 của công cụ analytics cho doanh nghiệp (analytics theo domain, profile, audience; phân theo quốc gia, ứng dụng; impression, click, repin).
  • Nguồn dữ liệu: event từ Kafka được log xuống S3; object (Pin, board, user) từ DB production.

Thay đổi chính

  • Bốn thành phần: pipeline batch Hadoop MapReduce tạo một dataset mới mỗi ngày → HBase phục vụ với độ trễ thấp → API (có kiểm quyền truy cập) → web app.
  • Pipeline batch: xử lý hàng chục TB/ngày, chia thành khoảng 100 job do Pinball (công cụ workflow nội bộ) quản lý; job "điều kiện" định kỳ kiểm dữ liệu đã có trên S3 thì kích hoạt. Job lỗi không chặn các job độc lập khác. Bốn giai đoạn: trích object và event (song song theo loại event) → gộp theo domain/profile → tìm top item → ghi vào HBase.
  • Tăng tốc khi pipeline mất tới 19 giờ (2014), job viết bằng Hive và Cascading:
    1. job càng đơn giản càng tốt, lưu kết quả trung gian để tái dùng và chạy tiếp từ checkpoint khi lỗi;
    2. giảm kích thước dữ liệu (I/O đĩa là nút cổ chai): job trích chung, chỉ giữ trường cần;
    3. tránh ORDER BY; dùng CLUSTER BY + priority queue khi chỉ cần top N;
    4. dữ liệu lệch (vài profile/domain chiếm phần lớn) làm reducer không đều: nghiên cứu phân phối và cắt bớt bản ghi gần như không thể lọt vào kết quả;
    5. cân nhắc log thêm dữ liệu thay vì join; nếu phải join thì map join, bucket join;
    6. UDF để chia sẻ logic.
  • Lưu trữ HBase: khoảng nửa TB mỗi ngày, giữ phần lớn một tháng. Row key userparam_platform_aggregation_date: ngày đứng cuối để dữ liệu một biểu đồ nằm liền nhau (một lệnh scan); userparam đứng đầu để rải đều qua region server. Gộp sẵn theo ngày, tuần, hai tuần, tháng và theo loại app, nên không bao giờ gộp lúc đọc. Một column family duy nhất vì khó giữ các family cùng cỡ.

Vì sao

  • Analytics cho khách hàng cần đọc nhanh trên dữ liệu đã gộp; tính nặng dồn hết vào batch ban đêm.

Bài học cho SWE

  • Mẫu kinh điển của analytics giai đoạn tăng trưởng: batch hằng ngày + kho key-value đã gộp sẵn cho phía đọc (Pipeline dữ liệu và analytics).
  • Thiết kế row key theo mẫu đọc (scan liền một biểu đồ) và để phân tán ghi đều (khoá phân tán đứng đầu) (Hot partition và thundering herd).
  • Dữ liệu lệch là vấn đề của cả batch: một khoá to làm một reducer chạy mãi.

Liên quan