乾物丨時系列データベースパーティションチュートリアル(1)

1.なぜデータを分割するのですか?

データベースをパーティション化すると、データスループットを向上させながら、システム応答の遅延を大幅に減らすことができます。具体的には、パーティショニングには次の利点があります。

  • パーティション化により、大きなテーブルの管理が容易になります。データサブセットのメンテナンス操作も、テーブル全体ではなく必要なデータに対してのみ行われるため、より効率的です。優れたパーティショニング戦略は、クエリを満たすために必要な関連データのみを読み取ることにより、スキャンされるデータの量を削減します。すべてのデータが同じパーティションにある場合、データベースに対するクエリ、計算、およびその他の操作は、ディスクアクセスIOのボトルネックに制限されます。
  • パーティショニングにより、システムはすべてのリソースを最大限に活用できます。優れたパーティショニングスキームと並列コンピューティングにより、分散コンピューティングはすべてのノードを最大限に活用して、通常は1つのノードで完了するタスクを完了することができます。タスクをいくつかの散在するサブタスクに分割でき、各サブタスクが異なるパーティションにアクセスする場合、効率を向上させることができます。
  • パーティショニングにより、システムの可用性が向上します。パーティションのコピーは通常、異なる物理ノードに保存されるためです。したがって、パーティションが使用できなくなった後でも、システムは他のレプリカパーティションを呼び出して、ジョブの正常な動作を保証できます。

2.パーティション方式

DolphinDBは、範囲パーティション(RANGE)、ハッシュパーティション(HASH)、値パーティション(VALUE)、リストパーティション(LIST)、複合パーティション(COMPO)などのさまざまなパーティション分割方法をサポートしています。

  • 範囲パーティショニングは、間隔ごとにパーティションを作成します。これは、最も一般的に使用され、推奨されるパーティショニング方法です。範囲内の値を持つすべてのレコードをパーティションに入れることができます。
  • ハッシュパーティショニングは、ハッシュ関数を使用してパーティション列を操作し、指定された数のパーティションの確立を容易にします。
  • 値のパーティションは、株式取引日や株式取引月など、値ごとにパーティションを作成します。
  • リストのパーティション化は、ユーザーが列挙したリストに基づいており、値のパーティション化よりも柔軟性があります。
  • 複合パーティション化は非常に大量のデータに適しており、クエリには2つ以上のパーティション列が含まれることがよくあります。各パーティションの選択では、間隔、値、またはリストパーティションを使用できます。たとえば、値のパーティションは株式取引日に基づいており、範囲のパーティションは株式コードに基づいています。

データベース関数を使用してデータベースを作成できます。

语法:データベース(ディレクトリ、[partitionType]、[partitionScheme]、[locations])

パラメータ

directory:データベースが保存されるディレクトリDolphinDBには、メモリ内データベース、ディスク上のデータベース、分散ファイルシステム上のデータベースの3種類のデータベースがあります。インメモリデータベースを作成するには、ディレクトリは空です。ローカルデータベースを作成するには、ディレクトリはローカルファイルシステムディレクトリである必要があります。分散ファイルシステムでデータベースを作成するには、ディレクトリは「dfs://」で始まる必要があります。このチュートリアルでは、例としてWindowsローカルデータベースの作成を取り上げます。

partitionType:パーティションモード。範囲パーティション(RANGE)、ハッシュパーティション(HASH)、値パーティション(VALUE)、リストパーティション(LIST)、複合パーティション(COMPO)の5つの方法があります。

partitionScheme:パーティションスキーム。さまざまなパーティショニング方法に対応するパーティショニングスキームは次のとおりです。

6c5af97e99111771a9edb241ee11a46e.png

場所:各パーティションが配置されているノードの場所を指定します。分散ファイルシステムデータベースまたは複合パーティション(COMPO)タイプのデータベースの場合、locationsパラメーターは使用できません。


2.1範囲パーティション

範囲パーティションは、パーティションベクトルによって決定されます。パーティションベクトルは、開始値を含み、終了値を含まない間隔を表します。

次の例では、データベースデータベースに[0,5)と[5,10)の2つのパーティションがあります。関数append!を使用して、テーブルtをデータベースdbのパーティションテーブルptとして保存し、IDをパーティション列として使用します。

n = 1000000 
ID = rand(10、n)
x = rand(1.0、n)
t = table(ID、x)
db = database( "dfs:// rangedb"、RANGE、0 5 10)

pt = db.createPartitionedTable (t、 `pt、` ID)
pt.append!(t); 

pt = loadTable(db、 `pt)
ptからcount(x)を選択

6f925802b778e71f0fa201f30f78c09f.png


2.2ハッシュパーティション

ハッシュパーティションは、パーティション列のハッシュ関数を使用してパーティションを生成します。ハッシュパーティショニングは、指定された数のパーティションを生成する簡単な方法です。ただし、特にパーティション列の値の分布が偏っている場合、ハッシュパーティションはパーティションの同じサイズを保証できないことに注意してください。さらに、パーティション列の連続領域でデータを検索する場合、ハッシュパーティションの効率は領域パーティションまたは値パーティションよりも低くなります。

次の例では、データベースデータベースに2つのパーティションがあります。関数append!を使用して、テーブルtをデータベースdbのパーティションテーブルptとして保存し、IDをパーティション列として使用します。

n = 1000000 
ID = rand(10、n)
x = rand(1.0、n)
t = table(ID、x)
db = database( "dfs:// hashdb"、HASH、[INT、2])

pt = db .createPartitionedTable(t、 `pt、` ID)
pt.append!(t); 

pt = loadTable(db、 `pt)
ptからcount(x)を選択

80270b36bebb1d2446f19e6625f66688.png

2.3バリューパーティション

値パーティションは、値を使用してパーティションを表します。次の例では、204個のパーティションを定義しています。各ゾーンは、2000年1月から2016年12月までの月を表します。

n = 1000000 
month = take(2000.01M..2016.12M、n)
x = rand(1.0、n)
t = table(month、x)

db = database( "dfs:// valuedb"、VALUE、2000.01M .. 2016.12M)

pt = db.createPartitionedTable(t、 `pt、` month)
pt.append!(t)

pt = loadTable(db、 `pt)
ptからcount(x)を選択

67865bbac45ea112b87e52dd4a342346.png


2.4リストパーティション

LISTパーティションでは、パーティションを表すために複数の要素を含むリストを使用します。次の例には2つのパーティションがあり、最初のパーティションには3つのストックコードが含まれ、2番目のパーティションには2つのストックコードが含まれています。

n = 1000000
ティッカー= rand( `MSFT`GOOG`FB`ORCL`IBM、n); 
x = rand(1.0、n)
t = table(ticker、x)

db = database( "dfs:// listdb"、LIST、[`IBM`ORCL`MSFT、` GOOG`FB])
pt = db.createPartitionedTable( t、 `pt、` ticker)
pt.append!(t)

pt = loadTable(db、 `pt)
ptからcount(x)を選択

09c0318879b18f933acc9801ba2d936f.png


2.5複合パーティション

組み合わせ(COMPO)パーティションは、2つまたは3つのパーティション列を定義できます。各列は、範囲(RANGE)、値(VALUE)、またはリスト(LIST)によって個別に分割できます。結合されたパーティションの複数の列は論理的に並列であり、従属関係や優先順位の関係はありません。

n = 1000000 
ID = rand(100、n)
dates = 2017.08.07..2017.08.11 
date = rand(dates、n)
x = rand(10.0、n)
t = table(ID、date、x)

dbDate =データベース(、VALUE、2017.08.07..2017.08.11)
dbID = database(、RANGE、0 50 100)
db = database( "dfs:// compoDB"、COMPO、[dbDate、dbID])
pt = db.createPartitionedTable( t、 `pt、` date`ID)
pt.append!(t)

pt = loadTable(db、 `pt)
ptからcount(x)を選択

上記の例では、5つの値のパーティションを作成します。

0d76d97408efc2a4705b89e79eb44f5a.png

20170807パーティションには、2つの範囲パーティションがあります。

b22745d6c82ab7fec6b3765c168e49af.png


データベースパーティショニングチュートリアル(2)では、データベースパーティショニングの原則と特別なパーティショニングスキームを紹介します。

おすすめ

転載: blog.51cto.com/15022783/2562523