Hive を使用してオフラインデータウェアハウスを構築する場合、データ量の増加に伴い、HDFS ベースの従来のデータウェアハウスではコスト効率よく要件を満たせない場合があります。この場合、Hive データウェアハウスの基盤となるストレージとして OSS-HDFS を使用し、JindoSDK を使用して、より優れた読み取りおよび書き込みパフォーマンスを実現できます。
前提条件
ECS インスタンスが購入済みであること。 このトピックでは、Alibaba Cloud ECS インスタンスを例として使用します。 詳細については、「ECS インスタンスの購入」をご参照ください。
バケットに対して OSS-HDFS が有効になっており、RAM ロールに OSS-HDFS へのアクセス権限が付与されていること。 詳細については、「OSS-HDFS の有効化とアクセス権限の付与」をご参照ください。
Hive クライアントがデプロイ済みであること。
手順
ECS インスタンスに接続します。 詳細については、「インスタンスへの接続」をご参照ください。
JindoSDK を構成します。
JindoSDK JAR パッケージの最新バージョンをダウンロードします。 ダウンロードアドレスについては、GitHub をご参照ください。
JindoSDK JAR パッケージを解凍します。
次のサンプルコードは、
jindosdk-x.x.x-linux.tar.gzという名前のパッケージを解凍する方法の例を示しています。 異なるバージョンの JindoSDK を使用する場合は、パッケージ名を対応する JAR パッケージの名前に置き換えてください。tar zxvf jindosdk-x.x.x-linux.tar.gz説明x.x.x は JindoSDK JAR パッケージのバージョン番号を示します。
ダウンロードした JindoSDK JAR パッケージを Hive のクラスパスにコピーします。
cp jindosdk-x.x.x-linux/lib/*.jar $HIVE_HOME/lib/
OSS-HDFS 実装クラスと AccessKey ペアを構成します。
Hive の core-site.xml ファイルで OSS-HDFS 実装クラスを構成します。
<configuration> <property> <name>fs.AbstractFileSystem.oss.impl</name> <value>com.aliyun.jindodata.oss.JindoOSS</value> </property> <property> <name>fs.oss.impl</name> <value>com.aliyun.jindodata.oss.JindoOssFileSystem</value> </property> </configuration>Hive の core-site.xml ファイルで、OSS-HDFS が有効になっているバケットの AccessKey ID と AccessKey Secret を構成します。
<configuration> <property> <name>fs.oss.accessKeyId</name> <value>LTAI******** </value> </property> <property> <name>fs.oss.accessKeySecret</name> <value>KZo1********</value> </property> </configuration>
OSS-HDFS エンドポイントを構成します。
OSS-HDFS を使用して OSS バケットにアクセスする場合、エンドポイントを構成する必要があります。 推奨されるアクセスパスのフォーマットは
oss://<Bucket>.<Endpoint>/<Object>です。たとえば、oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/exampleobject.txtです。 構成が完了すると、JindoSDK はアクセスパス内のエンドポイントを使用して、対応する OSS-HDFS API 操作にアクセスします。他のメソッドを使用して OSS-HDFS エンドポイントを構成することもできます。 異なるメソッドを使用して構成されたエンドポイントには、異なる優先順位があります。 詳細については、「付録 1: エンドポイントを構成するために使用されるその他のメソッド」をご参照ください。
重要上記の設定が完了したら、Hive を再起動して設定を有効にする必要があります。
ターミナルで次のコマンドを実行して Hive に接続します。
他の接続方法の詳細については、「Hive の接続方法」をご参照ください。
hiveOSS-HDFS を使用してデータを保存します。
データベースまたはテーブルを作成するときに、次の 2 つのメソッドのいずれかを使用して OSS-HDFS パスを指定し、データベースまたはテーブルのデータを OSS-HDFS に保存できます。
メソッド 1: コマンドで OSS-HDFS パスを指定する
データベースの作成時に OSS-HDFS パスを指定する
CREATE DATABASE db_on_oss1 LOCATION 'oss://bucket_name.endpoint_name/path/to/db1';テーブルの作成時に OSS-HDFS パスを指定する
CREATE TABLE db2.table_on_oss ( id INT, name STRING, age INT ) LOCATION 'oss://bucket_name.endpoint_name/path/to/db2/tablepath';
メソッド 2: 構成ファイルで OSS-HDFS パスを指定する
Hive Metastore の hive-site.xml 構成ファイルで hive.metastore.warehouse.dir を OSS-HDFS パスに設定し、Hive Metastore を再起動します。 デフォルトでは、後で作成されるデータベースとテーブルは、指定された OSS-HDFS パスに保存されます。
次のサンプルコードは、構成の例を示しています。
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>oss://bucket_name.endpoint_name/path/to/warehouse</value> </property> </configuration>
既存のテーブルにパーティションを追加します。
既存のテーブルにパーティションを追加して、より小さなストレージユニットに分割できます。 クエリ条件に基づいて、条件を満たすパーティションのみがスキャンされ、全表スキャンが回避されます。 これにより、クエリのパフォーマンスが大幅に向上します。
コマンドのフォーマット
ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...] LOCATION 'location';次の表にパラメーターを示します。
パラメーター
任意
説明
table_name
はい
パーティションを追加するテーブルの名前。
IF NOT EXISTS
オプション
IF NOT EXISTS を指定しない場合、同じ名前のパーティションが既に存在すると、操作は失敗し、エラーが返されます。
pt_spec
必須
追加するパーティション。 フォーマットは
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)です。 このフォーマットでは、partition_colはパーティションフィールドを示し、partition_col_valueはパーティション値を示します。 パーティションフィールドでは大文字と小文字は区別されませんが、パーティション値では大文字と小文字が区別されます。location
必須
パーティションが保存される OSS パス。
例
次の例は、sale_detail テーブルにパーティションを追加して、2021 年 12 月の中国 (杭州) リージョンの販売レコードを保存する方法を示しています。 パーティションは指定された OSS パスに保存されます。
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202112', region='hangzhou') LOCATION 'oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/path/2021/';