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 hàng hóa. Nó có khả năng chịu lỗi, có thể 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á khả năng lưu trữ trên một máy vật lý, điều cần thiết là phải phân chia dữ liệu cho một số máy riêng biệt. Hệ thống tệp quản lý các hoạt động lưu trữ cụ thể trên một 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.
Trong hướng dẫn này, chúng ta sẽ học,
- HDFS là gì?
- Kiến trúc HDFS
- Đọc hoạt động
- Viết hoạt động
- Truy cập HDFS bằng API JAVA
- Truy cập HDFS bằng GIAO DIỆN LỆNH LỆNH
Kiến trúc HDFS
Cụm HDFS chủ yếu bao gồm Mã tên quản lý Siêu dữ liệu hệ thống tệp và Mã dữ liệu lưu trữ dữ liệu thực tế .
- NameNode: NameNode có thể coi là một tổng thể 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 'Hình ảnh không gian tên' và 'nhật ký chỉnh sửa' được sử dụng để lưu trữ thông tin siêu dữ liệu. Namenode có kiến thức về tất cả các datanode 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 liên tục. Thông tin này được tạo lại mỗi lần từ các nút dữ liệu khi hệ thống khởi động.
- DataNode: DataNodes là nô lệ nằm trên mỗi máy trong một cụm và cung cấp dung lượng lưu trữ thực tế. Nó chịu trách nhiệm phục vụ, đọc và ghi các yêu cầu cho khách hàng.
Hoạt động đọc / ghi trong HDFS hoạt động ở mức khối. Các tệp dữ liệu trong HDFS được chia thành các phần có kích thước khối, được lưu trữ như 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à được phân phối trên các nút trong toàn một cụm để cho phép dữ liệu sẵn có cao trong trường hợp nút bị lỗi.
Bạn có biết? Tệp trong HDFS, nhỏ hơn một khối duy nhất, không chiếm dung lượng lưu trữ đầy đủ của khối.
Đọc hoạt động trong HDFS
Yêu cầu đọc dữ liệu được cung cấp 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 trong Hadoop.
- Máy khách khởi tạo yêu cầu đọc bằng cách gọi phương thức 'open ()' của đối tượng FileSystem; nó là một đối tượng kiểu DistributedFileSystem .
- Đố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 là một số khối đầu tiên của tệp.
- Đáp lại yêu cầu siêu dữ liệu này, địa chỉ của các Mã dữ liệu có bản sao của khối đó sẽ được trả lại.
- Khi địa chỉ của các Mã dữ liệu được nhận, một đối tượng kiểu FSDataInputStream được trả lại cho máy khách. FSDataInputStream chứa DFSInputStream xử lý các tương tác với DataNode và NameNode. Trong bước 4 được hiển thị trong sơ đồ trên, một máy khách gọi phương thức 'read ()' khiến DFSInputStream 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 phương thức 'read ()' lặp đi lặp lại. Quá trình hoạt động read () này tiếp tục cho đến khi nó đi đến cuối khối.
- Khi đến cuối khối, DFSInputStream đóng kết nối và chuyển sang định vị Mã dữ liệu tiếp theo cho khối tiếp theo
- Khi một ứng dụng khách đã thực hiện xong việc đọc, nó sẽ gọi một phương thức close () .
Viết hoạt động trong 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ột ứng dụng 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 cách gọi RPC và bắt đầu tạo tệp mới. Tuy nhiên, hoạt động 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 tệp mới, thì IOException sẽ được chuyển đến 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 kiểu FSDataOutputStream được trả lại cho máy khách. Máy khách 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 sau khi giao tiếp với DataNodes và NameNode. Trong khi máy khách tiếp tục ghi dữ liệu, DFSOutputStream 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à DataQueue .
- Có một thành phần nữa được gọi là DataStreamer sử dụng DataQueue này . 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 được sử dụng để nhân rộng.
- 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 nhân bản là 3 và do đó có 3 DataNodes trong đường ống.
- DataStreamer đổ các gói vào DataNode đầu tiên trong đường dẫn.
- Mọi DataNode trong một đường ống đều lưu trữ gói tin mà nó nhận được và chuyển tiếp gói dữ liệu tương tự đến DataNode thứ hai trong một đường ống.
- Một hàng đợi khác, 'Ack Queue' được DFSOutputStream duy trì để lưu trữ các gói đang chờ xác nhận từ DataNodes.
- Sau khi xác nhận cho một gói trong hàng đợi được nhận từ tất cả các Mã dữ liệu trong đường ống, nó 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 để khởi động lại hoạt động.
- Sau khi máy khách hoàn tất việc ghi dữ liệu, nó sẽ gọi một phương thức close () (Bước 9 trong sơ đồ) Gọi tới close (), dẫn đến việc đẩy các gói dữ liệu còn lại vào đường ống, 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 giao diện Java đượ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 trong việc thao tác tệp trong hệ thống tệp của Hadoop. Các thao tác này bao gồm, mở, đọc, ghi và đóng. Trên thực tế, tệp API 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 tệp. Để bắt đầu, chúng ta cần làm cho 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 phương thức setURLStreamHandlerFactory trên đối tượng URL và một phiên bản của FsUrlStreamHandlerFactory được chuyển cho nó. Phương thức này chỉ cần được thực thi một lần cho mỗi JVM, do đó nó được bao bọc 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. Đường dẫn của tệp này trên HDFS được chuyể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 LỆNH 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 tôi 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à một lệnh shell của HDFS hỗ trợ nhiều lệnh con.
Một số lệnh được sử dụng rộng rãi được liệt kê bên dưới cùng với một số chi tiết của mỗi 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 tôi có thể liệt kê các tệp có trong thư mục bằng -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Chúng ta có thể thấy một tệp 'temp.txt' (đã sao chép trước đó) được liệt kê trong 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ể thấy temp.txt được sao chép vào hệ thống tệp cục bộ.
4. Lệnh tạo thư mục mới
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Kiểm tra xem một thư mục có được tạo hay không. Bây giờ, bạn nên biết cách làm điều đó ;-)