列指向ストレージは、列ごとにデータを格納および処理するデータ管理方法です。Lindorm コンピュートエンジンは、半構造化データと構造化データを格納するために列指向ストレージを提供します。行指向ストレージと比較して、列指向ストレージはクエリ応答時間を短縮し、I/O リソースを節約します。このトピックでは、コンピューティングエンジンを使用して Lindorm 列指向データにアクセスする方法について説明します。
背景情報
Lindorm 列指向ストレージは、列指向の分散ストレージサービスです。列指向ストレージは、車載インターネット (IoV)、モノのインターネット (IoT)、注文、ログなどのシナリオで大量の半構造化データと構造化データを格納するのに適しています。列指向ストレージは、次のコア機能を提供します。
コンピューティングと分析
Lindorm コンピュートエンジンは、列指向データにアクセスして、インタラクティブな分析とオンラインコンピューティングを実行できます。列指向ストレージは、データ分散機能と豊富なインデックス機能を提供し、計算プロセスにおけるデータの位置特定と配置を効果的に高速化できます。SQL ステートメントを使用して、大量の主キーデータを追加、削除、変更、およびクエリできます。
高スループット
列指向ストレージは水平方向のスケーリングをサポートし、1 分あたりテラバイトのデータを読み書きする機能を提供します。これにより、IoV データの迅速なインポート、モデル トレーニング データセット アクセス、大規模なレポート分析と生成などの高スループット データシナリオに適しています。
費用対効果
Lindorm は、列指向の高圧縮率アルゴリズム、高密度低コストメディア、ホットデータとコールドデータの分離、圧縮エンコーディング、コールドデータアーカイブストレージなどのテクノロジーを実装しています。自己管理型ストレージと比較して、Lindorm 列指向ストレージはストレージコストを大幅に削減し、大量のデータを低コストでアーカイブおよび保存できます。
高可用性
イレージャーコーディングなどのテクノロジーを使用することにより、Lindorm 列指向ストレージは分散データセットの高可用性を確保し、単一障害点 (SPOF) のリスクを排除します。
オープンソースサービスとの互換性
列指向ストレージは、Iceberg API などの複数のオープンソース標準 API と互換性があります。列指向ストレージは、Spark や Flink などのコンピューティングエンジンにも接続できます。このようにして、列指向ストレージを主流のデータエコシステムにシームレスに統合できます。
ホットデータとコールドデータの分離
ビジネス要件に基づいて、ホットデータとコールドデータを異なるストレージメディアに保存できます。これにより、コールドデータへのアクセスによって発生するパフォーマンスオーバーヘッドを削減しながら、ストレージコストを効果的に削減できます。
前提条件
注意事項 をお読みください。
ジョブモードに応じて、次の操作が完了していることを確認してください。
JDBC ジョブ: アプリケーション開発で JDBC を使用する。
JAR ジョブ: Java でジョブを作成する。
Python ジョブ: Python でジョブを作成する。
コールドデータとホットデータの分離機能を使用する場合は、Capacity ストレージが有効になっていることを確認してください。詳細については、「Capacity ストレージを有効にする」をご参照ください。
機能説明
DDL
名前空間
テーブル
パーティション
DML
テーブル
パーティション内のデータの書き換え
一定期間、列指向パーティションにデータを書き込んだ後、rewrite_data_files コマンドまたは rewrite_manifest コマンドを実行してデータを書き換えることができます。たとえば、小さなファイルを大きなファイルに結合して、データまたはメタデータの冗長性を削減し、データクエリの パフォーマンスを向上させることができます。詳細については、「rewrite_data_files」および「rewrite_manifest」をご参照ください。
rewrite_data_files コマンドまたは rewrite_manifest コマンドを実行すると、データベースリソースが消費されます。オフピーク時にコマンドを実行することをお勧めします。
例 1:
USE lindorm_columnar; CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable');例 2:
USE lindorm_columnar; CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable', where => 'city=\"beijing\"');例 3:
USE lindorm_columnar; CALL lindorm_columnar.system.rewrite_manifest('mydb.mytable');
ホットデータとコールドデータのストレージ
ほとんどの場合、頻繁にアクセスされるデータは高 パフォーマンス ストレージに保存され、アクセス頻度の低い履歴データは低コストストレージに移行されます。これにより、ストレージコストを削減し、 パフォーマンス を向上させることができます。Lindorm は、L1、L2、L3 の 3 つのレベルでホットデータとコールドデータの分離をサポートしています。ビジネス要件に基づいて、ホットデータとコールドデータ間の変換ポリシーを開発できます。データレイクサービスを使用して、ホットデータストレージとコールドデータストレージ間でデータを自動的にダンプできます。これにより、主要サービスの応答時間を延長することなく、ストレージコストを効果的に管理できます。
Lindorm で列指向データの自動ホットコールド変換機能を有効にするには、Lindorm テクニカルサポート (DingTalk ID: s0s3eg3) にお問い合わせください。
パラメーター
列指向テーブルを作成するときは、コールドまたはホットストレージ (CHS) 属性を定義して、列指向テーブルの時間パーティションに基づいてコールドストレージとホットストレージ間でデータをダンプする方法を指定できます。次の表に、CHS パラメーターの構成方法を示します。
パラメーター | 説明 |
CHS | コールドデータとホットデータの分離機能を有効にするかどうかを指定します。次のリストは、このパラメーターを指定する方法について説明しています。
|
CHS_L1 | L1 のストレージタイプを指定します。形式: 説明 テーブルを作成するときにこのパラメーターを指定しない場合、デフォルトのストレージタイプは Capacity ストレージです。 クラウドにデータを保存する場合、目的のストレージタイプを次のいずれかの値に設定できます。
ローカルディスクにデータを保存する場合、目的のストレージタイプを次のいずれかの値に設定できます。
|
CHS_L2 | L2 のストレージタイプを指定します。CHS_L2 の形式と有効な値は CHS_L1 と同じです。 説明 CHS_L2 パラメーターを指定する必要があります。 |
CHS_L3 | L3 のストレージタイプを指定します。CHS_L3 の形式と有効な値は CHS_L1 と同じです。 説明 CHS パラメーターに 2 つの長い整数を設定する場合は、CHS_L3 パラメーターを指定する必要があります。 |
CHS_EXP | パーティションデータ時間の取得方法を指定します。形式: 説明:
Lindorm コンピュートエンジンは、CHS_EXP パラメーターから返された最大パーティションデータ時間を取得し、CHS パラメーターで指定された値に基づいてパーティションデータを対応するストレージにダンプします。 |
例
例 1:
table0という名前のテーブルを作成します。パーティションフィールド名は、年、月、日です。指定したホットデータとコールドデータの分離ポリシーに基づいて、1 か月 (2,592,000 秒) 前に保存されたデータは自動的に Capacity ストレージにダンプされます。次のステートメントを実行してテーブルを作成できます。CREATE TABLE table0 (col0 INT,year STRING,month STRING,day STRING) PARTITIONED BY (year,month) TBLPROPERTIES 'CHS'='2592000', 'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE', 'CHS_EXP'='toSec(year,yyyy,month,MM,day,dd)' );例 2:
table0のホットデータとコールドデータの分離ポリシーを変更します。変更後、1 か月 (2,592,000 秒) 前に保存されたデータは自動的に Capacity ストレージにダンプされ、3 か月 (5,184,000 秒) 前に保存されたデータは自動的にアーカイブストレージにダンプされます。次のステートメントを実行してテーブルを更新できます。ALTER TABLE table0 SET TBLPROPERTIES ( 'CHS'='2592000,5184000', 'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE', 'CHS_L3'='storagetype=CLOUD_ARCHIVE_STORAGE', 'CHS_EXP'='toSec(year,yyyy,month,MM,day,dd)' );例 3:
table1という名前のテーブルを作成します。パーティションフィールド名は dt です。例: 2020/12/1。指定したホットデータとコールドデータの分離ポリシーに基づいて、1 か月 (2,592,000 秒) 前に保存されたデータは自動的に Capacity ストレージにダンプされ、3 か月 (5,184,000 秒) 前に保存されたデータは自動的にアーカイブストレージにダンプされます。次のステートメントを実行してテーブルを作成できます。CREATE TABLE table1 (col0 INT,dt STRING) PARTITIONED BY (dt) TBLPROPERTIES ( 'CHS'='2592000,5184000', 'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE', 'CHS_L3'='storagetype=CLOUD_ARCHIVE_STORAGE', 'CHS_EXP'='toSec(dt,yyyy/MM/dd)' );
注意事項
テーブルを作成するときに CHS パラメーターを指定できます。ホットデータとコールドデータの分離ポリシーを変更する場合は、
ALTER TABLE ...SET TBLPROPERTIES...ステートメントを実行できます。CHS パラメーターを誤って指定した場合、テーブルは予期どおりに作成および更新できますが、コールドストレージとホットストレージ間でデータを自動的にダンプすることはできません。
ホットデータとコールドデータのダンプは非同期モードでトリガーされます。データダンプ中およびデータダンプ後もデータアクセスは影響を受けませんが、アクセス パフォーマンス はストレージメディアによって異なる場合があります。
列指向テーブルの時間パーティションに基づいてのみ、ホットデータとコールドデータの分離ポリシーを実装できます。
ベストプラクティス
次の方法を使用して、データクエリまたはコンピューティングを高速化できます。
主キーを指定する
大量のデータセットがテーブルに保存されている場合は、主キーを指定してクエリを高速化できます。主キーデータの範囲が小さいほど、高速化の結果が向上します。
この例では、次のステートメントを実行してサンプルテーブルを作成します。
USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey INT NOT NULL,
o_custkey INT,
o_orderstatus STRING,
o_totalprice DOUBLE,
o_orderdate STRING,
o_orderpriority STRING,
o_clerk STRING,
o_shippriority INT,
o_comment STRING)
PARTITIONED BY (bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderkey'); 例 1:
USE lindorm_columnar; SELECT * FROM orders WHERE o_orderkey=18394;例 2:
USE lindorm_columnar; SELECT count(*) FROM orders WHERE o_orderkey>100000 AND o_orderkey<200000;例 3:
USE lindorm_columnar; SELECT count(*) FROM orders WHERE o_orderkey>100000;
パーティションを追加する
Lindorm の列指向ストレージエンジンでは、パーティションは互いに物理的に分離されています。パーティションを追加して、データクエリを高速化できます。
この例では、次のステートメントを実行してサンプルテーブルを作成します。
USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey INT NOT NULL,
o_custkey INT,
o_orderstatus STRING,
o_totalprice DOUBLE,
o_orderdate STRING NOT NULL,
o_orderpriority STRING,
o_clerk STRING,
o_shippriority INT,
o_comment STRING)
PARTITIONED BY (o_orderdate, bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderdate,o_orderkey');例 1:
USE lindorm_columnar; SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate='2022-01-01' GROUP BY o_orderdate;例 2:
USE lindorm_columnar; SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate>='2022-01-01' AND o_orderdate<='2022-01-07' GROUP BY o_orderdate;
クエリ高速化
特定のテーブルまたはテーブルの特定のパーティション内のデータを書き換えることができます。これにより、データの秩序とコンパクトさが向上し、データスキャン パフォーマンス が向上します。
この例では、次のステートメントを実行してサンプルテーブルを作成します。
CREATE TABLE mydb.mytable (
id INT NOT NULL,
city STRING NOT NULL,
name STRING,
score INT)
partitioned by (city, bucket(4, id))
tblproperties('primary-key' = 'id,city');例 1: mydb.mytable テーブル内のデータを書き換えます。
CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable');例 2: 特定のパーティション内のデータを書き換えます。
CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable', where => 'city=\"beijing\"');
データを書き換えた後、クエリの効率をさらに向上させたい場合は、次のステートメントを実行してテーブルパラメーターを指定できます。
ALTER TABLE mydb.mytable SET TBLPROPERTIES ('read.scan-major-rewritten-files-only' = true);パラメーターの説明
read.scan-major-rewritten-files-only: クエリのデータ範囲を指定します。データ型は BOOLEAN です。有効な値:
true: 書き換えられたデータのみをクエリします。書き換えられていない増分データはクエリしません。
false (デフォルト): すべてのデータをクエリします。
非主キークエリ
パーティション内のデータを書き換えると、データは列指向テーブルの主キーでソートされます。テーブルを作成した後、要件に基づいてソートキーを指定して、非主キークエリの高速化できます。
ソートキーを指定した後、パーティション内のデータを書き換えて、高速化 パフォーマンス を確保する必要があります。書き換えられたデータのみをクエリでき、増分データはクエリできません。
この例では、次のステートメントを実行してサンプルテーブルを作成します。
USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey INT NOT NULL,
o_custkey INT,
o_orderstatus STRING,
o_totalprice DOUBLE ,
o_orderdate STRING ,
o_orderpriority STRING,
o_clerk STRING,
o_shippriority INT,
o_comment STRING)
PARTITIONED BY (bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderkey',
'read.scan-major-rewritten-files-only' = 'true');次のステートメントを実行して、ソートキーを指定します。
ALTER TABLE orders WRITE ORDERED BY o_shippriority,o_totalprice;次のステートメントを実行して、データを書き換えます。
CALL lindorm_columnar.system.rewrite_data_files(table => 'orders');次の SQL ステートメントを実行して、書き換えられたデータをクエリできます。
例 1:
USE lindorm_columnar; SELECT count(*) FROM orders WHERE o_shippriority=0;例 2:
USE lindorm_columnar; SELECT count(*) FROM orders WHERE o_shippriority=0 AND o_totalprice>999.9;