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の左のメニューから[データのインポート]でファイルを選択します。
アップロード後に[サンプル]タブをクリックすると、Hive Editorからクエリを実行することなくデータが表示できます。
正しくアップロードされているようです。続いて別のデータもMetastore Managerでインポートします。
[shell]
$ vi gooddata2.csv
ookeeper^A12345
HBase^A99999
[/shell]
アップロード後にサンプルをみると、データが追加されていることがわかりました。HueのFile Browserから /user/hive/warehouse/sample_by_hue ディレクトリを見てみると、先ほどアップロードしたファイルがありますね。
つまり、データをインポートするというのは、単にデータファイルをテーブルのディレクトリにコピーしているだけなのです。HueのFile Browserからこのディレクトリにファイルをコピー、アップロードすれば、拡張子などは全く関係なく、Hiveのデータとして扱われます。
ファイルブラウザでコピー
では、ファイルブラウザからファイルをアップロードしてみましょう。ファイル名はgooddata3です。
[shell]
$ vi gooddata3
FlumeNG^A70
Sqoop^A3
[/shell]
ファイルがアップロードされました。
Metastore Managerでサンプルを見てみると、追加したファイルの内容が表示されています。
このように、Hiveで処理するデータはテーブルのディレクトリに置かれているファイル群、ということがわかりました。
スキーマオンリード
では、異常な形式のファイルはどうなるのでしょうか?
一般的なRDBMSではデータのロード時に失敗してしまいますが、Hiveはロード時にエラーチェックを行いません。(単に、データファイルをディレクトリにコピーしているだけなので)
異常データを準備し、インポートします。
[shell]
$ vi baddata.txt
Impara
CROUDERA^A300,21^A30
Sqoop,30,200
1,ABCDE
[/shell]
問題なくインポートできました。
しかしサンプルをとってみると、区切り文字が正しくないため、不正なデータが含まれています。繰り返しますが、Hiveはロード時にデータの確認は行わず、クエリ実行時に行います。これをスキーマオンリードと呼びます。
(注)beelineシェルからロードすることも可能ですが、今回は割愛します。
#LOAD DATA INPATH、またはLOAD DATA LOCAL INPATHを使用します
既にHDFSに存在しているデータがあれば「外部テーブル」を利用することも可能です。興味のある方は調べてみてください。
Hiveによる処理のおおまかな処理の流れ
最後にフローをまとめておきます
- クライアントやHueでHiveのクエリを書く
- Hiveは
- ユーザーが書いたクエリの構文解析を行い、
- メタストアから必要な情報を収集し、
- 実行計画を作成し、
- MapReduceのジョブとしてクラスタに投入
- Hadoopクラスタでは、
- メタストアの情報を元に、
- データが置かれているディレクトリに対して、
- 投入されたMapReduceジョブを実行
- 結果を表示(またはファイルに書き出す)
それでは皆さんよい週末を〜
コメント