Hướng dẫn HDFS: Archikiến trúc, Đọc & Viết Operasử dụng Java API
HDFS là gì?
HDFS là một hệ thống tệp phân tán để lưu trữ các tệp dữ liệu rất lớn, chạy trên các cụm phần cứng thông dụng. Nó có khả năng chịu lỗi, có khả năng mở rộng và cực kỳ đơn giản để mở rộng. Hadoop đi kèm với HDFS (Hệ thống tệp phân tán Hadoop).
Khi dữ liệu vượt quá dung lượng lưu trữ trên một máy vật lý, việc chia dữ liệu đó thành một số máy riêng biệt là điều cần thiết. Một hệ thống tệp quản lý các hoạt động lưu trữ cụ thể trên mạng máy được gọi là hệ thống tệp phân tán. HDFS là một trong những phần mềm như vậy.
HDFS Archikiến trúc
Cụm HDFS chủ yếu bao gồm một TênNode quản lý hệ thống tập tin Siêu dữ liệu và Mã dữ liệu lưu trữ dữ liệu thực tế.
- TênNode: NameNode có thể được coi là bậc thầy của hệ thống. Nó duy trì cây hệ thống tệp và siêu dữ liệu cho tất cả các tệp và thư mục có trong hệ thống. Hai tập tin 'Hình ảnh không gian tên' và 'chỉnh sửa nhật ký' được sử dụng để lưu trữ thông tin siêu dữ liệu. Nút tên có kiến thức về tất cả các nút dữ liệu chứa các khối dữ liệu cho một tệp nhất định, tuy nhiên, nó không lưu trữ các vị trí khối một cách liên tục. Thông tin này được xây dựng lại mỗi lần từ các nút dữ liệu khi hệ thống khởi động.
- Mã dữ liệu: DataNodes là các nô lệ nằm trên mỗi máy trong một cụm và cung cấp bộ nhớ thực tế. Nó chịu trách nhiệm phục vụ, đọc và viết các yêu cầu cho khách hàng.
Hoạt động đọc/ghi trong HDFS hoạt động ở cấp độ khối. Các tệp dữ liệu trong HDFS được chia thành các khối có kích thước khối, được lưu trữ dưới dạng các đơn vị độc lập. Kích thước khối mặc định là 64 MB.
HDFS hoạt động dựa trên khái niệm sao chép dữ liệu trong đó nhiều bản sao của khối dữ liệu được tạo và phân phối trên các nút trong toàn bộ cụm để cho phép dữ liệu có tính sẵn sàng cao trong trường hợp nút bị lỗi.
Bạn có biết? Một tệp trong HDFS, nhỏ hơn một khối, không chiếm toàn bộ bộ nhớ của khối.
Đọc Operatrong HDFS
Yêu cầu đọc dữ liệu được phục vụ bởi HDFS, NameNode và DataNode. Hãy gọi người đọc là 'khách hàng'. Sơ đồ dưới đây mô tả hoạt động đọc tập tin trong Hadoop.
- Một khách hàng bắt đầu yêu cầu đọc bằng cách gọi 'mở()' phương thức của đối tượng FileSystem; nó là một đối tượng thuộc loại Hệ thống tập tin phân tán.
- Đối tượng này kết nối với nút tên bằng RPC và nhận thông tin siêu dữ liệu như vị trí của các khối của tệp. Xin lưu ý rằng những địa chỉ này nằm trong vài khối đầu tiên của tệp.
- Để đáp ứng yêu cầu siêu dữ liệu này, địa chỉ của DataNodes có bản sao của khối đó sẽ được trả về.
-
Khi địa chỉ của DataNodes được nhận, một đối tượng thuộc loại FSDữ liệuĐầu vàoLuồng được trả lại cho khách hàng. FSDữ liệuĐầu vàoLuồng chứa Luồng đầu vào DFS đảm nhiệm việc tương tác với DataNode và NameNode. Ở bước 4 được hiển thị trong sơ đồ trên, khách hàng gọi 'đọc()' phương pháp gây ra Luồng đầu vào DFS để thiết lập kết nối với DataNode đầu tiên với khối đầu tiên của tệp.
-
Dữ liệu được đọc dưới dạng luồng trong đó máy khách gọi 'đọc()' phương pháp lặp đi lặp lại. Quá trình này đọc() hoạt động tiếp tục cho đến khi nó đến cuối khối.
- Khi đến cuối khối, DFSInputStream sẽ đóng kết nối và chuyển sang định vị DataNode tiếp theo cho khối tiếp theo
- Sau khi client đọc xong, nó sẽ gọi đóng() phương pháp.
Viết Operatrong HDFS
Trong phần này, chúng ta sẽ hiểu cách dữ liệu được ghi vào HDFS thông qua các tệp.
- Máy khách bắt đầu thao tác ghi bằng cách gọi phương thức 'create()' của đối tượng DistributedFileSystem để tạo một tệp mới – Bước không. 1 trong sơ đồ trên.
- Đối tượng DistributedFileSystem kết nối với NameNode bằng lệnh gọi RPC và bắt đầu tạo tệp mới. Tuy nhiên, thao tác tạo tệp này không liên kết bất kỳ khối nào với tệp. NameNode có trách nhiệm xác minh rằng tệp (đang được tạo) chưa tồn tại và khách hàng có quyền chính xác để tạo tệp mới. Nếu một tệp đã tồn tại hoặc máy khách không có đủ quyền để tạo một tệp mới thì IOException được ném tới máy khách. Nếu không, thao tác sẽ thành công và một bản ghi mới cho tệp được tạo bởi NameNode.
- Khi một bản ghi mới trong NameNode được tạo, một đối tượng thuộc loại FSDataOutputStream sẽ được trả về cho máy khách. Một khách hàng sử dụng nó để ghi dữ liệu vào HDFS. Phương thức ghi dữ liệu được gọi (bước 3 trong sơ đồ).
- FSDataOutputStream chứa đối tượng DFSOutputStream đảm nhiệm việc giao tiếp với DataNodes và NameNode. Trong khi client tiếp tục ghi dữ liệu, Luồng đầu ra DFS tiếp tục tạo các gói với dữ liệu này. Các gói này được xếp vào hàng đợi được gọi là Hàng đợi dữ liệu.
- Có một thành phần nữa được gọi là Bộ truyền dữ liệu tiêu thụ cái này Hàng đợi dữ liệu. DataStreamer cũng yêu cầu NameNode phân bổ các khối mới từ đó chọn các DataNode mong muốn để sử dụng để sao chép.
- Bây giờ, quá trình sao chép bắt đầu bằng cách tạo một đường dẫn sử dụng DataNodes. Trong trường hợp của chúng tôi, chúng tôi đã chọn mức độ sao chép là 3 và do đó có 3 DataNode trong quy trình.
- DataStreamer đổ các gói vào DataNode đầu tiên trong đường ống.
- Mỗi DataNode trong một đường ống lưu trữ gói mà nó nhận được và chuyển tiếp gói đó đến DataNode thứ hai trong một đường ống.
- Một hàng đợi khác, 'Hàng đợi Ack' được DFSOutputStream duy trì để lưu trữ các gói đang chờ xác nhận từ DataNodes.
- Sau khi nhận được xác nhận cho một gói trong hàng đợi từ tất cả các DataNode trong đường ống, gói đó sẽ bị xóa khỏi 'Hàng đợi Ack'. Trong trường hợp có bất kỳ lỗi DataNode nào, các gói từ hàng đợi này sẽ được sử dụng để bắt đầu lại hoạt động.
- Sau khi máy khách ghi xong dữ liệu, nó sẽ gọi phương thức close() (Bước 9 trong sơ đồ) Gọi để đóng(), dẫn đến chuyển các gói dữ liệu còn lại vào đường dẫn, sau đó chờ xác nhận.
- Sau khi nhận được xác nhận cuối cùng, NameNode sẽ được liên hệ để thông báo rằng thao tác ghi tệp đã hoàn tất.
Truy cập HDFS bằng API JAVA
Trong phần này, chúng tôi cố gắng hiểu Java giao diện được sử dụng để truy cập hệ thống tệp của Hadoop.
Để tương tác với hệ thống tệp của Hadoop theo chương trình, Hadoop cung cấp nhiều lớp JAVA. Gói có tên org.apache.hadoop.fs chứa các lớp hữu ích khi thao tác với tệp trong hệ thống tệp của Hadoop. Các thao tác này bao gồm mở, đọc, viết và đóng. Trên thực tế, API tệp cho Hadoop là chung và có thể được mở rộng để tương tác với các hệ thống tệp khác ngoài HDFS.
Đọc tệp từ HDFS, theo chương trình
Đối tượng java.net.URL được sử dụng để đọc nội dung của một tập tin. Để bắt đầu, chúng ta cần thực hiện Java nhận ra lược đồ URL hdfs của Hadoop. Điều này được thực hiện bằng cách gọi setURLStreamHandlerFactory phương thức trên đối tượng URL và một phiên bản của FsUrlStreamHandlerFactory được truyền cho nó. Phương pháp này chỉ cần được thực hiện một lần mỗi JVM, do đó nó được đặt trong một khối tĩnh.
Một mã ví dụ là-
public class URLCat { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args) throws Exception { InputStream in = null; try { in = new URL(args[0]).openStream(); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } } }
Mã này mở và đọc nội dung của một tập tin. Đường dẫn của tệp này trên HDFS được truyền tới chương trình dưới dạng đối số dòng lệnh.
Truy cập HDFS bằng GIAO DIỆN DÒNG LỆNH
Đây là một trong những cách đơn giản nhất để tương tác với HDFS. Giao diện dòng lệnh hỗ trợ các hoạt động của hệ thống tệp như đọc tệp, tạo thư mục, di chuyển tệp, xóa dữ liệu và liệt kê các thư mục.
Chúng ta có thể chạy '$HADOOP_HOME/bin/hdfs dfs -help' để nhận trợ giúp chi tiết về mọi lệnh. Đây, 'dfs' là lệnh shell của HDFS hỗ trợ nhiều lệnh con.
Dưới đây là danh sách một số lệnh được sử dụng rộng rãi cùng với thông tin chi tiết của từng lệnh.
1. Sao chép tệp từ hệ thống tệp cục bộ sang HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Lệnh này sao chép tệp temp.txt từ hệ thống tệp cục bộ sang HDFS.
2. Chúng ta có thể liệt kê các tập tin có trong một thư mục bằng cách sử dụng -l
$HADOOP_HOME/bin/hdfs dfs -ls /
Chúng ta có thể thấy một tập tin 'temp.txt' (được sao chép trước đó) được liệt kê dưới '/' thư mục.
3. Lệnh sao chép tệp vào hệ thống tệp cục bộ từ HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Chúng ta có thể nhìn thấy temp.txt được sao chép vào một hệ thống tập tin cục bộ.
4. Lệnh tạo thư mục mới
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Kiểm tra xem thư mục đã được tạo hay chưa Bây giờ bạn nên biết cách thực hiện 😉