HDFS (Hadoop Distributed File System) là hệ thống quản lý tập tin được thiết kế để tối ưu cho bài toán lưu trữ các tập tin có kích thước lớn hàng GB, thậm chí TB. Đểgiải quyết bài toán này, dữ liệu của các tập tin lớn sẽ được chia nhỏ thành các block(ví dụ 64MB) và phân tán trên các Datanode. Ý tưởng được sử dụng ở đây là “dichuyển tính toán vào trong dữ liệu” thay vì di chuyển dữ liệu để tính toán” như cáchthông thường.
Trang 1Khi vi c x lý m t t p h p d li u r t l n và ph c t p mà các ng d ngệ ử ộ ậ ợ ữ ệ ấ ớ ứ ạ ứ ụ
teminal)
d li u.ữ ệ
Trang 2H TH NG FILE PHÂN TÁN HDFS Ệ Ố
1 Khái ni m ệ
1.1 Gi i thi u v Hadoop ớ ệ ề
Hình 1: Ki n trúc Hadoop cluster ế
1.2 Khái ni m HDFS ệ
Trang 3d ng đây là “di chuy n tính toán vào trong d li u” thay vì di chuy n d li uụ ở ể ữ ệ ể ữ ệ
2 Ki n trúc ế
Hình 2: Ki n trúc HDFS ế
Trang 4M c đ nh m i block trên HDFS có kích thặ ị ỗ ước là 64MB M i block c a file sẽ đỗ ủ ược
l i ạ
3 Truy n thông ề
3.1 Gi a Client và Namenode ữ
Trang 53.2 Gi a Client và DataNode ữ
DataNode
3.3 Gi a Namenode và Datanode ữ
c p.ấ
hàm DataNode khác
Trang 6N u NameNode không nh n đế ậ ược Heartbeat g i đ nh kì v , thì xem nhở ị ề ư
4 Đ nh danh ị
Block ID
DataNode
5 Qu n lý ti n trình ả ế
5.1 Ti n trình đ c trong HDFS ế ọ
Trang 7Hình 3: Ti n trình đ c trong HDFS ế ọ
Trang 85.2 Ti n trình ghi trên HDFS ế
Hình 4: Ti n trình ghi trong HDFS ế
bi u đ ).ể ồ
Trang 95 Có nhi u h n m t thành ph n g i làề ơ ộ ầ ọ DataStreamer sẽ tiêu thụ DataQueue.
6 Bây gi , vi c x lý tái t o b t đ u b ng vi c t o đờ ệ ử ạ ắ ầ ằ ệ ạ ường ng s d ngố ử ụ
t t.ấ
6 Đ ng b hóa trong h th ng file phân tán HDFS ồ ộ ệ ố
HDFS cung cấp một phương thức để buộc tất cả các bộ đệm được đồng bộ hóavới các nút dữ liệu thông qua sync() phương thức trên FSDataOutputStream Sau khimột cuộc gọi trở lại thành công từ những người sync()bảo vệ HDFS, dữ liệu được ghiđến thời điểm đó trong tệp được duy trì và hiển thị cho tất cả người đọc Trong trườnghợp xảy ra sự cố (của máy khách hoặc HDFS), dữ liệu sẽ không bị mất
Thuật toán Rack-Awareness
Trang 10Hình 5: Mô hình thuật toán Rack Awareness
Cách các bản sao HDFS sao chép và nhận thức Rack là gì? Một lần nữa,NameNode cũng đảm bảo rằng tất cả các bản sao không được lưu trữ trên cùng mộtrack hoặc một rack đơn Nó tuân theo Thuật toán nhận thức Rack Awareness trong xâydựng để giảm độ trễ cũng như cung cấp khả năng chịu lỗi Xem xét hệ số nhân bản là
3, thuật toán nhận thức giá nói rằng bản sao đầu tiên của một khối sẽ được lưu trữ trênmột giá địa phương và hai bản sao tiếp theo sẽ được lưu trên một giá khác (từ xa)nhưng trên một DataNode khác trong đó ( từ xa) rack như trong hình trên Nếu bạn cónhiều bản sao, phần còn lại của bản sao sẽ được đặt trên các DataNodes ngẫu nhiênđược cung cấp không quá hai bản sao nằm trên cùng một giá, nếu có thể
Đây là cách một cụm sản xuất Hadoop thực tế trông như thế nào Ở đây, cónhiều Rack được điền bằng DataNodes:
Trang 11Hình 6: Các Rack được điền vào trong DataNode
Ưu điểm của thuật toán:
Để cải thiện hiệu suất mạng: Giao tiếp giữa các nút nằm trên các giá đỡ khác
nhau được chuyển qua nút chuyển Nói chung, bạn sẽ tìm thấy băng thông mạng lớnhơn giữa các máy trong cùng một giá so với các máy nằm trong giá khác nhau Vì vậy,Nhận thức Rack giúp bạn giảm lưu lượng ghi ở giữa các giá đỡ khác nhau và do đócung cấp hiệu suất ghi tốt hơn Ngoài ra, bạn sẽ được tăng hiệu suất đọc vì bạn đang
sử dụng băng thông của nhiều giá đỡ
Để tránh mất dữ liệu: Chúng tôi không phải lo lắng về dữ liệu ngay cả khi toàn
bộ giá bị lỗi do lỗi chuyển đổi hoặc mất điện Và nếu bạn nghĩ về nó, nó sẽ có ý nghĩa,
vì nó được nói rằng không bao giờ đặt tất cả trứng của bạn trong cùng một giỏ
7 Qu n lý b t c ả ế ắ
HDFS không phải là một hệ thống file dành cho các mục đích chung HDFSđược thiết kế dành cho các ứng dụng dạng xử lý khối (batch processing) Do đó, cácfile trên HDFS một khi được tạo ra, ghi dữ liệu và đóng lại thì không thể bị chỉnh sữa
Trang 12được nữa Điều này làm đơn giản hoá đảm bảo tính nhất quán của dữ liệu và cho phéptruy cập dữ liệu với thông lượng cao.
7.1 V c u trúc topology c a m ng ề ấ ủ ạ
Trong bối cảnh xử lý dữ liệu với kích thước lớn qua môi trường mạng, việcnhận biết ra giới hạn về băng thông giữa các node là một yếu tố quan trọng để Hadoopđưa ra các quyết định trong việc phân bố dữ liệu và phân tán tính toán Ý tưởng đobăng thông giữa hai node có vẻ như hợp lý, tuy nhiên làm được điều này là khá khókhăn (vì việc đo băng thông mạng cần được thực hiện trong một môi trường “yêntĩnh”, tức tại thời điểm đo thì không được xảy ra việc trao đổi dữ liệu qua mạng) Vìvậy, Hadoop đã sử dụng cấu trúc topology mạng của cluster để định lượng khả năngtruyền tải dữ liệu giữa hai node bất kỳ
Hadoop nhận biết cấu trúc topology mạng của cluster qua một cấu trúc câyphân cấp Cấu trúc này sẽ giúp Hadoop nhận biết được “khoảng cách” giữa hai nodetrên cluster Trên cấu trúc phân cấp này, các bridge sẽ đóng vai trò là các “node trong”
để phân chia mạng ra thành các mạng con (subnet) 2 node có cùng một node cha(cùng nằm trên một mạng con) thì được xem như là “nằm trên cùng một rack”
Hadoop đưa ra một khái niệm là “địa chỉ mạng” để xác định vị trí tương đốicủa các node “Địa chỉ mạng” của một node bất kỳ sẽ là đường dẫn từ node gốc đếnnode xác định Ví dụ địa chỉ mạng của Node 1 của hình bên dưới sẽ là /Swicth 1/Rack1/ Node 1 Hadoop sẽ tính toán “khoảng cách” giữa hai node bất kỳ đơn giản bằngtổng khoảng cách của 2 node đến node cha chung gần nhất Ví dụ như theo hình bêndưới, khoảng cách giữa Node 1 và Node 2 là 2, khoảng cách giữa Node 1 và Node 4 là
4
Hình 7: Cấu trúc topology mạng Hadoop đưa ra một số giả định sau đây về rack:
Trang 13Băng thông giảm dần theo thứ tự sau đây:
1 Các tiến trình trên cùng một node
2 Các node khác nhau trên cùng một rack
3 Các node nằm không cùng nằm trên một rack
Hai node có “khoảng cách” càng gần nhau thì có băng thông giữa hai node đócàng lớn Giả định này khẳng định lại giả định đầu tiên
Khả năng hai node nằm trên cùng một rack cùng bị lỗi (death) là cao hơn sovới hai node nằm trên hai rack khác nhau Điều này sẽ được ứng dụng khi NameNodethực hiện sắp đặt các bản sao cho một block xuống các DataNode
7.2 Săp x p b n sao c a các Block lên DataNode ế ả ủ
Như ta đã biết, trên HDFS, một file được chia ra thành nhiều block, và mỗiblock sẽ được lưu trữ ra thành N bản sao trên N DataNode khác nhau, N được gọi làchỉ số mức độ sao chép (replication level) Với mỗi file trên HDFS, ta có thể quy địnhmột chỉ số replication level khác nhau Chỉ số này càng cao thì file càng “an toàn” Domỗi block của file sẽ được lưu trữ ra càng nhiều bản sao trên các DataNode khácnhau
Một vấn đề được đặt ra là: “NameNode sẽ chọn những DataNode nào để lưucác bản sao của các một block?” Ở đây, chúng ta sẽ có một sự cân bằng giữa ba yếutố: độ tin cậy, băng thông đọc và băng thông ghi dữ liệu Ví dụ như nếu ta ghi tất cácbản sao của một block trên duy nhất một DataNode, thì băng thông ghi sẽ tối ưu vìdata pile (xem lại quá trình ghi file) chỉ xảy ra trên một node duy nhất Tuy nhiên sựtin cậy sẽ tối thiểu (vì nếu DataNode đó “chết” thì tất cả các bản sao block dữ liệu đócũng mất hết) Một ví dụ khác, nếu ta lưu các bản sao của một block lên nhiềuDataNode thuộc các rack khác nhau Điều này làm cho block đó an toàn, vì khả năngcác node thuộc các rack khác nhau cũng “chết” là khó xảy ra Tuy nhiên băng thôngghi dữ liệu sẽ thấp vì data pile trải ra trên nhiều node thuộc các rack khác nhau Vì sựcân bằng này các yếu tố trên chỉ mang tính chất tương đối, nên xuất hiện khá nhiềuchiến lược cho việc sắp xếp bản sao của các block lên các DataNode Từ bản Hadoop0.17.0 trở đi, chiến lược này đã được cố định và theo nguyên tắt là “phân tán các bảnsao của từng block ra khắp cluster”
Theo chiến lược này, bản sao đầu tiên của một block dữ liệu sẽ được đặt trêncùng node với client (nếu chương trình client ghi dữ liệu cũng thuộc cluster, ngược lại,NameNode sẽ chọn ngẫu nhiên một DataNode) Bản sao thứ hai sẽ được đặt trên mộtDataNode ngẫu nhiên nằm trên rack khác với node lưu bản sao đầu tiên Bản sao thứ
ba, sẽ được đặt trên một DataNode nằm cùng rack với node lưu bản sao thứ hai Các
Trang 14bản sao xa hơn được đặt trên các DataNode được chọn ngẫu nhiên Nhìn chung, chiếnlược này đảm bảo cân bằng được cả ba yếu tố là độ tin cậy (một block sẽ được lưutrên hai rack khác nhau), băng thông ghi (data pile chỉ đi qua hai rack) và băng thôngđọc (vì client sẽ có được hai sự lựa chọn xem nên đọc trên rack nào)
7.3 Cân b ng cluster ằ
Theo thời gian sự phân bố của các block dữ liệu trên các DataNode có thể trởnên mất cân đối, một số node lưu trữ quá nhiều block dữ liệu trong khi một số nodekhác lại ít hơn Một cluster bị mất cân bằng có thể ảnh hưởng tới sự tối ưu hoáMapReduce và sẽ tạo áp lực lên các DataNode lưu trữ quá nhiều block dữ liệu (lưulượng truy cập từ client, dung lượng lưu trữ lớn) Vì vậy tốt nhất là nên tránh tìnhtrạng mất cân bằng này
Một chương trình tên balancer (chương trình này sẽ chạy như là một daemontrên NameNode) sẽ thực hiện việc cân bằng lại cluster Việc khởi động hay mởchương trình này sẽ độc lập với HDFS (tức khi HDFS đang chạy, ta có thể tự do tắthay mở chương trình này), tuy nhiên nó vẫn là một thành phần trên HDFS Balancer
sẽ định kỳ thực hiện phân tán lại các bản sao của block dữ liệu bằng các di chuyển nó
từ các DataNode đã quá tải sang những DataNode còn trống mà vẫn đảm bảo cácchiến lược sắp xếp bản sao của các block lên các DataNode
8 Ph c h i và ch u l i ụ ồ ị ỗ
Lỗi từng phần là tính chất đặc trưng của hệ thống phân tán so với các hệ thốngchỉ có một máy chủ, lỗi đó có thể xảy ra khi một thành phần nào đó của hệ thống phântán bị hỏng Trong khi lỗi của hệ thống một máy chủ sẽ ảnh hưởng đến toàn bộ hệthống thì lỗi trong hệ thống phân tán sẽ chỉ ảnh hưởng tới một số thành phần, ít khiảnh hưởng đến toàn bộ hệ thống Mục tiêu chính của HDFS là lưu trữ dữ liệu mộtcách tin cậy ngay khi có lỗi xảy ra
Trang 158.1.2 DataNode b l i ị ỗ
Mọi dữ liệu lưu ở DataNode hỏng đều không được sử dụng cho NameNodenữa và làm cho số lượng nhân bản của nhiều block bị nhỏ hơn hệ số nhân bản.NameNode kiểm tra các block định kì và tiến hành nhân bản cho các block bị thiếunhân bản Việc tái nhân bản này có thể bị gây ra bởi nhiều nguyên nhân khác nhau:Datanode bị lỗi, một nhân bản bị lỗi, hệ số nhân bản tăng lên…
Ngoài ra, DataNodecó thể do lỗi thiết bị, lỗi kết nối mạng, lỗi phần mềm, hay
do nhiều DataNode cùng chứa một khối dữ liệu nên nhiều lúc sẽ xảy ra vấn đề lấy dữliệu, hay khi khối dữ liệu gặp sự cố sẽ ảnh hưởng đến DataNode
và lỗi về nguồn điện… Vì thế, khả năng phát hiện lỗi, chống chịu lỗi và tự động phụchồi phải được tích hợp vào trong hệ thống HDFS
8.1.4 Metadata Disk Failure - Đĩa l u metadata b l i ư ị ỗ
FsImage (lưu thông tin về hệ thống tập tin) và Edit Log (lưu lại giao tác trong
hệ thống) là cấu trúc dữ liệu trung tâm, nếu xảy ra lỗi có thể dẫn đến HDFS ngưnghoạt động Vì lí do này, NameNode được cấu hình để hỗ trợ duy trì nhiều phiên bảnsao chép của FsImage và EditLog, sửa bản chính phải đảm bảo đồng thời sửa bản sao.Thông tin cập nhật vào một phiên bản sẽ đồng bộ sang tất cả các phiên bản khác Điềunày có làm giảm tốc độ của NameNode chút ít nhưng cũng chấp nhận được Trongtrường hợp NameNode (duy nhất) bị sự cố thì cần phải thủ công xử lí
8.1.5 L i phân m nh m ng ỗ ả ạ
Mỗi DataNode đều gửi heartbeat đến NameNode một cách định kì Phân mảnhmạng xảy ra khi một số DataNode mất kết nối với NameNode NameNode phát hiện
ra nhờ sự vắng mặt của hearbeat, NameNode sẽ tiến hành đánh dấu các DataNode này
và đưa nó về trạng thái “dead” và ngừng chuyển tiếp các yêu cầu I/O tới chúng
8.2 Ph c h i và ch u l i c a HDFS ụ ồ ị ỗ ủ
Tính chịu lỗi của một hệ thống liên quan mật thiết tới khái niệm hệ thống tincậy, một hệ thống được coi là đáng tin cậy nếu đáp ứng được bốn tiêu chí sau:
Trang 168.2.1 Tính s n sàng cao khi có s c c a HDFS ẵ ự ố ủ
Toàn bộ kiến trúc Hadoop được xây dựng để hoạt động thông suốt ngay cả cólỗi node hoặc sự cố phần cứng Nó được xây dựng trên khái niệm đơn giản rằng dữliệu là quá lớn và không thể xử lý trên 1 phần cứng duy nhất Chúng ta cần nhiều phầncứng (giá rẽ) để quản lý dữ liệu lớn và phần cứng gặp lỗi là việc hoàn toàn dễ xảy ra
Để giảm tác động của lỗi phần cứng, kiến trúc Hadoop được xây dựng để khắc phụcnhững hạn chế của lỗi phần cứng
Khi NameNode lỗi:
NameNode được sử dụng là điểm lỗi duy nhất trong Hadoop 1.x, nơi toàn bộcụm Hadoop sẽ không có sẵn ngay khi NameNode bị hỏng Nói cách khác, tính sẵnsàng cao của các cuộc đàm phán NameNode về sự cần thiết của một NameNode đểhoạt động để phục vụ các yêu cầu của các máy khách Hadoop
Để giải quyết vấn đề lỗi đơn điểm không thành công của NameNode, tính năng
HA được intorduced trong Hadoop 2.x nơi chúng ta có hai NameNode trong cụmHDFS của chúng ta trong một cấu hình hoạt động / thụ động Do đó, nếu NameNodehoạt động không thành công, thì NameNode thụ động khác có thể thay thế tráchnhiệm của NameNode không thành công và giữ cho HDFS hoạt động
Khi DataNode lỗi - tính toàn vẹn được thể hiện:
Nhiều DataNode chứa cùng các khối dữ liệu, trong trường hợp bất kỳDataNode nào gặp sự cố, toàn bộ xử lý sẽ vẫn tiếp tục, DataNode khác sẽ thay thế vai
Trang 17trò để xử lý khối dữ liệu cụ thể của node bị lỗi Hệ thống này cung cấp tính chịu lỗi rấtcao để đối phó với thảm họa và cung cấp tính sẵn sàng cao.
Khi dữ liệu lấy ra từ DataNode có thể bị hư, HDFS client software sẽ tiến hànhchecksum nội dung của file Khi tạo file, HDFS sẽ tính ra checksum của từng block,
và lưu thành file ẩn riêng biệt Checksum của dữ liệu lấy từ DataNode sẽ được so sánhvới file ẩn này, nếu không giống thì xem như dữ liệu đã hư, cần phải lấy từ DataNodekhác
8.2.2 Đ tin c y c a HDFS thông qua vi c nhân b n d li u ộ ậ ủ ệ ả ữ ệ
HDFS được thiết kế để lưu trữ các file cực lớn một cách tin cậy trên nhiều máytrong một cụm máy chủ lớn Nó chia file thành một chuỗi các block, tất cả các block
có kích thước bằng nhau trừ block cuối cùng Độ lớn block (mặc định 64MB) và sốbản sao (mặc định 3) đều có thể thiết lập được Các block này được nhân bản đểchống lỗi theo hệ thống nhân bản được cấu hình Việc sao lưu là để đảm bảo tính chịulỗi Các file trong HDFS được ghi một lần duy nhất và không thể thay đổi
Các DataNode sẽ gởi nhịp tim (Heartbeat) và báo cáo Block (Blockreport) vềcho NameNode theo định kì Nhận được nhịp tim, NameNode sẽ biết được DataNodehoạt động bình thường, còn báo cáo Block, bao gồm danh sách tất cả các block tênDataNode đó, sẽ giúp cho NameNode ra quyết định (truy xuất dữ liệu hoặc sao thêmnếu có block không đủ bản sao)
Để tăng độ tin cậy (reliability), tính sẵn sàng (availability) và tối ưu đườngtruyền, HDFS lưu các bản sao của các block theo kiểu Rack-Aware
Hình 8: Nhân bản dữ liệu trong HDFS
Trang 18Phương thức nhân bản:
Phương pháp nhân bản của HDFS dựa trên kĩ thuật Hadoop Rack Awareness.Trong hầu hết các trường hợp với hệ số nhân bản là 3, HDFS đặt một nhân bản ở mộtDataNode khác cùng rack, và một ở một DataNode khác khác rack
Tỉ lệ toàn bộ 1 rack bị fail thấp hơn nhiều so với 1 Node bị fail Khi DataNode
bị fail, NameNode sẽ khôi phục các block bị mất cân bằng cách nhân bản trên cácDataNodes trên cùng rack để có tốc độ cao nhất (băng thông lớn hơn) Nếu toàn bộrack bị fail thì vẫn có nhân bản của block trên các rack khác
Cụ thể nếu số bản sao là 3 thì có 2 bản sao lưu trên 2 nodes thuộc cùng 1 rack,bản sao còn lại lưu trên node thuộc rack khác NameNode sẽ xác định DataNode nàothuộc rack nào Nhớ rằng, lỗi của rack ít hơn rất nhiều so với lỗi của node và giao tiếpgiữa các rack khác nhau thì phải qua các switch, tốn thời gian Cách làm này cho phépđọc dữ liệu song song từ các node khác nhau, nhưng lại “mệt” khi ghi dữ liệu
Lựa chọn nhân bản:
Để giảm thiểu việc tiêu thụ băng thông và độ trễ đọc dữ liệu, HDFS cố gắngtìm nhân bản mà gần nhất với NameNode Nếu tồn tại một nhân bản trên cùng rackvới NamdeNode yêu cầu, nhân bản đó sẽ được ưu tiên chọn để thỏa mãn yêu cầu
Nếu HDFS trải rộng trên Data Center, những nhân bản trên cùng Data Center
sẽ được ưu tiên hơn các nhân bản ở Data Center khác
Nói cách khác, HDFS tạo các mảnh nhỏ hơn của dữ liệu lớn và phân tán nó
trên các nodes khác nhau Nó cũng sao chép mỗi miếng dữ liệu nhỏ hơn nhiều lần trênnhiều nodes khác nhau Do đó khi bất kỳ node nào có dữ liệu lỗi, hệ thống tự độngdùng dữ liệu từ 1 node khác và tiếp tục xử lý Đây là tính năng quan trọng của HDFS
Nhân bản dữ liệu được theo đuổi trong HDFS để cung cấp khả năng chịu lỗi.
Và khi nhân rộng sẽ dẫn đến việc tiêu thụ rất nhiều không gian, nhưng người ta luôn
có thể thêm nhiều nút hơn vào cụm nếu cần Bằng cách này, trong các cụm thực tế, rất hiếm khi có vấn đề về không gian trống vì lý do đầu tiên để triển khai HDFS là lưu trữ các tập dữ liệu khổng lồ Ngoài ra, người ta có thể thay đổi yếu tố nhân bản dữ liệu để tiết kiệm không gian HDFS hoặc sử dụng codec khác nhau được cung cấp bởi Hadoop để nén dữ liệu.
Ngoài ra, tốc độ truyền dữ liệu giữa các nodes trong HDFS là rất cao, dẫn đếngiảm thiểu nguy cơ lỗi
Nhân bản metadata trên NameNode với SecondaryNameNode: