Sử dụng Apache Flume để thu nhận và xử lý dữ liệu quy mô lớn

734
Sử dụng một kiến trúc có thể chịu được lỗi, Flume là một hệ thống được phân bổ để thu thập dữ liệu logs từ nhiều nguồn, tổng hợp và chuyển một phần lớn trong số đó tới khu lưu trữ dữ liệu tập trung như Hadoop Distributed File System (HDFS) hoặc Hbase. Flume được thiết kế như một hệ thống phân tán linh động có thể quy mô ra rất dễ dàng và có khả năng chỉnh sửa, tùy biến cao. Một tác nhân Flume được định dạng cụ thể và một đường dẫn tác nhân Flume hình thành bởi việc kết nối các tác nhân với nhau đã được đảm bảo không làm mất dữ liệu, các kênh bền vững nó cung cấp đang được sử dụng.
Trong bài viết trước, tôi đã giải thích tại sao chúng ta thực sự cần một hệ thống bộ đệm như Flume để nạp vào dữ liệu log. Trong bài viết này, chúng ta sẽ trao đổi về việc làm thế nào để quy mô dễ dàng một dãy Flume trong khi số lượng máy chủ xuất dữ liệu liên tục tăng.
Hình 1: Flume được thiết kế như một hệ thống phân tán linh động có thể quy mô ra rất dễ dàng và có khả năng chỉnh sửa, tùy biến cao
Mô hình dữ liệu luồng           
Một sự biến Flume có thể được định nghĩa là một đơn vị dữ liệu luồng có tải trọng (bytes) và một bộ tùy chọn thuộc tính chuỗi. Một tác nhân Flume là một quá trình JVM kiểm soát các thành phần mà qua đó sự biến chảy từ một nguồn bên ngoài tới điểm thu nhận tiếp theo (hop).
Một sự biến Flume có 3 thành phần chính: source, channel và sink. Source xử lý các sự kiện được một nguồn bên ngoài như một dịch vụ mạng chuyển đến nó. Nguồn bên ngoài này gửi sự kiện tới Flume dưới một khuôn dạng có thể nhận biết. Khi một nguồn Flume nhận được sự kiện, nó lưu trữ chúng ở một hay nhiều channel (channel dùng hệ thống tập tin nội bộ hoặc bộ nhớ để lưu trữ sự biến). Channel là một kho lưu trữ bị động giữ một sự kiện cho đến khi nó được xử lý bởi Flume sink. Sink trích xuất sự kiện từ một channel và đưa nó vào một kho chứa ngoại biên như HDFS hoặc chuyển tiếp nó tới Flume source của tác nhân Flume tiếp theo (luồng multi-hop) trong luồng. Source và sink trong tác nhân đã cho chạy không đồng thời với những sự biến được xử lý trong channel.
Hình 2: Một sự biến Flume có 3 thành phần chính: source, channel và sink
Luồng multi-hop/Luồng phức
Flume cho phép người dùng xây dựng luồng multi-hop nơi các sự kiện di chuyển qua hàng loạt tác nhân trước khi tới đích cuối. Trong trường hợp của luồng multi-hop, bộ phận sink và source của hop trước đó đều chạy quy trình quản trị để đảm bảo dữ liệu được lưu trữ an toàn trong channel của hop tiếp theo.
Hình 3: Flume cho phép người dùng xây dựng luồng multi-hop nơi các sự kiện di chuyển qua hàng loạt tác nhân trước khi tới đích cuối
Điều này cho phép người dùng thiết kế một luồng dạng mạch từ một số lượng lớn ứng dụng xuất dữ liệu. Việc giới hạn số lượng ứng dụng viết dữ liệu cho bất kỳ hệ thống nào là rất quan trọng để đảm bảo hệ thống lưu trữ có quy mô tương thích với lượng lớn dữ liệu nhập vào và có thể xử lý khi chúng bùng phát.
Để thiết kế một cấu trúc hình học dạng mạch cần có một lượng tác nhân Flume nhận dữ liệu từ ứng dụng xuất dữ liệu trong khi một vài tác nhân viết dữ liệu vào hệ thống lưu trữ. Tùy thuộc vào số lượng máy chủ xuất ra lượng dữ liệu là bao nhiêu, các tác nhân có thể được tổ chức thành một, hai, hoặc nhiều tầng, với các tác nhân chuyển tiếp dữ liệu ở từng tầng tới tầng tiếp theo qua kết hợp RPC sink- RPC source.
 Hình minh họa dưới đây cho thấy, tầng ngoài cùng có lượng tác nhân tối đa để nhận dữ liệu từ ứng dụng, mặc dù số lượng tác nhân Flume chỉ chiếm một phần nhỏ trong số lượng máy chủ ứng dụng, con số cụ thể phụ thuộc vào nhiều yếu tố bao gồm cả mạng lưới, phần cứng, và khối lượng dữ liệu. Khi ứng dụng xuất ra nhiều dữ liệu hơn hoặc nhiều máy chủ được thêm vào hơn, rất dễ để quy mô hóa bằng cách đơn giản là thêm tác nhân vào tầng ngoài cùng và định hình để chúng ghi dữ liệu vào bộ máy của tầng thứ hai.
Hình 4: Flume kiểm soát mức độ lưu trữ trong hệ thống bằng cách đẩy ra nếu cần thiết, trong khi vẫn cho phép ứng dụng ghi dữ liệu
Cấu trúc hình học này cho phép Flume kiểm soát mức độ lưu trữ trong hệ thống bằng cách đẩy ra nếu cần thiết, trong khi vẫn cho phép ứng dụng ghi dữ liệu. Cấu trúc này còn thường được sử dụng khi ứng dụng xuất dữ liệu được triển khai ở nhiều trung tâm dữ liệu khác nhau, và dữ liệu đang được tập hợp tới một dãy. Bằng cách ghi vào một tác nhân Flume trong cùng một trung tâm dữ liệu, ứng dụng này có thể tránh việc ghi dữ liệu chéo vào trung tâm dữ liệu chéo WAN link, nhưng đảm bảo rằng dữ liêu cuối cùng vẫn sót lại trong hệ thống lưu trữ. Sự trao đổi tin tức giữa các tác nhân Flume có thể được định hình để thao túng trung tâm dữ liệu chéo tiềm tàng, từ đó đảm bảo rằng sự truyền tin giữa các tác nhân có thể thực hiện hiệu quả mà không trễ thời gian.
Việc có nhiều tầng cho phép duy trì các nhánh tải lâu và rộng hơn, bằng cách không áp đảo bất cứ tác nhân hay tầng nào và thoát ra dữ liệu từ mỗi tầng nhanh nhất có thể. Vì thế, số lượng tầng cần thiết được quyết định dựa trên lượng dữ liệu dồn vào khu triển khai Flume. Bởi tầng ngoài cùng nhận dữ liệu từ lượng máy lớn nhất, tầng này nên có một lượng tác nhân tối đa để cân bằng được kiến trúc mạng lưới. Nếu nghiên cứu kĩ hơn vào cấu trúc hình học Flume, số lượng tác nhân có thể giảm đi đáng kể.
Kết luận
Qua một số lượng tác nhân nhận dữ liệu từ các máy chủ ứng dụng, nơi sau đó viết dữ liệu vào HDFS hay Hbase (trực tiếp hoặc qua tác nhân Flume khác), việc cân bằng số lượng máy chủ và lượng dữ liệu có thể ghi vào HDFS qua thao tác đơn giản thêm tác nhân Flume là hoàn toàn khả thi.
Tin liên quan:
  • 1
    Share