บทช่วยสอน 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.
- ไคลเอนต์เริ่มต้นคำขออ่านโดยการโทร 'เปิด()' วิธีการของวัตถุ FileSystem; มันเป็นวัตถุประเภท ระบบไฟล์แบบกระจาย.
- ออบเจ็กต์นี้เชื่อมต่อกับเนมโหนดโดยใช้ RPC และรับข้อมูลเมตาดาต้า เช่น ตำแหน่งของบล็อกของไฟล์ โปรดทราบว่าที่อยู่เหล่านี้เป็นเพียงสองสามช่วงแรกของไฟล์
- เพื่อตอบสนองต่อคำขอข้อมูลเมตานี้ ที่อยู่ของ DataNodes ที่มีสำเนาของบล็อกนั้นจะถูกส่งกลับ
-
เมื่อได้รับที่อยู่ของ DataNodes แล้ว วัตถุประเภท FSDataInputStream จะถูกส่งกลับไปยังลูกค้า FSDataInputStream มี DFSInputStream ซึ่งดูแลการโต้ตอบกับ DataNode และ NameNode ในขั้นตอนที่ 4 ที่แสดงในแผนภาพด้านบน ไคลเอนต์เรียกใช้ 'อ่าน()' วิธีการที่ทำให้เกิด DFSInputStream เพื่อสร้างการเชื่อมต่อกับ DataNode แรกด้วยบล็อกแรกของไฟล์
-
ข้อมูลถูกอ่านในรูปแบบของสตรีมที่ไคลเอนต์เรียกใช้ 'อ่าน()' วิธีการซ้ำๆ กระบวนการนี้ อ่าน() การทำงานดำเนินต่อไปจนกระทั่งถึงจุดสิ้นสุดของบล็อค
- เมื่อถึงจุดสิ้นสุดของบล็อก DFSInputStream จะปิดการเชื่อมต่อและย้ายไปยังตำแหน่ง DataNode ถัดไปสำหรับบล็อกถัดไป
- เมื่อลูกค้าอ่านเสร็จแล้วก็จะโทรมา ปิด() วิธี
เขียน Operaใน HDFS
ในส่วนนี้ เราจะเข้าใจวิธีการเขียนข้อมูลลงใน HDFS ผ่านไฟล์
- ไคลเอนต์เริ่มการดำเนินการเขียนโดยเรียกวิธีการ 'create()' ของอ็อบเจ็กต์ DistributedFileSystem ซึ่งจะสร้างไฟล์ใหม่ – ขั้นตอนที่ 1 ในแผนภาพด้านบน
- วัตถุ DistributedFileSystem เชื่อมต่อกับ NameNode โดยใช้การเรียก RPC และเริ่มสร้างไฟล์ใหม่ อย่างไรก็ตาม การดำเนินการสร้างไฟล์นี้จะไม่เชื่อมโยงบล็อกใดๆ กับไฟล์ เป็นความรับผิดชอบของ NameNode ที่จะตรวจสอบว่าไฟล์ (ที่กำลังสร้าง) ยังไม่มีอยู่ และไคลเอนต์มีสิทธิ์ที่ถูกต้องในการสร้างไฟล์ใหม่ หากไฟล์มีอยู่แล้วหรือไคลเอนต์ไม่มีสิทธิ์เพียงพอในการสร้างไฟล์ใหม่ แสดงว่า IOข้อยกเว้น จะถูกโยนไปที่ไคลเอนต์ มิฉะนั้น การดำเนินการจะประสบความสำเร็จ และ NameNode จะสร้างระเบียนใหม่สำหรับไฟล์
- เมื่อสร้างเรกคอร์ดใหม่ใน NameNode แล้ว ออบเจ็กต์ประเภท FSDataOutputStream จะถูกส่งกลับไปยังไคลเอ็นต์ ไคลเอนต์ใช้เพื่อเขียนข้อมูลลงใน HDFS มีการเรียกใช้วิธีเขียนข้อมูล (ขั้นตอนที่ 3 ในแผนภาพ)
- FSDataOutputStream มีวัตถุ DFSOutputStream ซึ่งดูแลการสื่อสารกับ DataNodes และ NameNode ในขณะที่ลูกค้ายังคงเขียนข้อมูลต่อไป DFSOutputStream สร้างแพ็กเก็ตต่อไปด้วยข้อมูลนี้ แพ็กเก็ตเหล่านี้ถูกจัดคิวไว้ในคิวซึ่งเรียกว่าเป็น ข้อมูลคิว.
- มีอีกองค์ประกอบหนึ่งที่เรียกว่า DataStreamer ซึ่งกินสิ่งนี้ ข้อมูลคิว- DataStreamer ยังขอให้ NameNode จัดสรรบล็อกใหม่ด้วย ดังนั้นจึงเลือก DataNodes ที่ต้องการเพื่อใช้สำหรับการจำลอง
- ตอนนี้ กระบวนการจำลองแบบเริ่มต้นโดยการสร้างไปป์ไลน์โดยใช้ DataNodes ในกรณีของเรา เราได้เลือกระดับการจำลองเป็น 3 และด้วยเหตุนี้จึงมี DataNodes 3 ตัวในไปป์ไลน์
- DataStreamer เทแพ็กเก็ตลงใน DataNode แรกในไปป์ไลน์
- DataNode ทุกตัวในไปป์ไลน์จะเก็บแพ็กเก็ตที่ได้รับและส่งต่อแพ็กเก็ตเดียวกันไปยัง DataNode ตัวที่สองในไปป์ไลน์
- อีกคิวหนึ่ง 'Ack Queue' ได้รับการดูแลโดย DFSOutputStream เพื่อจัดเก็บแพ็กเก็ตที่กำลังรอการตอบรับจาก DataNodes
- เมื่อได้รับการยืนยันสำหรับแพ็กเก็ตในคิวจาก DataNode ทั้งหมดในไปป์ไลน์ แพ็กเก็ตดังกล่าวจะถูกลบออกจาก 'Ack Queue' ในกรณีที่ DataNode ล้มเหลว แพ็กเก็ตจากคิวนี้จะถูกนำมาใช้เพื่อเริ่มการทำงานใหม่อีกครั้ง
- หลังจากที่ไคลเอ็นต์เขียนข้อมูลเสร็จแล้ว จะเรียกเมธอด close() (ขั้นตอนที่ 9 ในแผนภาพ) การเรียกเพื่อปิด() ส่งผลให้แพ็กเก็ตข้อมูลที่เหลือถูกล้างไปยังไปป์ไลน์ตามด้วยการรอการตอบรับ
- เมื่อได้รับการยอมรับขั้นสุดท้ายแล้ว 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 /
คำสั่งนี้จะคัดลอกไฟล์ temp.txt จากระบบไฟล์ในเครื่องไปยัง HDFS
2. เราสามารถแสดงรายการไฟล์ที่มีอยู่ในไดเร็กทอรีโดยใช้ -ล
$HADOOP_HOME/bin/hdfs dfs -ls /
เราจะสามารถเห็นไฟล์ 'temp.txt' (คัดลอกไว้ก่อนหน้านี้) อยู่ในรายการภายใต้ '/' ไดเรกทอรี
3. คำสั่งให้คัดลอกไฟล์ไปยังระบบไฟล์ในเครื่องจาก HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
เราสามารถเห็น temp.txt คัดลอกไปยังระบบไฟล์ในเครื่อง
4. คำสั่งให้สร้างไดเร็กทอรีใหม่
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
ตรวจสอบว่าไดเร็กทอรีถูกสร้างขึ้นหรือไม่ ตอนนี้คุณควรจะรู้วิธีการทำ😉