Hiveの外部テーブルと内部テーブルの違いを教えてください。テーブルをドロップするときに違いが生じることは知っています。データとメタデータが内部で削除され、メタデータのみが外部テーブルで削除されるという意味がわかりません。誰でもノードの面で私を説明できますか?.
Hiveは、状態を追跡するために使用するマスターノードにリレーショナルデータベースを持っています。たとえば、CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';
を実行すると、このテーブルスキーマはデータベースに保存されます。
パーティションテーブルがある場合、パーティションはデータベースに保存されます(これにより、Hiveはファイルシステムにアクセスしてパーティションを見つけることなく、パーティションのリストを使用できます)。これらの種類のものは「メタデータ」です。
内部テーブルを削除すると、データが削除され、メタデータも削除されます。
外部表を削除すると、メタデータのみが削除されます。これは、Hiveが現在そのデータを知らないことを意味します。データ自体には影響しません。
Hiveテーブルは、EXTERNALまたはINTERNALとして作成できます。これは、データのロード、制御、および管理方法に影響する選択です。
EXTERNALテーブルは次の場合に使用します。
次の場合に内部テーブルを使用します。
データは一時的なものです。
Hiveでテーブルとデータのライフサイクルを完全に管理する必要があります。
外部テーブルの場合、Hiveはデータをウェアハウスディレクトリに移動しません。外部テーブルが削除されると、テーブルメタデータは削除されますが、データは削除されません。
内部テーブルの場合、Hiveはデータをウェアハウスディレクトリに移動します。テーブルが削除されると、テーブルのメタデータとデータが削除されます。
内部テーブルと外部テーブルの違い:
外部テーブルの場合-
外部テーブルはファイルをHDFSサーバーに保存しますが、テーブルはソースファイルに完全にはリンクされていません。
外部テーブルを削除しても、ファイルはHDFSサーバーに残ります。
例として、Hive-QLを使用してHiveで“ table_test”と呼ばれるexternal tableを作成し、テーブルをファイルにリンクする場合 「file」、その後、「table_test」をHiveから削除しても、「file」はHDFS から削除されません。
外部テーブルファイルは、HDFSファイル構造にアクセスできるすべてのユーザーがアクセスできるため、セキュリティはHDFSファイル/フォルダーレベルで管理する必要があります。
メタデータはマスターノードで維持され、Hiveから外部テーブルを削除すると、データ/ファイルではなくメタデータのみが削除されます。
内部テーブルの場合-
Hive.metastore.warehouse.dir
の設定に基づいてディレクトリに格納され、デフォルトで内部テーブルは次のディレクトリに格納されます“/user/Hive/warehouse” configファイルの場所を更新することで変更できます。- テーブルを削除すると、マスターノードとHDFSからそれぞれメタデータとデータが削除されます。
- 内部テーブルファイルのセキュリティは、Hiveを介してのみ制御されます。セキュリティは、Hive内で、おそらくスキーマレベルで管理する必要があります(組織によって異なります)。
Hiveには内部テーブルまたは外部テーブルがあります。これは、データのロード、制御、および管理方法に影響する選択です。
次の場合に外部テーブルを使用:
次の場合に内部テーブルを使用:
ソース:
内部テーブルデータはWarehouseフォルダーに格納され、外部テーブルデータはテーブル作成で指定した場所を指します。したがって、内部テーブルを削除すると、スキーマとウェアハウスフォルダの下のデータが削除されますが、外部テーブルではスキーマのみが失われます。したがって、テーブルを元に戻したい場合は、スキーマを使用してテーブルを再度作成し、場所を指定できます。それが今明確であることを願っています。
外部テーブルでは、ドロップすると、テーブルのスキーマのみが削除され、テーブルデータは物理的な場所に存在します。そのため、データを削除するにはhadoop fs-rmr tablenameを使用します。管理テーブルHiveはテーブルを完全に制御します。外部表では、ユーザーが制御できます。
これまでの限られた研究とテスト(Hive 1.1.0 -cdh5.12.0を使用)に基づく動作の唯一の違い(意図した使用法ではありません)は、テーブルがドロップされたときのようです
(注: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DDL の「Managed and External Tables」セクションを参照してください。他の違いは完全には理解できませんでした)
Hiveは、次の優先順位に基づいてテーブルを作成する必要がある場所を上から下に選択すると信じています
「Hiveテーブルの作成」中に「ロケーション」オプションが使用されない場合、上記の優先順位ルールが使用されます。これは、内部テーブルと外部テーブルの両方に適用されます。つまり、内部テーブルは必ずしもウェアハウスディレクトリに存在する必要はなく、他の場所に存在できます。
注:いくつかのシナリオを見逃している可能性がありますが、限定的な調査に基づいて、内部テーブルと外部テーブルの両方の動作は、上記の1つの違い(データ削除)を除いて同じようです。内部テーブルと外部テーブルの両方で次のシナリオを試しました。
Hiveの外部テーブルの最適な使用例は、CSVまたはテキストのいずれかのファイルからテーブルを作成する場合です。
外部表に最適なこのシナリオを検討してください。
MapReduce(MR)ジョブは巨大なログファイルをフィルター処理し、n
サブログファイルを吐き出します(たとえば、各サブログファイルには特定のメッセージタイプのログが含まれます)。出力、つまりn
サブログファイルはhdfsに保存されます。
これらのログファイルは、さらに分析を実行するためにHiveテーブルに読み込まれます。このシナリオでは、実際のログファイルは外部プロセス(MRジョブなど)によって生成および所有されるため、外部テーブルをお勧めします。生成された各ログファイルをそれぞれのHiveテーブルにもロードする追加のステップ。
また、Hiveはビッグデータウェアハウスであることに注意してください。テーブルを削除する場合、ギガバイトまたはテラバイトのデータを失いたくありません。その規模でのデータの生成、移動、コピーには時間がかかる場合があります。 「管理」テーブルをドロップすると、Hiveはそのデータを破棄します。 「外部」テーブルを削除すると、Hiveメタストアのスキーマ定義のみが削除されます。 hdfsのデータはまだ残っています。
外部Hiveテーブルには、テーブルをドロップしてもファイルが削除されないという利点があります。serde.... delimitedなどの異なる設定で行形式を設定できます。
内部テーブルは、削除を含むデータの完全なライフサイクルをHiveで管理する場合に役立ちますが、外部テーブルは、ファイルがHiveの外部で使用されている場合に役立ちます。
Hiveはメタデータのみをメタストアに保存し、外部テーブルを使用する場合は元のデータをHiveの外側に保存します
管理テーブルの場合、Hiveはデータのライフサイクルを制御します。 Hiveは、デフォルトでHive.metastore.warehouse.dirで定義されたディレクトリの下のサブディレクトリに管理テーブルのデータを保存します。
管理対象テーブルを削除すると、Hiveはテーブル内のデータを削除しますが、管理対象テーブルは他のツールと共有するには不便です。たとえば、主にPigによって作成および使用されるデータがあるが、それに対していくつかのクエリを実行したいが、データのHive所有権を与えたくないとしましょう。
その時点で、そのデータを指すが所有権を持たない外部テーブルが定義されます。
Hiveでは、外部テーブルを作成することもできます。ウェアハウスディレクトリ外の既存の場所にあるデータを参照するようにHiveに指示します。外部テーブルを削除すると、メタデータは削除されますが、データは削除されません。
HDFSにすでにデータがある場合、外部Hiveテーブルを作成してデータを記述することができます。外部テーブルのデータは、デフォルトのウェアハウスディレクトリではなく、LOCATIONプロパティで指定されるため、EXTERNALと呼ばれます。
内部テーブルにデータを保持する場合、Hiveはテーブルとデータのライフサイクルを完全に管理します。これは、内部テーブルが削除されるとデータが削除されることを意味します。外部テーブルが削除されると、テーブルメタデータは削除されますが、データは保持されます。ほとんどの場合、外部テーブルは、誤ってテーブルと一緒にデータを削除することを避けるために推奨されます。