回答:
Hiveは、状態を追跡するために使用するマスターノードにリレーショナルデータベースを持っています。たとえば、の場合CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';
、このテーブルスキーマはデータベースに格納されます。
パーティションテーブルがある場合、パーティションはデータベースに保存されます(これにより、ハイブは、ファイルシステムにアクセスしてそれらを見つけることなく、パーティションのリストを使用できます)。この種のものは「メタデータ」です。
内部テーブルを削除すると、データが削除され、メタデータも削除されます。
外部テーブルを削除すると、メタデータのみが削除されます。つまり、ハイブは現在そのデータを認識していません。データ自体には触れません。
ハイブテーブルは、EXTERNALまたはINTERNALとして作成できます。これは、データのロード、制御、および管理の方法に影響する選択です。
次の場合にEXTERNALテーブルを使用します。
次の場合に内部テーブルを使用します。
データは一時的なものです。
Hiveでテーブルとデータのライフサイクルを完全に管理する必要があります。
外部テーブルの場合、Hiveは、テーブルの作成中に指定されたLOCATIONにデータを格納します(通常、ウェアハウスディレクトリにはありません)。外部テーブルが削除されると、テーブルメタデータは削除されますが、データは削除されません。
内部テーブルの場合、Hiveはデータをウェアハウスディレクトリに格納します。テーブルが削除されると、テーブルのメタデータとデータの両方が削除されます。
内部テーブルと外部テーブルの違い:
外部テーブルの場合-
外部テーブルはHDFSサーバーにファイルを格納しますが、テーブルはソースファイルに完全にリンクされていません。
外部テーブルを削除しても、ファイルはHDFSサーバーに残ります。
例として作成した場合、外部テーブルと呼ばれる「table_test」 HIVEにHIVE-QLを使用して、ファイルにテーブルをリンク「ファイル」を、その後、HDFSから「ファイル」は削除されませんHIVEから「table_test」を削除します。
外部テーブルファイルは、HDFSファイル構造にアクセスできるすべてのユーザーがアクセスできるため、セキュリティはHDFSファイル/フォルダーレベルで管理する必要があります。
メタデータはマスターノードで維持され、HIVEから外部テーブルを削除してもメタデータのみが削除され、データ/ファイルは削除されません。
内部テーブルの場合
- の設定に基づいてディレクトリに保存されます。デフォルトでは
hive.metastore.warehouse.dir
、 内部テーブルは次のディレクトリ「/ user / hive / warehouse」に保存されます。設定ファイル内の場所を更新することで変更できます。- テーブルを削除すると、マスターノードとHDFSからそれぞれメタデータとデータが削除されます。
- 内部テーブルファイルのセキュリティは、HIVEを介してのみ制御されます。セキュリティはHIVE内で、おそらくスキーマレベルで管理する必要があります(組織によって異なります)。
Hiveには内部または外部テーブルがある場合があります。これは、データのロード、制御、および管理の方法に影響する選択です。
次の場合にEXTERNALテーブルを使用します。
次の場合に内部テーブルを使用します。
出典:
これまでの限定的な調査とテスト(Hive 1.1.0 -cdh5.12.0を使用)に基づく動作の(意図された使用法ではなく)唯一の違いは、テーブルが削除されたときのようです
(注:https ://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDLのセクション「管理テーブルと外部テーブル」を参照してください。これらには、完全には理解していなかった他の違いがリストされてい ます)
Hiveは、次の優先順位に基づいて上から下にテーブルを作成する必要がある場所を選択すると思います
「ハイブテーブルの作成」中に「場所」オプションを使用しない場合は、上記の優先規則が使用されます。これは、内部テーブルと外部テーブルの両方に適用されます。つまり、内部テーブルは必ずしもWarehouseディレクトリにある必要はなく、他のどこにでも置くことができます。
注:いくつかのシナリオを見逃したかもしれませんが、私の限られた調査に基づいて、内部テーブルと外部テーブルの両方の動作は、上記の1つの違い(データ削除)を除いて同じであるようです。内部テーブルと外部テーブルの両方で次のシナリオを試しました。
外部テーブルでは、ドロップすると、テーブルのスキーマのみが削除され、テーブルデータは物理的な場所に存在します。したがって、データを削除するには、hadoop fs -rmr tablenameを使用します。管理されたテーブルハイブは、テーブルを完全に制御できます。外部テーブルでは、ユーザーがそれを制御できます。
外部ハイブテーブルには、テーブルをドロップしてもファイルが削除されないという利点があり、serde .... delimitedなどのさまざまな設定で行フォーマットを設定できます。
外部テーブルに最適な次のシナリオを検討してください。
MapReduce(MR)ジョブは、巨大なログファイルをフィルタリングしてサn
ブログファイル(たとえば、各n
サブログファイルに特定のメッセージタイプのログが含まれる)を出力し、出力、つまりサブログファイルはhdfsに保存されます。
これらのログファイルは、さらに分析を実行するためにHiveテーブルに読み込まれます。このシナリオでは、外部テーブルをお勧めします。実際のログファイルは、外部プロセスによって生成および所有されるためです。生成された各ログファイルをそれぞれのHiveテーブルにロードする追加のステップ。
ハイブはメタストアにメタデータのみを格納し、外部テーブルを使用する場合はハイブの外側に元のデータを格納します。場所を指定できます ''これらにより、テーブルをドロップしても元のデータは影響を受けません
HDFSに既にデータがある場合、データを記述するための外部Hiveテーブルを作成できます。外部表のデータは、デフォルトのウェアハウスディレクトリではなくLOCATIONプロパティで指定されるため、これはEXTERNALと呼ばれます。
内部テーブルにデータを保持する場合、Hiveはテーブルとデータのライフサイクルを完全に管理します。つまり、内部テーブルが削除されると、データは削除されます。外部テーブルが削除されると、テーブルのメタデータは削除されますが、データは保持されます。ほとんどの場合、誤ってテーブルと共にデータを削除しないようにするために、外部テーブルが推奨されます。
管理テーブルの場合、Hiveはデータのライフサイクルを制御します。Hiveは、管理テーブルのデータを、デフォルトでhive.metastore.warehouse.dirによって定義されたディレクトリの下のサブディレクトリに格納します。
管理テーブルを削除すると、Hiveはテーブル内のデータを削除しますが、管理テーブルは他のツールとの共有には不便です。たとえば、主にPigによって作成および使用されるデータがあるが、それに対していくつかのクエリを実行したいが、Hiveにデータの所有権を与えたくないとします。
その時点で、そのデータを指す外部テーブルが定義されていますが、その所有権はありません。
Hiveでは、外部テーブルを作成することもできます。これは、ウェアハウスディレクトリの外部の既存の場所にあるデータを参照するようにHiveに指示します。外部テーブルを削除すると、メタデータは削除されますが、データは削除されません。