はじめに
この実験では、Hive の設定と基本操作に焦点を当てており、SQL の基礎を持つ学生が Hive のアーキテクチャ、基本的な展開と使用方法を理解するように設計されています。
ドキュメント内のサンプルコードをすべて自分で入力してください。できるだけコードをコピーして貼り付けないでください。このようにすることで、コードに慣れることができます。問題がある場合は、ドキュメントを注意深く確認するか、フォーラムで助けを求めて交流することができます。
Hive の紹介
Apache Hive は、Hadoop の上に構築されたデータウェアハウスソフトウェアパッケージで、SQL のようなクエリを使用して大規模なデータセットを照会および分析します。ユーザーに慣れ親しんだ SQL インターフェイスを提供することで、データの集計、即席クエリ、およびビッグデータの分析を簡素化します。以下は、Hive のアーキテクチャと主な機能の概要です。
Hive のアーキテクチャ
- コンポーネント:Hive は、テーブルとストレージ管理用の
HCatalogと、MapReduce タスクを実行したり、Pig クエリを実行したり、REST API 経由で Hive メタデータとやり取りしたりするためのWebHCatで構成されています。 - 機能:
- ETL、データ分析、レポート作成などのデータウェアハウスタスクに対して SQL クエリをサポートします。
- データは HDFS や HBase などのストレージシステムに格納されます。照会操作は、Tez、Spark、または MapReduce などの計算エンジンによって実行されます。
- 手続き型言語、HPL-SQL をサポートし、Hive LLAP、YARN、および Slider のサポートを備えたサブクエリの検索をサポートします。
Hive の基本的なデータ単位
- データベース:名前の衝突を回避し、セキュリティを強化するための名前空間。
- テーブル:同じスキーマを持つ同質のデータ単位(たとえば、タイムスタンプ、ユーザー ID、ページ URL などの列を持つ
page_viewsテーブル)。 - パーティション:キーに基づいてデータをパーティションに分割し、効率的なデータ検索を行います。
- バケット:ハッシュ関数値に基づいてパーティショニングされたデータをバケットに分割し、照会効率を向上させます。
Hive のデータ型
- 基本型と複合型のデータ型をサポートしています。詳細については、Hive のデータ型のドキュメントを参照してください。
Hive は、オンライントランザクション処理 (OLTP) ではなく、データウェアハウスタスクに対して設計されており、拡張性、パフォーマンス、信頼性、およびフォールトトレランスに焦点を当てています。さまざまな入力形式をサポートしており、さまざまな形式のコネクタで拡張することができます。Hive のアーキテクチャ、データ単位、およびデータ型を理解することは、ビッグデータ分析におけるその機能を活用するために不可欠です。
Hive のインストールと展開
このセクションでは、ダウンロードとディレクトリ設定、環境変数設定、メタベース構成設定、Hive システムパラメータ、およびメタベースの初期化に焦点を当てます。
まず、以降の操作を実行するために hadoop ユーザーに切り替える必要があります。デスクトップ上の Xfce ターミナルをダブルクリックして、次のコマンドを入力します。
su - hadoop
ヒント:パスワードはユーザー hadoop の 'hadoop' です。
次に、wget コマンドを使用して Hive の最新の安定版をダウンロードします。ここでは Hive の 2.3.3 版を選択しています。
sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz
次に、ダウンロードしたインストールパッケージを展開する必要があります。ターミナルに次のコマンドを入力します。
tar -zxvf apache-hive-2.3.3-bin.tar.gz
sudo 特権を使用して、展開したディレクトリを /opt ディレクトリに移動します。sudo 特権を使用しない場合、/opt ディレクトリに書き込めない場合があります。
sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3
ディレクトリを移動した後、Hive のディレクトリの所有者を hadoop ユーザーとそのユーザーグループに変更する必要があります。ターミナルに次のコマンドを入力してください。
sudo chown -R hadoop:hadoop /opt/hive-2.3.3
ヒント:別のターミナルを開いて、'sudo' 特権で上記の操作を行うことができます。
labex:~/ $ ls -al /opt/
total 24
drwxrwxr-x 10 hadoop hadoop 4096 Mar 3 12:01 hive-2.3.3
...
環境変数の設定
ディレクトリ設定が完了した後、Hive の環境変数を設定する必要があります。これにより、HIVE_HOME がそのインストールディレクトリを指すようになります。
まず、vim エディタを使用して hadoop ユーザーの .bashrc ファイルを開きます。ターミナルに次のコマンドを入力します。
vim /home/hadoop/.bashrc
ファイルの末尾に次の内容を追加します。PATH は、現在の実験環境の実際の状況に応じて変更する必要があります。$PATH 式は、既存のコンテンツを参照するために使用されます。PATH 環境変数の末尾に直接 :$HIVE_HOME/bin を追加します。
export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin
編集が完了したら、ファイルを保存してエディタを終了します。次に、source コマンドを使用して上記の環境変数を有効にします。
この実験では、事前に Hive をインストールしてあるため、**source 環境変数は必要ありません**。ただし、実際のインストールでは、この手順はケースバイケースで行われます。
設定のセットアップ
これは Hive の設定プロセスです。このステップでは、手を動かさずに見るだけで大丈夫です。なぜなら、この実験では事前に Hive を設定してあり、この事前インストール済みの Hive を使用できます。which hive コマンドを使用して確認できますが、ファイルの作成は依然として行う必要があります。なぜなら、これがテストに合格したかどうかを判断する資格情報だからです。
メタベースの設定
公式に Hive を使用する前に、メタデータストアを設定する必要があります。デフォルトでは、Hive は埋め込み型の Derby データベースにメタ情報を保存します。ディスク上の保存場所は、Hive 設定ファイル conf/hive-default.xml の構成項目 javax.jdo.option.ConnectionURL によって決定されます。デフォルトでは、この場所は ./metastore_db です。
しかし、この実験では MySQL をメタデータの保存先として使用します。したがって、Hive 設定ファイルを変更する必要があります。
この設定ファイルを作成して vim エディタで開きます。
vim /opt/hive-2.3.3/conf/hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive_metastore1?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveuser1</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123qweQWE...</value>
</property>
</configuration>
上記の構成項目を編集した後、ファイルを保存してエディタを終了します。
MySQL データベースの作成
sudo mysql で MySQL サーバーを起動し、データベース hive_metastore を作成します。
CREATE DATABASE hive_metastore1;
CREATE USER 'hiveuser1'@'localhost' IDENTIFIED BY '123qweQWE...';
GRANT ALL PRIVILEGES ON hive_metastore1.* TO 'hiveuser1'@'localhost';
FLUSH PRIVILEGES;
exit;
次に、MySQL JDBC ドライバをダウンロードして /opt/hive-2.3.3/lib ディレクトリにコピーします。
cp /usr/local/hive/lib/mysql-connector-j-8.3.0.jar /opt/hive-2.3.3/lib
Hive システムパラメータの設定
メタベースの設定が完了した後、Hive 内部の構成項目を設定して、Hadoop の場所、内部構成ファイルのパスなどを識別する必要があります。
まず最初に行うことは、設定テンプレートをコピーして cp コマンドを使用して有効にすることです。
ターミナルに次のコマンドを入力してください。
cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh
次に、vim エディタで hive-env.sh ファイルを開きます。
vim /opt/hive-2.3.3/conf/hive-env.sh
48 行目で、HADOOP_HOME を Hadoop のインストールパスに設定します。
HADOOP_HOME=/home/hadoop/hadoop
上記の構成項目を編集した後、ファイルを保存してエディタを終了します。
メタベースの初期化
すべての設定作業が完了したら、メタベースの初期化を開始できます。
後で使用するデータは HDFS に保存されるため、事前に HDFS を起動する必要があります。ターミナルに次のコマンドを入力して HDFS を起動します。
start-dfs.sh
start-yarn.sh
サービスの状態を確認するには、jps を入力します。
hadoop:~/ $ jps [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode
初めて Hadoop を使用する場合、Hadoop データを削除して hdfs namenode -format で初期化する必要があります。
この実験では、事前にインストールされた Hive をデータベースごとに初期化しています。もちろん、新しくダウンロードした Hive を初期化する場合は、次のコマンドを使用します。
/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed
ここで、新しくダウンロードした Hive を最初に初期化する場合、'~/.bashrc' の HIVE_HOME のパスを新しくインストールした Hive のパスに変更して source する必要があります。ただし、私のアドバイスはそうすることではないです。なぜなら、後続の Hive のテストはすべて事前にインストールされた Hive を基に行われるからです!
プロンプトメッセージが初期化完了を示したら、hive コマンドを使用してコマンドラインに入ることができます。ターミナルに次のコマンドを入力します。
hive
ヒント:事前にインストールされた Hive シェルに直接 hive を入力し、絶対パスを追加すると、新しく設定した Hive シェルに入ることができます!
Hive Session ID = 3eee2693-175d-4452-82d2-47f1b639d9d5
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 68d0d345-92c3-4eb1-8393-7ee34f56363f
hive>
Hive の基本操作
次に、Hive の基本操作を学びましょう。このセクションで言及されている操作文以外のすべての Hive 文は、その 言語マニュアル にあります。このセクションを終えた後、さらに多くの文を試してみることができます。
テーブルの作成
まず、いくつかのデータを取得する必要があります。この実験のこのセクションで使用されるデータは、主に NginX サーバーをシミュレートするログファイルで、ウェブサイトのページビューを分析するために使用できます。
別のターミナルを再開し、ターミナルに次のコマンドを入力してサンプルデータをダウンロードします。
su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv
次に、ファイルを HDFS にアップロードします。
hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view
データを取得した後の最初のことは、テーブルを作成することです。上記のデータに対して page_view テーブルを作成するには、Hive コマンドラインで次の文を入力する必要があります。
CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;
この例では、テーブルの各列に適切な型が割り当てられています。また、列とテーブルのレベルでコメントを付けることができます。さらに、PARTITIONED BY 句は、データ列とは異なるパーティション列を定義します。パーティション列はデータ列とともに保存されません。このようにパーティション列を指定すると、各行の区切り文字として改行文字が使用されます。
データが上記の形式でない場合、次の例のようにフィールド区切り文字をパラメータ化することができます。
次の文は示すためのもので、hive シェルに入力しないでください。
CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;
行区切り文字は、Hadoop システムの区切り文字によって決定されるため、Hive によっては手動で変更できません。
通常、列データが決定されるテーブルはバケットに保存されます。これにより、データセットの効率的なサンプリングが可能になります。バケットがない場合、テーブルのランダムサンプリングは完了できますが、全体のデータをスキャンする際には効率的なサンプリングを行うことはできません。次の例は、page_view テーブルの userid 列に対してバケット保存を有効にする方法を示しています。
次の文は示すためのもので、hive シェルに入力しないでください。
CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
上記の例では、テーブルの userid 列がハッシュ関数によって 32 個のバケットに集約されます。各バケット内では、データが viewTime の昇順でソートされます。このようなデータの組織方法により、ユーザーは集約列(ここでは userid 列)を効果的にサンプリングできます。また、ソート機能により、データ管理者はより良いデータ構造を通じてクエリをより効率的に評価できます。
次の文は示すためのもので、hive シェルに入力しないでください。
CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
上記の例では、テーブルの各行の形式がフィールド名と型によって定義されており、他のプログラミング言語の型定義に非常に似ています。テーブル名と列名は大文字小文字を区別しません。IP Address of the User と次の COMMENT 文は、列とテーブルの両方のレベルでコメントを追加できることを示しています。さらに、PARTITIONED BY 句は、データ列とは異なるパーティション列を定義します。前述の通り、実際にはデータを保存しません。CLUSTERED BY 句は、どの列を使用して何個のバケットを作成するかを指定します。ROW FORMAT DELIMITED 句は、Hive テーブルにおける行の保存方法を指定します。区切り形式の場合、この文はフィールドの終了記号、コレクション(配列またはマップ)内の項目の終了記号、およびマップキーの終了記号をどのように決定するかを指定します。ここでの数字は ASCII エンコードです。STORED AS SEQUENCEFILE は、データが HDFS にバイナリ形式(具体的には Hadoop の SequenceFile 型)で保存されていることを示します。その中で、ROW FORMAT と STORED AS 句の設定は、現在 Hive が使用している既定値です。したがって、最初にテーブルを作成する文で明示的に書かなくてもよいです。
テーブルとパーティションの参照
倉庫内の既存のテーブルを一覧表示するには、次の文を使用できます。
SHOW TABLES;
テーブルがたくさんある場合、上記の文は多くの返却情報を生成します。接頭辞を指定することで範囲を絞ることができます。たとえば、接頭辞 page のテーブルを一覧表示するには、次の文を使用できます。
SHOW TABLES 'page.*';
この文の一致規則は正規表現構文と同じで、ピリオド(.)はワイルドカードを表します。
テーブルのパーティションを一覧表示するには、次の文を使用します。テーブルがパーティション付きでない場合、情報は返却されません。
SHOW PARTITIONS page_view;
テーブルの列と列の型を一覧表示するには、DESCRIBE 文を使用できます。
DESCRIBE page_view;
テーブルの列とその他のすべてのプロパティを一覧表示するには、EXTENDED キーワードを追加する必要があります。これは多くの情報を表示し、通常はデバッグに使用されます。
DESCRIBE EXTENDED page_view;
テーブルの変更
既存のテーブルの名前を変更するには、ALTER TABLE 文に RENAME TO を使用します。新しい名前のテーブルが既に存在する場合、エラーが返されます。
ALTER TABLE page_view RENAME TO new_page_view;
結果を表示します。
hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)
既存のテーブルの列名も変更できます。ただし、同じ列型を使用し、既存の各列にレコードを含める必要があることに注意してください。
ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');
また、既存のテーブルに新しい列を追加することもできます。
ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');
スキーマの変更(たとえば列の追加)は、テーブルの古いパーティションのスキーマを保持し、パーティション付きテーブルにならないようにします。これらの列にアクセスし、古いパーティションで実行されるすべてのクエリは、暗黙的に null 値またはそれらの列の指定された既定値を返します。
テーブルとパーティションの削除
Hive はデータウェアハウスとして設計されているため、データの破壊は常に否定的なものです。したがって、テーブルを削除する操作は少々面倒です。テーブルに対して DROP コマンドを使用すると、テーブルに構築されているすべてのインデックスが暗黙的に削除されます。
次のコマンドを使用してテーブルを削除できます。
DROP TABLE new_page_view;
データの読み込みと照会
Hive では、データの読み込みと照会は 2 つの異なる操作です。このドキュメントでは、Hive テーブルにデータを読み込む方法について説明します。
データの読み込み
Hive テーブルにデータを読み込む方法はいくつかあります。ユーザーは、HDFS 内の特定の場所を指す外部テーブルを作成できます。この使用方法では、ユーザーは HDFS の put または copy コマンドを使用して、データファイルを指定された場所にコピーし、その場所を指すテーブルを作成できます。このテーブルには、すべての関連する 行形式 情報が含まれます。
作成後、ユーザーはデータを変換して、他の任意の Hive テーブルに挿入できます。最初から log_example.csv ファイルを HDFS にアップロードし、page_view にリネームしました。対応するパーティションの page_view テーブルに読み込むには、次のコマンドで行うことができます。
まず、外部テーブルを作成して指定されたファイルと関連付けます。
CREATE EXTERNAL TABLE page_view_stg(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User',
Country STRING COMMENT 'country of origin')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '\n' STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';
次に、データの最終保存用の page_view テーブルを作成します。
CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;
最後に、外部テーブルからのデータを page_view テーブルに挿入します。
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view
PARTITION(dt='2015-05-17', country='us')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, pvs.ip
WHERE pvs.country = 'us';
データが HDFS に読み込まれ、その後 page_view テーブルに読み込まれるまで数分かかる場合があります。
...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 6.31 sec HDFS Read: 369021 HDFS Write: 22943 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 310 msec
OK
Time taken: 25.304 seconds
単純な照会
データを挿入した後、単純な照会を行うことができます。これは通常の SQL 文に似ています。Hive コマンドラインインターフェイスに次の文を入力します。
SELECT * FROM page_view WHERE userid = 0 LIMIT 10;
返される情報は照会されたレコードです。
hive> select * from page_view;
OK
NULL 490 /downloads/product_1 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 490 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 3316 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
...
サービスの停止
もっと多くの Hive の操作文を学びたい場合は、次の拡張機能を読むことができます。
使用が終了したら、quit コマンドを使用して Hive コマンドラインインターフェイスを終了できます。
quit;
もちろん、HDFS サービスを停止することを忘れないでください。ターミナルに次のコマンドを入力します。
stop-yarn.sh
stop-dfs.sh
まとめ
このセッションでは、Hive のアーキテクチャ、インストールと展開、および基本的な HQL 文を紹介しました。また、サンプルデータを使用したデータのインポート方法を学びました。
言及された主なポイントは以下の通りです。
- Hive のアーキテクチャ
- Hive の基本データ単位
- Hive を展開する方法
- Hive HQL 言語
一般的に、データウェアハウスソフトウェアパッケージとして、Hive の機能はさらに掘り下げる必要があります。技術資料を積極的に見直す習慣を維持し、次のコースを続けて学んでください。



