Apache Hiveは、Apache Hadoopを基盤としたデータウェアハウスソフトウェアであり、ユーザーがSQLを使用して大規模なデータセットの読み書きおよび管理を行うことを可能にします。Hiveの主な機能には、分散ストレージ、フォールトトレランス、そして大規模データ分析が含まれます。これにより、分散システムに保存されたデータに対するクエリおよび分析プロセスが簡素化され、データ分析が容易になります。
本記事では、コードを修正することなく、Hiveを使用して直接OBKV-HBaseにアクセスする方法について説明します。
前提条件
Hiveを使用してOBKV-HBaseにアクセスする前に、以下の条件が満たされていることを確認する必要があります。
- ネイティブHive機能をサポートするために、OBKV-HBase Javaクライアントバージョン2.0.0-alpha4以降を使用します。
- OBKV-HBaseのHive使用機能をサポートするために、OceanBaseバージョンV4.4.1以降を使用します。
- Hiveのバージョンが3.0.0から3.1.3の間であることを確認します。
テーブルの作成
Hiveを使用してOBKV-HBaseワイドテーブルにアクセスする場合、2つのテーブル作成方法があります。
- HBase Admin createTableインターフェースを使用してテーブルを作成します。
- SQLを使用してテーブルを作成します。SQLでテーブルを作成する場合は、OBKV-HBaseのテーブル作成ルールに従って作成する必要があります。テーブル作成ルールについては、OBKV-HBaseデータ操作の例を参照してください。
OBKV-HBaseクライアント接続パラメータの設定
OBKV-HBaseでは、パブリッククラウドとプライベートデプロイメントの方式によって、クライアント接続パラメータの設定方法が異なります。プライベートデプロイメントのOceanBaseクラスタは 直接接続モードの設定 に従って設定する必要がありますが、パブリッククラウドのOBKVサービスでは クラウドモード に従って設定する必要があります。
どちらのデプロイメント方式であっても、すべての構成パラメータは以下の2つの方法で設定できます:
- Hiveクライアントの設定ファイル
hive-site.xmlに設定を追加します。 - Hive Configurationの
setメソッドを使用して、コード内でConnectionを初期化する前に設定を行います。
直接接続モードの設定
直接接続モードは、プライベートデプロイメントのOceanBaseクラスタに適用されます。Configurlを使用してOceanBaseクラスタに直接接続します。Configurlは、OceanBaseデータベースの基盤となるサーバーの実際のアドレスを取得するために使用されます。以下は、Hiveで直接接続モードの接続パラメータを設定する方法です。
注意
paramURLに含まれるXMLの特殊文字&は、設定ファイル内では&と記述してください。エスケープしないとXMLの解析に失敗します。
方法1:Hiveの設定ファイル
hive-site.xmlに以下のパラメータを設定します。<!-- 現在のクラスタを次のように仮定します ClusterName:obkvcluster TenantName:obkv DataBaseName: test UserName:root UserPassWord: SYS_USER_NAME : sysroot SYS_USER_PASSWD: --> <configuration> <!-- OceanBase HBase実装クラスの置き換え --> <property> <name>hbase.client.connection.impl</name> <value>com.alipay.oceanbase.hbase.util.OHConnectionImpl</value> </property> <!-- OceanBase接続設定 --> <property> <!-- obconfig serverからRSlistのURLを取得します。詳細については、Config URLの取得に関する内容を参照してください --> <name>hbase.oceanbase.paramURL</name> <value>PARAM_URL</value> </property> <property> <!-- 形式はuserName@tenantName#clusterName --> <name>hbase.oceanbase.fullUserName</name> <value>root@obkv#obkvcluster</value> </property> <property> <!-- fullUserNameで指定したユーザーがOceanBaseにアクセスするためのパスワード --> <name>hbase.oceanbase.password</name> <value></value> </property> <property> <!-- システムテナント配下のユーザー名。ルーティングテーブルにアクセスする権限があるのはシステムテナント配下のユーザーのみです --> <name>hbase.oceanbase.sysUserName</name> <value>sysroot</value> </property> <property> <!-- システムテナント配下のユーザーパスワード --> <name>hbase.oceanbase.sysPassword</name> <value></value> </property> </configuration>方法2:コード内でHiveConfを使用してパラメータを設定します。
/* * 現在のクラスタを次のように仮定します * ClusterName:obkvcluster * TenantName:obkv * DataBaseName: test * UserName:root * UserPassWord: * SYS_USER_NAME : sysroot * SYS_USER_PASSWD: */ HiveConf conf = new HiveConf(); conf.set("hbase.client.connection.impl", "com.alipay.oceanbase.hbase.util.OHConnectionImpl") conf.set("hbase.oceanbase.fullUserName", "root@obkv#obkvcluster"); conf.set("hbase.oceanbase.password", ""); // obconfig serverからRSlistのURLを取得します。詳細については、以下のConfig URLの取得に関する内容を参照してください conf.set("hbase.oceanbase.paramURL", ""); conf.set("hbase.oceanbase.sysUserName", "sysroot"); conf.set("hbase.oceanbase.sysPassword", "");
Config URLの取得:
以下の方法を参考にConfig URLを取得できます:
OCPからConfig URLを取得する
OCPを使用している場合は、OCPからConfig URLを取得できます。具体的な操作は以下のとおりです:
a. OceanBase Cloud Platform(OCP)にログインします。 b. 左側のナビゲーションバーでクラスタを選択し、下にスクロールしてクラスタリストを見つけ、アクセスしたいクラスタ名をクリックして開きます。 c. クラスタの詳細ページでConfigURLパラメータを見つけます。このパラメータはクライアントの初期化時に設定する必要があります。
OBDを使用してConfig Serverをデプロイし、ObRootServiceInfoUrlを取得する
OCPを使用していない場合は、OBDを使用してConfig Serverをデプロイする必要があり、
ObRootServiceInfoUrlを取得する必要があります。
クラウドモードの設定
クラウドモードは、パブリッククラウドにデプロイされたOceanBaseクラスタに適用されます。ODPを介してOceanBaseクラスタに接続します。以下は、Hiveでクラウドモードの接続パラメータを設定する方法です。
方法1:Hiveの設定ファイル
hive-site.xmlに以下のパラメータを設定します。<!-- 現在のクラスタは以下のように仮定します。 DataBaseName: test UserName:root <configuration> --> <!-- OceanBase HBase実装クラスの置換 --> <property> <name>hbase.client.connection.impl</name> <value>com.alipay.oceanbase.hbase.util.OHConnectionImpl</value> </property> <!-- OceanBase接続設定 --> <configuration> <property> <name>hbase.oceanbase.fullUserName</name> <value>root</value> </property> <property> <name>hbase.oceanbase.password</name> <value></value> </property> <property> <!-- ODP Addressの取得についてはこちらを参照 --> <name>hbase.oceanbase.odpAddr</name> <value></value> </property> <property> <name>hbase.oceanbase.odpPort</name> <value>3307</value> </property> <property> <name>hbase.oceanbase.odpMode</name> <value>true</value> </property> <property> <name>hbase.oceanbase.database</name> <value>test</value> </property> </configuration>方法2:コード内で、HiveConfを使用してパラメータを設定します。
/* * 現在のクラスタは以下のように仮定します。 * DataBaseName: test * UserName:root */ HiveConf conf = new HiveConf(); conf.set("hbase.client.connection.impl", "com.alipay.oceanbase.hbase.util.OHConnectionImpl") conf.set(HBASE_OCEANBASE_FULL_USER_NAME, "root"); // ユーザーPassword conf.set(HBASE_OCEANBASE_PASSWORD, ""); // ODP Addressの備考を参照 conf.set(HBASE_OCEANBASE_ODP_ADDR, ""); // OBKVのポートは3307(固定) conf.setInt(HBASE_OCEANBASE_ODP_PORT, "3307"); // クラウドでODPモードを使用する(固定) conf.setBoolean(HBASE_OCEANBASE_ODP_MODE, true); // データベースのdatabase名 conf.set(HBASE_OCEANBASE_DATABASE, "test");
注意
paramURLに含まれるXMLの特殊文字&は、設定ファイル内では&と記述してください。エスケープしないとXMLの解析に失敗します。
ODP Addressの取得:
ODP Addressは以下の方法で取得できます。OceanBase Cloudテナントのダッシュボードにアクセスし、デプロイメント関係図を確認します。
その他のパラメータ
上記の必須接続パラメータ以外にも、いくつかの設定パラメータを設定できます。よく使われるパラメータとその意味については、OBKV-HBaseクライアントのパラメータを参照してください。
使用例
依存関係の追加
プロジェクトの pom.xml にOBKV-HBaseの依存関係を追加します:
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>obkv-hbase-client</artifactId>
<version>2.2.1</version>
</dependency>
Hiveの依存関係も追加します。ただし、Hive-HbaseHandler を追加する際は、OBKV-HBaseの依存関係との競合を避けるため、Hiveが提供する hbase-common および hadoop-common の依存関係を除外する必要があります。
<!-- Hive JDBC Driver -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Hive HBase Handler -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-hbase-handler</artifactId>
<version>${hive.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
</exclusion>
</exclusions>
</dependency>
Hiveの読み書き例
HiveがOBKV-HBaseに読み書きする例としては、外部テーブルの作成、外部テーブルへのクエリ実行、データの挿入などがあります。
Hiveで外部テーブルを作成する
外部テーブルを作成する構文は次のとおりです。
CREATE EXTERNAL TABLE if not exists {HiveTableName}(key string, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,{HbaseFamilyName}:{HbaseQualifiername}")
TBLPROPERTIES ("hbase.table.name" = "{HbaseTableName}", "hbase.mapred.output.outputtable" = "{HbaseTableName}");
ここで、各項目の説明は以下のとおりです。
HiveTableNameはHiveにおける外部テーブルの名前です。HbaseFamilyNameはHBaseにおけるColumn Familyの名前を指定します。HbaseQualifiernameはHBaseにおけるQualifierの名前を指定します。hbase.table.nameは対応するHBaseテーブルの名前を指定します。hbase.mapred.output.outputtableは書き込み時のターゲットHBaseテーブル名を指定します。
読み書きの例
注意
現在、HiveからOBKV-HBaseの基盤ファイルを直接読み取ることはサポートされていませんが、外部テーブルを関連付けたり作成したりすることで、OBKV-HBaseにおけるデータの読み書きをサポートしています。
次のOBKV-HBaseテーブルがあると仮定します。
-- テーブルグループを作成
CREATE TABLEGROUP `ecommerce_data` SHARDING = 'ADAPTIVE';
-- ユーザー行動テーブルを作成
CREATE TABLE `ecommerce_data$user_behavior` (
`K` varbinary(1024) NOT NULL, -- ユーザーID
`Q` varbinary(256) NOT NULL, -- 行動タイプのフィールド名
`T` bigint(20) NOT NULL, -- タイムスタンプ
`V` varbinary(1024) DEFAULT NULL, -- 行動データ値
PRIMARY KEY (`K`, `Q`, `T`)
) TABLEGROUP = `ecommerce_data`;
OBKV内のデータが以下のようであると仮定します。
obclient> SELECT * FROM ecommerce_data$user_behavior;
+----------+-----------------+----------------+-------------+
| K | Q | T | V |
+----------+-----------------+----------------+-------------+
| user_001 | avg_order_value | -1640995200000 | 172.03 |
| user_001 | last_login | -1640995200000 | 2024-01-15 |
| user_001 | login_frequency | -1640995200000 | 25 |
| user_001 | total_amount | -1640995200000 | 2580.5 |
| user_001 | total_orders | -1640995200000 | 15 |
| user_001 | user_age | -1640995200000 | 28 |
| user_001 | user_city | -1640995200000 | 深圳 |
| user_001 | user_name | -1640995200000 | 张三 |
| user_001 | user_phone | -1640995200000 | 138****8001 |
| user_002 | avg_order_value | -1640995200000 | 150.0 |
| user_002 | last_login | -1640995200000 | 2024-01-14 |
| user_002 | login_frequency | -1640995200000 | 18 |
| user_002 | total_amount | -1640995200000 | 1200.0 |
| user_002 | total_orders | -1640995200000 | 8 |
| user_002 | user_age | -1640995200000 | 32 |
| user_002 | user_city | -1640995200000 | 上海 |
| user_002 | user_name | -1640995200000 | 李四 |
| user_002 | user_phone | -1640995200000 | 138****8002 |
| user_003 | avg_order_value | -1640995200000 | 159.13 |
| user_003 | last_login | -1640995200000 | 2024-01-16 |
| user_003 | login_frequency | -1640995200000 | 35 |
| user_003 | total_amount | -1640995200000 | 3500.8 |
| user_003 | total_orders | -1640995200000 | 22 |
| user_003 | user_age | -1640995200000 | 25 |
| user_003 | user_city | -1640995200000 | 北京 |
| user_003 | user_name | -1640995200000 | 王五 |
| user_003 | user_phone | -1640995200000 | 138****8003 |
| user_004 | avg_order_value | -1640995200000 | 150.02 |
| user_004 | last_login | -1640995200000 | 2024-01-13 |
| user_004 | login_frequency | -1640995200000 | 22 |
| user_004 | total_amount | -1640995200000 | 1800.25 |
| user_004 | total_orders | -1640995200000 | 12 |
| user_004 | user_age | -1640995200000 | 30 |
| user_004 | user_city | -1640995200000 | 广州 |
| user_004 | user_name | -1640995200000 | 赵六 |
| user_004 | user_phone | -1640995200000 | 138****8004 |
| user_005 | avg_order_value | -1640995200000 | 122.26 |
| user_005 | last_login | -1640995200000 | 2024-01-16 |
| user_005 | login_frequency | -1640995200000 | 28 |
| user_005 | total_amount | -1640995200000 | 2200.75 |
| user_005 | total_orders | -1640995200000 | 18 |
| user_005 | user_age | -1640995200000 | 27 |
| user_005 | user_city | -1640995200000 | 深圳 |
| user_005 | user_name | -1640995200000 | 钱七 |
| user_005 | user_phone | -1640995200000 | 138****8005 |
| user_006 | avg_order_value | -1640995200000 | 168.0 |
| user_006 | last_login | -1640995200000 | 2024-01-15 |
| user_006 | login_frequency | -1640995200000 | 40 |
| user_006 | total_amount | -1640995200000 | 4200.0 |
| user_006 | total_orders | -1640995200000 | 25 |
| user_006 | user_age | -1640995200000 | 35 |
| user_006 | user_city | -1640995200000 | 杭州 |
| user_006 | user_name | -1640995200000 | 孙八 |
| user_006 | user_phone | -1640995200000 | 138****8006 |
| user_007 | avg_order_value | -1640995200000 | 175.03 |
| user_007 | last_login | -1640995200000 | 2024-01-17 |
| user_007 | login_frequency | -1640995200000 | 32 |
| user_007 | total_amount | -1640995200000 | 2800.5 |
| user_007 | total_orders | -1640995200000 | 16 |
| user_007 | user_age | -1640995200000 | 29 |
| user_007 | user_city | -1640995200000 | 成都 |
| user_007 | user_name | -1640995200000 | 周九 |
| user_007 | user_phone | -1640995200000 | 138****8007 |
| user_008 | avg_order_value | -1640995200000 | 150.08 |
| user_008 | last_login | -1640995200000 | 2024-01-14 |
| user_008 | login_frequency | -1640995200000 | 15 |
| user_008 | total_amount | -1640995200000 | 1350.75 |
| user_008 | total_orders | -1640995200000 | 9 |
| user_008 | user_age | -1640995200000 | 26 |
| user_008 | user_city | -1640995200000 | 西安 |
| user_008 | user_name | -1640995200000 | 吴十 |
| user_008 | user_phone | -1640995200000 | 138****8008 |
+----------+-----------------+----------------+-------------+
72 rows in set
OBKVテーブルにHive外部テーブルを作成します。
hive> CREATE EXTERNAL TABLE IF NOT EXISTS user_behavior_analysis(
> user_id string, -- OBKVのKフィールドにマッピング
> user_name string, -- Q='user_name' のV値にマッピング
> user_age string, -- Q='user_age' のV値にマッピング
> user_city string, -- Q='user_city' のV値にマッピング
> total_orders string, -- Q='total_orders' のV値にマッピング
> total_amount string, -- Q='total_amount' のV値にマッピング
> last_login string -- Q='last_login' のV値にマッピング
> )
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES (
> "hbase.columns.mapping" = ":key,user_behavior:user_name,
> user_behavior:user_age,
> user_behavior:user_city,
> user_behavior:total_orders,
> user_behavior:total_amount,
> user_behavior:last_login"
> )
> TBLPROPERTIES (
> "hbase.table.name" = "ecommerce_data",
> "hbase.mapred.output.outputtable" = "ecommerce_data"
> );
Hive-SQLを使用して外部テーブルをクエリします。
-- 全ユーザーの基本情報を照会する
hive> SELECT user_id, user_name, user_age, user_city FROM user_behavior_analysis LIMIT 5;
OK
user_001 张三 28 深圳
user_002 李四 32 上海
user_003 王五 25 北京
user_004 赵六 30 广州
user_005 钱七 27 深圳
Time taken: 5.127 seconds, Fetched: 5 row(s)
-- 高価値ユーザー(ここでは消費額が2000を超えるユーザーを指す)の情報を照会する
hive> SELECT user_id, user_name, user_city, total_amount, total_orders FROM user_behavior_analysis WHERE CAST(total_amount AS DOUBLE) > 2000;
OK
user_001 张三 深圳 2580.5 15
user_003 王五 北京 3500.8 22
user_005 钱七 深圳 2200.75 18
user_006 孙八 杭州 4200.0 25
user_007 周九 成都 2800.5 16
Time taken: 5.194 seconds, Fetched: 5 row(s)
-- 各都市のユーザー消費状況を照会する
hive> SELECT user_city, COUNT(*) as user_count, ROUND(AVG(CAST(total_amount AS DOUBLE)), 2) as avg_spending FROM user_behavior_analysis GROUP BY user_city ORDER BY avg_spending DESC;
OK
杭州 1 4200.0
北京 1 3500.8
成都 1 2800.5
深圳 2 2390.63
广州 1 1800.25
西安 1 1350.75
上海 1 1200.0
Time taken: 11.499 seconds, Fetched: 7 row(s)
-- 新規ユーザーデータを挿入する
hive> INSERT INTO user_behavior_analysis VALUES
> ('user_011', '赵小明', '26', '南京', '3', '450.0', '2024-01-23');
OK
Time taken: 8.714 seconds
hive> SELECT * FROM user_behavior_analysis WHERE user_id = 'user_011';
OK
user_011 赵小明 26 南京 3 450.0 2024-01-23
Time taken: 5.294 seconds, Fetched: 1 row(s)
-- OBKVから照会する
obclient> SELECT * FROM ecommerce_data$user_behavior WHERE K = 'user_011';
+----------+--------------+----------------+------------+
| K | Q | T | V |
+----------+--------------+----------------+------------+
| user_011 | last_login | -1750072416837 | 2024-01-23 |
| user_011 | total_amount | -1750072416837 | 450.0 |
| user_011 | total_orders | -1750072416837 | 3 |
| user_011 | user_age | -1750072416837 | 26 |
| user_011 | user_city | -1750072416837 | 南京 |
| user_011 | user_name | -1750072416837 | 赵小明 |
+----------+--------------+----------------+------------+
6 rows in set
-- ユーザー王五の情報を照会する
hive> SELECT * FROM user_behavior_analysis WHERE user_name = '王五';
OK
user_003 王五 25 北京 22 3500.8 2024-01-16
Time taken: 5.259 seconds, Fetched: 1 row(s)
-- ユーザー王五の情報を更新する
hive> INSERT INTO user_behavior_analysis
> SELECT
> user_id,
> user_name,
> user_age,
> user_city,
> CASE
> WHEN user_id = 'user_003' THEN '25' -- 王五は3件の注文を追加
> ELSE total_orders
> END as total_orders,
> CASE
> WHEN user_id = 'user_003' THEN '4200.0' -- 総消費額が3500.8から4200.0に増加
> ELSE total_amount
> END as total_amount,
> CASE
> WHEN user_id = 'user_003' THEN '2024-01-25' -- 最終ログイン日を更新
> ELSE last_login
> END as last_login
> FROM user_behavior_analysis;
hive> SELECT * FROM user_behavior_analysis WHERE user_name = '王五';
OK
user_003 王五 25 北京 25 4200.0 2024-01-25
Time taken: 5.172 seconds, Fetched: 1 row(s)