บทช่วยสอน HDFS: Archiการสอน อ่านและเขียน Operaการใช้ Java API

HDFS คืออะไร?

HDFS เป็นระบบไฟล์แบบกระจายสำหรับจัดเก็บไฟล์ข้อมูลขนาดใหญ่มาก โดยทำงานบนคลัสเตอร์ฮาร์ดแวร์ทั่วไป ทนทานต่อข้อผิดพลาด ปรับขนาดได้ และขยายได้ง่ายมาก Hadoop มาพร้อมกับ เอชดีเอฟเอส (ระบบไฟล์แบบกระจาย Hadoop).

เมื่อข้อมูลเกินความจุของหน่วยเก็บข้อมูลบนเครื่องกายภาพเครื่องเดียว จำเป็นต้องแบ่งข้อมูลดังกล่าวออกเป็นเครื่องแยกกันหลายเครื่อง ระบบไฟล์ที่จัดการการทำงานเฉพาะหน่วยเก็บข้อมูลบนเครือข่ายเครื่องเรียกว่าระบบไฟล์แบบกระจาย HDFS คือซอฟต์แวร์ประเภทหนึ่ง

เอชดีเอฟเอส Archiเทคเจอร์

คลัสเตอร์ HDFS ประกอบด้วยหลักๆ ดังนี้ ชื่อโหนด ที่จัดการระบบไฟล์ เมตาดาต้า และ โหนดข้อมูล ที่เก็บ ข้อมูลจริง.

  • ชื่อโหนด: NameNode ถือได้ว่าเป็นต้นแบบของระบบ จะรักษาโครงสร้างระบบไฟล์และข้อมูลเมตาสำหรับไฟล์และไดเร็กทอรีทั้งหมดที่มีอยู่ในระบบ สองไฟล์ 'รูปภาพเนมสเปซ' และ 'แก้ไขบันทึก' ใช้เพื่อจัดเก็บข้อมูลเมตาดาต้า Namenode มีความรู้เกี่ยวกับดาต้าโหนดทั้งหมดที่มีบล็อกข้อมูลสำหรับไฟล์ที่กำหนด อย่างไรก็ตาม จะไม่จัดเก็บตำแหน่งบล็อกอย่างต่อเนื่อง ข้อมูลนี้จะถูกสร้างขึ้นใหม่ทุกครั้งจากดาต้าโหนดเมื่อระบบเริ่มทำงาน
  • โหนดข้อมูล: DataNodes คือสเลฟที่อยู่บนเครื่องแต่ละเครื่องในคลัสเตอร์และจัดเตรียมพื้นที่จัดเก็บจริง โดยจะรับผิดชอบในการให้บริการ อ่าน และเขียนคำขอสำหรับไคลเอนต์

การอ่าน/เขียนใน HDFS ดำเนินการที่ระดับบล็อก ไฟล์ข้อมูลใน HDFS จะถูกแบ่งออกเป็นชิ้นขนาดบล็อก ซึ่งจะถูกจัดเก็บเป็นหน่วยอิสระ ขนาดบล็อกเริ่มต้นคือ 64 MB

HDFS ทำงานภายใต้แนวคิดการจำลองข้อมูล โดยจะสร้างบล็อกข้อมูลจำลองหลายชุด และกระจายไปยังโหนดต่างๆ ทั่วทั้งคลัสเตอร์ เพื่อให้มีความพร้อมใช้งานของข้อมูลสูงในกรณีที่โหนดล้มเหลว

คุณรู้หรือไม่? ไฟล์ใน HDFS ซึ่งมีขนาดเล็กกว่าบล็อกเดียว ไม่ได้ใช้พื้นที่เก็บข้อมูลเต็มของบล็อก

อ่าน Operaใน HDFS

คำขออ่านข้อมูลได้รับบริการโดย HDFS, NameNode และ DataNode เรียกผู้อ่านว่า "ไคลเอนต์" แผนภาพด้านล่างแสดงการดำเนินการอ่านไฟล์ Hadoop.

อ่าน Operaใน HDFS

  1. ไคลเอนต์เริ่มต้นคำขออ่านโดยการโทร 'เปิด()' วิธีการของวัตถุ FileSystem; มันเป็นวัตถุประเภท ระบบไฟล์แบบกระจาย.
  2. ออบเจ็กต์นี้เชื่อมต่อกับเนมโหนดโดยใช้ RPC และรับข้อมูลเมตาดาต้า เช่น ตำแหน่งของบล็อกของไฟล์ โปรดทราบว่าที่อยู่เหล่านี้เป็นเพียงสองสามช่วงแรกของไฟล์
  3. เพื่อตอบสนองต่อคำขอข้อมูลเมตานี้ ที่อยู่ของ DataNodes ที่มีสำเนาของบล็อกนั้นจะถูกส่งกลับ
  4. เมื่อได้รับที่อยู่ของ DataNodes แล้ว วัตถุประเภท FSDataInputStream จะถูกส่งกลับไปยังลูกค้า FSDataInputStream มี DFSInputStream ซึ่งดูแลการโต้ตอบกับ DataNode และ NameNode ในขั้นตอนที่ 4 ที่แสดงในแผนภาพด้านบน ไคลเอนต์เรียกใช้ 'อ่าน()' วิธีการที่ทำให้เกิด DFSInputStream เพื่อสร้างการเชื่อมต่อกับ DataNode แรกด้วยบล็อกแรกของไฟล์
  5. ข้อมูลถูกอ่านในรูปแบบของสตรีมที่ไคลเอนต์เรียกใช้ 'อ่าน()' วิธีการซ้ำๆ กระบวนการนี้ อ่าน() การทำงานดำเนินต่อไปจนกระทั่งถึงจุดสิ้นสุดของบล็อค
  6. เมื่อถึงจุดสิ้นสุดของบล็อก DFSInputStream จะปิดการเชื่อมต่อและย้ายไปยังตำแหน่ง DataNode ถัดไปสำหรับบล็อกถัดไป
  7. เมื่อลูกค้าอ่านเสร็จแล้วก็จะโทรมา ปิด() วิธี

เขียน Operaใน HDFS

ในส่วนนี้ เราจะเข้าใจวิธีการเขียนข้อมูลลงใน HDFS ผ่านไฟล์

เขียน Operaใน HDFS

  1. ไคลเอนต์เริ่มการดำเนินการเขียนโดยเรียกวิธีการ 'create()' ของอ็อบเจ็กต์ DistributedFileSystem ซึ่งจะสร้างไฟล์ใหม่ – ขั้นตอนที่ 1 ในแผนภาพด้านบน
  2. วัตถุ DistributedFileSystem เชื่อมต่อกับ NameNode โดยใช้การเรียก RPC และเริ่มสร้างไฟล์ใหม่ อย่างไรก็ตาม การดำเนินการสร้างไฟล์นี้จะไม่เชื่อมโยงบล็อกใดๆ กับไฟล์ เป็นความรับผิดชอบของ NameNode ที่จะตรวจสอบว่าไฟล์ (ที่กำลังสร้าง) ยังไม่มีอยู่ และไคลเอนต์มีสิทธิ์ที่ถูกต้องในการสร้างไฟล์ใหม่ หากไฟล์มีอยู่แล้วหรือไคลเอนต์ไม่มีสิทธิ์เพียงพอในการสร้างไฟล์ใหม่ แสดงว่า IOข้อยกเว้น จะถูกโยนไปที่ไคลเอนต์ มิฉะนั้น การดำเนินการจะประสบความสำเร็จ และ NameNode จะสร้างระเบียนใหม่สำหรับไฟล์
  3. เมื่อสร้างเรกคอร์ดใหม่ใน NameNode แล้ว ออบเจ็กต์ประเภท FSDataOutputStream จะถูกส่งกลับไปยังไคลเอ็นต์ ไคลเอนต์ใช้เพื่อเขียนข้อมูลลงใน HDFS มีการเรียกใช้วิธีเขียนข้อมูล (ขั้นตอนที่ 3 ในแผนภาพ)
  4. FSDataOutputStream มีวัตถุ DFSOutputStream ซึ่งดูแลการสื่อสารกับ DataNodes และ NameNode ในขณะที่ลูกค้ายังคงเขียนข้อมูลต่อไป DFSOutputStream สร้างแพ็กเก็ตต่อไปด้วยข้อมูลนี้ แพ็กเก็ตเหล่านี้ถูกจัดคิวไว้ในคิวซึ่งเรียกว่าเป็น ข้อมูลคิว.
  5. มีอีกองค์ประกอบหนึ่งที่เรียกว่า DataStreamer ซึ่งกินสิ่งนี้ ข้อมูลคิว- DataStreamer ยังขอให้ NameNode จัดสรรบล็อกใหม่ด้วย ดังนั้นจึงเลือก DataNodes ที่ต้องการเพื่อใช้สำหรับการจำลอง
  6. ตอนนี้ กระบวนการจำลองแบบเริ่มต้นโดยการสร้างไปป์ไลน์โดยใช้ DataNodes ในกรณีของเรา เราได้เลือกระดับการจำลองเป็น 3 และด้วยเหตุนี้จึงมี DataNodes 3 ตัวในไปป์ไลน์
  7. DataStreamer เทแพ็กเก็ตลงใน DataNode แรกในไปป์ไลน์
  8. DataNode ทุกตัวในไปป์ไลน์จะเก็บแพ็กเก็ตที่ได้รับและส่งต่อแพ็กเก็ตเดียวกันไปยัง DataNode ตัวที่สองในไปป์ไลน์
  9. อีกคิวหนึ่ง 'Ack Queue' ได้รับการดูแลโดย DFSOutputStream เพื่อจัดเก็บแพ็กเก็ตที่กำลังรอการตอบรับจาก DataNodes
  10. เมื่อได้รับการยืนยันสำหรับแพ็กเก็ตในคิวจาก DataNode ทั้งหมดในไปป์ไลน์ แพ็กเก็ตดังกล่าวจะถูกลบออกจาก 'Ack Queue' ในกรณีที่ DataNode ล้มเหลว แพ็กเก็ตจากคิวนี้จะถูกนำมาใช้เพื่อเริ่มการทำงานใหม่อีกครั้ง
  11. หลังจากที่ไคลเอ็นต์เขียนข้อมูลเสร็จแล้ว จะเรียกเมธอด close() (ขั้นตอนที่ 9 ในแผนภาพ) การเรียกเพื่อปิด() ส่งผลให้แพ็กเก็ตข้อมูลที่เหลือถูกล้างไปยังไปป์ไลน์ตามด้วยการรอการตอบรับ
  12. เมื่อได้รับการยอมรับขั้นสุดท้ายแล้ว NameNode จะถูกติดต่อเพื่อแจ้งให้ทราบว่าการดำเนินการเขียนไฟล์เสร็จสมบูรณ์แล้ว

เข้าถึง HDFS โดยใช้ JAVA API

ในส่วนนี้เราพยายามทำความเข้าใจ Java อินเทอร์เฟซที่ใช้สำหรับเข้าถึงระบบไฟล์ของ Hadoop

เพื่อโต้ตอบกับระบบไฟล์ของ Hadoop ด้วยโปรแกรม Hadoop จึงจัดเตรียมคลาส JAVA หลายคลาส แพ็คเกจชื่อ org.apache.hadoop.fs ประกอบด้วยคลาสที่มีประโยชน์ในการจัดการไฟล์ในระบบไฟล์ของ Hadoop การดำเนินการเหล่านี้ได้แก่ เปิด อ่าน เขียน และปิด จริงๆ แล้ว API ไฟล์สำหรับ Hadoop เป็นแบบทั่วไปและสามารถขยายเพื่อโต้ตอบกับระบบไฟล์อื่นๆ นอกเหนือจาก HDFS ได้

การอ่านไฟล์จาก HDFS โดยทางโปรแกรม

วัตถุ java.net.URL ใช้สำหรับอ่านเนื้อหาของไฟล์ ขั้นแรกเราต้องทำให้ Java รู้จักรูปแบบ hdfs URL ของ Hadoop ทำได้โดยการเรียก setURLStreamHandlerFactory วิธีการบนวัตถุ URL และอินสแตนซ์ของ FsUrlStreamHandlerFactory ถูกส่งผ่านไป วิธีการนี้จะต้องดำเนินการเพียงครั้งเดียวต่อ JVMดังนั้นจึงถูกปิดล้อมอยู่ในบล็อกคงที่

รหัสตัวอย่างคือ-

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);
        }
    }
}

รหัสนี้เปิดและอ่านเนื้อหาของไฟล์ เส้นทางของไฟล์นี้บน HDFS ถูกส่งไปยังโปรแกรมเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

เข้าถึง HDFS โดยใช้ COMMAND-LINE INTERFACE

นี่เป็นหนึ่งในวิธีที่ง่ายที่สุดในการโต้ตอบกับ HDFS อินเทอร์เฟซบรรทัดคำสั่งรองรับการทำงานของระบบไฟล์ เช่น การอ่านไฟล์ การสร้างไดเร็กทอรี การย้ายไฟล์ การลบข้อมูล และการแสดงรายการไดเร็กทอรี

เราวิ่งได้ '$HADOOP_HOME/bin/hdfs dfs -help' เพื่อรับความช่วยเหลือโดยละเอียดในทุกคำสั่ง ที่นี่, 'dfs' เป็นคำสั่งเชลล์ของ HDFS ที่รองรับคำสั่งย่อยหลายคำสั่ง

ด้านล่างนี้เป็นรายการคำสั่งที่ใช้กันอย่างแพร่หลายพร้อมทั้งรายละเอียดของแต่ละคำสั่ง

1. คัดลอกไฟล์จากระบบไฟล์ในเครื่องไปยัง HDFS

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

เข้าถึง HDFS โดยใช้ COMMAND-LINE INTERFACE

คำสั่งนี้จะคัดลอกไฟล์ temp.txt จากระบบไฟล์ในเครื่องไปยัง HDFS

2. เราสามารถแสดงรายการไฟล์ที่มีอยู่ในไดเร็กทอรีโดยใช้ -ล

$HADOOP_HOME/bin/hdfs dfs -ls /

เข้าถึง HDFS โดยใช้ COMMAND-LINE INTERFACE

เราจะสามารถเห็นไฟล์ 'temp.txt' (คัดลอกไว้ก่อนหน้านี้) อยู่ในรายการภายใต้ '/' ไดเรกทอรี

3. คำสั่งให้คัดลอกไฟล์ไปยังระบบไฟล์ในเครื่องจาก HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

เข้าถึง HDFS โดยใช้ COMMAND-LINE INTERFACE

เราสามารถเห็น temp.txt คัดลอกไปยังระบบไฟล์ในเครื่อง

4. คำสั่งให้สร้างไดเร็กทอรีใหม่

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

เข้าถึง HDFS โดยใช้ COMMAND-LINE INTERFACE

ตรวจสอบว่าไดเร็กทอรีถูกสร้างขึ้นหรือไม่ ตอนนี้คุณควรจะรู้วิธีการทำ😉