Uber là một nhà cung cấp dịch vụ vận chuyển phạm vi toàn cầu. Theo thời gian, họ có hơn 100 petabyte dữ liệu phân tích cần được lưu trữ và cung cấp thông qua nền tảng dữ liệu lớn (big data) dựa trên Apache Hadoop. Bài viết này mô tả lại hành trình xây dựng nền tảng Hadoop của Uber và thảo luận về những gì đang được xây dựng tiếp theo để mở rộng hệ sinh thái phức tạp và phong phú này.
Giai đoạn 1: Sự khởi đầu của dữ liệu lớn tại Uber
Trước năm 2014, dữ liệu của họ được lưu trữ trong các cơ sở dữ liệu truyền thống (MySQL và PostgreSQL). Để sử dụng các cơ sở dữ liệu này, các kỹ sư phải truy cập từng cơ sở dữ liệu hoặc bảng một cách độc lập và viết mã của riêng nếu họ cần kết hợp dữ liệu từ các cơ sở dữ liệu khác nhau. Vào thời điểm đó, họ chưa có một cơ sở dữ liệu tập trung để phục vụ cho việc phân tích tất cả dữ liệu được lưu trữ của mình. Trên thực tế, dữ liệu của họ nằm rải rác trên các cơ sở dữ liệu OLTP khác nhau, tổng kích thước dữ liệu khoảng vài terabyte và độ trễ để truy cập dữ liệu này là rất cao (thường là vài phút).
Do việc kinh doanh của Uber phát triển nhanh chóng, lượng dữ liệu cũng tăng lên đặt ra yêu cầu cho họ phải xây dựng một kho dữ liệu tập trung. Điều này cũng giúp hình thành thế hệ đầu tiên của kho dữ liệu lớn tại Uber.
Kho dữ liệu này tập trung vào việc tổng hợp tất cả dữ liệu của Uber vào một nơi cũng như hợp lý hóa việc truy cập dữ liệu. Họ quyết định sử dụng Vertica làm phần mềm quản lý dữ liệu của mình do các ưu điểm như thiết kế lưu trữ dữ liệu dạng cột, khả năng mở rộng và tốc độ nhanh.
Giai đoạn 2: Sự xuất hiện của Hadoop
Thế hệ đầu tiên có một số hạn chế đó là dữ liệu thiếu sự nhất quán và khả năng mở rộng còn hạn chế. Để giải quyết những hạn chế này, họ đã tái cấu trúc nền tảng dữ liệu lớn của mình xung quanh hệ sinh thái Hadoop. Cụ thể hơn, họ đã xây dựng một kho dữ liệu Hadoop nơi tất cả dữ liệu thô được trích xuất từ các kho dữ liệu trực tuyến khác nhau một lần duy nhất và không có biến đổi trong quá trình trích xuất.
Để truy cập dữ liệu trong Hadoop, họ sử dụng Presto cho các truy vấn trực tiếp, Apache Spark để hỗ trợ truy cập vào dữ liệu thô (ở cả định dạng SQL và không phải SQL) và Apache Hive để phục vụ cho các truy vấn lớn. Họ cũng tận dụng định dạng File dạng cột tiêu chuẩn của Apache Parquet để giảm dung lượng lưu trữ nhờ tỷ lệ nén được cải thiện.
Giai đoạn 3: Xây dựng lại nền tảng dữ liệu lớn cho mục tiêu dài hạn
Vào đầu năm 2017, nền tảng dữ liệu lớn của họ đã được các team trong toàn công ty sử dụng. Người dùng có thể dễ dàng truy cập dữ liệu trong Hive, Presto, Spark, Vertica, Notebook, … thông qua một cổng giao diện người dùng duy nhất. Với hơn 100 petabyte dữ liệu trong HDFS, 100.000 vcores trong cụm máy chủ, 100.000 truy vấn Presto mỗi ngày, 10.000 công việc Spark mỗi ngày và 20.000 truy vấn Hive mỗi ngày, kiến trúc Hadoop của họ bắt đầu đạt mức giới hạn về khả năng mở rộng và nhiều dịch vụ bắt đầu bị ảnh hưởng bởi độ trễ dữ liệu.
Uber đã bắt đầu nghiên cứu để xây dựng thế hệ kho dữ liệu lớn tiếp theo. Họ tập trung vào bốn yêu cầu sau:
- Khả năng mở rộng của HDFS
- Truy cập dữ liệu nhanh hơn trong Hadoop
- Hỗ trợ thao tác cập nhật và xóa trong Hadoop và Parquet
- ETL và mô hình hóa nhanh hơn
Dựa vào 4 yêu cầu nêu trên, họ đã xây dựng Hudi, một thư viện mã nguồn mở của Spark. Hudi được xây dựng dựa trên HDFS và Parquet để hỗ trợ cho thao tác cập nhật và xóa. Sử dụng thư viện Hudi đã cho phép họ giảm độ trễ truy xuất dữ liệu từ 24 giờ xuống dưới một giờ.
Bài viết còn trình bày những mục tiêu đặt ra để xây dựng thế hệ dữ liệu thứ 4 tiếp theo của Uber. Mời các bạn đọc bài viết gốc để tìm hiểu sâu hơn về nội dung này.
(by ndaadn)