Hiveの構成 | Hadoop Advent Calendar 2016 #05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。 この記事はHadoop Advent Calendar 5日目のものとなります。

前回はHadoop3.0の新機能であるHDFSのErasure Codingについて紹介しました。
今回はSQL on Hadoopの先駆けで現在でも人気のあるHiveがどのような仕組みで成り立っているのかについて書かせていただきたいと思います。

Hiveとは

HiveとはHadoop上での処理をSQLライクな言語で実現するためのHadoopエコシステムとなります。

従来であればHadoopはMapReduceというフレームワークを使ってJavaで実装しなければならなかったため、データサイエンティストや企画職などデータを活用する必要はあるがプログラミングには詳しくない人にとっては敷居の高いものでした。

それらの人でも分析に必要なデータを取得するのによく使われるSQLを記述するればHiveがMapReduceに変換してくれるという仕組みを実現することで一躍人気となりました。

SQLとHiveQL

HiveはSQLライクなHiveQLという言語で記述するものになっていますが、厳密にはSQLではありません。 中でも特徴的なのはRDBとことなりファイルの実態を意識する場面が多々あるということでしょうか。

また、実際にはMapReduceに変換されるため最適化やチューニングではRDBのそれとは違ったやり方が必要になる場面も多くあります。

Hiveの構成

MapReduceでは非構造化データも扱えるため、データがRDBのようにテーブル構造担っており各カラムの型がはっきりと決まっているとは限りません。 また、仮にそういったものが決まっているデータを扱いたいとしてもスキーマを管理するための仕組みもありません。

そこでHiveではスキーマと実際のデータを分けて管理しています。 データはHDFS上に置き、それを管理すためのテーブル構造などのスキーマ情報は別なコンポーネントで管理しています。

hive1

HDFS上のファイルとMetaStore

前述の用にHiveで管理しているファイルはHDFS上にある通常のファイルです。 最近ではカラムナ型のデータフォーマットもありますが、CSVやTSVといった一般的なファイルを想像してもらって問題ありません。

これに対してMetaStoreと呼ばれるコンポーネントがあります。 これはCREATE TABLEなどによって作成されたHive上でのテーブルを管理しています。 テーブル名やカラム名、型などといった情報と実際のHDFS上のファイルとの関係を紐付けています。

この対応関係によってSELECT column1, column2 FROM table1 ... のようなクエリのtable1は実際にはどのディレクトリやファイルを指しているのかや、column1, 2はそのファイル中の何カラム目の項目に付けられた名前なのかが対応するようになっています。

MetaStoreはRDBやHBaseを使って実現しています。

hiveコマンド

hiveを実行するためにシェルコマンドです。 mysqlコマンドやpsqlコマンドのhive版となるます。

このコマンドやこの後解説するHiveServer2によって投げられたクエリはこの後、構文解析やMetaStoreを利用した実際のファイルとの対応付け解消、最適化、MapReduceへの変換などといった処理が行われることになります。

hiveコマンド特有のものもありますが、mysqlコマンドに似た操作でテーブル情報の確認などが行えます。

HiveServer2

最後にもう一つ重要なのがこのHiveServer2(HS2)とよばれるコンポーネントです。 これはJDBC/ODBCを利用して外部と接続するためのものとなります。 HS2のURLへアクセスすることで外部からはRDBでSQLを実行するのと同じコードでHiveへのアクセスも可能となります。

また、beelineと呼ばれるものが存在していて、これはHS2経由のhiveコマンドのようなものです。

MetaStoreと呼ばれる HiveのMetaStoreはRDBやHBaseで管理されており、CREATE TABLE文などでテーブルを作成する際にファイルの実態と対応するMetaStore上の情報を紐付けます。

その仕組みを使用すると、MapReduceなどでHive用に作成されたデータをスキーマ情報を介さずに読み込んだり、他のSQL on HadoopがHiveのMetaStoreを利用してデータを読み込んだりといったことが可能になっています。

その他のコンポーネント

外部からHiveのMetaStoreへアクセスするためのHCatalogと呼ばれるコンポーネントがあります。 このコンポーネントの主な利用シーンはHiveの外側となるため、今回は触れません。

おわりに

今回はHiveがどのような仕組みで動いているのかの概観を記載させていただきました。 実際にはここで示したものの細かいチューニングや、最近のHiveにはそれ以外にも色々工夫がなされており細かく追っていこうとするとかなり複雑な部分も多々あります。
しかし、いったんはここで解説した内容を把握しておけばまずは使い始める際にスムーズに行えるのではないかと思います。

明日はHiveを実際に動かしてみる方法について書かせていただく予定です。
ぜひ、お楽しみに!