Perbedaan antara tabel internal Hive dan tabel eksternal?

110

Adakah yang bisa memberi tahu saya perbedaan antara tabel eksternal Hive dan tabel internal. Saya tahu perbedaannya muncul saat menjatuhkan meja. Saya tidak mengerti apa yang Anda maksud dengan data dan metadata dihapus di internal dan hanya metadata yang dihapus di tabel eksternal. Adakah yang bisa menjelaskan saya dalam hal node tolong.

DrewRose
sumber

Jawaban:

118

Hive memiliki database relasional pada node master yang digunakannya untuk melacak status. Misalnya, saat Anda CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';, skema tabel ini disimpan dalam database.

Jika Anda memiliki tabel yang dipartisi, partisi tersebut disimpan dalam database (ini memungkinkan sarang untuk menggunakan daftar partisi tanpa pergi ke sistem file dan menemukannya, dll). Hal-hal semacam ini adalah 'metadata'.

Ketika Anda menjatuhkan tabel internal, itu menjatuhkan datanya, dan itu juga menjatuhkan metadata.

Ketika Anda menjatuhkan tabel eksternal, itu hanya menjatuhkan meta data. Itu berarti sarang sekarang tidak mengetahui data itu. Itu tidak menyentuh data itu sendiri.

prestomation
sumber
ok .. misalnya saya telah membuat tabel eksternal .. dan saya menjatuhkannya. apa yang terjadi? Apa yang Anda maksud dengan data tidak tersentuh? jika saya memilih * dari tabel itu apakah akan ditampilkan? saya tidak bisa membayangkan perbedaannya.
DrewRose
11
Jika Anda menjatuhkan tabel, Hive mengembalikan keadaan semula sebelum Anda menjatuhkan tabel. jika Anda menjalankan kueri 'pilih * dari foo' setelah Anda melepaskan foo, sarang akan memberi tahu Anda bahwa tabel tidak ada. Ini karena Anda telah menyuruh sarang untuk melupakan meja itu. Data masih ada di sistem file apa pun sebelumnya. Pikirkan metadata sebagai 'penunjuk' ke tempat data berada.
prestomation
1
Jadi Anda memberi tahu jika saya memiliki data di lokasi opt / nancy / foo.txt dan saya memuatnya di tabel eksternal dan menjatuhkannya, metadata hilang tetapi data di lokasi ini opt / nancy / foo.txt tetap?
DrewRose
Oke, sekarang lokasi ini ada di HDFS atau sistem lokal saya? Jika ada di sistem lokal, ketika saya memuat data ke tabel internal dan menjatuhkan tabel, file foo.txt akan tetap berada di lokasi itu. apakah saya benar sejauh ini?
DrewRose
3
Tabel sarang berada pada sistem file yang didukung (Hbase, HDFS, S3, dll). Saya berasumsi bahwa Anda menggunakan "BEBAN DATA" untuk memuat data dari file lokal ke tabel sarang? Dalam kasus ini, Anda menyalin file lokal ke tabel sarang. Saat Anda menghapus tabel ini, salinan data di tabel internal akan dihapus, tetapi file sumber dari perintah "LOAD DATA" akan tetap utuh.
prestomation
101

Tabel sarang dapat dibuat sebagai EKSTERNAL atau INTERNAL. Ini adalah pilihan yang memengaruhi cara data dimuat, dikontrol, dan dikelola.

Gunakan tabel EKSTERNAL ketika:

  1. Data tersebut juga digunakan di luar Hive. Misalnya, file data dibaca dan diproses oleh program yang sudah ada yang tidak mengunci file.
  2. Data harus tetap berada di lokasi yang mendasarinya bahkan setelah TABEL DROP. Ini bisa diterapkan jika Anda menunjuk beberapa skema (tabel atau tampilan) pada satu kumpulan data atau jika Anda melakukan iterasi melalui berbagai kemungkinan skema.
  3. Anda ingin menggunakan lokasi khusus seperti ASV.
  4. Hive tidak boleh memiliki data dan mengontrol pengaturan, dirs, dll., Anda memiliki program atau proses lain yang akan melakukan hal-hal itu.
  5. Anda tidak membuat tabel berdasarkan tabel yang sudah ada (SEBAGAI PILIH).

Gunakan tabel INTERNAL ketika:

Data tersebut bersifat sementara.

Anda ingin Hive mengelola sepenuhnya siklus hidup tabel dan data.

swetha
sumber
akan membuat tabel INTERNAL menghapus data dari HDFS atau membuat salinan dan menggunakan secara eksklusif untuk sarang meninggalkan sumber (HDFS) utuh?
luckyluke
@swetha Hai, Saya datang ke sini karena saya menghapus metastore.db sepenuhnya tetapi datanya tetap di hdfs. Jadi ketika saya menampilkan tabel tidak ada yang ditampilkan. Apakah ada cara untuk membuat ulang metadata?
awadhesh14
47

Untuk menjawab pertanyaan Anda:

Untuk Tabel Eksternal, Hive menyimpan data di LOKASI yang ditentukan selama pembuatan tabel (umumnya tidak di direktori gudang). Jika tabel eksternal dihapus, maka metadata tabel dihapus tetapi datanya tidak.

Untuk tabel Internal, Hive menyimpan data ke direktori gudang nya. Jika tabel dihapus maka metadata tabel dan datanya akan dihapus.


Untuk referensi Anda,

Perbedaan antara tabel Internal & Eksternal:

Untuk Tabel Eksternal -

  • Tabel eksternal menyimpan file di server HDFS tetapi tabel tidak ditautkan sepenuhnya ke file sumber.

  • Jika Anda menghapus tabel eksternal, file masih tetap berada di server HDFS.

    Sebagai contoh jika Anda membuat tabel eksternal bernama "table_test" di HIVE menggunakan HIVE-QL dan menautkan tabel ke file "file" , maka menghapus "table_test" dari HIVE tidak akan menghapus "file" dari HDFS .

  • File tabel eksternal dapat diakses oleh siapa saja yang memiliki akses ke struktur file HDFS dan oleh karena itu keamanan perlu dikelola di level file / folder HDFS.

  • Data meta dipertahankan pada node master, dan menghapus tabel eksternal dari HIVE hanya menghapus metadata, bukan data / file.


Untuk Tabel Internal-

  • Disimpan dalam direktori berdasarkan pengaturan di hive.metastore.warehouse.dir, secara default tabel internal disimpan di direktori berikut "/ user / hive / warehouse" Anda dapat mengubahnya dengan memperbarui lokasi di file konfigurasi.
  • Menghapus tabel akan menghapus metadata dan data masing-masing dari master-node dan HDFS.
  • Keamanan file tabel internal dikontrol hanya melalui HIVE. Keamanan perlu dikelola dalam HIVE, mungkin di tingkat skema (bergantung pada organisasi).

Hive mungkin memiliki tabel internal atau eksternal, ini adalah pilihan yang memengaruhi cara data dimuat, dikontrol, dan dikelola.

Gunakan tabel EKSTERNAL ketika:

  • The data juga digunakan di luar Hive . Misalnya, file data dibaca dan diproses oleh program yang sudah ada yang tidak mengunci file.
  • Data harus tetap berada di lokasi yang mendasarinya bahkan setelah TABEL DROP. Ini dapat diterapkan jika Anda menunjuk beberapa skema (tabel atau tampilan) pada satu kumpulan data atau jika Anda mengulang melalui berbagai kemungkinan skema.
  • Hive tidak boleh memiliki data dan pengaturan kontrol, direktori, dll ., Anda mungkin memiliki program atau proses lain yang akan melakukan hal-hal itu.
  • Anda tidak membuat tabel berdasarkan tabel yang sudah ada (SEBAGAI PILIH).

Gunakan tabel INTERNAL ketika:

  • The data sementara .
  • Anda ingin Hive mengelola sepenuhnya siklus hidup tabel dan data .

Sumber:

HDInsight: Perkenalan Tabel Internal dan Eksternal Sarang

Tabel internal & eksternal di Hadoop- HIVE

Ani Menon
sumber
1
@CapturedTree Tapi jawabannya tidak benar. "Hive memindahkan data ke direktori gudang." -Ini benar-benar salah, sebenarnya tidak. Data sedang disimpan di lokasi tabel. Tidak masalah eksternal atau dikelola.
leftjoin
6

Data tabel internal disimpan di folder gudang, sedangkan data tabel eksternal disimpan di lokasi yang Anda sebutkan dalam pembuatan tabel.

Jadi ketika Anda menghapus tabel internal, itu menghapus skema serta data di bawah folder gudang, tetapi untuk tabel eksternal itu hanya skema yang akan Anda lepas.

Jadi ketika Anda menginginkan tabel eksternal kembali lagi setelah Anda menghapusnya, dapat membuat tabel dengan skema yang sama lagi dan mengarahkannya ke lokasi data asli. Semoga sudah jelas sekarang.

Pelajar Hadoop
sumber
4

Satu-satunya perbedaan dalam perilaku (bukan penggunaan yang dimaksudkan) berdasarkan penelitian dan pengujian terbatas saya sejauh ini (menggunakan Hive 1.1.0 -cdh5.12.0) tampaknya adalah ketika tabel dijatuhkan

  • data tabel Internal (Terkelola) dihapus dari sistem file HDFS
  • sedangkan data tabel Eksternal TIDAK dihapus dari sistem file HDFS.

(CATATAN: Lihat Bagian 'Tabel Terkelola dan Eksternal' di https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL yang mencantumkan beberapa perbedaan lain yang saya tidak sepenuhnya mengerti)

Saya yakin Hive memilih lokasi di mana ia perlu membuat tabel berdasarkan prioritas berikut dari atas ke bawah

  1. Lokasi ditentukan selama Pembuatan Tabel
  2. Lokasi yang ditentukan dalam Pembuatan Database / Skema tempat tabel dibuat.
  3. Direktori Gudang Sarang Default (Properti hive.metastore.warehouse.dir di hive.site.xml)

Ketika opsi "Lokasi" tidak digunakan selama "pembuatan tabel sarang", aturan prioritas di atas digunakan. Ini berlaku untuk tabel Internal dan Eksternal. Ini berarti tabel Internal tidak harus berada di direktori Gudang dan dapat ditempatkan di tempat lain.

Catatan: Saya mungkin melewatkan beberapa skenario, tetapi berdasarkan eksplorasi saya yang terbatas, perilaku tabel Internal dan Ekstenal tampaknya sama kecuali untuk satu perbedaan (penghapusan data) yang dijelaskan di atas. Saya mencoba skenario berikut untuk tabel Internal dan Eksternal.

  1. Membuat tabel dengan dan tanpa opsi Lokasi
  2. Membuat tabel dengan dan tanpa Opsi Partisi
  3. Menambahkan data baru menggunakan Hive Load dan Insert Statements
  4. Menambahkan file data ke lokasi Tabel di luar Hive (menggunakan perintah HDFS) dan menyegarkan tabel menggunakan perintah "MSCK REPAIR TABLE
  5. Menjatuhkan tabel
NallaAnand
sumber
eksplorasi yang bagus. Ini adalah satu-satunya jawaban yang menjelaskan bagaimana sarang menangani opsi lokasi untuk tabel internal dan eksternal.
d2207197
3

Di tabel eksternal, jika Anda menjatuhkannya, itu hanya menghapus skema tabel, data tabel ada di lokasi fisik. Jadi untuk menghapus datanya gunakan hadoop fs - rmr tablename. Sarang meja yang dikelola akan memiliki kontrol penuh atas meja. Di tabel eksternal, pengguna akan memiliki kendali atasnya.

Ajaykumar
sumber
Saya mengalami situasi di mana direktori tidak selalu dihapus setelah DROP TABLE pada tabel internal yang dibuat melalui CREATE TABLE foo (id INT). Metadata tampaknya baik-baik saja karena SHOW TABLES konsisten - tabel tidak muncul dalam daftar itu setelah dijatuhkan. Membingungkan, saya memperhatikan dir / is / dihapus kadang-kadang, tetapi saya tidak dapat secara konsisten membuatnya kembali. Ada ide?
Matthew Cornell
Apakah izin tabel dicentang? Anda mungkin telah mengubah kepemilikan lokasi di HDFS ke beberapa Pengguna yang berbeda.
Milind Jindal
1

Tabel internal berguna jika Anda ingin Hive mengelola seluruh siklus hidup data Anda termasuk penghapusan, sedangkan tabel eksternal berguna ketika file sedang digunakan di luar Hive.

Muthu Palaniappan
sumber
1

External hive table memiliki kelebihan yaitu tidak menghapus file ketika kita drop tabel, kita dapat mengatur format baris dengan pengaturan yang berbeda, seperti serde .... delimited

pengguna3485352
sumber
1

Perlu diingat juga bahwa Hive adalah gudang data besar. Saat Anda ingin menjatuhkan tabel, Anda tidak ingin kehilangan Gigabyte atau Terabyte data. Menghasilkan, memindahkan, dan menyalin data pada skala itu dapat memakan waktu. Ketika Anda menjatuhkan sarang tabel 'Terkelola' juga akan membuang datanya. Ketika Anda menjatuhkan tabel 'Eksternal' hanya definisi skema dari penyimpanan meta sarang yang dihapus. Data di hdfs masih ada.

Urvishsinh Mahida
sumber
1

Pertimbangkan skenario ini yang paling sesuai untuk Tabel Eksternal:

Pekerjaan MapReduce (MR) memfilter file log yang sangat besar untuk mengeluarkan nfile sub log (mis. Setiap file sub log berisi log jenis pesan tertentu) dan outputnya yaitu nfile sub log disimpan dalam hdfs.

File log ini akan dimuat ke dalam tabel Hive untuk melakukan analitik lebih lanjut, dalam skenario ini saya akan merekomendasikan Tabel Eksternal, karena file log sebenarnya dihasilkan dan dimiliki oleh proses eksternal yaitu pekerjaan MR selain itu Anda dapat menghindari langkah tambahan untuk memuat setiap file log yang dihasilkan ke tabel Hive masing-masing juga.

Suresh Vadali
sumber
1

Kasus penggunaan terbaik untuk tabel eksternal di sarang adalah saat Anda ingin membuat tabel dari file baik CSV atau teks

anubhav
sumber
0

sarang hanya menyimpan data meta di metastore dan data asli di luar sarang ketika kami menggunakan tabel eksternal kami dapat memberikan lokasi '' oleh ini data asli kami tidak akan berpengaruh ketika kami menjatuhkan tabel

pengguna5080458
sumber
0

Jika sudah ada data di HDFS, tabel Hive eksternal dapat dibuat untuk mendeskripsikan data. Ini disebut EKSTERNAL karena data di tabel eksternal ditentukan di properti LOKASI, bukan di direktori gudang default.

Saat menyimpan data di tabel internal, Hive sepenuhnya mengelola siklus hidup tabel dan data. Ini berarti data dihapus setelah tabel internal dijatuhkan. Jika tabel eksternal dijatuhkan, metadata tabel dihapus tetapi datanya disimpan. Seringkali, tabel eksternal lebih disukai untuk menghindari penghapusan data bersama dengan tabel secara tidak sengaja.

Sayat Satybald
sumber
0

Untuk tabel terkelola, Hive mengontrol siklus hidup datanya. Hive menyimpan data untuk tabel terkelola dalam sub-direktori di bawah direktori yang ditentukan oleh hive.metastore.warehouse.dir secara default.

Saat kami menjatuhkan tabel terkelola, Hive menghapus data dalam tabel. Namun tabel terkelola kurang nyaman untuk dibagikan dengan alat lain. Sebagai contoh, katakanlah kita memiliki data yang dibuat dan digunakan terutama oleh Pig, tetapi kita ingin menjalankan beberapa kueri terhadapnya, tetapi tidak memberikan kepemilikan data kepada Hive.

Pada saat itu, tabel eksternal ditentukan yang menunjuk ke data tersebut, tetapi tidak mengambil kepemilikannya.

Ankit Nandwal
sumber
0

INTERNAL : Tabel dibuat Pertama dan Data dimuat kemudian

EKSTERNAL : data adalah hadir dan Table yang dibuat di atas itu.

Prasad L
sumber
0

Di Hive Kita juga bisa membuat tabel eksternal. Ini memberitahu Hive untuk merujuk ke data yang ada di lokasi yang ada di luar direktori gudang. Menghapus tabel Eksternal akan menghapus metadata tetapi tidak datanya.

Harsimranjit Singh Kler
sumber
0

Saya ingin menambahkan itu

  1. Tabel internal digunakan saat data perlu diperbarui atau beberapa baris perlu dihapus karena properti ACID dapat didukung di tabel Internal tetapi properti ACID tidak dapat didukung di tabel eksternal.
  2. Pastikan ada backup data di tabel Internal karena jika tabel internal di-drop maka data juga akan hilang.
jatin
sumber
-2

Secara sederhana, ada dua hal:

Sarang dapat mengatur hal-hal di gudang yaitu tidak akan menghapus data dari gudang. Saat kami menghapus tabel:

1) Untuk tabel internal, data dikelola secara internal di gudang. Jadi akan dihapus.

2) Untuk tabel eksternal, data dikelola selamanya dari gudang. Jadi tidak bisa dihapus dan klien selain sarang juga bisa menggunakannya.

Sonu
sumber