Sự khác biệt giữa bảng nội bộ Hive và bảng bên ngoài?


110

Bất cứ ai có thể cho tôi biết sự khác biệt giữa bảng bên ngoài của Hive và bảng bên trong. Tôi biết sự khác biệt đến khi bỏ bàn xuống. Tôi không hiểu ý bạn vì dữ liệu và siêu dữ liệu bị xóa trong bảng nội bộ và chỉ siêu dữ liệu bị xóa trong bảng bên ngoài. Bất cứ ai có thể giải thích cho tôi về các nút làm ơn.

Câu trả lời:


117

Hive có một cơ sở dữ liệu quan hệ trên nút chính mà nó sử dụng để theo dõi trạng thái. Ví dụ, khi bạn CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';, lược đồ bảng này được lưu trữ trong cơ sở dữ liệu.

Nếu bạn có một bảng được phân vùng, các phân vùng được lưu trữ trong cơ sở dữ liệu (điều này cho phép hive sử dụng danh sách các phân vùng mà không cần vào hệ thống tệp và tìm chúng, v.v.). Những thứ này là 'siêu dữ liệu'.

Khi bạn thả một bảng nội bộ, nó sẽ giảm dữ liệu và nó cũng làm giảm siêu dữ liệu.

Khi bạn thả một bảng bên ngoài, nó chỉ làm giảm dữ liệu meta. Điều đó có nghĩa là hive hiện không biết gì về dữ liệu đó. Nó không chạm vào dữ liệu của chính nó.


ok .. ví dụ như tôi đã tạo một bảng bên ngoài .. và tôi bỏ nó. điều gì xảy ra? ý bạn là gì bởi dữ liệu không được chạm vào? nếu tôi chọn * bảng đó sẽ hiển thị? tôi không thể hình dung ra sự khác biệt.
DrewRose

11
Nếu bạn đánh rơi một bảng, Hive sẽ trả về trạng thái trước khi bạn bỏ bảng. nếu bạn chạy truy vấn 'select * from foo' sau khi bạn thả foo, hive sẽ cho bạn biết bảng không tồn tại. Điều này là do bạn đã nói với hive để quên về bảng đó. Dữ liệu vẫn tồn tại trong bất kỳ hệ thống tập tin nào trước đây. Hãy coi siêu dữ liệu như một 'con trỏ' đến vị trí của dữ liệu.
prestomation

1
Vì vậy, bạn đang cho biết nếu tôi có dữ liệu ở vị trí dis opt / nancy / foo.txt và tôi tải nó trong bảng bên ngoài và thả nó, siêu dữ liệu bị mất nhưng dữ liệu ở vị trí này opt / nancy / foo.txt vẫn còn?
DrewRose

OK, bây giờ vị trí này nằm trong HDFS hay hệ thống cục bộ của tôi? Nếu nó nằm trong hệ thống cục bộ, khi tôi tải dữ liệu vào một bảng nội bộ và thả bảng, tệp foo.txt sẽ vẫn ở vị trí đó. cho đến nay tôi có đúng không?
DrewRose

3
Bảng Hive nằm trên hệ thống tệp được hỗ trợ (Hbase, HDFS, S3, v.v.). Tôi giả sử bạn đang sử dụng "TẢI DỮ LIỆU" để tải dữ liệu từ tệp cục bộ vào bảng hive? Trong trường hợp này, bạn đang sao chép tệp cục bộ vào một bảng hive. Khi bạn thả bảng này, bản sao dữ liệu trong bảng nội bộ sẽ bị xóa, nhưng tệp nguồn từ lệnh "LOAD DATA" sẽ vẫn còn nguyên vẹn.
prestomation

100

Bảng Hive có thể được tạo dưới dạng BÊN NGOÀI hoặc NỘI BỘ. Đây là một lựa chọn ảnh hưởng đến cách dữ liệu được tải, kiểm soát và quản lý.

Sử dụng bảng BÊN NGOÀI khi:

  1. Dữ liệu cũng được sử dụng bên ngoài Hive. Ví dụ: các tệp dữ liệu được đọc và xử lý bởi một chương trình hiện có không khóa tệp.
  2. Dữ liệu cần được duy trì ở vị trí cơ bản ngay cả sau BẢNG HIỆU QUẢ. Điều này có thể áp dụng nếu bạn đang trỏ nhiều lược đồ (bảng hoặc dạng xem) vào một tập dữ liệu duy nhất hoặc nếu bạn đang lặp qua các lược đồ có thể có khác nhau.
  3. Bạn muốn sử dụng một vị trí tùy chỉnh như ASV.
  4. Hive không nên sở hữu dữ liệu và cài đặt kiểm soát, dirs, v.v., bạn có một chương trình hoặc quy trình khác sẽ thực hiện những điều đó.
  5. Bạn không tạo bảng dựa trên bảng hiện có (AS SELECT).

Sử dụng bảng NỘI BỘ khi:

Dữ liệu là tạm thời.

Bạn muốn Hive quản lý hoàn toàn vòng đời của bảng và dữ liệu.



Việc tạo bảng NỘI BỘ sẽ xóa dữ liệu khỏi HDFS hay nó tạo một bản sao và sử dụng riêng cho tổ ong để giữ nguyên nguồn (HDFS)?
luckyyluke

@swetha Xin chào, tôi đến đây vì tôi đã xóa hoàn toàn tệp di căn.db nhưng dữ liệu vẫn còn trên hdfs. Vì vậy, khi tôi hiển thị bảng không có gì được hiển thị. Có cách nào để tạo lại siêu dữ liệu không?
awadhesh 14

46

Để trả lời bạn Câu hỏi:

Đối với Bảng bên ngoài, Hive lưu trữ dữ liệu trong VỊ TRÍ được chỉ định trong quá trình tạo bảng (thường không nằm trong thư mục kho). Nếu bảng bên ngoài bị xóa, thì siêu dữ liệu bảng sẽ bị xóa nhưng không xóa dữ liệu.

Đối với bảng Internal, Hive lưu trữ dữ liệu vào thư mục kho của nó. Nếu bảng bị xóa thì cả siêu dữ liệu bảng và dữ liệu sẽ bị xóa.


Cho bạn tham khảo,

Sự khác biệt giữa bảng Nội bộ và Bảng bên ngoài:

Đối với bảng bên ngoài -

  • Bảng bên ngoài lưu trữ các tệp trên máy chủ HDFS nhưng các bảng hoàn toàn không được liên kết với tệp nguồn.

  • Nếu bạn xóa một bảng bên ngoài, tệp vẫn còn trên máy chủ HDFS.

    Ví dụ: nếu bạn tạo một bảng bên ngoài có tên “table_test” trong HIVE bằng HIVE-QL và liên kết bảng với tệp “tệp” , thì việc xóa “table_test” khỏi HIVE sẽ không xóa “tệp” khỏi HDFS .

  • Các tệp bảng bên ngoài có thể truy cập được đối với bất kỳ ai có quyền truy cập vào cấu trúc tệp HDFS và do đó bảo mật cần được quản lý ở cấp tệp / thư mục HDFS.

  • Dữ liệu siêu dữ liệu được duy trì trên nút chính và việc xóa bảng bên ngoài khỏi HIVE chỉ xóa siêu dữ liệu chứ không phải dữ liệu / tệp.


Đối với bảng nội bộ-

  • Được lưu trữ trong một thư mục dựa trên cài đặt trong hive.metastore.warehouse.dir, theo mặc định, các bảng nội bộ được lưu trữ trong thư mục sau “/ user / hive / kho”, bạn có thể thay đổi nó bằng cách cập nhật vị trí trong tệp cấu hình.
  • Xóa bảng sẽ xóa siêu dữ liệu và dữ liệu từ nút chính và HDFS tương ứng.
  • Bảo mật tệp bảng nội bộ chỉ được kiểm soát thông qua HIVE. Bảo mật cần được quản lý trong HIVE, có thể là ở cấp giản đồ (tùy thuộc vào tổ chức).

Hive có thể có các bảng bên trong hoặc bên ngoài, đây là lựa chọn ảnh hưởng đến cách dữ liệu được tải, kiểm soát và quản lý.

Sử dụng bảng BÊN NGOÀI khi:

  • Các dữ liệu cũng được sử dụng bên ngoài của Hive . Ví dụ: các tệp dữ liệu được đọc và xử lý bởi một chương trình hiện có không khóa tệp.
  • Dữ liệu cần được duy trì ở vị trí cơ bản ngay cả sau khi BẢNG HIỆU QUẢ. Điều này có thể áp dụng nếu bạn đang trỏ nhiều lược đồ (bảng hoặc dạng xem) vào một tập dữ liệu duy nhất hoặc nếu bạn đang lặp qua nhiều lược đồ có thể có.
  • Hive không nên sở hữu dữ liệu và cài đặt kiểm soát, thư mục, v.v. , bạn có thể có một chương trình hoặc quy trình khác sẽ thực hiện những điều đó.
  • Bạn không tạo bảng dựa trên bảng hiện có (AS SELECT).

Sử dụng bảng NỘI BỘ khi:

  • Các dữ liệu chỉ là tạm thời .
  • Bạn muốn Hive quản lý hoàn toàn vòng đời của bảng và dữ liệu .

Nguồn:

HDInsight: Giới thiệu bảng bên trong và bên ngoài Hive

Bảng bên trong và bên ngoài trong Hadoop- HIVE


1
@CapturedTree Nhưng câu trả lời là không đúng. "Hive chuyển dữ liệu vào thư mục kho của nó." - điều này hoàn toàn sai, nó không sai. Dữ liệu đang được lưu trữ ở vị trí bảng. Không quan trọng bên ngoài hoặc được quản lý.
leftjoin

6

Dữ liệu bảng nội bộ được lưu trữ trong thư mục kho, trong khi dữ liệu bảng bên ngoài được lưu trữ tại vị trí bạn đã đề cập trong quá trình tạo bảng.

Vì vậy, khi bạn xóa một bảng bên trong, nó sẽ xóa lược đồ cũng như dữ liệu trong thư mục kho, nhưng đối với một bảng bên ngoài, đó chỉ là lược đồ mà bạn sẽ mất.

Vì vậy, khi bạn muốn một bảng bên ngoài khôi phục lại bạn sau khi xóa nó, có thể tạo lại một bảng với cùng một lược đồ và trỏ nó đến vị trí dữ liệu ban đầu. Hy vọng nó đã rõ ràng bây giờ.


4

Sự khác biệt duy nhất về hành vi (không phải mục đích sử dụng) dựa trên nghiên cứu và thử nghiệm hạn chế của tôi cho đến nay (sử dụng Hive 1.1.0 -cdh5.12.0) dường như là khi một bảng bị bỏ

  • dữ liệu của các bảng Nội bộ (Được quản lý) sẽ bị xóa khỏi hệ thống tệp HDFS
  • trong khi dữ liệu của các bảng Bên ngoài KHÔNG bị xóa khỏi hệ thống tệp HDFS.

(LƯU Ý: Xem Phần 'Bảng được quản lý và Bảng bên ngoài' trong https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL liệt kê một số điểm khác biệt khác mà tôi không hoàn toàn hiểu)

Tôi tin rằng Hive chọn vị trí cần tạo bảng dựa trên thứ tự ưu tiên sau từ trên xuống dưới

  1. Vị trí được xác định trong quá trình tạo bảng
  2. Vị trí được xác định trong Tạo cơ sở dữ liệu / lược đồ trong đó bảng được tạo.
  3. Thư mục Kho hàng Hive mặc định (Thuộc tính hive.metastore.warehouse.dir trong hive.site.xml)

Khi tùy chọn "Vị trí" không được sử dụng trong quá trình "tạo bảng tổ", quy tắc ưu tiên trên được sử dụng. Điều này có thể áp dụng cho cả bảng Bên trong và bảng Bên ngoài. Điều này có nghĩa là một bảng Nội bộ không nhất thiết phải nằm trong thư mục Kho và có thể nằm ở bất kỳ nơi nào khác.

Lưu ý: Tôi có thể đã bỏ lỡ một số trường hợp, nhưng dựa trên khả năng khám phá hạn chế của tôi, hoạt động của cả bảng Internal và Extenal dường như giống nhau ngoại trừ một điểm khác biệt (xóa dữ liệu) được mô tả ở trên. Tôi đã thử các trường hợp sau cho cả bảng Nội bộ và Bảng bên ngoài.

  1. Tạo bảng có và không có tùy chọn Vị trí
  2. Tạo bảng có và không có tùy chọn phân vùng
  3. Thêm dữ liệu mới bằng cách sử dụng Hive Load và Insert Statements
  4. Thêm tệp dữ liệu vào vị trí Bảng bên ngoài Hive (sử dụng lệnh HDFS) và làm mới bảng bằng lệnh "MSCK REPAIR TABLE
  5. Bỏ bàn

khám phá tốt. Đây là câu trả lời duy nhất giải thích rằng cách tổ ong xử lý tùy chọn vị trí cho bảng bên trong và bên ngoài.
d2207197

3

Trong các bảng bên ngoài, nếu bạn thả nó, nó chỉ xóa lược đồ của bảng, dữ liệu bảng tồn tại ở vị trí thực. Vì vậy, để xóa dữ liệu, hãy sử dụng tên bảng hadoop fs - rmr. Tổ ong bảng được quản lý sẽ có toàn quyền kiểm soát các bảng. Trong các bảng bên ngoài, người dùng sẽ có quyền kiểm soát nó.


Tôi đang gặp phải trường hợp không phải lúc nào thư mục cũng bị xóa sau khi DROP TABLE trên bảng nội bộ được tạo qua CREATE TABLE foo (id INT). Siêu dữ liệu có vẻ ổn vì SHOW TABLES nhất quán - bảng không xuất hiện trong danh sách đó sau khi nó bị xóa. Thật khó hiểu, đôi khi tôi đã nhận thấy dir / is / bị xóa, nhưng tôi không thể tạo lại nó một cách nhất quán. Có ý kiến ​​gì không?
Matthew Cornell

Quyền của các bảng có được kiểm tra không? Bạn có thể đã thay đổi quyền sở hữu vị trí trên HDFS thành một Người dùng khác.
Milind Jindal

1

Các bảng bên trong hữu ích nếu bạn muốn Hive quản lý toàn bộ vòng đời dữ liệu của mình bao gồm cả việc xóa, trong khi các bảng bên ngoài hữu ích khi các tệp đang được sử dụng bên ngoài Hive.


1

Bảng tổ ong bên ngoài có ưu điểm là nó không xóa các tập tin khi chúng ta thả bảng, chúng ta có thể thiết lập các định dạng hàng với các cài đặt khác nhau, như serde .... phân định


1

Cũng nên nhớ rằng Hive là một kho dữ liệu lớn. Khi bạn muốn xóa một bảng, bạn không muốn mất hàng Gigabyte hoặc Terabyte dữ liệu. Việc tạo, di chuyển và sao chép dữ liệu ở quy mô đó có thể tốn nhiều thời gian. Khi bạn thả tổ ong bảng 'Được quản lý' cũng sẽ thùng rác dữ liệu của nó. Khi bạn thả bảng 'Bên ngoài', chỉ định nghĩa giản đồ từ siêu cửa hàng hive bị xóa. Dữ liệu trên hdfs vẫn còn.


1

Hãy xem xét tình huống này phù hợp nhất với Bảng bên ngoài:

Một công việc MapReduce (MR) lọc một tệp nhật ký khổng lồ để lấy ra ncác tệp nhật ký phụ (ví dụ: mỗi tệp nhật ký phụ chứa một nhật ký loại thông báo cụ thể) và đầu ra tức là ncác tệp nhật ký phụ được lưu trữ trong hdfs.

Các tệp nhật ký này sẽ được tải vào các bảng Hive để thực hiện phân tích sâu hơn, trong trường hợp này, tôi khuyên bạn nên sử dụng (các) Bảng bên ngoài, bởi vì các tệp nhật ký thực tế được tạo và sở hữu bởi một quy trình bên ngoài, tức là một công việc MR bên cạnh bạn có thể tránh thêm bước tải từng tệp nhật ký đã tạo vào bảng Hive tương ứng.


1

Trường hợp sử dụng tốt nhất cho bảng ngoài trong tổ là khi bạn muốn tạo bảng từ tệp CSV hoặc văn bản


0

hive chỉ lưu trữ dữ liệu meta ở vùng di căn và dữ liệu gốc ở bên ngoài tổ ong khi chúng tôi sử dụng bảng bên ngoài, chúng tôi có thể cung cấp vị trí '' bằng cách này, dữ liệu ban đầu của chúng tôi sẽ không ảnh hưởng khi chúng tôi bỏ bảng


0

Khi đã có dữ liệu trong HDFS, một bảng Hive bên ngoài có thể được tạo để mô tả dữ liệu. Nó được gọi là BÊN NGOÀI vì dữ liệu trong bảng bên ngoài được chỉ định trong thuộc tính VỊ TRÍ thay vì thư mục kho mặc định.

Khi giữ dữ liệu trong các bảng nội bộ, Hive quản lý đầy đủ vòng đời của bảng và dữ liệu. Điều này có nghĩa là dữ liệu sẽ bị xóa sau khi bảng nội bộ bị xóa. Nếu bảng bên ngoài bị xóa, siêu dữ liệu bảng sẽ bị xóa nhưng dữ liệu được giữ lại. Hầu hết thời gian, một bảng bên ngoài được ưu tiên để tránh xóa nhầm dữ liệu cùng với các bảng.


0

Đối với các bảng được quản lý, Hive kiểm soát vòng đời của dữ liệu của chúng. Hive lưu trữ dữ liệu cho các bảng được quản lý trong một thư mục con trong thư mục được xác định bởi hive.metastore.warehouse.dir theo mặc định.

Khi chúng tôi thả một bảng được quản lý, Hive sẽ xóa dữ liệu trong bảng, nhưng các bảng được quản lý ít thuận tiện hơn cho việc chia sẻ với các công cụ khác. Ví dụ: giả sử chúng tôi có dữ liệu được tạo và sử dụng chủ yếu bởi Pig, nhưng chúng tôi muốn chạy một số truy vấn đối với dữ liệu đó, nhưng không cấp cho Hive quyền sở hữu dữ liệu.

Tại thời điểm đó, bảng bên ngoài được định nghĩa trỏ đến dữ liệu đó, nhưng không có quyền sở hữu nó.


0

NỘI BỘ : Bảng được tạo Đầu tiênDữ liệu được tải sau

EXTERNAL : Dữ liệuhiện tạiBảng được tạo ra trên đầu trang của nó.


0

Trong Hive Chúng ta cũng có thể tạo một bảng bên ngoài. Nó yêu cầu Hive tham chiếu đến dữ liệu ở vị trí hiện có bên ngoài thư mục kho. Bỏ bảng bên ngoài sẽ xóa siêu dữ liệu nhưng không xóa dữ liệu.


0

Tôi muốn thêm điều đó

  1. Bảng bên trong được sử dụng khi dữ liệu cần được cập nhật hoặc một số hàng cần được xóa vì thuộc tính ACID có thể được hỗ trợ trên bảng bên trong nhưng thuộc tính ACID không thể được hỗ trợ trên bảng bên ngoài.
  2. Hãy đảm bảo rằng có một bản sao lưu dữ liệu trong bảng Nội bộ vì nếu bảng nội bộ bị mất thì dữ liệu cũng sẽ bị mất.

-2

Nói một cách đơn giản, có hai điều:

Hive có thể quản lý những thứ trong kho tức là nó sẽ không xóa dữ liệu ra khỏi kho. Khi chúng tôi xóa bảng:

1) Đối với bảng nội bộ, dữ liệu được quản lý nội bộ trong kho. Vì vậy, sẽ bị xóa.

2) Đối với các bảng bên ngoài, dữ liệu được quản lý vĩnh viễn từ kho. Vì vậy, không thể bị xóa và các khách hàng khác sau đó hive cũng có thể sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.