Apache Hiveとは?基本的な使い方を徹底解説!Hadoopでの役割とメタストアの設定方法は?インストール手順もご紹介
はじめに
今回の記事では、分散処理フレームワークの「Apache Hive」について紹介します。
SNSや遺伝子解析など、分散処理は幅広い分野で利用されており日々ニーズが高まっています。
ビッグデータの活用をする方も、そうではない方も「Apache Hive」について概要だけでも知っておきましょう。
Apache Hiveの特徴
Apache Hiveを使用すると、Hadoopと互換性のあるファイルシステムに格納されたデータの分析をおこなうことが可能です。
Apache HiveではSQLに似ている「HiveQL」という独自の言語を利用しています。
また、ビットマップのインデックス機能も実装しているためクエリを高速でおこなうことが可能です。
クエリとは命令のことで、データベースに対して様々な処理(データの抽出や操作など)を指示します。
日本語では「問い合わせ」と呼ばれることもあるようです。
Apache Hiveの機能
Apache Hiveは、下記のような機能を実装しています。
- Apache Hiveの機能
- 高速化インデックスの作成
- プレーンテキストやRCFile、HBaseなど様々なストレージタイプの使用
- RDBMSに対してメタデータの格納
- クエリ実行時に構文チェックの高速化
- Hadoop環境に格納されている圧縮データの使用
- 組み込みユーザ定義関数(UDF)を使用可能
Apache Hiveのインストール方法
Apache Hiveのインストールは、何種類か方法もあり環境の設定も様々です。
ここでは、コマンドを入力しておこなう方法を解説します。
事前にApacheの公式ページからパッケージを入手しておきましょう。
またJDK・Hadoopも必要になるため、事前にインストールをおこなっておく必要があります。
事前に上記2つのダウンロード・インストールが完了したら以下のコマンドを入力してください。
- 「cd /usr/local/lib/」
- 「wget http://ftp.riken.jp/net/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz」
- 「tar zxf apache-hive-1.2.1-bin.tar.gz」
- 「rm apache-hive-1.2.1-bin.tar.gz」
- 「ln -s apache-hive-1.2.1-bin hive」
PATHの設定も事前におこなっておきましょう。
- 「echo ‘export HIVE_HOME=/usr/local/lib/hive’ >> /etc/profile.d/hive.sh」
- 「echo ‘export PATH=”$HIVE_HOME/bin:$PATH”‘ >> /etc/profile.d/hive.sh」
- 「source /etc/profile」
Apache Hiveの起動
Apache Hiveのインストールが完了したら、起動の確認をおこなってください。
- 「hive」
- 「Logging initialized using configuration in jar:file:/usr/local/lib/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
- hive> exit;」
起動が無事に成功した場合は、ディレクトリ内に「metastore_db」と「derby.log」が作成されます。
- 「ll」
- 「drwxr-xr-x 5 root root 4096 month day hhmm metastore_db」
- 「-rw-r–r– 1 root root 21109 month day hhmm derby.log」
「metastore_db」を削除した場合、テーブルが消失してしまうため場所を変更したい場合は以下を設定してください。
Apache Hiveの基本的な操作
Apache Hiveの特徴や機能を学んだので、ここからは基本的な使い方について学んでいきましょう。
この記事を読みながら実際に操作をおこなうと覚えやすいです。
データ操作
Apache Hiveを使ってデータのロードやINSERT、SELECTなどを学習しましょう。
最初に「LOAD DATA LOCAL INPATH ‘xxx/xxx/xxx/xxx.xxx’」を入力してデータのロードをおこないます。
INPATHの後は、実際に読み込みをおこなうデータに応じて値が変化します。
上記のコマンドの後には「OVERWRITE INTO TABLE records;」を入力しましょう。
このコマンドを実行すると、ローカルに保存されている指定したファイルをHiveの保管用ディレクトリに保存します。
「OVERWRITE INTO TABLE records;」は、入力しなくても構いませんがデータの重複を防ぐことが可能です。
INSERT文とSELECT文
データをインポートする際は、INSERT文とSELECT文を使用します。
例として以下のコマンドを入力してください。
- 「INSERT OVERWRITE TABLE events」
- 「SELECT a.*FROM profiles a WHERE a.key < 200;」
このコマンドでは「profiles」というテーブルから「key」という列の値が200未満の行を抽出します。
それから「events」というテーブルに「INSERT」をおこなってください。
ロードの時と同様に「OVERWRITE」が指定されているため、既存のデータは今回指定したデータに置き換わります。
SELECT文は、SQLに似た構文を使用することも可能です。
以下に、クエリの例を挙げておきます。
- 「SELECT weekday, COUNT(*)」
- 「FROM u_data_new」
- 「GROUP BY weekday;」
区切り文字
Apache Hiveでは、TABや空白がレコードの中でよく見られるため、区切り文字を使用する際は制御文字を使用することが多いです。
- 区切り文字の一覧
- 「\n」:テキストファイルでは各行がレコードになるため、改行文字でレコードを区切ります。
- 「^A」:フィールドの列同士を区切ることが可能です。明示的に指定する場合は、8進数表記(\001)で記載します。
- 「^B」:「ARRAY」や「STRUCT」の要素などを区切る。で明示的に指定する場合は、8進数表記(\002)で記載します。
- 「^C」:MAP中のキーや値ペアのキーと対応する値を区切る。明示的に指定する場合は、8進数表記(\003)で記載します。
スキーマの設定
データの書き込み時や読み込み時にはスキーマの適用をするか選択することが出来ます。
それぞれメリット、デメリットが存在するので紹介しましょう。
書き込み時のスキーマ適用には「RDBMS」を、読み込み時のスキーマ適用には「Hive」を使用します。
「RDBMS」使用時は、読み込んだデータがスキーマに則していない場合はデータのロードが拒否されます。
「Hive」使用時は、読み込み時点ではデータの確認をおこないません。
クエリの発行時にデータの確認をおこない、スキーマに則していないデータはクエリの発行時にエラーとなります。
書き込み時のスキーマ適用のメリットとデメリットは以下の通りです。
- メリット:クエリの実行パフォーマンスが高速になる
- デメリット:データベースへのデータロードに時間がかかる
また、読み込み時のスキーマ適用についてのメリット・デメリットは以下の通りになります。
- メリット:初期のデータ読み込みが高速になる
- デメリット:クエリの実行速度が下がる
テーブルの作成と確認
Apache Hiveではパーティションの集まりとしてテーブルを構成します。
パーティションはテーブルを、カレンダーの日付のような集まりに対して大きく分割させる方法です。
パーティションを使うことでクエリの実行を高速化することが出来ます。
以下のようにテーブルを作成します。
- 「CREATE TABLE records(year STRING, temperature INT, quality INT)」
- 「ROW FORMAT DELIMITED」
- 「 FIELDS TERMINSTED BY ‘\t’;」
「ROW FORMAT DELIMITED FIELDS TERMINSTED BY ‘\t’;」では、データファイルの各行をタブ区切りのテキストで示すことが可能です。
テーブルの確認をおこなう際は「SHOW TABLES;」でおこないます。
ユーザーが見ることの出来るすべてのテーブルを表示できます。
表示するテーブルは、文末に正規表現をつけることで検索するテーブルの指定が可能です。
- 「SHOW TABLES ‘.*x’;」
この場合は、’x’で終了するテーブルをすべて表示させることができます。
また、列ごとに表示をおこないたい場合は「DESCRIBE invites;」と入力しましょう。
インデックス
Apache Hiveには「compact」と「bitmap」と2種類のインデックスが存在します。
「compact(インデックス)」では、それぞれの値に対して各ファイルのオフセットではなくHDFSのブロック番号を保存します。
そのため値が「compact」は、近傍の行にまとまっているような場合に効果的です。
コマンドの例を紹介しましょう。
- 「CREATE TABLE t(i int, j int);」
- 「CREATE INDEX x ON TABLE t(j)」
- 「AS ‘org.apache.hadoop.hive.ql.index.compact.CompactlndexHandler’;」
「bitmap(インデックス)」では、特定の値が表されている行を効率的に保存します。
通常は、カーディナリティの低い列(性別や国など)に対して使うのが効果的です。
ユーザー定義関数
「UDF」というユーザー定義関数を使うことで、独自の処理コードを組み込んで簡単に呼び出すことが可能です。
- ユーザー定義関数の一覧
- ユーザー定義関数(UDF):数値関数や文字列関数に利用され、1つの行を受け取り1つの出力行を生成します。
- ユーザー定義集計関数(UDAF):COUNT関数やMAX関数に利用されます。UDFと異なり、複数の入力行を受け取ることが可能です。
- ユーザー定義テーブル生成関数(UDTF):UDFと同様に1つの行に対して処理をおこないますが、複数の行(テーブル)を出力します。
メタストアを設定する
メタストア(metastore)では、クエリで見るテーブル定義情報をHiveQL上に格納することができます。
ここでは、メタストアの設定方法について確認しましょう。
ローカルメタストアの設定
ローカル環境でメタストアを利用する方法から確認します。
ローカルメタストアの設定手順は以下の通りです。
- PostgreSQL(RDBMS)をインストール
- JDBCドライバーを配置
- Hiveの設定変更
- メタストアで使用するデータベースの準備
PostgreSQLのインストールが完了していない場合は、事前にインストールしておいてください。
JDBCドライバーは、PostgreSQLのホームページから入手することが可能です。
複数のバージョンがありますが、「JDBC4」若しくは「最新」バージョンを入手しましょう。
入手したドライバーは、Hiveクライアントの「$HIVE HOME/lib/」に格納しておきます。
ドライバー入手後は「$HIVE HOME/conf/hive-site.xml」を参考にHiveの設定を変更してください。
設定の際は「PostgreSQLのホスト名」「ポート番号」「データベース名」を手動で設定しましょう。
Hiveの設定が完了したら「CREATE ROLE」でユーザーの作成をおこないます。
今回はログイン権限を持つユーザーを作成しましょう。
- 「$ psql」
- 「postgres=# CREATE ROLE hive LOGIN;」
- 「CRESTE ROLE」
ユーザーを作成したら「CREATE DATABASE」で作成します。
リモートメタストアの設定
ローカルメタストアの設定について紹介しましたが、メタストアの格納モードには「リモートメタストア」も存在します。
メタストアを格納するサーバーを用意するところまではローカルメタストアと同様です。
Thriftのプロトコルを利用してメタストアにアクセスできるように設定します。
リモートメタストアの設定手順は以下の通りです。
- Hiveサーバーの設定(記述)「hive.metastore.local」を削除
- クライアントの設定「hive.metastore.uris」を「thrift://:」に設定
- 「hive.metastore.local」プロパティを「false」に設定
- 「hive.metastore.warehouse.dir」をHiveサーバーと同じ設定に変更
- 「[hive@hiveserver ~]$ hive –service metastore」
メタストアの設定詳細
メタストアの設定を以下に「プロパティ名:説明」というように以下に示します。
- javax.jdo.option.ConnectionURL:PostgreSQLにメタストアを設定
- javax.jdo.option.ConnectionDriverName:PostgreSQL JDBCドライバーのクラス設定
- javax.jdo.option.ConnectionUserName:メタストアにアクセスするためのユーザー設定
- javax.jdo.option.ConnectionPassword:PostgreSQLに接続するユーザーのパスワードを設定
- hive.metastore.local:ローカルのメタストアをしようするための設定
- hive.metastore.warehouse.dir:HDFS上でHiveのデータを格納する領域を指定
Hadoop環境を構築
Apache Hiveを使用する際にHadoop環境の構築をおこなう場合があるので紹介しておきます。
ネットワークの設定
Hadoopクラスタは、処理中にノード間で通信をおこなう必要があります。
そのため「/etc/hosts」ファイルに「master/slave」のIPアドレスとFQDN(Fully Qualified Domain Name)を設定しましょう。
- 「192.168.10.xxx master」
- 「192.168.10.xxx slave1」
- 「192.168.10.xxx slave2」
- 「192.168.10.xxx slave3」
iptablesの設定
ノード間の通信をおこなうために「iptables」を無効にします。
- 「sudo service iptables stop」
- 「sudo chkconfig iptables off」
- 「chkconfig –list | grep iptables」
- 「iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off」
Hadoopの設定
- 「/etc/hadoop/conf」にはhadoopの設定ファイルが格納されています。
- 「ls /etc/hadoop/conf/」
- 「 core-site.xml hadoop-metrics.properties hdfs-site.xml」
- 「log4j.properties mapred-」
- 「site.xml README」
CDHでは「alternatives」コマンドによりhadoopの設定ファイルが管理されています。
そのため、クラスターの動作モードに応じて設定ファイルを切り替えていくのが一般的です。
- 「alternatives –display hadoop-conf」
- 「 hadoop-conf – status is auto.」
- 「 link currently points to /etc/hadoop/conf.pseudo.mrl」
- 「 /etc/hadoop/conf.empty – priority 10」
- 「 /etc/hadoop/conf.pseudo.mrl- priority 30」
- 「 current {}‘best’ version is /etc/hadoop/conf.pseudo.mrl.」
alternativesコマンドの優先度
先ほどのコマンドで、優先度の確認をおこないました。
一番優先度が高い箇所は「 /etc/hadoop/conf.pseudo.mrl- priority 30」です。
そのため30よりも大きい優先度を持った設定を追加する必要があります。
ここでは「conf.distribute.mrl」という名前で完全分散モード用の設定を追加します。
- 「sudo cp -prL /etc/hadoop/conf /etc/hadoop/conf.distribute.mrl」
- 「sudo alternatives –install /etc/hadoop/conf hadoop-conf \ /etc/hadoop/conf.distribute.mrl 50」
- 「alternatives –display hadoop-conf」
- 「hadoop-conf – status is auto.」
- 「link currently points to /etc/hadoop/conf.distribute.mrl」
- 「 /etc/hadoop/conf.empty – priority 10」
- 「 /etc/hadoop/conf.pseudo.mrl- priority 30」
- 「 /etc/hadoop/confdistribute.mrl- priority 50」
- 「 current {}‘best’ version is /etc/hadoop/conf.distribute.mrl.」
優先度の変更をおこなうことが出来ました。
まとめ
インストール手順が複雑で敬遠されがちですが、実際に使用すると便利なことが分かると思います。
Apache Hiveの概要を理解出来たと思うので、今後の学習に活かしてみましょう。