Hadoop関連(全部俺) Advent Calendar 2014:12日目の記事です
昨日はHueからHiveを使ってクエリを行いました。Hiveでのクエリの実行時には間接的にMapReduceのジョブが実行されています。CDH5ならMapReduce v2/YARN、もしくはMapReduce v1のいずれかです。
HueがあればHadoopをほとんど意識せずにHiveのクエリを実行できますが、今日はHiveについてもう少し詳しく見てみましょう。
Hiveに関係する用語
まずはHiveに関する用語から。
用語 | 説明 |
---|---|
クライアント | Hiveクエリを実行する人、またはコマンドを実行するPC |
HiveQL | Hiveクエリ言語。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というファイルがありました。
これがクエリの対象となっているデータです。クリックしてファイルの内容をみてみると、テキスト形式のデータでした。
このように、今回のクエリで扱うテーブルは /user/hive/warehouse/sample_07ディレクトリ、データはsample_07というファイルで、ファイルフォーマットはテキスト形式です。
列の情報を探す
続いて salary 列を探すために、Hueのトップメニューの[Data Browser]から、[Metastore テーブル]を選択します。defaultというデータベース(これもディレクトリ名にマッチするのですが、今回は割愛)にsample_07とsample_08という2つのテーブルがあります。
sample_07テーブルをクリックすると、テーブルの列情報が確認できます。
このテーブルは4列あり、順番に code STRING, description STRING, total_emp INT, salary INT となっています。従って、salary列は4列目、int型であることがわかりました。続いて[プロパティ]タブをクリックします。
一部を抜粋してみると、テーブルに関する情報があることがわかります。
- テーブル名: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. テーブルを作成
2. レコードのフォーマット
区切り文字です。今回は区切り文字付きにしてみました。Hiveでは、区切り文字のないデータ(例えば固定長データのように、先頭から10文字が1列目、次の3文字が2列目など)も扱うことができます。
3. シリアル化
Hiveでは、いわゆるテーブルのセルに複数の情報を埋め込むネスト型をサポートしています。今回は使用しないのでデフォルトのままにします。
4. ファイルフォーマットの選択
(HDFSに)保存されているデータの形式です。今回はCSV形式のデータを想定しているので、TextFileのままにします。
5.データの保存場所
デフォルトのままにします。つまり、/user/hive/warehouse/<テーブル名>です。
6. テーブルの列の設定
7. 完了
sample_by_hueテーブルが作成されました。Metastore Managerでも表示されています。
8. テーブルのディレクトリを表示
テーブルの作成が完了したので、/user/hive/warehouse ディレクトリをみてみましょう。sample_by_hue ディレクトリが作成されています。
シェルからテーブルを作成する
ついでに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から確認することもできますが、スクリーンショットが多すぎるので省略します。
テーブルを作成しただけではデータがありません。長くなったので、明日のブログでデータをロードしてみましょう。
コメント