CHƯƠNG 4: KIẾN TRÚC CƠ SỞ DỮ LIỆU LỚN
4.1. Kiến trúc khung tính toán (computing frameworks)
4.1.3. Khung xử lý tính toán phân tán
Điện toán phân tán là “Hệ thống trong đó các thành phần phần cứng và phần mềm đã được cài đặt trong các máy tính phân tán về mặt địa lý, điều phối và cộng tác các hành động của chúng bằng cách truyền các thông điệp giữa chúng”. Hiện tại, dữ liệu lớn (Big Data) đang tạo ra tác động rất lớn đến các ngành công nghiệp. Do đó, hầu hết dữ liệu trên thế giới đã được chuyển sang công nghệ Dữ liệu lớn (Hadoop).
Apache Hadoop, một hệ thống phân tán, cũng tận dụng công nghệ tính toán song song để xử lý dữ liệu đồng thời trên nhiều máy sử dụng phân cụm theo tỷ lệ. MapReduce là một mô hình máy tính được thiết kế để xử lý khối lượng dữ liệu khổng lồ có khả năng mở rộng cao. Trong MapReduce, các công việc được chia thành các nhiệm vụ nhỏ độc lập và xử lý song song trên nhiều nút của cụm, đề cập đến tập hợp các máy tính tiêu chuẩn được kết nối với nhau.
Gần đây, sự tăng trưởng của dữ liệu đã bùng nổ, và việc bắt đầu dữ liệu từ các phương tiện truyền thông xã hội và nhật ký giao dịch đã được truyền trực tuyến. Do đó, các công cụ mới và framework cải tiến đã được thêm vào theo nhu cầu của thị trường.
Các framework phổ biến mới như Spark và Flink dẫn đầu cho MapReduce. Spark là một mô hình lập trình Điện toán phân tán đa luồng, chia nhỏ một tập dữ liệu lớn thành các phần nhỏ và xử lý và lưu trữ dữ liệu trên một hệ thống tệp phân tán. Ngày nay, các khung công tác hoàn toàn dựa trên luồng, chẳng hạn như Strom, cũng đang được sử dụng trong ngành.
Điện toán phân tán có vai trò to lớn đối với sự thành công của dữ liệu lớn. Dữ liệu lớn yêu cầu không gian lưu trữ và cơ sở hạ tầng với chi phí rất thấp, được cung cấp bởi điện toán đám mây. Điện toán đám mây là một nhánh của điện toán phân tán. Để xử lý một lượng lớn dữ liệu với tốc độ rất cao, yêu cầu sức mạnh của điện toán cụm (cluster computing), đây cũng là một nhánh của điện toán phân tán. Như vậy, để nâng cao tốc độ xử lý của dữ liệu lớn cần có hai tính năng: xử lý theo lô (batch processing) và xử lý theo luồng (stream processing). Theo mặc định, Hadoop MapReduce là một hệ thống batch processing, nhưng với việc phát minh ra phương tiện truyền thông xã hội khởi tạo dữ liệu trong thời gian thực, cần có một khung xử lý luồng cho dữ liệu lớn. Khung xử lý MapReduce được thiết kế để xử lý các tập dữ liệu lớn và chia các tập dữ liệu thành
các lô nhỏ. Ngược lại, các khung khác xử lý dữ liệu theo một luồng không bị gián đoạn, khi nó chảy vào hệ thống.
Khung xử lý dữ liệu theo lô chia các công việc dữ liệu lớn thành các phần nhỏ và phân phối các phần này trên một số lượng lớn các nút theo kích thước của cụm máy tính để xử lý dữ liệu lớn. Thời gian thực hiện xử lý theo lô được xác định với số lượng nút hoạt động trong một cụm và quy mô của công việc. Mô hình xử lý theo lô không phù hợp để đáp ứng các hạn chế về thời gian thực do có độ trễ cao để xử lý Dữ liệu lớn.
Xử lý luồng là một mô hình để xử lý luồng thời gian thực được đồng bộ hóa với luồng dữ liệu và trả về kết quả theo kiểu có độ trễ thấp. Xử lý luồng cũng có một số tính năng của xử lý theo lô như khả năng chịu lỗi, tính sẵn sàng cao và sử dụng tài nguyên.
Hệ thống xử lý luồng thời gian thực đảm bảo luôn cập nhật và luôn sẵn sàng cho dữ liệu thời gian thực. Xử lý luồng đạt được khả năng mở rộng gia tăng một cách tự động bằng cách phân phối sức mạnh xử lý cũng như dung lượng lưu trữ trên nhiều máy tính mà không cần bất kỳ sự tương tác nào của con người. Các khung sau được nối trong môi trường Hadoop:
• MapReduce (Batch Processing frameworks)
• Spark (Stream and Batch Processing frameworks)
• Flink (Stream and Batch Processing frameworks)
• Storm (Stream processing frameworks) 4.1.3.1 Apche HADOOP
Theo thời gian, kích thước thông tin liên tục tăng và sự tăng trưởng lớn đó được tạo ra để thay đổi cách xử lý và quản lý thông tin này, khi tốc độ đồng hồ của các bộ xử lý riêng lẻ chậm lại, các hệ thống phát triển thành đa bộ xử lý hoặc kiến trúc định hướng.
Tuy nhiên, có những trường hợp kịch bản, trong đó kích thước dữ liệu quá lớn để được phân tích trong thời gian có thể chấp nhận được bởi một hệ thống và trong trường hợp này, MapReeduce và hệ thống tệp phân tán có thể phát huy tác dụng. Apache Hadoop là một cơ sở hạ tầng xử lý phân tán. Nó có thể được sử dụng trên một máy duy nhất, nhưng để tận dụng và đạt được tiềm năng đầy đủ của nó, nó phải mở rộng quy mô nó lên hàng trăm hoặc hàng nghìn máy tính, mỗi máy tính có một số lõi bộ xử lý. Nó cũng được thiết kế để phân phối hiệu quả lượng lớn công việc và dữ liệu trên nhiều hệ thống.
Nó chủ yếu bao gồm hai thành phần chính, đó là hệ thống tệp phân tán Hadoop (HDFS) và MapReduce. HDFS được sử dụng để quản lý lưu trữ dữ liệu, trong khi MapReduce được sử dụng như mô hình lập trình.
4.1.3.1.1 Hệ thống tệp phân tán Hadoop (HDFS)
Hệ thống tệp phân tán Hadoop (HDFS) là một hệ thống lấy cảm hứng từ hệ thống tệp Google của Google lưu trữ các tệp lớn trong nhiều máy theo cơ chế không chia sẻ gì. Nó được phát triển để xử lý dữ liệu lớn trên các cụm phần cứng hàng hóa. Apache Hadoop là một triển khai mã nguồn mở của Google’s MapReduce và được nhiều tổ chức
lớn như Google, Facebook, Yahoo, Oracle và Microsoft mua lại để kích hoạt các ứng dụng của họ trên đám mây. Nó cung cấp một mô hình lập trình trừu tượng và dễ dàng để viết các chương trình song song thay vì phải lo lắng về việc phân phối dữ liệu, song song hóa, khả năng chịu lỗi và tính toán. MapReduce là một khung xử lý dữ liệu song song trên HDFS (cung cấp thông lượng và khả năng truy cập cao) .Hadoop có các cơ chế tồn tại lỗi máy chủ, thông lượng cao và khả năng chịu lỗi tốt nhất.
Giống như hệ thống tệp của Google, Hadoop cũng duy trì các bản sao của các phân tách dữ liệu của nó trên các máy khác nhau để cung cấp vị trí và độ tin cậy của dữ liệu. Kích thước phân đoạn mặc định của HDFS là 64 MB và các phân đoạn này là một khi ghi nhiều đoạn đọc. Cơ chế chủ-tớ của Hadoop được hiển thị trong Hình 4.13. Nó bao gồm NameNode và DataNodes. NameNode còn được gọi là MasterNode, chịu trách nhiệm kiểm soát toàn bộ công việc MapReduce thông qua JobTracker và kiểm soát các tác vụ trong công việc thông qua TaskTracker (TT) trong khi làm việc với tư cách DataNode (ví dụ: cụm nút đơn). Một DataNode, còn được gọi là SlaveNode, bao gồm DataNode và TT. Một mã tên thứ cấp trong các cụm lớn được sử dụng để tạo các snaps của tên node để tránh mất mát và hoạt động như mã tên dự phòng. NameNode lưu trữ siêu dữ liệu về các tệp/khối dữ liệu được lưu trữ trong DataNodes, trong khi DataNodes lưu trữ các khối dữ liệu thực tế (64 MB). Theo mặc định, mỗi đoạn dữ liệu được sao chép theo hệ số 3.
Hình 4. 13: Kiến trúc của HDFS 4.1.3.1.2. MapReduce
MapReduce là trung tâm của Apache Hadoop. Mô hình lập trình này cho phép khả năng mở rộng lớn trên hàng trăm hoặc hàng nghìn máy chủ trong một cụm Hadoop.
Khái niệm MapReduce khá đơn giản để hiểu đối với những người đã quen thuộc với các
giải pháp xử lý dữ liệu theo tỷ lệ phân cụm. Thuật ngữ MapReduce thực sự đề cập đến hai tác vụ riêng biệt và khác biệt mà các chương trình Hadoop thực hiện. Đầu tiên là công việc bản đồ, lấy một tập dữ liệu và chuyển đổi nó thành một tập dữ liệu khác, trong đó các phần tử riêng lẻ được chia nhỏ thành các bộ giá trị (cặp khóa/giá trị). Công việc rút gọn lấy đầu ra từ một bản đồ làm đầu vào và kết hợp các bộ dữ liệu đó thành một bộ bộ dữ liệu nhỏ hơn. Như trình tự của tên MapReduce, công việc thu gọn luôn được thực hiện sau công việc bản đồ.
Hình 4. 14: Luồng làm việc của MapReduce Các bước Hình 4.14 tóm tắt luồng thuật toán thu nhỏ bản đồ:
• Dữ liệu đầu vào có thể được chia thành n phần tùy thuộc vào lượng dữ liệu và khả năng xử lý của từng đơn vị.
• Tiếp theo, nó được chuyển cho các hàm ánh xạ. Xin lưu ý rằng tất cả các phần được xử lý đồng thời tại cùng một thời điểm, bao gồm việc xử lý song song dữ liệu.
• Sau đó, thực hiện xáo trộn dẫn đến tổng hợp các mẫu tương tự.
• Cuối cùng, các bộ giảm kết hợp tất cả chúng lại để có được đầu ra tổng hợp theo logic.
• Thuật toán này bao gồm khả năng mở rộng vì tùy thuộc vào kích thước của dữ liệu đầu vào, chúng ta có thể tiếp tục tăng số lượng các đơn vị xử lý song song 4.1.3.2. Apache Spark
Apache Spark là một khung xử lý dữ liệu lớn mã nguồn mở được xây dựng dựa trên tốc độ, tính dễ sử dụng và phân tích phức tạp. Ban đầu nó được phát triển vào năm 2009 trong AMPLab của UC Berkeley và có nguồn mở vào năm 2010 dưới dạng một dự án Apache. để quản lý các yêu cầu xử lý dữ liệu lớn với nhiều tập dữ liệu đa dạng về bản chất (dữ liệu văn bản, dữ liệu biểu đồ,…) cũng như nguồn dữ liệu (dữ liệu truyền
trực tuyến theo lô thời gian thực). Spark cho phép các ứng dụng trong cụm Hadoop chạy nhanh hơn 100 lần trong bộ nhớ và nhanh hơn 10 lần ngay cả khi chạy trên đĩa. Spark tạo điều kiện cho người dùng nhanh chóng viết các ứng dụng bằng Java, Scala hoặc Python. Nó đi kèm với một bộ cài sẵn gồm hơn 80 toán tử cấp cao. Và bạn có thể sử dụng nó một cách tương tác để truy vấn dữ liệu bên trong shell. Các nhà phát triển có thể sử dụng các khả năng này độc lập hoặc kết hợp chúng để chạy trong một trường hợp sử dụng đường ống dữ liệu duy nhất. Với các khả năng như lưu trữ dữ liệu trong bộ nhớ và xử lý gần thời gian thực, hiệu suất có thể nhanh hơn nhiều lần so với các công nghệ dữ liệu lớn khác. Spark cũng hỗ trợ đánh giá lười biếng các truy vấn dữ liệu lớn, giúp tối ưu hóa các bước trong quy trình xử lý dữ liệu. Nó cung cấp một API cấp cao hơn để cải thiện năng suất của nhà phát triển và một mô hình kiến trúc nhất quán cho dữ liệu lớn các giải pháp.
Spark lưu giữ các kết quả trung gian trong bộ nhớ thay vì ghi chúng vào đĩa, điều này rất hữu ích, đặc biệt khi bạn cần làm việc trên cùng một tập dữ liệu nhiều lần. Nó được thiết kế để trở thành một công cụ thực thi hoạt động cả trong bộ nhớ và trên đĩa.
Các toán tử Spark thực hiện các hoạt động bên ngoài khi dữ liệu không vừa trong bộ nhớ. Spark có thể được sử dụng để xử lý tập dữ liệu lớn hơn bộ nhớ tổng hợp trong một cụm. Spark cố gắng lưu trữ càng nhiều dữ liệu trong bộ nhớ và sau đó sẽ tràn ra đĩa. Nó có thể lưu trữ một phần của tập dữ liệu trong bộ nhớ và dữ liệu còn lại trên đĩa. Bạn phải xem dữ liệu của mình và các trường hợp sử dụng để đánh giá các yêu cầu về bộ nhớ.
Với khả năng lưu trữ dữ liệu trong bộ nhớ này, Spark có lợi thế về hiệu suất. Có nhiều tính năng của Spark, bao gồm:
• Hỗ trợ nhiều hơn các chức năng Bản đồ và Rút gọn.
• Tối ưu hóa các đồ thị toán tử tùy ý.
• Đánh giá chậm các truy vấn dữ liệu lớn giúp tối ưu hóa quy trình xử lý dữ liệu tổng thể.
• Cung cấp các API ngắn gọn và nhất quán trong Scala, Java và Python.
• Cung cấp trình bao tương tác cho Scala và Python. Điều này chưa có sẵn trong Java.
Spark được viết bằng Ngôn ngữ lập trình Scala và chạy trên môi trường Máy ảo Java (JVM). Nó hiện hỗ trợ Scala, Java, Python, Clojure và R.
Hình 4. 15: Kiến trúc của Apache Spark Kiến trúc Apache Spark bao gồm hai lớp trừu tượng chính:
• Tập dữ liệu phân tán có khả năng phục hồi (RDD): Nó là một công cụ quan trọng để tính toán dữ liệu. Nó cho phép bạn kiểm tra lại dữ liệu trong trường hợp bị lỗi và nó hoạt động như một giao diện cho dữ liệu bất biến. Nó giúp tính toán lại dữ liệu trong trường hợp bị lỗi và nó là một cấu trúc dữ liệu. Có hai phương pháp để sửa đổi RDD: biến đổi và hành động.
• Đồ thị Acyclic có hướng (DAG): Trình điều khiển chuyển đổi chương trình thành một DAG cho mỗi công việc. Hệ thống Apache Spark bao gồm các thành phần khác nhau như lõi API, Spark SQL, truyền trực tuyến và xử lý thời gian thực, MLIB và Đồ thị X. Một chuỗi kết nối giữa các nút được gọi là trình điều khiển.
Do đó, bạn có thể đọc khối lượng dữ liệu bằng cách sử dụng Spark shell. Bạn cũng có thể sử dụng ngữ cảnh Spark - hủy bỏ, chạy một công việc, nhiệm vụ (công việc) và công việc (tính toán) để dừng một công việc.
Khi Chương trình trình điều khiển trong kiến trúc Apache Spark thực thi, nó sẽ gọi chương trình thực của một ứng dụng và tạo một SparkContext. SparkContext chứa tất cả các chức năng cơ bản. Trình điều khiển Spark bao gồm một số thành phần khác, bao gồm Bộ lập lịch DAG, Bộ lập lịch tác vụ, Bộ lập lịch phụ trợ và Trình quản lý khối, tất cả đều chịu trách nhiệm dịch mã do người dùng viết thành các công việc thực sự được thực thi trên cụm.
Trình quản lý cụm quản lý việc thực hiện các công việc khác nhau trong cụm. Spark Driver hoạt động cùng với trình quản lý cụm để kiểm soát việc thực hiện nhiều công việc khác nhau. Người quản lý cụm làm nhiệm vụ phân bổ tài nguyên cho công việc.
Khi công việc đã được chia thành các công việc nhỏ hơn, sau đó được phân phối đến các nút worker, SparkDriver sẽ kiểm soát việc thực thi.
Nhiều nút worker có thể được sử dụng để xử lý một RDD được tạo trong SparkContext và kết quả cũng có thể được lưu vào bộ nhớ cache.
Spark context nhận thông tin nhiệm vụ từ trình quản lý cụm và xếp hàng nó trên các nút worker.
Bộ thi hành Executor có trách nhiệm thực hiện các nhiệm vụ này. Tuổi thọ của các trình thực thi giống như tuổi thọ của Ứng dụng Spark. Chúng ta có thể tăng số lượng worker nếu chúng ta muốn cải thiện hiệu suất của hệ thống. Bằng cách này, chúng ta có thể phân chia công việc thành nhiều phần mạch lạc hơn.
4.1.3.3. Apache Storm
Apache Storm là một hệ thống xử lý dữ liệu lớn thời gian thực phân tán. Storm được thiết kế để xử lý lượng lớn dữ liệu theo phương pháp có thể chịu lỗi và có thể mở rộng theo chiều ngang. Đây là một khung dữ liệu trực tuyến có khả năng đạt tốc độ nhập cao nhất. Mặc dù Storm không có trạng thái, nó quản lý môi trường phân tán và trạng thái cụm thông qua Apache ZooKeeper. Nó rất đơn giản và bạn có thể thực hiện song song tất cả các loại thao tác trên dữ liệu thời gian thực.Apache Storm đang tiếp tục dẫn đầu trong phân tích dữ liệu thời gian thực. Storm rất dễ cài đặt, vận hành và nó đảm bảo rằng mọi thông báo sẽ được xử lý thông qua cấu trúc liên kết ít nhất một lần.
Hình 4. 16: Kiến trúc của Apache Storm
Có hai loại dịch vụ nút sau được trình bày trong sơ đồ trên (Hình 4.16)
• Dịch vụ Nimbus trên Master Node - Nimbus là một daemon (daemon là một quy trình nền xử lý các yêu cầu đối với các dịch vụ như in spooling và truyền tệp, và không hoạt động khi không được yêu cầu) chạy trên nút chính của Storm cluster.
Nó chịu trách nhiệm phân phối mã giữa các nút worker, gán các bộ dữ liệu đầu vào cho các máy để xử lý và giám sát các hỏng hóc. Dịch vụ Nimbus là một dịch vụ Apache Thrift cho phép bạn gửi mã bằng bất kỳ ngôn ngữ lập trình nào. Bằng cách này, bạn luôn có thể sử dụng ngôn ngữ mà bạn thành thạo mà không cần phải học một ngôn ngữ mới để sử dụng Apache Storm trong dịch vụ Apache ZooKeeper.
• Dịch vụ Supervisor trên Worker Node - Tất cả các worker node trong Storm cluster đều chạy một daemon có tên là Supervisor. Dịch vụ giám sát nhận công