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

Hadoop関連(全部俺) Advent Calendar 2014:13日目の記事です
#既に10分を超えてしまったかもしれませんが、、、
昨日はHiveが使用するメタストアについて紹介しました。テーブルは作成されていますが、まだデータがありません。今日のデータのロードでHive編完了です。

データをロードする

昨日のブログに書いたように、Hiveのクエリ対象のデータはHDFSに置かれます。メタストアに情報があるので、クエリするときにデータの置いてある場所、フォーマット、区切り文字などの情報を得ることができました。しかし、テーブルを作成しただけではデータが空の状態です。
Hive用のデータをロードするには、Hueからインポート、beelineシェルからロードするなどの方法が可能です。
昨日作成したsample_by_hueテーブルは、デフォルトの区切り文字(^A)のままにしてしまったので、データを準備しておきます。(テーブル作成時にタブ区切りもしくはカンマ区切りにすべきでしたね。。。)
[shell]
$ vi gooddata.tsv
Hive^A7500
Hadoop^A65535
Shiumachi^A10
Pig^A399
Impala^A10000000000
Oozie^A99
[/shell]

Hueでインポート

Hueからデータをインポートするには、Metastore Managerの左のメニューから[データのインポート]でファイルを選択します。
import1
アップロード後に[サンプル]タブをクリックすると、Hive Editorからクエリを実行することなくデータが表示できます。
import2正しくアップロードされているようです。続いて別のデータもMetastore Managerでインポートします。
 
[shell]
$ vi gooddata2.csv
ookeeper^A12345
HBase^A99999
[/shell]
import3import4
アップロード後にサンプルをみると、データが追加されていることがわかりました。HueのFile Browserから /user/hive/warehouse/sample_by_hue ディレクトリを見てみると、先ほどアップロードしたファイルがありますね。
import5
つまり、データをインポートするというのは、単にデータファイルをテーブルのディレクトリにコピーしているだけなのです。HueのFile Browserからこのディレクトリにファイルをコピー、アップロードすれば、拡張子などは全く関係なく、Hiveのデータとして扱われます。

ファイルブラウザでコピー

では、ファイルブラウザからファイルをアップロードしてみましょう。ファイル名はgooddata3です。
[shell]
$ vi gooddata3
FlumeNG^A70
Sqoop^A3
[/shell]

import6ファイルがアップロードされました。
import7Metastore Managerでサンプルを見てみると、追加したファイルの内容が表示されています。
import8このように、Hiveで処理するデータはテーブルのディレクトリに置かれているファイル群、ということがわかりました。

スキーマオンリード

では、異常な形式のファイルはどうなるのでしょうか?
一般的なRDBMSではデータのロード時に失敗してしまいますが、Hiveはロード時にエラーチェックを行いません。(単に、データファイルをディレクトリにコピーしているだけなので)
異常データを準備し、インポートします。
[shell]
$ vi baddata.txt
Impara
CROUDERA^A300,21^A30
Sqoop,30,200
1,ABCDE
[/shell]
問題なくインポートできました。
importng
しかしサンプルをとってみると、区切り文字が正しくないため、不正なデータが含まれています。繰り返しますが、Hiveはロード時にデータの確認は行わず、クエリ実行時に行います。これをスキーマオンリードと呼びます。
importng2
(注)beelineシェルからロードすることも可能ですが、今回は割愛します。
#LOAD DATA INPATH、またはLOAD DATA LOCAL INPATHを使用します
既にHDFSに存在しているデータがあれば「外部テーブル」を利用することも可能です。興味のある方は調べてみてください。
 

Hiveによる処理のおおまかな処理の流れ

最後にフローをまとめておきます

  1. クライアントやHueでHiveのクエリを書く
  2. Hiveは
    1. ユーザーが書いたクエリの構文解析を行い、
    2. メタストアから必要な情報を収集し、
    3. 実行計画を作成し、
    4. MapReduceのジョブとしてクラスタに投入
  3. Hadoopクラスタでは、
    1. メタストアの情報を元に、
    2. データが置かれているディレクトリに対して、
    3. 投入されたMapReduceジョブを実行
  4. 結果を表示(またはファイルに書き出す)

それでは皆さんよい週末を〜

コメント