Hiveを使用して、HDFSを使用してデータを格納する従来のオフラインデータウェアハウスを構築すると、ウェアハウスに格納されるデータ量が増加するため、データウェアハウスにコストがかかる可能性があります。 この場合、Hiveデータウェアハウスの基盤となるストレージとしてOSS-HDFS (JindoFS) を使用し、JindoSDKを使用して読み取りおよび書き込みパフォーマンスを向上させることができます。
前提条件
Elastic Compute Service (ECS) インスタンスが作成されました。 詳細は、インスタンスの作成をご参照ください。
バケットのOSS-HDFSが有効になり、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パッケージのバージョン番号を示します。
オプション: Kerberos関連およびSASL関連の依存関係が環境に含まれていない場合は、JindoSDKがデプロイされているすべてのノードに次の依存関係をインストールします。
UbuntuまたはDebian
sudo apt-getインストールlibkrb5-dev krb5-admin-server krb5-kdc krb5-user libsasl2-dev libsasl2-modules libsasl2-modules-gssapi-mit
Red Hat Enterprise LinuxまたはCentOS
sudo yum install krb5-server krb5-workstation cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-plain
macOS
brew install krb5
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>
では、core-site.xmlファイルには、OSS-HDFSが有効になっているバケットへのアクセスに使用するAccessKey IDとAccessKeyシークレットを指定します。
<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を使用してObject Storage Service (OSS) のバケットにアクセスする場合は、OSS-HDFSのエンドポイントを指定する必要があります。 OSS-HDFSへのアクセスに使用するパスは、
oss://<Bucket>.<Endpoint>/<Object>
形式 (例:oss:// examplebucket.cn-shanghai.oss-dls.aliyuncs.com/exampleobject.txt
) で設定することを推奨します。 エンドポイントを設定すると、JindoSDKはアクセスパスで指定されたエンドポイントに基づいて対応するOSS-HDFS操作にアクセスします。他の方法を使用してOSS-HDFSのエンドポイントを設定することもできます。 異なる方法を使用して構成されたエンドポイントの優先度は異なります。 詳細については、「付録1: OSS-HDFSのエンドポイントの設定に使用されるその他の方法」をご参照ください。
重要上記の設定を完了した後、設定を有効にするにはHiveを再起動する必要があります。
ターミナルで次のコマンドを実行して、Hiveに接続します。
その他の接続方法については、「Hiveへの接続」をご参照ください。
ハイブ
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, 年齢INT ) LOCATION 'oss:// bucket_name.endpoint_name/path/to/db2/tablepath';
方法2: Hive設定ファイルでOSS-HDFSストレージパスを指定する
hive.metastore.warehouse.dirの値をhive MetastoreのHive-site.xml設定ファイルのOSS-HDFSストレージパスに設定し、Hive Metastoreを再起動できます。 後で作成されるデータベースとテーブルは、指定されたOSS-HDFSストレージパスに格納されます。
次のサンプルコードでは、hive.metastore.warehouse.dirを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 [存在しない場合] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...] 場所 '場所';
次の表に、上記のコマンドのパラメーターを示します。
パラメーター
必須
説明
table_name
可
パーティションを追加するテーブルの名前。
存在しない場合
任意
テーブルに同じ名前のパーティションが含まれている場合、エラーがスキップされる原因となるパラメーター。 If NOT EXISTSパラメーターが指定されておらず、追加するパーティションと同じ名前のパーティションがすでに存在する場合、操作に失敗し、エラーが返されます。
pt_spec
可
追加するパーティション。The partition that you want to add. このパラメーターの値は、
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
形式です。 この形式では、partition_col
はパーティションキー列の名前、partition_col_value
はその値です。 パーティションキー列の名前は大文字と小文字を区別せず、値は大文字と小文字を区別します。場所
可
パーティションにデータを格納するために使用されるOSSパス。
例
次のサンプルコードは、2021年12月にsale_detailという名前のテーブルにパーティションを追加して販売レコードを中国 (杭州) リージョンに格納し、パーティションにデータを格納するために使用されるOSSパスを指定する方法の例を示しています。
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20212' 、region='hangzhou') LOCATION 'oss:// examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/path/2021/';