ความแตกต่างระหว่างตารางภายในของ Hive และตารางภายนอก?


110

ใครช่วยบอกความแตกต่างระหว่างตารางภายนอกของ Hive กับตารางภายในได้ไหม ฉันรู้ว่าความแตกต่างเกิดขึ้นเมื่อวางโต๊ะ ฉันไม่เข้าใจความหมายของข้อมูลและข้อมูลเมตาถูกลบในข้อมูลเมตาภายในและมีเพียงข้อมูลเมตาเท่านั้นที่ถูกลบในตารางภายนอก ใครช่วยอธิบายฉันในแง่ของโหนดได้โปรด

คำตอบ:


118

Hive มีฐานข้อมูลเชิงสัมพันธ์บนโหนดหลักที่ใช้เพื่อติดตามสถานะ ตัวอย่างเช่นเมื่อคุณCREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';สคีมาของตารางนี้จะถูกเก็บไว้ในฐานข้อมูล

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

เมื่อคุณวางตารางภายในตารางจะลดข้อมูลและข้อมูลเมตาจะลดลงด้วย

เมื่อคุณวางตารางภายนอกตารางจะลดลงเฉพาะข้อมูลเมตา นั่นหมายความว่าตอนนี้รังไม่รู้ข้อมูลนั้น ไม่ได้สัมผัสข้อมูลเอง


ตกลง .. ตัวอย่างเช่นฉันได้สร้างตารางภายนอก .. และฉันวางมันลง เกิดอะไรขึ้น? คุณหมายถึงอะไรที่ไม่ได้สัมผัสข้อมูล? ถ้าฉันเลือก * ของตารางนั้นจะแสดงหรือไม่ ฉันไม่สามารถมองเห็นความแตกต่างได้
DrewRose

11
หากคุณวางโต๊ะ Hive จะส่งคืนสถานะเดิมก่อนที่คุณจะทิ้งโต๊ะ หากคุณเรียกใช้แบบสอบถาม 'select * from foo' หลังจากที่คุณวาง foo รังจะบอกคุณว่าไม่มีตาราง นี่เป็นเพราะคุณบอกให้ไฮฟ์ลืมโต๊ะนั้นซะ ข้อมูลยังคงมีอยู่ในระบบไฟล์ใด ๆ ก็ตามที่มีมาก่อน ให้คิดว่าข้อมูลเมตาเป็น "ตัวชี้" ว่าข้อมูลอยู่ที่ใด
prestomation

1
ดังนั้นคุณกำลังบอกว่าฉันมีข้อมูลในการเลือกตำแหน่ง / nancy / foo.txt หรือไม่และฉันโหลดในตารางภายนอกแล้ววางข้อมูลเมตาจะหายไป แต่ข้อมูลในตำแหน่งนี้ opt / nancy / foo.txt ยังคงอยู่?
DrewRose

ตกลงตอนนี้ตำแหน่งนี้อยู่ใน HDFS หรือระบบภายในของฉัน? หากอยู่ในระบบโลคัลเมื่อฉันโหลดข้อมูลลงในตารางภายในและวางตารางไฟล์ foo.txt จะยังคงอยู่ในตำแหน่งนั้น ฉันอยู่หรือเปล่า
DrewRose

3
ตารางไฮฟ์อยู่บนระบบไฟล์ที่รองรับ (Hbase, HDFS, S3 ฯลฯ ) ฉันสมมติว่าคุณกำลังใช้ "LOAD DATA" เพื่อโหลดข้อมูลจากไฟล์ในเครื่องลงในตารางรัง? ในกรณีนี้คุณกำลังคัดลอกไฟล์ในเครื่องลงในตารางรัง เมื่อคุณวางตารางนี้สำเนาของข้อมูลในตารางภายในจะถูกลบออก แต่ไฟล์ต้นฉบับจากคำสั่ง "LOAD DATA" จะยังคงอยู่เหมือนเดิม
prestomation

102

ตารางไฮฟ์สามารถสร้างเป็นภายนอกหรือภายใน นี่เป็นทางเลือกที่มีผลต่อวิธีโหลดควบคุมและจัดการข้อมูล

ใช้ตารางภายนอกเมื่อ:

  1. ข้อมูลยังถูกใช้นอก Hive ตัวอย่างเช่นไฟล์ข้อมูลจะถูกอ่านและประมวลผลโดยโปรแกรมที่มีอยู่ซึ่งไม่ได้ล็อกไฟล์
  2. ข้อมูลจะต้องยังคงอยู่ในตำแหน่งพื้นฐานแม้ว่าจะวาง DROP TABLE แล้วก็ตาม สิ่งนี้สามารถใช้ได้หากคุณกำลังชี้สคีมาหลายรายการ (ตารางหรือมุมมอง) ที่ชุดข้อมูลเดียวหรือหากคุณกำลังทำซ้ำผ่านสคีมาต่างๆที่เป็นไปได้
  3. คุณต้องการใช้ตำแหน่งที่กำหนดเองเช่น ASV
  4. Hive ไม่ควรเป็นเจ้าของข้อมูลและควบคุมการตั้งค่า dirs ฯลฯ คุณมีโปรแกรมหรือกระบวนการอื่นที่จะทำสิ่งเหล่านั้น
  5. คุณไม่ได้สร้างตารางตามตารางที่มีอยู่ (AS SELECT)

ใช้ตารางภายในเมื่อ:

ข้อมูลเป็นแบบชั่วคราว

คุณต้องการให้ Hive จัดการวงจรชีวิตของตารางและข้อมูลอย่างสมบูรณ์



การสร้างตารางภายในจะลบข้อมูลออกจาก HDFS หรือจะทำสำเนาและใช้เฉพาะสำหรับกลุ่มที่ปล่อยให้แหล่งที่มา (HDFS) เหมือนเดิม?
luckyluke

@swetha สวัสดีฉันมาที่นี่เพราะฉันลบ metastore.db ทั้งหมด แต่ข้อมูลยังคงอยู่ใน hdfs ดังนั้นเมื่อฉันไม่แสดงตารางจะไม่มีการแสดง มีวิธีสร้างข้อมูลเมตาใหม่หรือไม่
awadhesh14

47

เพื่อตอบคำถามคุณ:

สำหรับตารางภายนอก Hive จะเก็บข้อมูลไว้ใน LOCATION ที่ระบุระหว่างการสร้างตาราง (โดยทั่วไปจะไม่อยู่ในไดเรกทอรีคลังสินค้า) หากตารางภายนอกหลุดข้อมูลเมตาของตารางจะถูกลบ แต่ไม่ใช่ข้อมูล

สำหรับตารางภายใน Hive จะเก็บข้อมูลไว้ในไดเร็กทอรีคลังสินค้า หากตารางหลุดทั้งข้อมูลเมตาของตารางและข้อมูลจะถูกลบ


การอ้างอิงของคุณ,

ความแตกต่างระหว่างตารางภายในและภายนอก:

สำหรับตารางภายนอก -

  • ตารางภายนอกจัดเก็บไฟล์บนเซิร์ฟเวอร์ HDFS แต่ตารางไม่ได้เชื่อมโยงกับไฟล์ต้นฉบับอย่างสมบูรณ์

  • หากคุณลบตารางภายนอกไฟล์จะยังคงอยู่บนเซิร์ฟเวอร์ HDFS

    ตัวอย่างเช่นถ้าคุณสร้างตารางภายนอกที่เรียกว่า“table_test”ในรังโดยใช้รัง QL และเชื่อมโยงตารางไปยังแฟ้ม“แฟ้ม” , แล้วลบ“table_test” จาก HIVE จะไม่ลบ“แฟ้ม” จาก HDFS

  • ไฟล์ตารางภายนอกสามารถเข้าถึงได้โดยทุกคนที่สามารถเข้าถึงโครงสร้างไฟล์ HDFS ดังนั้นจึงต้องมีการจัดการความปลอดภัยที่ระดับไฟล์ / โฟลเดอร์ HDFS

  • ข้อมูลเมตาจะถูกเก็บรักษาไว้ในโหนดหลักและการลบตารางภายนอกจาก HIVE จะลบเฉพาะข้อมูลเมตาเท่านั้นไม่ใช่ข้อมูล / ไฟล์


สำหรับตารางภายใน -

  • เก็บไว้ในไดเรกทอรีที่ขึ้นอยู่กับการตั้งค่าในhive.metastore.warehouse.dir, โดยตารางภายในเริ่มต้นจะถูกเก็บไว้ในไดเร็กทอรีต่อไป“/ ผู้ใช้ / รัง / คลังสินค้า”คุณสามารถเปลี่ยนได้โดยการปรับปรุงสถานที่ในไฟล์ config
  • การลบตารางจะลบข้อมูลเมตาและข้อมูลจาก master-node และ HDFS ตามลำดับ
  • ความปลอดภัยของไฟล์ตารางภายในถูกควบคุมผ่านทาง HIVE เท่านั้น ความปลอดภัยต้องได้รับการจัดการภายใน HIVE ซึ่งอาจอยู่ในระดับสคีมา (ขึ้นอยู่กับองค์กร)

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

ใช้ตารางภายนอกเมื่อ:

  • ข้อมูลนอกจากนี้ยังใช้นอกรังข้อมูลนอกจากนี้ยังใช้นอกรังตัวอย่างเช่นไฟล์ข้อมูลจะถูกอ่านและประมวลผลโดยโปรแกรมที่มีอยู่ซึ่งไม่ได้ล็อกไฟล์
  • ข้อมูลจะต้องยังคงอยู่ในตำแหน่งพื้นฐานแม้ว่าจะวาง DROP TABLE แล้วก็ตามสิ่งนี้สามารถใช้ได้หากคุณกำลังชี้สคีมา (ตารางหรือมุมมอง) หลายชุดที่ชุดข้อมูลเดียวหรือหากคุณกำลังทำซ้ำผ่านสคีมาที่เป็นไปได้ต่างๆ
  • ไฮฟ์ไม่ควรเป็นเจ้าของข้อมูลและควบคุมการตั้งค่าไดเร็กทอรี ฯลฯคุณอาจมีโปรแกรมหรือกระบวนการอื่นที่จะทำสิ่งเหล่านั้น
  • คุณไม่ได้สร้างตารางตามตารางที่มีอยู่ (AS SELECT)

ใช้ตารางภายในเมื่อ:

  • ข้อมูลชั่วคราว
  • คุณต้องการให้Hive จัดการวงจรชีวิตของตารางและข้อมูลอย่างสมบูรณ์

ที่มา:

HDInsight: Hive Intro ตารางภายในและภายนอก

ตารางภายในและภายนอกใน Hadoop- HIVE


1
@CapturedTree แต่คำตอบไม่ถูกต้อง "ไฮฟ์ย้ายข้อมูลไปยังไดเร็กทอรีคลังสินค้า" - นี่ผิดทั้งหมดไม่ใช่ กำลังจัดเก็บข้อมูลในตำแหน่งตาราง ไม่สำคัญว่าภายนอกหรือได้รับการจัดการ
leftjoin

6

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

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

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


4

ความแตกต่างเพียงประการเดียวในพฤติกรรม (ไม่ใช่การใช้งานที่ตั้งใจไว้) จากการวิจัยและการทดสอบที่ จำกัด ของฉันจนถึงตอนนี้ (โดยใช้ Hive 1.1.0 -cdh5.12.0) ดูเหมือนว่าเมื่อตารางหลุด

  • ข้อมูลของตารางภายใน (จัดการ) จะถูกลบออกจากระบบไฟล์ HDFS
  • ในขณะที่ข้อมูลของตารางภายนอกไม่ถูกลบออกจากระบบไฟล์ HDFS

(หมายเหตุ: ดูส่วน 'ตารางที่มีการจัดการและภายนอก' ใน https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDLซึ่งแสดงรายการความแตกต่างอื่น ๆ ที่ฉันไม่เข้าใจอย่างสมบูรณ์)

ฉันเชื่อว่าไฮฟ์เลือกตำแหน่งที่ต้องการสร้างตารางโดยยึดตามลำดับความสำคัญต่อไปนี้จากบนลงล่าง

  1. ตำแหน่งที่กำหนดในระหว่างการสร้างตาราง
  2. ตำแหน่งที่กำหนดไว้ในการสร้างฐานข้อมูล / สคีมาที่สร้างตาราง
  3. ดีฟอลต์ Hive Warehouse Directory (คุณสมบัติ hive.metastore.warehouse.dir ใน hive.site.xml)

เมื่อไม่ได้ใช้ตัวเลือก "ตำแหน่ง" ในระหว่าง "การสร้างตารางรัง" ระบบจะใช้กฎลำดับความสำคัญข้างต้น สิ่งนี้ใช้ได้กับทั้งตารางภายในและภายนอก ซึ่งหมายความว่าตารางภายในไม่จำเป็นต้องอยู่ในไดเร็กทอรี Warehouse และสามารถอยู่ที่อื่นได้

หมายเหตุ: ฉันอาจพลาดบางสถานการณ์ไป แต่จากการสำรวจที่ จำกัด ของฉันพฤติกรรมของทั้งตารางภายในและภายนอกดูเหมือนจะเหมือนกันยกเว้นความแตกต่างเดียว (การลบข้อมูล) ที่อธิบายไว้ข้างต้น ฉันลองสถานการณ์ต่อไปนี้สำหรับทั้งตารางภายในและภายนอก

  1. การสร้างตารางที่มีและไม่มีตัวเลือกตำแหน่ง
  2. การสร้างตารางที่มีและไม่มี Partition Option
  3. การเพิ่มข้อมูลใหม่โดยใช้ Hive Load and Insert Statements
  4. การเพิ่มไฟล์ข้อมูลไปยังตำแหน่ง Table นอก Hive (โดยใช้คำสั่ง HDFS) และรีเฟรชตารางโดยใช้คำสั่ง "MSCK REPAIR TABLE
  5. วางตาราง

การสำรวจที่ดี นี่เป็นคำตอบเดียวที่อธิบายได้ว่ากลุ่มจัดการตัวเลือกตำแหน่งสำหรับตารางภายในและภายนอกอย่างไร
d2207197

3

ในตารางภายนอกถ้าคุณวางมันจะลบเฉพาะสคีมาของตารางข้อมูลตารางมีอยู่ในตำแหน่งทางกายภาพ ดังนั้นในการลบข้อมูลให้ใช้ hadoop fs - rmr tablename กลุ่มตารางที่มีการจัดการจะควบคุมตารางได้อย่างสมบูรณ์ ในตารางภายนอกผู้ใช้จะสามารถควบคุมได้


ฉันพบสถานการณ์ที่ไม่ได้ลบไดเรกทอรีเสมอไปหลังจาก DROP TABLE บนตารางภายในที่สร้างผ่าน CREATE TABLE foo (id INT) เห็นได้ชัดว่าข้อมูลเมตานั้นใช้ได้เนื่องจาก SHOW TABLES สอดคล้องกัน - ตารางจะไม่ปรากฏในรายการนั้นหลังจากที่มันถูกทิ้ง น่าสับสนฉันสังเกตเห็น dir / is / delete ในบางครั้ง แต่ฉันไม่สามารถสร้างสิ่งนั้นได้อย่างสม่ำเสมอ ความคิดใด ๆ ?
Matthew Cornell

มีการตรวจสอบสิทธิ์ของตารางหรือไม่ คุณอาจเปลี่ยนความเป็นเจ้าของตำแหน่งบน HDFS เป็นผู้ใช้รายอื่น
Milind Jindal

1

ตารางภายในมีประโยชน์หากคุณต้องการให้ Hive จัดการวงจรชีวิตที่สมบูรณ์ของข้อมูลของคุณรวมถึงการลบในขณะที่ตารางภายนอกจะมีประโยชน์เมื่อไฟล์ถูกใช้ภายนอก Hive


1

External hive table มีข้อดีตรงที่ไม่ลบไฟล์เมื่อเราวางตารางเราสามารถกำหนดรูปแบบแถวด้วยการตั้งค่าต่างๆเช่น serde .... delimited


1

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


1

พิจารณาสถานการณ์นี้ที่เหมาะสมที่สุดสำหรับตารางภายนอก:

งาน MapReduce (MR) จะกรองไฟล์บันทึกขนาดใหญ่เพื่อคายnไฟล์บันทึกย่อย (เช่นไฟล์บันทึกย่อยแต่ละไฟล์มีบันทึกประเภทข้อความเฉพาะ) และเอาต์พุตเช่นnไฟล์บันทึกย่อยจะถูกเก็บไว้ใน hdfs

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


1

กรณีการใช้งานที่ดีที่สุดสำหรับตารางภายนอกในกลุ่มคือเมื่อคุณต้องการสร้างตารางจากไฟล์ CSV หรือข้อความ


0

รังเก็บเฉพาะข้อมูลเมตาในการแพร่กระจายและข้อมูลดั้งเดิมในด้านนอกของกลุ่มเมื่อเราใช้ตารางภายนอกเราสามารถระบุตำแหน่งได้ '' โดยข้อมูลเดิมของเราจะไม่มีผลเมื่อเราวางตาราง


0

เมื่อมีข้อมูลอยู่แล้วใน HDFS สามารถสร้างตาราง Hive ภายนอกเพื่ออธิบายข้อมูลได้ เรียกว่า EXTERNAL เนื่องจากข้อมูลในตารางภายนอกถูกระบุไว้ในคุณสมบัติ LOCATION แทนที่จะเป็นไดเร็กทอรีคลังสินค้าเริ่มต้น

เมื่อเก็บข้อมูลไว้ในตารางภายใน Hive จะจัดการวงจรชีวิตของตารางและข้อมูลอย่างเต็มที่ ซึ่งหมายความว่าข้อมูลจะถูกลบออกเมื่อตารางภายในถูกทิ้ง หากตารางภายนอกหลุดข้อมูลเมตาของตารางจะถูกลบ แต่ข้อมูลจะถูกเก็บไว้ โดยส่วนใหญ่แล้วตารางภายนอกเป็นที่ต้องการเพื่อหลีกเลี่ยงการลบข้อมูลพร้อมกับตารางโดยไม่ได้ตั้งใจ


0

สำหรับตารางที่มีการจัดการ Hive จะควบคุมวงจรชีวิตของข้อมูล ไฮฟ์เก็บข้อมูลสำหรับตารางที่มีการจัดการในไดเร็กทอรีย่อยภายใต้ไดเร็กทอรีที่กำหนดโดย hive.metastore.warehouse.dir ตามค่าเริ่มต้น

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

ในเวลานั้นตารางภายนอกถูกกำหนดให้ชี้ไปที่ข้อมูลนั้น แต่ไม่ได้เป็นเจ้าของตาราง


0

ภายใน : ตารางถูกสร้างขึ้นก่อนและข้อมูลจะถูกโหลดในภายหลัง

ภายนอก : ข้อมูลเป็นปัจจุบันและตารางที่ถูกสร้างขึ้นที่ด้านบนของมัน


0

ใน Hive เราสามารถสร้างตารางภายนอกได้ด้วย มันบอกให้ Hive อ้างถึงข้อมูลที่อยู่ในตำแหน่งที่มีอยู่ภายนอกไดเร็กทอรีคลังสินค้า การทิ้งตารางภายนอกจะลบข้อมูลเมตา แต่ไม่ใช่ข้อมูล


0

ขอเพิ่มเติมว่า

  1. ตารางภายในใช้เมื่อจำเป็นต้องอัปเดตข้อมูลหรือบางแถวจำเป็นต้องลบเนื่องจากคุณสมบัติ ACID สามารถรองรับได้บนตารางภายใน แต่ไม่สามารถรองรับคุณสมบัติ ACID บนตารางภายนอกได้
  2. โปรดตรวจสอบให้แน่ใจว่ามีการสำรองข้อมูลในตารางภายในเนื่องจากหากตารางภายในหลุดข้อมูลก็จะสูญหายไปด้วย

-2

พูดง่ายๆมีสองอย่างคือ

Hive สามารถจัดการสิ่งต่างๆในคลังสินค้ากล่าวคือจะไม่ลบข้อมูลออกจากคลังสินค้า เมื่อเราลบตาราง:

1) สำหรับตารางภายในข้อมูลจะถูกจัดการภายในคลังสินค้า จึงจะถูกลบทิ้ง

2) สำหรับตารางภายนอกข้อมูลจะถูกจัดการตลอดไปจากคลังสินค้า ดังนั้นไม่สามารถลบได้และไคลเอนต์อื่น ๆ ก็สามารถใช้มันได้เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.