2014年版 Hadoopを10分で試す(4) まずはHiveから(中編)

Hadoop関連(全部俺) Advent Calendar 2014:12日目の記事です
昨日はHueからHiveを使ってクエリを行いました。Hiveでのクエリの実行時には間接的にMapReduceのジョブが実行されています。CDH5ならMapReduce v2/YARN、もしくはMapReduce v1のいずれかです。
HueがあればHadoopをほとんど意識せずにHiveのクエリを実行できますが、今日はHiveについてもう少し詳しく見てみましょう。

Hiveに関係する用語

まずはHiveに関する用語から。

用語説明
クライアントHiveクエリを実行する人、またはコマンドを実行するPC
HiveQLHiveクエリ言語。SQLに似ているがSQL92などに完全準拠ではない
HadoopクラスタHadoop(HDFS, YARN/MapReduce)が実行されている環境
メタストアHiveで使用するテーブルの情報(処理するデータの置き場所、テーブルの列の情報、その他のメタデータ)を格納するデータベース。デフォルトはApache Derby。しかし、複数のユーザがHiveを利用する場合など、一般的にはMySQLなどのRDBMSを使用した共有メタストアを準備する

 

メタストアの役割

まず、Hadoopはデータベースではありません。HiveはHadoop(Hadoop分散ファイルシステム)にあるデータを処理するために、HiveQLにより開始されるMapReduceジョブをHadoopクラスタに投入(サブミット)するだけです。Hadoopクラスタからみれば、ワードカウントや円周率を計算するようなMapReduceジョブを実行することと、何の違いもありません。
このとき、MapReduceとして処理するために用いられるのがメタストアです。
昨日実行したクエリを例にしてみましょう。

SELECT * FROM sample_07 ORDER BY salary DESC;

テーブルの名前は sample_07。ORDER BY salary としているので、少なくとも salary という列がありそうだことがわかります。
先ほど書いたように、Hiveで処理するテーブルのデータは(一般的に)HDFSに置かれています。Hiveのデフォルトでは、HDFSの /user/hive/warehouse/ ディレクトリ以下にテーブル名のディレクトリ(今回の場合はsample_07)があり、その下のディレクトリにデータが置かれています。Hueを使ってみてみましょう。

sample_07テーブルの内容を直接みてみる

HueのFile Browserから/user/hive/warehouse/sample_07ディレクトリを見ると、sample_07というファイルがありました。
sample07dir
これがクエリの対象となっているデータです。クリックしてファイルの内容をみてみると、テキスト形式のデータでした。
sample07dataこのように、今回のクエリで扱うテーブルは /user/hive/warehouse/sample_07ディレクトリ、データはsample_07というファイルで、ファイルフォーマットはテキスト形式です。

列の情報を探す

続いて salary 列を探すために、Hueのトップメニューの[Data Browser]から、[Metastore テーブル]を選択します。defaultというデータベース(これもディレクトリ名にマッチするのですが、今回は割愛)にsample_07とsample_08という2つのテーブルがあります。
metastore_default
sample_07テーブルをクリックすると、テーブルの列情報が確認できます。
metastore_sample_07_column
このテーブルは4列あり、順番に code STRING, description STRING, total_emp INT, salary INT となっています。従って、salary列は4列目、int型であることがわかりました。続いて[プロパティ]タブをクリックします。
metastore_sample07_property一部を抜粋してみると、テーブルに関する情報があることがわかります。

  • テーブル名:sample_07
  • データベース名:default
  • location(場所): hdfs://quickstart.cloudera 8020/user/hive/warehouse/sample_07(一言で言えば、(あるサーバが管理している)HDFSの/user/hive/warehouse/sample_07ディレクトリということ。ちょっと表示が崩れてる?)
  • 入力フォーマット:     org.apache.hadoop.mapred.TextInputFormat

シェルから確認する

同じ情報は、hiveのコマンドラインシェルであるbeelineでも取得することができます。
注)今回はHiveServer2というHive用のサービスを経由してクエリを実行しています。このサービスを使用しない場合、hiveシェルを使用します。
[shell]
[cloudera@quickstart ~]$ beeline -u jdbc:hive2://quickstart.cloudera:10000/default -u cloudera –HiveServer2に接続
scan complete in 3ms
Connecting to jdbc:hive2://quickstart.cloudera:10000/default
Connected to: Apache Hive (version 0.13.1-cdh5.2.0)
Driver: Hive JDBC (version 0.13.1-cdh5.2.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 0.13.1-cdh5.2.0 by Apache Hive
0: jdbc:hive2://quickstart.cloudera:10000/def> DESCRIBE EXTENDED sample_07; –テーブルを表示
(略)
| NULL |
| Detailed Table Information | Table(tableName:sample_07,
dbName:default, owner:cloudera, createTime:1417945402, lastAccessTime:0,
retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:code, type:string,
comment:null), FieldSchema(name:description, type:string, comment:null),
FieldSchema(name:total_emp, type:int, comment:null), FieldSchema(name:salary,
type:int, comment:null)],
location:hdfs://quickstart.cloudera:8020/user/hive/warehouse/sample_07,
inputFormat:org.apache.hadoop.mapred.TextInputFormat,
outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat,
compressed:false, numBuckets:0,
serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,
parameters:{serialization.format= | , field.delim= |
6 rows selected (1.476 seconds)
[/shell]
 
Hueでは表示されませんでしたが、一番最後に field.delim= と出力されていますね。目で見るのは難しいですが、これはデータの区切り文字がタブであることを意味しています。入力フォーマットが TextInputFormat というのは、1レコードが改行区切りのテキストであるということを示しています。

メタ情報に登録されている情報のまとめ

ここまでの話をまとめると、

SELECT * FROM sample_07 ORDER BY salary DESC;

は、

MapReduceにより、/user/hive/warehouse/sample_07/以下にあるタブ区切りのテキストデータ(レコードは改行区切り)を1行ずつ処理して、降順にソートする

ということになります。
従って、HiveQLからMapReduceジョブとして実行するために、メタストアが必須なのです。

Hueからテーブルを作成する

ここでテーブルを作成して、メタストアに登録される情報を確認しましょう。 Hue から作成するにはMetastore Managerの左側の[手動で新しいテーブルを作成]をクリックし、ウィザード形式で作成します。

1. テーブルを作成

sample_by_hueという名前にしてみます
create1

2. レコードのフォーマット

区切り文字です。今回は区切り文字付きにしてみました。Hiveでは、区切り文字のないデータ(例えば固定長データのように、先頭から10文字が1列目、次の3文字が2列目など)も扱うことができます。
create2

3. シリアル化

Hiveでは、いわゆるテーブルのセルに複数の情報を埋め込むネスト型をサポートしています。今回は使用しないのでデフォルトのままにします。
create3

4. ファイルフォーマットの選択

(HDFSに)保存されているデータの形式です。今回はCSV形式のデータを想定しているので、TextFileのままにします。
create4

5.データの保存場所

デフォルトのままにします。つまり、/user/hive/warehouse/<テーブル名>です。
create5

6. テーブルの列の設定

ここで列を追加していきます。
create6

7. 完了

sample_by_hueテーブルが作成されました。Metastore Managerでも表示されています。
created1

8. テーブルのディレクトリを表示

テーブルの作成が完了したので、/user/hive/warehouse ディレクトリをみてみましょう。sample_by_hue ディレクトリが作成されています。
created_hdfs

シェルからテーブルを作成する

ついでにbeelineシェルからもテーブルを作成してみましょう。(プロンプトは省略しています)
[shell]
> CREATE TABLE sample2 (a INT, b STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
No rows affected (0.972 seconds)
> DESCRIBE sample2;
+———–+————+———-+–+
| col_name  | data_type  | comment  |
+———–+————+———-+–+
| a         | int        |          |
| b         | string     |          |
+———–+————+———-+–+
2 rows selected (0.825 seconds)
>
[/shell]
Hueから確認することもできますが、スクリーンショットが多すぎるので省略します。
テーブルを作成しただけではデータがありません。長くなったので、明日のブログでデータをロードしてみましょう。

コメント