tands_bの日記

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

【Hive】テーブル仕様

論理構成

 Hiveは「保存されているデータ」と「テーブル中のデータレイアウトを記述するメタデータ」の二つから構成されている。それぞれデータの保存場所が異なる。

データ種別 保存場所
保存データ HDFS
メタデータ RDB

テーブル仕様

管理対象テーブル

 管理対象テーブルとは、Hiveで通常のテーブル作成を行なった場合にできるテーブルのことを指す。LOADしたデータファイルはHiveの保管用ディレクトリに移動し、テーブル削除を行うタイミングで移動したデータファイルも削除される。

外部テーブル

 テーブル作成時にEXTERNALを指定すると外部テーブル作成になる。Hiveの保管用ディレクトリ以外に存在するデータ ファイルをそのまま参照し、テーブル削除時にはRDBからメタデータのみ削除する。

パーティション

 Hiveのテーブルではデータをパーティション群(データを分割したもの)として取り扱うことができる。例えば日付でパーティションを区切っておくと、クエリで日付を条件とした場合に対象パーティションファイルだけをスキャンすればよくなるため効率的になる。

# パーティション付きテーブルの作成
CREATE TABLE t_partition (col1 INT, col2 STRING)
PARTITIONED BY (date STRING, country STRING);

# パーティション化されたテーブルにデータをロード
LOAD DATA LOCAL INPATH 'input/hive/partitions/fileA'
INTO TABLE t_partition
PARTITION (date='2017/09/24', country='JP')

バケット

 指定した列のハッシュ値を元に、テーブルをパケット化(データブロック化)することができる。テーブルをJOINする場合、結合列がバケットされていればテーブル全体をフェッチする必要がないので効率よくJOIN処理が可能になる。なお、全バケットに均一な数のデータが入るわけではない。

# バケット付きテーブルの作成。バケット数も指定する。
CREATE TABLE t_bucket (col1 INT, col2 STRING)
CLUSTERED BY (col1) INTO 3 BUCKETS;

# バケット列をソートしておくとより効率よくmap側で結合できる
CREATE TABLE t_bucket (col1 INT, col2 STRING)
CLUSTERED BY (col1) SORTED BY (col1 ASC) INTO 3 BUCKETS;

# 半分のバケットからデータを取得する例
SELECT * FROM t_bucket
TABLESAMPLE(BUCKET 1 OUT OF 2 ON col1)

【正規表現】基礎

正規表現早見表

文字指定

メタ文字 マッチ対象 検索例 マッチ例
. 任意の1文字 a.c abc, aec
[...] リストの中の任意の1文字 [abc] a, b, c
[^...] リストに含まれていない任意の1文字 [^abc] d, e, f...
^ 行の先頭 ^abc abc...
$ 行の末尾 abc$ ...abc
\< 単語の先頭の位置 \<test test...
\> 単語の末尾の位置 test\> ...test
| 区切っている正規表現のいずれか ^abc|def... abc, def...
(...) |の範囲を限定 ^(abc|def)... abc..., def...

量指定

メタ文字 マッチ対象 検索例 マッチ例
? 直前の文字を任意にする ab?c abc, ac
* 直前の文字が0回以上繰り返されている abc* ab, abc, abcc...
+ 直前の文字が1回以上繰り返されている abc+ abc, abcc...
{...} 直前の文字が指定した回数繰り返されている abc{3} abccc
{min,max} 直前の文字が指定したmin以上、max以下繰り返されている abc{1,10} abc, abcc...

(...)と後方参照

 言語が後方参照をサポートしている場合、括弧でくくった文字列を特殊文字によって参照することができる。

文字列 指定正規表現 マッチ結果 備考
the theft the the the theft -
the theft the the\> - -
the theft (the) \1 the theft (...)が2つ以上存在する場合、2つ目以降を指定する場合は\2, \3...と数が上がっていく。

【Docker】環境構築(Mac)

Dockerインストール

 公式からMac用のCommunity版をダウンロードしてインストールを行う。Dockerインストール完了後、アプリケーションに追加されるDockerを選択してDockerを起動させ、バージョン確認ができればインストール完了。

$ docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:40:09 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:45:38 2017
 OS/Arch:      linux/amd64
 Experimental: true

Docker Toolboxインストール

 Dockerを利用するにあたって便利なツールをインストールするには、Homebrewを使用する。
(注:2017年10月現在、公式HPからダウンロードしたDocker ToolboxはMac OS Sierra でインストールできない)

$ brew update
$ brew cask install docker-toolbox

 インストール完了後、アプリケーション一覧にKitematicなどが追加されている。Docker社から提供されているツールは以下のようなものが存在する。

ツール名 概要
Swarm クラスタマネージャ
Kitematic コンテナを扱うGUI
Machine Dockerホストをプロビジョニングするためのコマンドラインユーティリティ

【Docker】基礎

Dockerとは

 Dockerとは、非常に軽量なアプリケーション実行環境で、1台のマシン上で複数のアプリケーション実行環境を用意することができるようになる。VMwareなどの仮想化ソフトウェアのように独立した実行環境を構築するのではなく、Linuxのコンテナ機能を用いて他のプロセスとは隔離することで実行環境を用意するため、オーバヘッドが少なくなるなどメリットを享受できる。

[参考URL]
超入門Docker:第1回

Dockerアーキテクチャ

ホストマシン上の構成

f:id:tands_b:20171008190028p:plain
 Dockerのホストマシン上での構成は上図のようになっており、、ホストのカーネルは実行されるコンテナと共有され、ライブラリはアプリケーション間で共有される。コンテナ内で動作しているプロセスはホスト上で直接動作しているプロセスと同等なため、コンテナエンジンからの起動・停止にオーバヘッドが無い。

コンポーネントの構成

 Dockerはクライアント・サーバ型のアーキテクチャになっている。DockerクライアントがDockerデーモンと通信し、Dockerデーモンから各層に振り分けている。以下のコンポーネントから構成される。

コンポーネント 概要
クライアント ユーザからの命令を元にDockerデーモンと通信を行う。
デーモン ホストマシン上で動作し、Dockerクラインアントからの要求を元にコンテナ/イメージ/レジストリに処理を要求する。
イメージ test
コンテナ Dockerにおける実行コンポーネント。Dockerイメージから構成され、実行/開始/停止/移動/削除できる。
レジストリ Dockerイメージを保管するもの。イメージのアップロードやダウンロードが可能。

[参考URL]
アーキテクチャの理解 (公式)

VMとの比較

コンテナを使用するメリット

 VMと比較した場合のコンテナのメリットは大きく3つある。

  • ホストOSとリソースを共有するため効率的。
  • 開発者マシンへの依存や環境構築コストを排除できる。
  • 軽量なため数十のコンテナを同時実行することが可能で、分散システムをエミュレーションできる。

支援技術

 Dockerに含まれている支援技術は以下の通り。(2017年10月時点)

技術 概要
Swarm クラスタリングソリューション。複数のDockerホストをまとめ、それらを統合されたリソースとして使用できる。
Compose 複数のDockerコンテナから合成されるアプリケーションの構築と実行のためのツール。主に試験や開発で使用される。
Kitematic Dockerコンテナの実行管理のためのGUI
Docker Trusted Registry オンプレミスでDockerイメージを保存管理するソリューション。ローカル版のDocker Hub。

【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インデックス
  特定の値が出現する行を圧縮されたビット集合を使って保存するもの。
  カーディナリティが低い列に対して使用するのが効果的。

【Markdown】テスト

*1

見出し1

見出し2

見出し3

見出し4

見出し5
見出し6
  • A
    • B
    • C
      • D
  • E

  • A 2.B 3.C

    1. D
  • E

引用文

引用文



code test code test

イタリック 強調 強調イタリック


google

https://www.google.co.jp/

my @name1 = ("tands", "b");
my $ref_name1 = \@name1;
my @name2 = ("tands", "b");
my $ref_name2 = \@name2;
my @name_array = ($ref_name1, $ref_name2);
print $name_array[0][0];
left centetr right
test1 test2 test3

return to menu

header1

header2

*1:ここに脚注を書きます