F3 - รูปแบบไฟล์ข้อมูลโอเพนซอร์สสำหรับอนาคต
(github.com/future-file-format)- F3 คือรูปแบบไฟล์ข้อมูลที่ออกแบบโดยคำนึงถึง ประสิทธิภาพ, การทำงานร่วมกันได้ และความสามารถในการขยาย
- มันนำเสนอวิธีการจัดระเบียบข้อมูลที่แก้ข้อจำกัดด้าน เลย์เอาต์ ของรูปแบบยุคก่อนอย่าง Parquet พร้อมคงความสามารถในการทำงานร่วมกันและการขยายผ่านตัวถอดรหัส Wasm แบบฝังในตัว
- ไฟล์ F3 แบบอธิบายตัวเองได้มีโครงสร้างที่บรรจุไม่เพียงข้อมูลและเมทาดาทาเท่านั้น แต่ยังรวม ไบนารี WebAssembly สำหรับถอดรหัสข้อมูลไว้ด้วย
- วิธีการฝังตัวถอดรหัสไว้ในไฟล์ต้องการพื้นที่จัดเก็บขั้นต่ำในระดับกิโลไบต์ และเป็นการออกแบบเพื่อรับประกันความเข้ากันได้บนทุกแพลตฟอร์ม แม้ไม่มีตัวถอดรหัสเนทีฟ
- เป็นโครงการ Future-proof File Format ที่มอบทั้งโครงสร้างการจัดระเบียบข้อมูลและ API แบบทั่วไป เพื่อให้นักพัฒนาสามารถเพิ่มวิธีการเข้ารหัสใหม่ได้อย่างง่ายดาย
- สถานะปัจจุบันคือ ต้นแบบงานวิจัย ที่ใช้ตรวจสอบแนวคิดในงานวิชาการ และห้ามนำไปใช้ในโปรดักชัน
- การบิลด์ได้รับการทดสอบเฉพาะบน Debian 12 บนเครื่อง Intel เท่านั้น และการบิลด์แพ็กเกจ PoC กับการทดสอบหน่วยทำได้ด้วย
cargo build -p fff-poc,cargo test -p fff-poc - นิยามรูปแบบไฟล์อิงตาม FlatBuffer และมีทั้งโค้ดหลัก, การติดตั้งใช้งานการถอดรหัส Wasm, เบนช์มาร์กสำหรับการทดลองในงานวิชาการ และสคริปต์ที่ให้มาพร้อมกัน
- ไลเซนส์คือ MIT License
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ไม่ค่อยเข้าใจว่าทำไมถึงได้คะแนนโหวตเยอะขนาดนี้ และหน้าแลนดิ้งเพจก็ไม่ค่อยดีนัก ดูเหมือนว่าไปอ่านงานวิจัยจะดีกว่า: https://dl.acm.org/doi/epdf/10.1145/3749163
มันดูเหมือน รูปแบบการจัดเก็บแบบคอลัมน์ ที่พยายามแก้ข้อเสียบางส่วนของ Parquet แต่จุดตัดสินที่แท้จริงของรูปแบบแบบนี้คือความเข้ากันได้ และรูปแบบใหม่ก็เสียเปรียบในจุดนี้ทันทีที่ถือกำเนิดขึ้น
Parquet แข็งแกร่งมากเพียงเพราะเป็นตัวแรกที่แพร่หลายอย่างกว้างขวาง และตามงานวิจัย แม้แต่ Parquet เวอร์ชันที่ถูกใช้มากที่สุดก็ยังเป็นเวอร์ชันเก่าสุดจากปี 2013 ซึ่งเท่ากับว่าแม้แต่ Parquet เองก็ยังแทนที่ Parquet ไม่ได้
ถ้า F3 จะก้าวข้ามสิ่งนี้ได้ก็คงต้องมีผลลัพธ์ที่แข็งแกร่งมาก แต่ยังดูไม่เป็นแบบนั้น
ส่วนตัวแล้วปัญหาใหญ่ที่สุดของ Parquet สำหรับผมคือเรื่อง หนึ่งตารางต่อหนึ่งไฟล์ ซึ่งที่นี่ก็ไม่ได้แตะต้อง แถมชื่อยังให้ความรู้สึกเว่อร์ไปหน่อย และแม้จะใส่ไบนารี Wasm สำหรับถอดรหัสมาให้ แต่การพาร์สก้อนนั้นก็ยังต้องใช้ FlatBuffers อยู่ดี ทำให้เป้าหมายดูไม่ชัดเจน
ผลงานหลักดูเหมือนจะเป็นการปรับปรุงการเข้าถึงแบบสุ่ม แต่เดิมทีการจัดเก็บแบบคอลัมน์ก็เกิดมาเพื่อยอมแลกการเข้าถึงแบบสุ่มกับการวิเคราะห์ที่รวดเร็ว และ F3 กลับเหมือนยอมเสียการวิเคราะห์ที่เร็วเพราะตัวถอดรหัส Wasm เลยทำให้เข้าใจได้ยาก
Spark, DataFusion และ DuckDB ต่อให้รับไฟล์ที่มีหลายตารางได้ ก็คงไม่ค่อยรู้ว่าจะต้องทำอะไรกับมัน
จริงอยู่ที่ Parquet ทำหลายอย่างได้ดีมาก แต่ไม่ได้หมายความว่าเพียงเพราะมันมาก่อน มันต้องเป็นรูปแบบไฟล์สำหรับงานวิเคราะห์เพียงหนึ่งเดียวไปตลอดกาล
การวิเคราะห์ที่รวดเร็วกับเวิร์กโหลดแบบ machine learning สมัยใหม่ โดยเนื้อแท้แล้วเป็นการผสมกันระหว่างการสแกนทั้งชุดกับการเข้าถึงแบบสุ่ม
ผู้เขียน F3 บางคนก็เคยเขียนงานวิจัยที่ลงรายละเอียดข้อเสียของ Parquet ไว้ด้วย: https://www.vldb.org/pvldb/vol17/p148-zeng.pdf
รูปแบบอย่าง Vortex, Lance และ F3 ที่ออกมาในช่วงหลัง กำลังพยายามแก้ปัญหาที่สรุปไว้ในงานวิจัยนั้น
Lance มีแนวคิดที่น่าสนใจ ส่วน Vortex เปลี่ยนตัวเข้ารหัสแบบกล่องดำของ Parquet ให้เป็นการเข้ารหัสที่โปร่งใส โดยเน้น ความขยายตัวและประสิทธิภาพ
สิ่งนี้ช่วยลดการต้องประนีประนอมระหว่างการถอดรหัสปริมาณมากกับการถอดรหัสระดับองค์ประกอบ ทำให้ได้ทั้งการสแกนทั้งชุดที่มีประสิทธิภาพและการเข้าถึงแบบสุ่มที่เร็วมาก
ตัวอย่างเช่น LangChain อธิบายว่าได้สร้างระบบที่อิงกับไฟล์ Parquet ขึ้นใหม่ด้วย Vortex และเห็นการเพิ่มความเร็วอย่างมาก: https://www.langchain.com/blog/introducing-smithdb
อนึ่ง ผมกำลังพัฒนา Vortex อยู่ เลยได้คิดกับคำถามว่า “ทำไมต้องสร้างรูปแบบใหม่” โดยตรงมามาก
ถ้าต้องการหลายตาราง ก็แค่รวมไฟล์ Parquet หลายไฟล์เข้าด้วยกันด้วย tar และมันเรียบง่ายอย่างสวยงาม เพราะอ่านได้ง่ายในทุกภาษาที่มีไลบรารี tar และ Parquet
.parquetzถ้าเป็นไฟล์ zip ที่บรรจุไฟล์ Parquet แบบไม่บีบอัดหลายไฟล์ ก็จะย้ายหลายตารางได้ในไฟล์เดียว และน่าจะเข้าถึงได้ผ่าน range requests ด้วย
แนวคิดที่ไม่ต้องพึ่ง SDK หรือไลบรารีรายภาษา และถ้าไม่มีก็ fallback ไปใช้ เมธอด Wasm ที่ฝังมาให้ได้นั้น ค่อนข้างชาญฉลาดทีเดียว
“ไฟล์ F3 แบบ self-describing แต่ละไฟล์ไม่ได้มีแค่ข้อมูลและเมทาดาทา แต่ยังรวมไบนารี WebAssembly (Wasm) สำหรับถอดรหัสข้อมูลด้วย พื้นที่จัดเก็บที่ต้องใช้เพื่อฝังตัวถอดรหัสลงในแต่ละไฟล์มีขนาดเล็กมาก (ระดับกิโลไบต์) และรับประกันความเข้ากันได้บนทุกแพลตฟอร์ม แม้จะไม่มี native decoder ก็ตาม”
ตัวถอดรหัสที่ฝังอยู่ใน PDF จะหน้าตาเป็นอย่างไรนะ?
เพราะมันผูกติดกับไบต์ของไฟล์อย่างแน่นหนา คนสร้างไฟล์อาจเลือกได้ว่ารูปแบบไหนสมเหตุสมผล แต่ก็ไม่ได้แปลว่าทุกรูปแบบจะมี “ขั้นตอนถอดรหัสที่ถูกต้องหนึ่งเดียว”
ตัวถอดรหัสถอดออกมาเป็นอะไร?
มันต้องขึ้นอยู่กับชนิดของข้อมูลทั้งหมดอยู่แล้ว บางรูปแบบเป็นสตรีมไบต์ บางรูปแบบเป็นระนาบพิกเซลสองมิติ ขณะที่บางรูปแบบต้องมีจุดยอด ระนาบพิกเซลสองมิติ และ UV map และในบางกรณี object graph ก็ดูเป็นธรรมชาติกว่า
ไม่รู้ว่าคนอื่นกำลังดูอะไรแล้วถึงพูดกันแบบนี้
ใน README แทบไม่มีข้อมูลเลยว่ามันคืออะไร หรือแก้ปัญหาอะไร มีแค่คำอธิบายของ FlatBuffers กับลิงก์ไปไดเรกทอรีซอร์สโค้ด
ผมพลาดบริบทอะไรไปหรือเปล่า?
ดูเหมือนว่ายังต้องการคำอธิบายเรื่อง “ทำไม” เพิ่มอีกหน่อย
เขาบอกว่าจะเอาชนะข้อเสียของ Parquet ได้ แต่ก็อยากรู้ว่าข้อเสียนั้นคืออะไร
เรื่องการรองรับเครื่องมืออย่างกว้างขวางคงไม่ใช่แน่
ทำไมต้องเลิกใช้ Parquet หรือ ORC แล้วหันมาใช้โครงสร้างนี้?
น่าจะควรเริ่มจากอ่านงานวิจัยก่อน: https://doi.org/10.1145/3749163
บทความนี้น่าสนใจดี: https://medium.com/@reliabledataengineering/f3-the-future-pr...
บางคนบอกว่าเป็นไอเดียอัจฉริยะ แต่ถ้าจะรับบทคนขี้สงสัยแบบ HN มันก็ดูค่อนข้างไม่เข้าท่า
ฟอร์แมตบีบอัดข้อมูลเป็นเรื่องรองเมื่อเทียบกับสิ่งที่จะทำกับข้อมูลนั้นหลังถอดรหัสแล้ว
ไฟล์เสียงกับภาพ SVG นั้นต่างกันโดยสิ้นเชิง และถึงจะมี VM ในตัวที่คลายวิดีโอออกมาเป็นพิกเซลดิบได้ ก็ไม่ได้แปลว่าจะเปิดวิดีโอนั้นในโปรแกรมแก้ไขข้อความได้ ดังนั้นจึงไม่ได้เกิดการทำงานร่วมกันแบบใหม่อย่างแท้จริง
ทุกฟอร์แมตใหม่ก็ยังต้องมีการจัดการเฉพาะฟอร์แมตอยู่ดี
ตัวอย่างเช่น ถ้าคุณสร้างวิธีบีบอัดวิดีโอที่ดีกว่า H.265 แต่ทุกแพลตฟอร์มยังไม่รองรับ ก็อาจมีประโยชน์ในแง่ฝังตัวถอดรหัสไว้เพื่อให้เล่นบนฮาร์ดแวร์เก่าได้
แต่นั่นก็เผยจุดอ่อนเช่นกัน ฮาร์ดแวร์เก่าคงมีโอกาสน้อยที่จะถอดรหัสฟอร์แมตวิดีโอแห่งอนาคตด้วยซอฟต์แวร์ได้ดี และถึงแนวคิดนี้จะเกิดขึ้นตั้งแต่ยุค 1990 ก็คงไม่ได้ทำให้ดู Netflix บน i386 ได้
ในทำนองเดียวกัน ก็ยังน่าสงสัยว่าจะช่วยให้เปิดไฟล์ Word 2021 ใน Word 97 ได้จริงไหม เพราะไม่มีความสอดคล้องแบบ 1:1 ระหว่างโครงสร้างข้อมูล
ถ้าความเข้ากันได้นี้ไม่ใช่ชัยชนะที่ชัดเจน ก็ไม่แน่ใจว่าเป้าหมายคืออะไร
ข้อเสียก็ชัดเจนอยู่แล้ว หากมีบั๊กในตัวถอดรหัสที่ต้องแก้ คุณจะไปแพตช์ไฟล์ทั้งหมดที่ฝังตัวถอดรหัสนั้นไว้แล้วอย่างไร?
ยังมีภาระด้านขนาดและความเสี่ยงด้านความปลอดภัยด้วย และเท่ากับเพิ่ม พื้นผิวการโจมตี อย่างมากให้ parser ของทุกฟอร์แมต เปิดโอกาสให้เกิดการรันโค้ดจากระยะไกล การโจมตีให้ทรัพยากรหมด ฯลฯ มากขึ้น
ไม่ใช่ว่าเป็นแนวทางที่ผิดเสมอไป แต่สิ่งสำคัญคือประโยชน์ที่ได้คืออะไร
ถ้าลองค้นหา column-oriented storage format ตอนนี้มีการสรุปข้อดีข้อเสียไว้ค่อนข้างดีแล้ว
แน่นอนว่าไม่ใช่สำหรับการถอดรหัสวิดีโอ
ข้อดีของฟอร์แมตสมัยใหม่บางประเภทคือเครื่องมือต่าง ๆ สามารถอ่านได้เร็วมากในความรู้สึกใช้งานจริง
ตัวอย่างเช่น DuckDB สามารถใช้การปรับแต่งหลายอย่างได้เมื่ออ่านฟอร์แมตเนทีฟของตัวเองหรือ Parquet
แต่ผมไม่แน่ใจว่าจะใช้การปรับแต่งแบบนั้นได้มีประสิทธิภาพแค่ไหนกับฟอร์แมตที่ต้องรันก้อน Wasm เพื่อจะเข้าใจฟอร์แมต
ไม่ว่าจะไม่ใช่ SIMD หรือปรับแต่งด้วย SIMD ถ้าต้องไล่อ่านข้อมูลหนึ่งรอบในขณะที่รอบนั้นไม่เข้าใจคิวรี ก็อาจเสียเปรียบไปแล้ว
ผมแค่อ่านคร่าว ๆ ต้นงานวิจัยเท่านั้น ดังนั้นฟอร์แมตจริงอาจไม่ได้ทั่วไปมากอย่างที่ฟังดู
พอนึกภาพการใช้แทน EXE แตกไฟล์ในตัวได้บ้าง แต่เหตุผลสำคัญส่วนหนึ่งที่เลือกใช้ฟอร์แมตไฟล์เฉพาะก็คือความสามารถเฉพาะที่ฟอร์แมตนั้นมีให้
ระบบแบบ self-describing ก็อาจลงเอยเหมือนฟอร์แมตอื่น ๆ คือ “มีฟีเจอร์แข่งกันมากเกินไปจนไม่มีใครรองรับครบทั้งหมด”
เช่น ไฟล์นี้สามารถ
mmapได้อย่างมีประสิทธิภาพหรือไม่?ถ้าข้างในเลียนแบบ tar ก็อาจจะได้ แต่ไม่ลองรันดูก็ไม่รู้
มันสามารถกระโดดไปยังตำแหน่งไบต์ที่กำหนดเพื่อคลายข้อมูลออกมาแค่บางส่วนได้หรือไม่?
อาจรองรับเฉพาะ exploratory release ล่วงหน้าของ ISO-36898533 และไลบรารีไฟล์ที่ใช้อยู่ก็อาจตัดการรองรับนั้นไปแล้วตั้งแต่ 6 ปีก่อน
ถ้าเขียนทับใหม่ตรง 1MB ตรงกลาง จะเปลี่ยนแค่เพจนั้นบนดิสก์ได้เลยไหม หรือว่าต้องเขียนใหม่ทั้งก้อน?
ก้อน Wasm อาจรองรับ API สำหรับเรื่องนี้ถึง 97 ตัว โดย 35 ตัวเป็นแค่สำเนาที่ต่างกันแต่ชื่อ จนมีขนาดใหญ่กว่าตัวข้อมูลเอง แต่ก็ไม่มีใครสนใจ
สุดท้ายตัวเลือกที่พอจำแนกได้มี 19 แบบ แต่ตัวเร่ง Wasm แบบเนทีฟของ CPU รองรับจริงแค่สองสามแบบ คุณก็อาจยังต้องทำโค้ดให้เฉพาะทางหนักอยู่ดี
อย่างน้อยถ้าเป็น
*.tar.gzก็ยังพอเดาได้ว่าทำอะไรได้บ้างดีเลย โลกนี้ต้องการฟอร์แมตข้อมูลที่ดีกว่าอยู่เสมอ
เพียงแต่ถ้าใน README เขียนข้อดีเมื่อเทียบกับ Parquet และฟอร์แมตไฟล์อื่นไว้ให้ชัดตั้งแต่แรก น่าจะดึงความสนใจได้มากกว่า
เมื่อมีคนเข้าไปที่ https://github.com/future-file-format/f3 ก็ควรเห็นได้ทันทีว่าทำไมถึงควรลองใช้
เอาข้อดีและตัวชี้วัดขึ้นมาแสดงเถอะ จะเลือกเฉพาะตัวชี้วัดที่เข้าข้างตัวเองก็ได้
อาจมีกรณีใช้งานที่ดีอยู่จริง แต่จาก README ตอนนี้ยังไม่ชัดว่าใครควรใช้และเพราะอะไร
ถ้าจะเก็บข้อมูลระดับ PB ไว้นานเกิน 10 ปี ผมคงไม่อยากพึ่งว่าภายภาคหน้าจะยังมี Wasm interpreter อยู่และเร็วพอสำหรับการอ่านไฟล์
ผมอยากได้ข้อกำหนดระดับไบต์ที่เรียบง่ายและมีเอกสารชัดเจนแบบ Parquet
ยิ่งไปกว่านั้น การใส่ลอจิกถอดรหัสไว้ในไบนารี Wasm ก็คือการเพิ่มชั้นการประมวลผลแบบ active เข้าไปในสิ่งที่ควรเป็น cold storage
มันถูก sandbox และได้รับการยอมรับอย่างกว้างขวาง และ Wasm ก็มีความสามารถด้าน sandbox แบบเดียวกัน
สำหรับการเก็บระยะยาวอาจยิ่งดีกว่าด้วยซ้ำ
เพราะไม่ต้องพกโปรแกรมแตกไฟล์แยกต่างหาก เนื่องจากมันอยู่ในไฟล์ archive เอง
ถ้าการถอดรหัสล้มเหลว ก็จะต้องไปดีบัก Wasm ที่คนอื่นใส่เข้ามา และก็น่ากังวลว่ามันอาจมีบั๊กแปลก ๆ ปะปนอยู่ด้วย
ถ้ามีไลบรารีดีโคเดอร์มาตรฐานที่โปรเจ็กต์เป็นผู้ดูแลและทดสอบก็น่าจะช่วยได้ แต่ก็ไม่แน่ใจว่านั่นจะไปทำลายข้อดีด้าน ความยืดหยุ่น ที่แนวทางนี้มอบให้หรือไม่
กล่าวคือมันไม่ใช่ปัญหาใหม่ที่เกิดจากระบบของผมเอง และพวกเขาควรจะสามารถทำให้เกิดซ้ำได้โดยไม่ขึ้นกับไคลเอนต์ตัวไหนก็ตาม