Apache Hive シリーズの記事
1. apache-hive-3.1.2 の導入と展開 (組み込みモード、ローカル モード、リモート モードの 3 つの展開方法) と詳細な検証 2. Hive 関連の概念の詳細な説明 - アーキテクチャ、ファイルの読み書きメカニズム、
データ ストレージ
3 . hive 使用例の詳細説明 - テーブル作成、データ型の詳細説明、内部テーブルと外部テーブル、パーティションテーブル、バケットテーブル 4. hive
使用例の詳細説明 - トランザクションテーブル、ビュー、マテリアライズドビュー、DDL(データベース)の詳細操作、テーブルとパーティション)の管理
5、ハイブのロード、挿入、トランザクション テーブルの使用法の詳細と例
6. ハイブの選択(GROUP BY、ORDER BY、CLUSTER BY、SORT BY、LIMIT、ユニオン、CTE)、結合の使用法の詳細と例 7
、 hive シェル クライアントと属性の設定、組み込み演算子、関数 (組み込み演算子とカスタム UDF 演算子)
8. hive のリレーショナル演算、論理バジェット、数学演算、数値演算、日付関数、条件関数と文字列関数
9. Hive の展開、横方向ビュー、集計関数、ウィンドウ関数、およびサンプリング関数の使用方法の詳細な説明 10.
Hive の包括的な例: データのマルチセパレータ (通常の RegexSerDe)、URL 解析、および共通関数列と列の変換 (case when、union、concat、explode) 詳細な使用例
11. Hive の包括的なアプリケーション例: json 解析、ウィンドウ関数アプリケーション (連続ログイン、カスケード蓄積、topN)、ジッパー テーブル アプリケーション
12. Hive の最適化 - ファイル ストレージ形式と圧縮形式の最適化とジョブ実行の最適化 (実行計画、MR 属性、結合、オプティマイザー、述語プッシュダウン、データ スキュー最適化) の詳細な紹介と例 13.
Java API アクセス ハイブの操作例
この記事では主に、Hiveのアーキテクチャ、コンポーネント、データモデル、読み書きの仕組みなどを紹介します。
この記事は、アーキテクチャとコンポーネントの紹介と、ファイルの読み取りと書き込みのメカニズムの 2 つの部分に分かれています。
この記事の一部の写真はインターネットから入手したものです。
1. アーキテクチャとコンポーネントの概要
1. Hive全体のアーキテクチャ図
2. ハイブコンポーネント
- ユーザー インターフェイスに
は、CLI、JDBC/ODBC、WebGUI が含まれます。
CLI (コマンド ライン インターフェイス) はシェル コマンド ラインです。Hive
の Thrift サーバーを使用すると、外部クライアントがネットワークを通じて Hive と対話できるようになります。JDBC または ODBC プロトコルと同様に、WebGUI はブラウザーを通じて
Hive にアクセスします。 - メタデータ ストレージは
通常、mysql/derby などのリレーショナル データベースに保存されます。Hive のメタデータには、テーブルの名前、テーブルの列とパーティションとその属性、テーブルの属性 (外部テーブルかどうかなど)、テーブルのデータが配置されているディレクトリなどが含まれます。 - ドライバーには、HQL クエリ ステートメントを完了するための
構文パーサー、プラン コンパイラー、オプティマイザー、エグゼキューターが含まれています。字句解析、構文分析、コンパイル、最適化、クエリ プラン生成から生成されたクエリ プランは、HDFS に保存され、その後実行されます。エンジン呼び出しの実行 - 実行エンジン
Hive 自体はデータ ファイルを直接処理するのではなく、実行エンジンを通じて処理します。
現在、Hive は MapReduce、Tez、Spark の 3 つの実行エンジンをサポートしています。
3. Hiveデータモデル(データモデル)
Hive のデータ モデルは、データの記述、編成、および操作に使用されます
。これは、RDBMS データベースのテーブル構造に似ています。さらに、独自の固有のモデルがあります。Hive
のデータは、粒度レベルで 3 つのカテゴリに分類できます: テーブル、パーティション、およびバケット。
1)、データベース
データ ウェアハウスとしての Hive にはデータベース (スキーマ) が含まれており、各データベースには独自のテーブルがあります。デフォルトのデータベースはデフォルトです。
Hive データは HDFS に保存され、デフォルトでルート ディレクトリがあり、これは hive-site.xml のパラメータ hive.metastore.warehouse.dir で指定されます。デフォルト値は /user/hive/warehouse です。
したがって、HDFS 上の Hive のデータベースのストレージ パスは ${hive.metastore.warehouse.dir}/databasename.db になります。
たとえば、test という名前のデータベースのストレージ パスは /user/hive/warehouse/test になります。 .db
2)、テーブル
Hive テーブルはリレーショナル データベースのテーブルと同じです。Hive のテーブルに対応するデータは Hadoop ファイル システムに保存され、テーブルに関連するメタデータは RDBMS に保存されます。
Hadoop では、データは通常 HDFS に保存されますが、ローカル ファイル システムや S3 などの任意の Hadoop ファイル システムに保存することもできます。
Hive には 2 種類のテーブルがあります。
- 管理テーブル内部テーブル、管理テーブル
- 外部テーブル テーブル
を作成する場合、デフォルトは内部テーブルです。HDFS 上の Hive のテーブル データのストレージ パスは、${hive.metastore.warehouse.dir}/databasename.db/tablename です。
たとえば、テスト データベースの t_user テーブルのストレージ パスは、/user/hive です。 /warehouse/test .db/t_user
3)、パーティション
パーティションパーティションは、ハイブテーブルの最適化方法です。
パーティショニングとは、パーティション列の値 (「日付、日」など) に基づいてテーブルを異なるパーティションに分割することを指します。これにより、指定されたパーティション データのクエリを高速化できます。
ストレージ レベルでのパーティションのパフォーマンスは、パーティションがテーブル ディレクトリ内のサブフォルダーの形式で存在することです。
フォルダーはパーティションを表します。サブファイルの命名標準: パーティション列 = パーティション値
Hive は、パーティションの下にパーティションを継続的に作成すること、いわゆるマルチ パーティションもサポートしています。
4)、バケツ
バケットテーブルはHiveの最適化テーブルです。
バケット化とは、テーブル内のフィールドの値 (「数値 ID」など) に基づくハッシュ計算ルールに従って、データ ファイルを複数の指定された小さなファイルに分割することを指します。
バケット化ルール: hashfunc(ID) % バケット番号、余りが同じものは同じファイルに分割されます。
バケット化の利点は、結合クエリを最適化し、サンプリング クエリを容易にできることです。HDFS のバケット テーブルは、複数のファイルにハッシュ化された同じテーブル ディレクトリ内のデータとして表示されます。
2. Hive のファイル読み取りおよび書き込みメカニズム
1、SerDe操作
SerDe は Serializer と Deserializer の略称で、シリアル化と逆シリアル化に使用されます。シリアル化はオブジェクトをバイトコードに変換するプロセスであり、逆シリアル化はバイトコードをオブジェクトに変換するプロセスです。
Hive は SerDe (および FileFormat) を使用して行オブジェクトの読み取りと書き込みを行います。
# 读过程
HDFS files --> InputFileFormat --> <key,value> --> Deserializer(反序列化) --> Row Object
# 写过程
Row Object --> serializer(反序列化) --> <key,value> --> OutputFileFormat --> HDFS files
# 需要注意的是,“key”部分在读取时会被忽略,而在写入时key始终是常数。基本上行对象存储在“value”中。
# 通过desc formatted tablename查看表的相关SerDe信息,SerDe默认(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe)如下:
0: jdbc:hive2://server4:10000> desc formatted t_user;
INFO : Compiling command(queryId=alanchan_20221017153821_c8ac2142-aacf-479c-a8f2-e040f2f791cb): desc formatted t_user
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:col_name, type:string, comment:from deserializer), FieldSchema(name:data_type, type:string, comment:from deserializer), FieldSchema(name:comment, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=alanchan_20221017153821_c8ac2142-aacf-479c-a8f2-e040f2f791cb); Time taken: 0.024 seconds
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Executing command(queryId=alanchan_20221017153821_c8ac2142-aacf-479c-a8f2-e040f2f791cb): desc formatted t_user
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=alanchan_20221017153821_c8ac2142-aacf-479c-a8f2-e040f2f791cb); Time taken: 0.037 seconds
INFO : OK
INFO : Concurrency mode is disabled, not creating a lock manager
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
| col_name | data_type | comment |
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
| # col_name | data_type | comment |
| id | int | |
| name | varchar(255) | |
| age | int | |
| city | varchar(255) | |
| | NULL | NULL |
| # Detailed Table Information | NULL | NULL |
| Database: | test | NULL |
| OwnerType: | USER | NULL |
| Owner: | alanchan | NULL |
| CreateTime: | Mon Oct 17 14:47:08 CST 2022 | NULL |
| LastAccessTime: | UNKNOWN | NULL |
| Retention: | 0 | NULL |
| Location: | hdfs://HadoopHAcluster/user/hive/warehouse/test.db/t_user | NULL |
| Table Type: | MANAGED_TABLE | NULL |
| Table Parameters: | NULL | NULL |
| | COLUMN_STATS_ACCURATE | {
\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{
\"age\":\"true\",\"city\":\"true\",\"id\":\"true\",\"name\":\"true\"}} |
| | bucketing_version | 2 |
| | numFiles | 0 |
| | numRows | 0 |
| | rawDataSize | 0 |
| | totalSize | 0 |
| | transient_lastDdlTime | 1665989228 |
| | NULL | NULL |
| # Storage Information | NULL | NULL |
| SerDe Library: | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | NULL |
| InputFormat: | org.apache.hadoop.mapred.TextInputFormat | NULL |
| OutputFormat: | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | NULL |
| Compressed: | No | NULL |
| Num Buckets: | -1 | NULL |
| Bucket Columns: | [] | NULL |
| Sort Columns: | [] | NULL |
| Storage Desc Params: | NULL | NULL |
| | field.delim | , |
| | serialization.format | , |
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
35 rows selected (0.081 seconds)
2. Hive ファイルの読み取りおよび書き込みプロセス
-
HDFS ファイルの読み取りプロセス
--> InputFileFormat --> <key, value> --> Deserializer (逆シリアル化) --> Row Object
Hive のファイル読み取りメカニズムは、
最初に InputFormat (デフォルトの TextInputFormat) を呼び出し、1 つの kv キーと値のペア Record (デフォルト) を返します。 1行が1レコードに対応します)。
次に、SerDe の Deserializer (デフォルトは LazySimpleSerDe) を呼び出し、区切り文字に従ってレコード内の値をさまざまなフィールドに分割します。 -
書き込み処理
Row Object --> シリアライザ(デシリアライズ) --> <key, value> --> OutputFileFormat --> HDFS ファイル Hive ファイルの
書き込み機構
Row をファイルに書き込む場合、最初に SerDe の Serializer (デフォルトは LazySimpleSerDe) が呼び出されます。オブジェクトをバイト シーケンスに変換し
、OutputFormat を呼び出してデータを HDFS ファイルに書き込みます。
3. SerDe 関連の構文
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-RowFormats&SerDe
Hive のテーブル作成ステートメントの SerDe に関連する構文は次のとおりです。
このうち、ROW FORMAT は構文キーワードであり、DELIMITED または SERDE のいずれかを選択します。
区切り記号付きを使用する場合は、デフォルトの LazySimpleSerDe クラスを使用してデータを処理することを意味します。データ ファイル形式が特殊な場合は、ROW FORMAT SERDE serde_name を使用して、データを処理する他の Serde クラスを指定したり、ユーザー定義の SerDe クラスをサポートしたりすることができます。
1)、LazySimpleSerDe セパレータ仕様
LazySimpleSerDe は Hive のデフォルトのシリアル化クラスであり、フィールド間、コレクション要素間、マップ マッピング kv 間の区切り記号、および改行を指定するために使用される 4 つのサブ構文が含まれています。テーブルを構築する際には、データの特性に合わせて柔軟に利用することができます。
2)、デフォルトの区切り文字
ハイブがテーブルを作成するときに行フォーマット構文がない場合。現時点では、フィールド間のデフォルトの区切り文字は「\001」です。これは特殊文字であり、ASCII エンコード値を使用します。
vim エディターで Ctrl+v/Ctrl+a を押し続けて「\001」を入力すると、表示された ^A が
一部のテキスト エディターで SOH の形式で表示されます。
4. Hive データストレージパス
1)、デフォルトのストレージパス
Hive テーブルのデフォルトのストレージ パスは、${HIVE_HOME}/conf/hive-site.xml 構成ファイルの hive.metastore.warehouse.dir 属性によって指定されます。デフォルト値は /user/hive/warehouse です。
このパスの下では、ファイルは、ファイルが属するライブラリとテーブルに従って、対応するフォルダーに定期的に保存されます。
2) 保存先パスを指定する
Hive でテーブルを構築する場合、ロケーション構文を使用して HDFS 上のデータのストレージ パスを変更できるため、テーブルの構築とデータの読み込みがより柔軟で便利になります。
構文: LOCATION '<hdfs_location>'。
すでに生成されているデータ ファイルの場合は、location を使用してパスを指定すると便利です。
上記では、hive の全体的なアーキテクチャ、関連コンポーネント、データ モデルなどを紹介し、また、hive のファイルの読み取りと書き込みのプロセス、メカニズム、その他の関連内容も紹介します。