Hadoop hiện đã trở thành một giải pháp phổ biến cho nhu cầu về sử lý dữ liệu lớn trên thế giới ngày nay. Thiết kế của Hadoop mang lại rất nhiều giá trị. Đó là khả năng chịu lỗi, xử lý các bộ dữ liệu lớn, lưu dữ liệu cục bộ, tính linh  động trên các nền tảng phần cứng và phần mềm khác nhau, v.v. Trong blog này, sẽ tìm hiểu chi tiết về Kiến trúc Hadoop. Ngoài ra, chúng ta sẽ thấy Sơ đồ kiến ​​trúc Hadoop giúp bạn hiểu rõ hơn về nó.

Vì vậy, hãy khám phá Kiến trúc Hadoop.

Kiến trúc của Hadoop

Hadoop có một cấu trúc liên kết master-slave. Trong cấu trúc này, chúng ta có một node master và nhiều node slave . Chức năng của node master là gán một tác vụ cho các node slave khác nhau và quản lý tài nguyên. Các node slave là máy tính thực tế có thể không mạnh lắm. Các node slave lưu trữ dữ liệu thực trong khi trên master chúng ta có metadata.

Kiến trúc ứng dụng Hadoop chi tiết

Kiến trúc Hadoop bao gồm ba lớp chính. Họ đang:-

  • HDFS (Hadoop Distributed File System)
  • Yarn
  • MapReduce

1. HDFS

HDFS là viết tắt của Hệ thống tệp phân tán Hadoop(Hadoop Distributed File System) . Nó cung cấp cho việc lưu trữ dữ liệu của Hadoop. HDFS chia đơn vị dữ liệu thành các đơn vị nhỏ hơn gọi là các block và lưu trữ chúng theo cách phân tán. Nó đã có hai daemon chạy. Một node master - NameNode và các node slave khác - DataNode.

a. NameNode và DataNode

HDFS có kiến trúc Master-Slave . Trình nền có tên NameNode chạy trên máy master chính. Nó chịu trách nhiệm quản lý Namespace và điều chỉnh truy cập tệp của client. DataNode chạy trên các nút slave. Nó có trách nhiệm lưu trữ business data thực tế. Bên trong đó, một tệp được chia thành một số block và được lưu trữ trên một nhóm các máy phụ thuộc. Namenode quản lý sửa đổi namespace tập tin. Chính vì vậy là những hành động như mở, đóng và đổi tên tập tin hoặc thư mục đều thông qua Namenode. NameNode cũng theo dõi ánh xạ các block tới DataNodes. DataNodes này phục vụ yêu cầu đọc / ghi từ client của file system. DataNode cũng tạo, xóa và sao chép các khối theo yêu cầu từ NameNode.

HDFS dược viết bằng ngôn ngữ chính là java. Do đó, người ta có thể deploy DataNode và NameNode trên các máy đã cài đặt Java. Thông thường chúng ta sẽ cần có một máy chuyên dụng chạy NameNode. Và tất cả các nút khác trong cụm chạy DataNode. NameNode chứa siêu dữ liệu giống như vị trí của các khối trên DataNodes. Và phân chia tài nguyên giữa các DataNodes khác nhau.

b. Block trong HDFS

Block là đơn vị lưu trữ nhỏ nhất trên hệ thống máy tính. Đây là bộ lưu trữ liền kề nhỏ nhất được phân bổ cho một tệp. Trong Hadoop, kích thước khối mặc định là 128 MB hoặc 256 MB .

Người ta phải chọn kích thước block rất cẩn thận. Để giải thích lý do tại sao chúng ta hãy lấy một ví dụ về một tệp có kích thước 700 MB. Nếu kích thước khối của chúng tôi là 128MB thì HDFS chia tệp thành 6 block. Năm blcok 128MB và một block 60MB. Điều gì sẽ xảy ra nếu block có kích thước 4KB? Nhưng trong HDFS, chúng ta sẽ có các tệp có kích thước theo thứ tự terabyte đến petabyte. Với 4KB kích thước block, chúng ta sẽ có nhiều block. Điều này sẽ tạo ra siêu dữ liệu khổng lồ sẽ làm quá tải NameNode. Do đó, chúng tôi phải chọn kích thước khối HDFS một cách thận trọng.

c. Quản lý Replication(nhân bản)

Để cung cấp khả năng chịu lỗi HDFS sử dụng kỹ thuật replication. Trong đó, nó tạo các bản sao của các block và lưu trữ trên các DataNodes khác nhau. Hệ số sao chép quyết định số lượng bản sao của các block được lưu trữ. Nó là 3 theo mặc định nhưng chúng ta có thể cấu hình thành bất kỳ giá trị nào.

Hình trên cho thấy kỹ thuật Replication hoạt động như thế nào. Giả sử chúng ta có một tệp 1GB thì với hệ số sao chép là 3, nó sẽ yêu cầu 3GB tổng dung lượng lưu trữ.

Để duy trì hệ số replication NameNode thu thập báo cáo khối từ mỗi DataNode. Bất cứ khi nào một khối được sao chép dưới mức hoặc sao chép quá mức, NameNode sẽ thêm hoặc xóa các bản sao tương ứng.

d. Rack Awareness

Một rack chứa nhiều máy DataNode và có nhiều rack như vậy trong sản xuất. HDFS tuân theo thuật toán Rack Awareness để đặt các bản sao của các block theo kiểu phân tán. Thuật toán Rack Awareness này cung cấp độ trễ thấp và khả năng chịu lỗi. Giả sử hệ số replication được cấu hình là 3. Bây giờ thuật toán rack awareness sẽ đặt block đầu tiên lên một rack. Nó sẽ giữ hai block còn lại trên một rack khác. Nó không lưu trữ nhiều hơn hai khối trong cùng một rack nếu có thể.

Làm như vậy sẽ giải quyết được các vấn đề sau:

  • Để cải thiện độ sẵn sàng cao và độ tin cậy của dữ liệu.
  • Cải thiện hiệu suất của cụm.
  • Để cải thiện băng thông mạng.
  • Tránh mất dữ liệu nếu toàn bộ rack bị hỏng mặc dù khả năng lỗi rack thấp hơn rất nhiều so với lỗi node.
  • Để giữ dữ liệu số lượng lớn trong giá khi có thể.
  • Băng thông cao hơn nên độ trễ thấp hơn.

2. MapReduce

MapReduce là data processing layer của Hadoop . Đây là framework cho phép bạn viết các ứng dụng để xử lý một lượng lớn dữ liệu.MapReduce chạy các ứng dụng này song song trên một cụm các máy cấp thấp.

Công việc MapReduce bao gồm một số nhiệm vụ mapreduce. Mỗi nhiệm vụ hoạt động trên một phần của dữ liệu. Điều này phân phối tải trên toàn cụm. Chức năng của các tác vụ map là tải, phân tích, chuyển đổi và lọc dữ liệu. Mỗi tác vụ reduce hoạt động trên tập hợp con đầu ra từ các tác vụ map. Reduce có nhiệm vụ tổng hợp cho dữ liệu trung gian này từ các tác vụ map.

Tệp đầu vào cho công việc MapReduce tồn tại trên HDFS. Định dạng đầu vào(input) quyết định cách chia tách như thế nào. Sự phân chia đầu vào này được tải bởi Map. Map task chạy trên nút có dữ liệu liên quan. Dữ liệu không cần phải di chuyển qua mạng và được xử lý cục bộ.

a. Map

Phần map được thực hiện ở các giai đoạn sau:

RecordReader

Bộ RecordReader biến đổi đầu vào tách thành các bản ghi. Nó parser dữ liệu thành các bản ghi nhưng không parser các bản ghi. Nó cung cấp dữ liệu cho hàm mapper trong đó là các cặp key-value. Thông thường, key là thông tin vị trí và giá trị là dữ liệu bao gồm bản ghi.

Có 2 loại RecordReader

  • LineRecordReader: Với đầu vào là 1 file sẽ tách mỗi dòng là 1 value và key là thứ tự của dòng đó
  • SequenceFileRecordReader: Nó đọc dữ liệu được chỉ định bởi header của file tuần tự.
Map

Trong pha này, map là hàm do người dùng định nghĩa sẽ xử lý cặp key-value từ bộ đọc bản ghi. Nó tạo ra 0 hoặc nhiều cặp -value trung gian.

Những cặp key-value sẽ được quết định bới hàm hàm mapper. Key thường là dữ liệu mà hàm reduce thực hiện thao tác grouping. Và value là dữ liệu được tổng hợp để có kết quả cuối cùng trong hàm reduce.

Combiner

Về vị trí của nó lại lắm ở reduce để nhóm các dữ liệu trong pha map. Nó là tùy chọn. Combiner lấy dữ liệu trung gian từ pha map và tổng hợp chúng. Nó làm như vậy cũng có một phần nhỏ của một mapper. Trong nhiều tình huống, điều này làm giảm lượng dữ liệu cần thiết để di chuyển qua network. Ví dụ: di chuyển (Hello World, 1) ba lần tiêu tốn băng thông mạng nhiều hơn so với di chuyển (Hello World, 3). Combiner cung cấp hiệu suất cực cao mà không có nhược điểm.

Partitioner

Partitioner nhận các cặp key-value trung gian từ pha map. Nó chia chúng thành các partition, một partition trên mỗi bộ reduce. Theo mặc định, partitioner tìm nạp mã hash của key. Partitioner thực hiện thao tác module hóa bằng một reducer: key.hashcode ()% (số reducer). Điều này phân phối keyspace đồng đều trên các reducer. Nó cũng đảm bảo rằng key có cùng giá trị nhưng từ các trình ánh xạ khác nhau kết thúc vào cùng một reducer. Dữ liệu được phân vùng được ghi trên hệ thống tệp cục bộ từ mỗi tác vụ map. Nó chờ ở đó để reduce có thể lấy nó ra.

b. Reduce

Các giai đoạn khác nhau trong Reducer như sau:

Xáo trộn và sắp xếp(Shuffle and Sort)

Reducer bắt đầu với bước xáo trộn và sắp xếp. Bước này tải dữ liệu được ghi bởi Partitioner vào máy nơi reducer đang chạy. Bước này sắp xếp các phần dữ liệu riêng lẻ vào một danh sách dữ liệu lớn. Mục đích của phân loại này là để thu thập các khóa tương đương với nhau. Khung làm việc này để chúng ta có thể lặp lại dễ dàng trong reduce. Giai đoạn này không thể tùy chỉnh. Khung xử lý mọi thứ tự động. Tuy nhiên, developer có quyền kiểm soát cách các key được sắp xếp và nhóm thông qua một đối tượng so sánh.

Reduce

Bộ giảm tốc thực hiện chức năng giảm một lần cho mỗi nhóm chính. Khung công tác vượt qua khóa chức năng và một đối tượng lặp có chứa tất cả các giá trị liên quan đến khóa.

Chúng ta có thể viết reducer để lọc, tổng hợp và kết hợp dữ liệu theo một số cách khác nhau. Khi hàm reduce được kết thúc, nó cung cấp không hoặc nhiều cặp key-value cho đầu ra. Giống như map function, reduce thay đôi từ công việc này sang công việc khác.

OutputFormat

Đây là bước cuối cùng. Nó lấy cặp key-value từ reducer và ghi nó vào tệp bởi người ghi. Theo mặc định, nó phân tách key và value bằng một tab và mỗi bản ghi bằng một ký tự dòng mới. Chúng ta có thể tùy chỉnh nó để cung cấp định dạng đầu ra phong phú hơn. Nhưng không có dữ liệu final nào được ghi vào HDFS.

3. YARN

YARN hay Yet Another Resource Negotiator là resource management layer của Hadoop. Các nguyên tắc cơ bản đằng sau YARN là để tách, quản lý tài nguyên và chức năng công việc lập kế hoạch / giám sát vào daemon riêng biệt. Trong YARN có một global ResourceMager và ApplicationMaster trên mỗi ứng dụng. Ứng dụng có thể là một công việc đơn lẻ hoặc chuỗi các công việc phục thuộc vào nhau.

Bên trong  YARN, chúng ta có hai trình quản lý ResourceManager và NodeManager. ResourceManager phân xử tài nguyên trong số tất cả các ứng dụng cạnh tranh trong hệ thống. Công việc của NodeManger là giám sát việc sử dụng tài nguyên của container và báo cáo với ResourceManger. Các tài nguyên ở đây là CPU, memory, disk, network,...

ApplcationMaster đàm phán tài nguyên với ResourceManager và làm việc với NodeManger để thực thi và giám sát công việc.

ResourceManger có hai thành phần quan trọng - Scheduler và ApplicationManager

a. Scheduler

Scheduler có trách nhiệm phân bổ tài nguyên cho các ứng dụng khác nhau. Đây là Scheduler thuần túy vì nó không thực hiện theo dõi trạng thái cho ứng dụng. Nó cũng không sắp xếp lại các tác vụ bị lỗi do lỗi phần mềm hoặc phần cứng. Bộ lập lịch phân bổ các tài nguyên dựa trên các yêu cầu của ứng dụng.

b. ApplicationManager

Sau đây là các chức năng của ApplicationManager

  • Chấp nhận nộp công việc.
  • Đàm phán container đầu tiên để thực thi ApplicationMaster. Một thùng chứa kết hợp các yếu tố như CPU, bộ nhớ, đĩa và mạng.
  • Khởi động lại container ApplicationMaster khi không thành công.

Chức năng của ApplicationMaster: -

  • Đàm phán container tài nguyên từ Trình lập lịch biểu.
  • Theo dõi trạng thái vùng chứa tài nguyên.
  • Giám sát tiến độ của ứng dụng.

Chúng ta có thể mở rộng YARN ngoài một vài nghìn node thông qua tính năng YARN Federation. Tính năng này cho phép chúng ta buộc nhiều cụm YARN thành một cụm lớn. Điều này cho phép sử dụng các cụm độc lập, ghép lại với nhau cho một job rất lớn.

c. Đặc điểm của YARN

YARN có các tính năng sau:

Multi-tenancy

YARN cho phép nhiều công cụ truy cập (kể cả open source) trên cùng một bộ dữ liệu Hadoop . Các công cụ truy cập này có thể được xử lý hàng loạt, xử lý thời gian thực, xử lý lặp và vv.

Cluster Utilization

Với sự phân bổ resource động, YARN cho phép sử dụng tốt các cluster. So với các quy tắc map-reduce trong các phiên bản trước của Hadoop , cung cấp việc sử dụng cluster ít hơn.

Khả năng mở rộng

ResourceManager của YARN tập trung vào lập lịch và đối phó với cluster ngày càng mở rộng, xử lý petabyte dữ liệu.

Khả năng tương thích

Chương trình MapReduce được phát triển cho Hadoop 1.x vẫn có thể sử dụng trên YARN này . Và điều này là không có sự gián đoạn đối với các quy trình đã hoạt động.

4. Best Practices cho Hadoop Architecture Design

a. Tránh sử dụng dư thừa phần cứng

Nhiều công ty đưa Hadoop vào bởi nhóm business hoặc nhóm phân tích. Các phần về hạ tầng được đưa vào sau. Những người này thường không có ý tưởng về Hadoop. Kết quả là cụm quá cỡ làm tăng ngân sách gấp nhiều lần. Hadoop chủ yếu được tạo ra để tận dụng lưu trữ giá rẻ và phân tích dữ liệu. Để đạt được điều này, hãy sử dụng JBOD tức là Just a Bunch Of Disk. Ngoài ra, sử dụng một nguồn cung cấp năng lượng duy nhất.

b. Start Small and Keep Focus

Nhiều dự án thất bại vì sự phức tạp và chi phí của chúng. Để tránh điều này bắt đầu với một small cluster và thêm các node khi bạn cần. Bắt đầu với một dự án nhỏ để những người phát triển cơ sở hạ tầng có thể hiểu được hoạt động bên trong của Hadoop .

c. Tạo Procedure tích hợp dữ liệu

Một trong những tính năng của Hadoop là nó cho phép dump dữ liệu trước. Và chúng ta có thể định nghĩa cấu trúc dữ liệu sau này. Chúng ta có thể lấy dữ liệu dễ dàng bằng các công cụ như Flume và Sqoop. Nhưng nó là điều cần thiết để tạo ra một quá trình tích hợp dữ liệu. Điều này bao gồm các lớp khác nhau như dàn dựng, tiêu chuẩn đặt tên, vị trí, vv. Tạo tài liệu thích hợp về nguồn dữ liệu và nơi chúng sống trong cụm.

d. Sử dụng kỹ thuật nén

Có một sự đánh đổi giữa hiệu suất và lưu trữ. Mặc dù nén làm giảm lưu trữ được sử dụng, nó cũng làm giảm hiệu suất. Nhưng Hadoop phát triển mạnh về nén. Nó có thể tăng mức sử dụng lưu trữ lên 80%.

e. Tạo nhiều môi trường

Đó là một thực tiễn tốt nhất để xây dựng nhiều môi trường để development, testing, và production. Vì Apache Hadoop có một hệ sinh thái rộng lớn, các dự án khác nhau trong đó có các yêu cầu khác nhau. Do đó cần có một môi trường phi product để thử nghiệm nâng cấp và các chức năng mới.

Tóm lược

Do đó, trong Kiến trúc ứng dụng Hadoop này, chúng ta đã thấy thiết kế của Kiến trúc Hadoop sao cho nó tự phục hồi bất cứ khi nào cần. Cấu trúc lưu trữ dự phòng của nó làm cho nó có khả năng chịu lỗi và mạnh mẽ. Chúng ta có thể mở rộng hệ thống tuyến tính. Phần MapReduce của thiết kế hoạt động theo nguyên tắc local hóa dữ liệu . Map-Reduce framework di chuyển tính toán gần với dữ liệu. Do đó, việc giảm lưu lượng network sẽ tiêu tốn băng thông lớn để di chuyển các bộ dữ liệu lớn. Kiến ​​trúc tổng thể của Hadoop làm cho nó trở thành công nghệ dữ liệu kinh tế lớn, có thể mở rộng và hiệu quả.

Bạn có thích đọc Kiến trúc Hadoop? Hãy chia sẻ suy nghĩ của bạn với chúng tôi.

Tài liệu tham khảo: