tands_bの日記

技術メモ。大したことは書きません

【Hive】概要

Hiveとは

 HiveはHadoop(分散処理フレームワーク)の上で動作するソフトウェア。MapReduce処理をSQLのように操作することができ、このSQL互換言語はHiveQLと呼ばれている。
 一般的なRDB同様にSELECT文やINSERT文を実行することができるが、Hiveの作成背景上の理由でデータ更新・削除はサポートされていない。 また、実データファイルの管理方法などがRDBと異なっているため注意(後日別記事にて)。

Hiveシェル

 Hive操作を行うために使用するシェルで、HiveQLでのコマンド発行が主な利用方法になる。HiveQLはMySQLの影響を大きく受けているため、「Show Tables;」などほぼ同等のコマンドで操作することができる。

Hiveアーキテクチャ

 Hiveは大きく「Hiveクライアント」と「Hiveサービス」に別れている。
「Hiveクライアント」はHiveサーバに要求を投げるアプリケーション・ミドルウェアで、様々なものが存在する。
以下URLのスライド内の図が参考になる。
Apache Hive紹介 - Slidshare

Hiveクライアント

クライアントは以下が該当する。

  • Hive JDBCドライバ
  • Hive ODBC ドライバ
  • Hive Thrift クライアント:Hive用のThriftクライアント。

※Thriftとは
言語間をシームレスに開発するためのソフトウェアのことで、コードジェネレータで生成されたコードを使用することでサーバとクライアント間で異なる言語でも通信できるようなる。

Hiveサービス

■ 第1層 (クライアントからの受け口)
 ・Hiveサーバ

■ 第2層 (第3層への中継層)
 ・ドライバ

■ 第3層 (Hadoopクラスタ、メタストアデータベースへの連絡口)
 ・メタストア
 ・ファイルシステム
 ・JobClient

メタストア

 メタストアとは、Hiveのメタデータの中央リポジトリのことである。メタストアは「サービス」「バックエンドのデータベース」の2つに分割されている。
 サービスではデフォルトではローカルディスクをバックエンドとして使用するDerbyデータベースが含まれている。デフォルトで使用する場合、ディスク上のデータベースファイルにアクセスできるのは1つのDerbyデータベースだけなので、同じメタストアを共有するHiveのセッションは複数起動できないことに注意。

複数Hiveセッションのサポート方法

ローカルメタストアの使用

 デフォルトのDerbyデータベースを使用せず、スタンドアロンのデータベースを使用する。この設定は「ローカルメタストア」と呼ばれている。メタストア設定プロパティの「javax.jdo.option.*」を設定すればJDBCに準拠しているDBを使用することができる。

リモートメタストアの使用

 Hiveサービスとは独立したプロセスで1つ以上のメタストアサーバを動作させるもの。これによりデータベース層から切り離されることでクライアントはDBの資格情報が不要になり管理生徒セキュリティが向上する。
 メタ設定プロパティで以下の通り設定を行う。

hive.metastore.local = false
hive.metastore.uris = <メタストアサーバのURI>

一般的なRDBとの比較

スキーマ適用のタイミング比較

DB種別 差異詳細 メリット 備考
RDB データがDBに書き込まれる時にチェックを行う。 クエリの実行パフォーマンスが高速。 書き込み時のスキーマ適用
Hive データお読み込み時点ではスキーマ確認せず、クエリ発行時にチェックを行う。 初期のデータ読み込みが極めて高速。Indexがつけられない場合に有用。 読み込み時のスキーマ適用

更新比較

 Hiveはテーブルデータの更新はサポートしていない。背景として、Hiveは元からHDFS上のデータに対してMapReduceを使用して処理する設計であったため、データの更新・削除は用意されていない。但し、挿入(INSERT)はサポートされているため、既存テーブルに新規行を追加することは可能。

トランザクション

 Hiveにはテーブル及びパーティションレベルの制御が存在する。(デフォルトではOFF)
 例えば、あるプロセスがデータをSELECTしている際に別プロセスによるDROPをロックする。ロックはZooKeeperによって管理されるため、ユーザはロックについて操作する必要はない。

インデックス

Hiveにはインデックスが2種類存在する。
(1) compactインデックス
  各値に対してHDFSのブロック番号を保存するもの。 (各ファイルのオフセットではない。)
  値が近傍の行にまとまっている場合に効果的。

(2) bitmapインデックス
  特定の値が出現する行を圧縮されたビット集合を使って保存するもの。
  カーディナリティが低い列に対して使用するのが効果的。