NoSQL のデヌタ モデル蚭蚈の特城

導入

NoSQL のデヌタ モデル蚭蚈の特城 「その堎に留たるためにはできるだけ早く走らなければなりたせん。
そしおどこかに行くには少なくずもXNUMX倍の速さで走らなければなりたせん」
(c) 䞍思議の囜のアリス

少し前に講挔を䟝頌されたした アナリスト 圓瀟は、デヌタ モデルの蚭蚈をテヌマにしおいたす。なぜなら、長期間 (堎合によっおは数幎間) プロゞェクトに携わっおいるず、IT テクノロゞヌの䞖界で自分たちの呚りで䜕が起こっおいるのかを芋倱っおしたうからです。 圓瀟では (たたたたですが) 倚くのプロゞェクトが (少なくずも珟時点では) NoSQL デヌタベヌスを䜿甚しおいないため、私の講矩では、HBase の䟋を䜿甚しお NoSQL デヌタベヌスに別途泚意を払い、資料のプレれンテヌションをそれらのデヌタベヌスに向けるようにしたした。䜿ったこずのない人でも効果がありたす。 特に、数幎前に読んだ䟋を䜿甚しお、デヌタ モデル蚭蚈のいく぀かの機胜を説明したした。 Amandeep Khurana による蚘事「HB ase スキヌマ蚭蚈の抂芁」。 䟋を分析するずき、䞻芁なアむデアを聎衆によりよく䌝えるために、同じ問題を解決するためのいく぀かのオプションを比范したした。

最近、「䜕もするこずがなくなったので」、理論䞊の蚈算はどれくらい実践に盞圓するだろうか、ずいう質問を自分自身に問いかけたした (XNUMX 月の長い週末が隔離生掻であったこずは特にこれに圹立ちたす)。 実は、この蚘事のアむデアはこうしお生たれたした。 数日間 NoSQL を䜿甚しおきた開発者は、そこから䜕も新しいこずを孊べない可胜性がありたす (したがっお、すぐに蚘事の半分を読み飛ばす可胜性がありたす)。 しかし、 アナリストNoSQL をただ詳しく扱ったこずがない人にずっおは、HBase のデヌタ モデル蚭蚈の機胜に぀いおの基本的な理解を埗るのに圹立぀ず思いたす。

分析䟋

私の意芋では、NoSQL デヌタベヌスの䜿甚を開始する前に、メリットずデメリットを慎重に怜蚎し、比范怜蚎する必芁がありたす。 倚くの堎合、問題は埓来のリレヌショナル DBMS を䜿甚しお解決できる可胜性が最も高くなりたす。 したがっお、特別な理由がない限り NoSQL を䜿甚しないほうがよいでしょう。 それでも NoSQL デヌタベヌスを䜿甚するこずに決めた堎合は、ここでの蚭蚈アプロヌチが倚少異なるこずを考慮する必芁がありたす。 特に、これたでリレヌショナル DBMS のみを扱っおきた人にずっおは珍しいものがあるかもしれたせん (私の芳察によれば)。 したがっお、「リレヌショナル」の䞖界では、通垞、問題領域のモデル化から始めお、必芁に応じおモデルを非正芏化したす。 NoSQL では、 デヌタを扱うために予想されるシナリオを盎ちに考慮する必芁がありたす そしお最初にデヌタを非正芏化したす。 さらに、他にも倚くの違いがありたすが、それに぀いおは以䞋で説明したす。

次の「合成」問題を考えおみたしょう。これに぀いおは匕き続き取り組んでいきたす。

䜕らかの抜象的な゜ヌシャルネットワヌクのナヌザヌの友人リストのストレヌゞ構造を蚭蚈する必芁がありたす。 単玔化するために、すべおの接続がLinkedin ではなく Instagram のように盎接行われおいるず仮定したす。 この構造により、次のこずが効果的に可胜になりたす。

  • ナヌザヌ A がナヌザヌ B を読むかどうかの質問に答えたす (読み取りパタヌン)
  • ナヌザヌ B からナヌザヌ A のサブスクリプション/サブスクリプション解陀の堎合に接続の远加/削陀を蚱可する (デヌタ倉曎テンプレヌト)

もちろん、問題を解決するには倚くのオプションがありたす。 通垞のリレヌショナル デヌタベヌスでは、おそらく単玔に関係のテヌブルを䜜成し (たずえば、この「友人」を含む家族、職堎などのナヌザヌ グルヌプを保存する必芁がある堎合に兞型化される)、最適化するこずになるでしょう。アクセス速床を䞊げるず、むンデックス/パヌティショニングが远加されたす。 おそらく、最終的なテヌブルは次のようになりたす。

USER_ID
友人ID

Vasya
ペチャ

Vasya
OLYA

以䞋、明確にし、よりよく理解するために、ID の代わりに名前を瀺したす。

HBase の堎合、次のこずがわかっおいたす。

  • フルテヌブルスキャンにならない効率的な怜玢が可胜 キヌによる排他的
    • 実際、倚くの人にずっお銎染みのある SQL ク゚リをそのようなデヌタベヌスに蚘述するのは悪い考えであるのはそのためです。 もちろん、技術的には、結合やその他のロゞックを含む SQL ク゚リを同じ Impala から HBase に送信できたすが、それがどれほど効果的になるか...

したがっお、ナヌザヌ ID をキヌずしお䜿甚する必芁がありたす。 そしお、「友達の ID をどこに、どのように保存するか?」ずいうテヌマに぀いお私が最初に考えたのは、 それらを列に栌玍するずいうアむデアかもしれたせん。 この最も明癜で「単玔な」オプションは次のようになりたす (これを次のように呌びたす) オプション 1 (デフォルト)さらなる参照のため):

行キヌ
講挔者

Vasya
1:ペティア
2オヌリダ
3ダヌシャ

ペチャ
1マヌシャ
2:ノァシャ

ここで、各行は 1 人のネットワヌク ナヌザヌに察応したす。 列には友人の数に応じお 2、1、... ずいう名前が付けられ、列には友人の ID が栌玍されたす。 各行の列数が異なるこずに泚意するこずが重芁です。 䞊図の䟋では、2 ぀の行には 3 ぀の列 (1、2、XNUMX) があり、XNUMX 番目の行には XNUMX ぀の列 (XNUMX ず XNUMX) だけがありたす。ここでは、リレヌショナル デヌタベヌスにはない XNUMX ぀の HBase プロパティを䜿甚したした。

  • 列の構成を動的に倉曎する機胜 (友達の远加 -> 列の远加、友達の削陀 -> 列の削陀)
  • 行が異なれば列構成も異なる堎合がありたす

構造がタスクの芁件に準拠しおいるかどうかを確認しおみたしょう。

  • デヌタの読み取り: Vasya が Olya に登録されおいるかどうかを理解するには、以䞋を匕く必芁がありたす。 行党䜓 RowKey = “Vasya” ずいうキヌを䜿甚しお、列の倀を Olya が「芋぀かる」たで䞊べ替えたす。 たたは、すべおの列の倀を反埩凊理しお、Olya を「満たさない」ず答え False を返したす。
  • デヌタ線集フレンド远加: 同様のタスクでは、枛算する必芁もありたす 行党䜓 RowKey = "Vasya" キヌを䜿甚しお友人の総数を数えたす。 新しい友達の ID を曞き留める必芁がある列の番号を決定するには、この友達の合蚈数が必芁です。
  • デヌタ倉曎フレンド削陀:
    • 匕き算が必芁 行党䜓 RowKey = “Vasya” キヌを䜿甚しお列を䞊べ替えお、削陀する友人が蚘録されおいる列を芋぀けたす。
    • 次に、友人を削陀した埌、番号付けに「ギャップ」が生じないように、すべおのデヌタを XNUMX ぀の列に「シフト」する必芁がありたす。

ここで、「条件付きアプリケヌション」偎で実装する必芁があるこれらのアルゎリズムの生産性を評䟡しおみたしょう。 O-象城䞻矩。 仮説的な゜ヌシャル ネットワヌクのサむズを n ず衚したす。 この堎合、1 人のナヌザヌが持぀こずができる友達の最倧数は (n-1) です。 O シンボルの䜿甚の枠組み内では重芁ではないため、この目的ではこれ (-XNUMX) をさらに無芖できたす。

  • デヌタの読み取り: 行党䜓を枛算し、制限内のすべおの列を反埩凊理する必芁がありたす。 これは、コストの䞊限掚定倀が玄 O(n) になるこずを意味したす。
  • デヌタ線集フレンド远加: 友達の数を刀断するには、行のすべおの列を反埩凊理しおから、新しい列を挿入する必芁がありたす => O(n)
  • デヌタ倉曎フレンド削陀:
    • 远加ず同様 - 制限内のすべおの列を通過する必芁がありたす => O(n)
    • 列を削陀した埌、列を「移動」する必芁がありたす。 これを「正面から」実装するず、制限内で最倧 (n-1) 個の操䜜が必芁になりたす。 しかし、ここずさらに実践的な郚分では、固定数の操䜜に察しお「擬䌌シフト」を実装する別のアプロヌチを䜿甚したす。぀たり、n に関係なく、䞀定の時間がそれに費やされたす。 この䞀定時間 (正確には O(2)) は、O(n) に比べお無芖できたす。 このアプロヌチを次の図に瀺したす。「最埌の」列からデヌタを削陀する列にデヌタをコピヌし、最埌の列を削陀するだけです。
      NoSQL のデヌタ モデル蚭蚈の特城

合蚈するず、すべおのシナリオで O(n) の挞近的な蚈算耇雑性が埗られたした。
おそらくすでにお気づきかず思いたすが、ほずんどの堎合、デヌタベヌスから行党䜓を読み取る必芁があり、XNUMX 件䞭 XNUMX 件の堎合は、すべおの列を調べお友人の総数を蚈算するだけです。 したがっお、最適化の詊みずしお、各ネットワヌク ナヌザヌの友人の合蚈数を栌玍する「カりント」列を远加できたす。 この堎合、行党䜓を読み取っお友人の総数を蚈算するこずはできず、XNUMX ぀の「カりント」列だけを読み蟌むだけです。 重芁なこずは、デヌタを操䜜するずきに「カりント」を曎新するこずを忘れないこずです。 それ。 私たちは改善されたす オプション 2 (カりント):

行キヌ
講挔者

Vasya
1:ペティア
2オヌリダ
3ダヌシャ
カりント3

ペチャ
1マヌシャ
2:ノァシャ

カりント2

最初のオプションず比范するず、次のようになりたす。

  • デヌタの読み取り「ノァシャはオヌリダを読みたすか」ずいう質問に察する答えを埗るために。 䜕も倉わっおいない => O(n)
  • デヌタ線集フレンド远加: 行党䜓を読み取っおその列を反埩する必芁がなくなり、「count」列などの倀のみを取埗できるため、新しい友人の挿入が簡玠化されたした。 新しい友人を挿入するための列番号をすぐに決定したす。 これにより、蚈算量が O(1) に削枛されたす。
  • デヌタ倉曎フレンド削陀: 友人を削陀する堎合、この列を䜿甚しお、デヌタを XNUMX セル巊に「シフト」するずきの I/O 操䜜の数を枛らすこずもできたす。 ただし、削陀する必芁がある列を芋぀けるために列を反埩凊理する必芁は䟝然ずしお残るため、 => O(n)
  • 䞀方、デヌタを曎新する堎合、毎回「count」列を曎新する必芁がありたすが、これには䞀定の時間がかかり、O シンボルの枠組み内では無芖できたす。

䞀般に、オプション 2 の方が若干最適であるように芋えたすが、どちらかずいうず「革呜ではなく進化」に近いものです。 「革呜」を起こすために必芁なのは オプション 3 (列).
すべおを「ひっくり返しお」みたしょう私たちが任呜したす 列名 ナヌザヌID 列自䜓に䜕を曞くかは私たちにずっおもはや重芁ではありたせん。それを番号 1 にしたす (䞀般に、圹立぀ものをそこに保存できたす。たずえば、グルヌプ「家族/友人/など」)。 このアプロヌチは、これたでに NoSQL デヌタベヌスを䜿甚した経隓のない、準備ができおいない「玠人」を驚かせるかもしれたせんが、このアプロヌチこそが、このタスクで HBase の可胜性をより効果的に䜿甚できるようにするものです。

行キヌ
講挔者

Vasya
ペティア: 1
オリダ: 1
ダヌシャ: 1

ペチャ
マヌシャ1
ノァシャ: 1

ここでは、いく぀かの利点が䞀床に埗られたす。 これらを理解するために、新しい構造を分析し、蚈算の耇雑さを芋積もっおみたしょう。

  • デヌタの読み取り: Vasya が Olya に登録されおいるかどうかの質問に答えるには、「Olya」ずいう 1 ぀の列を読むだけで十分です。そこにあれば、答えは True、そうでない堎合は、False => O(XNUMX)
  • デヌタ線集フレンド远加: 友達の远加: 新しい列「友達 ID」を远加するだけです => O(1)
  • デヌタ倉曎フレンド削陀: Friend ID 列を削陀するだけです => O(1)

ご芧のずおり、このストレヌゞ モデルの倧きな利点は、必芁なすべおのシナリオで XNUMX ぀の列のみを䜿甚しお操䜜し、デヌタベヌスから行党䜓を読み取る必芁がなく、さらにこの行のすべおの列を列挙する必芁がないこずです。 そこで止めおもいいのですが...

戞惑いながらも、デヌタベヌスにアクセスする際のパフォヌマンスの最適化ず I/O 操䜜の削枛ずいう道をもう少し進むこずもできたす。 完党な関係情報を行キヌ自䜓に盎接保存したらどうなるでしょうか? ぀たり、userID.friendID? のような耇合キヌを䜜成したす。 この堎合、その行の列を読み取る必芁すらありたせん (オプション 4(行)):

行キヌ
講挔者

ノァシャ・ペティア
ペティア: 1

ノァシャ・オリャ
オリダ: 1

ノァシャ・ダシャ
ダヌシャ: 1

ペティア・マヌシャ
マヌシャ1

ペチャ・ノァシャ
ノァシャ: 1

明らかに、このような構造におけるすべおのデヌタ操䜜シナリオの評䟡は、以前のバヌゞョンず同様に O(1) になりたす。 オプション 3 ずの違いは、デヌタベヌスでの I/O 操䜜の効率のみです。

さお、最埌の「お蟞儀」。 オプション 4 では、行キヌが可倉長になり、パフォヌマンスに圱響を䞎える可胜性があるこずが簡単にわかりたす (ここで、HBase はデヌタをバむトのセットずしお栌玍し、テヌブル内の行はキヌによっお゜ヌトされるこずを思い出しおください)。 さらに、シナリオによっおは凊理が必芁になる可胜性があるセパレヌタヌもありたす。 この圱響を排陀するには、userID ず friendsID のハッシュを䜿甚できたす。䞡方のハッシュの長さは䞀定であるため、区切り文字を䜿甚せずに単玔に連結できたす。 するず、テヌブル内のデヌタは次のようになりたす(オプション 5(ハッシュ)):

行キヌ
講挔者

dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994
ペティア: 1

dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a
オリダ: 1

dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a
ダヌシャ: 1

1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1
マヌシャ1

1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0
ノァシャ: 1

明らかに、私たちが怜蚎しおいるシナリオでこのような構造を扱うアルゎリズムの耇雑さは、オプション 4、぀たり O(1) の耇雑さず同じになりたす。
蚈算の耇雑さのすべおの掚定倀を XNUMX ぀の衚にたずめおみたしょう。

友達を远加する
友人の安吊を確認する
友達を削陀する

オプション 1 (デフォルト)
ON
ON
ON

オプション 2 (カりント)
O1
ON
ON

オプション 3 (列)
O1
O1
O1

オプション 4 (行)
O1
O1
O1

オプション 5 (ハッシュ)
O1
O1
O1

ご芧のずおり、オプション 3  5 が最も望たしいず思われ、理論的には必芁なすべおのデヌタ操䜜シナリオを䞀定時間で確実に実行できたす。 私たちのタスクの条件では、ナヌザヌの友人党員のリストを取埗するずいう明瀺的な芁件はありたせんが、実際のプロゞェクト掻動では、優れたアナリストずしお、そのようなタスクが発生する可胜性があるこずを「予枬」し、 「ストロヌを広げおください。」 したがっお、私の同情は遞択肢 3 の偎にありたす。しかし、実際のプロゞェクトでは、この芁求は他の手段ですでに解決されおいる可胜性が非垞に高いため、問題党䜓の䞀般的なビゞョンがなければ、この芁求は行わない方が良いでしょう。最終的な結論。

実隓の準備

䞊蚘の理論的議論を実際にテストしおみたいず思いたす。これが、長い週末の間に思い぀いたアむデアの目暙でした。 これを行うには、デヌタベヌスを䜿甚するための説明されたすべおのシナリオにおける「条件付きアプリケヌション」の動䜜速床ず、゜ヌシャル ネットワヌク (n) のサむズの増加に䌎うこの時間の増加を評䟡する必芁がありたす。 私たちが興味を持ち、実隓䞭に枬定するタヌゲットパラメヌタは、「条件付きアプリケヌション」が XNUMX ぀の「ビゞネス操䜜」を実行するのに費やした時間です。 「ビゞネス取匕」ずは、次のいずれかを意味したす。

  • 新しい友達を XNUMX 人远加したす
  • ナヌザヌ A がナヌザヌ B の友達かどうかを確認する
  • 友人を XNUMX 人削陀する

したがっお、最初の声明で抂説した芁件を考慮するず、怜蚌シナリオは次のようになりたす。

  • デヌタ蚘録。 サむズ n の初期ネットワヌクをランダムに生成したす。 「珟実䞖界」に近づけるために、各ナヌザヌが持぀友達の数も確率倉数になりたす。 「条件付きアプリケヌション」が生成されたすべおのデヌタを HBase に曞き蟌む時間を枬定したす。 次に、結果の時間を远加された友達の総数で割りたす。これが、XNUMX ぀の「ビゞネス操䜜」の平均時間を取埗する方法です。
  • デヌタの読み取り。 ナヌザヌごずに、ナヌザヌが賌読しおいるかどうかを回答する必芁がある「パヌ゜ナリティ」のリストを䜜成したす。 リストの長さ = ナヌザヌの友人のおよその数。チェックされた友人の半分に぀いおは答えが「はい」、残りの半分に぀いおは答えが「いいえ」である必芁がありたす。 チェックは、「はい」ず「いいえ」の回答が亀互になる順序で実行されたす (぀たり、1 回ごずに、オプション 2 ず XNUMX の行のすべおの列を調べる必芁がありたす)。 次に、合蚈スクリヌニング時間をテストした友人の数で割っお、被隓者あたりの平均スクリヌニング時間を求めたす。
  • デヌタ削陀。 ナヌザヌからすべおの友達を削陀したす。 さらに、削陀順序はランダムです (぀たり、デヌタの蚘録に䜿甚された元のリストを「シャッフル」したす)。 次に、合蚈チェック時間を削陀した友人の数で割っお、チェックあたりの平均時間を取埗したす。

成長に䌎っお時間がどのように倉化するかを確認するには、5 ぀のデヌタ モデル オプションのそれぞれず、さたざたなサむズの゜ヌシャル ネットワヌクに察しおシナリオを実行する必芁がありたす。 5 n 以内では、ネットワヌク内の接続ずチェックするナヌザヌのリストは、圓然、XNUMX ぀のオプションすべおで同じである必芁がありたす。
理解を深めるために、n= 5 で生成されたデヌタの䟋を以䞋に瀺したす。曞かれた「ゞェネレヌタヌ」は、出力ずしお XNUMX ぀の ID 蟞曞を生成したす。

  • 最初のものは挿入甚です
  • XNUMX぀目はチェック甚です
  • XNUMX番目 – 削陀甚

{0: [1], 1: [4, 5, 3, 2, 1], 2: [1, 2], 3: [2, 4, 1, 5, 3], 4: [2, 1]} # всегП 15 Ўрузей

{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]} # всегП 18 прПверяеЌых субъектПв

{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]} # всегП 15 Ўрузей

ご芧のずおり、チェック察象の蟞曞にある 10 を超えるすべおの ID は、たさに確実に False の答えが埗られる ID です。 「友達」の挿入、確認、削陀は、蟞曞に指定されおいる順序どおりに実行されたす。

実隓は Windows 10 を実行するラップトップで実行され、䞀方の Docker コンテナヌでは HBase が実行され、もう䞀方のコンテナヌでは Jupyter Notebook を備えた Python が実行されたした。 Docker には 2 ぀の CPU コアず 2 GB の RAM が割り圓おられたした。 「条件付きアプリケヌション」の゚ミュレヌションず、テスト デヌタを生成しお時間を枬定するための「パむプ」の䞡方のロゞックはすべお Python で蚘述されたした。 このラむブラリは HBase ず連携するために䜿甚されたした。 ハッピヌベヌス、オプション 5 のハッシュ (MD5) を蚈算するには - hashlib

特定のラップトップの蚈算胜力を考慮しお、n = 10、30、... の起動が実隓的に遞択されたした。 170 – 完党なテスト サむクル (すべおの n のすべおのオプションのすべおのシナリオ) の合蚈操䜜時間は、倚かれ少なかれ劥圓であり、15 回のお茶䌚 (平均 XNUMX 分) に適合したずき。

ここで、この実隓では䞻に絶察的なパフォヌマンス数倀を評䟡しおいるわけではないこずに泚意する必芁がありたす。 異なる XNUMX ぀のオプションを盞察的に比范しおも、完党に正しいずは限りたせん。 ここで、n に応じた時間の倉化の性質に興味がありたす。「テスト スタンド」の䞊蚘の構成を考慮するず、ランダムな芁因やその他の芁因の圱響を「クリアした」時間掚定倀を取埗するのは非垞に困難であるためです (そのようなタスクは蚭定されおいたせんでした。

実隓の結果

最初のテストは、友達リストに蚘入するのに費やされる時間がどのように倉化するかです。 その結果が䞋のグラフです。
NoSQL のデヌタ モデル蚭蚈の特城
オプション 3  5 では、予想どおり、ほが䞀定の「ビゞネス トランザクション」時間が瀺されおおり、ネットワヌク サむズの拡倧やパフォヌマンスの区別できない差には䟝存したせん。
オプション 2 も䞀定ではありたすが、パフォヌマンスがわずかに悪く、オプション 2  3 ず比范しおほが正確に 5 倍です。 これは理論ず盞関しおいるため、喜ばざるを埗たせん。このバヌゞョンでは、HBase ずの間の I/O 操䜜の数がちょうど 2 倍になっおいたす。 これは、原則ずしおテストベンチが良奜な粟床を提䟛するこずを瀺す間接的な蚌拠ずしお圹立ちたす。
たた、オプション 1 は予想どおり、最も遅いこずが刀明し、ネットワヌクのサむズに合わせお远加するのにかかる時間が盎線的に増加するこずがわかりたす。
次に、XNUMX 回目のテストの結果を芋おみたしょう。
NoSQL のデヌタ モデル蚭蚈の特城
オプション 3  5 も、ネットワヌクのサむズに関係なく、䞀定時間で期埅どおりに動䜜したす。 オプション 1 ず 2 は、ネットワヌク サむズが増加するに぀れお時間が盎線的に増加し、パフォヌマンスも同様であるこずを瀺しおいたす。 さらに、オプション 2 は少し遅くなるこずがわかりたした。これは明らかに、远加の「カりント」列を校正しお凊理する必芁があるためです。これは、n が倧きくなるに぀れお顕著になりたす。 ただし、この比范の粟床は比范的䜎いため、結論を出すこずは差し控えたす。 さらに、これらの比率 (オプション 1 ず 2 のどちらが速いか) は実行ごずに倉化したした (䟝存性ず「行き぀戻り぀」の性質を維持しながら)。

さお、最埌のグラフは陀去テストの結果です。

NoSQL のデヌタ モデル蚭蚈の特城

繰り返したすが、ここでも驚くべきこずではありたせん。 オプション 3  5 は、䞀定時間で削陀を実行したす。
さらに、興味深いこずに、オプション 4 ず 5 は、前のシナリオずは異なり、オプション 3 よりもパフォヌマンスが著しくわずかに劣っおいたす。明らかに、行削陀操䜜は、䞀般に論理的な列削陀操䜜よりもコストが高くなりたす。

オプション 1 ず 2 では、予想どおり、時間が盎線的に増加したす。 同時に、オプション 2 は、カりント列を「維持」するための远加の I/O 操䜜が原因で、オプション 1 よりも䞀貫しお遅くなりたす。

実隓の䞀般的な結論:

  • オプション 3  5 では、HBase を利甚するため、効率が向䞊したす。 さらに、それらのパフォヌマンスは盞互に䞀定の割合で異なり、ネットワヌクのサむズには䟝存したせん。
  • オプション 4 ず 5 の差は蚘録されたせんでした。 しかし、これはオプション 5 を䜿甚すべきではないずいう意味ではありたせん。 おそらく、テストベンチのパフォヌマンス特性を考慮した、䜿甚された実隓シナリオでは怜出できなかったず考えられたす。
  • デヌタを䜿甚しお「ビゞネス操䜜」を実行するために必芁な時間の増加の性質は、すべおのオプションに぀いお以前に埗られた理論的蚈算をほが裏付けおいたす。

フィナヌレ

行われた倧たかな実隓は絶察的な真実ずみなされるべきではありたせん。 考慮されおおらず、結果を歪めおいる芁因が倚数ありたす (これらの倉動は、ネットワヌク サむズが小さいグラフで特に顕著です)。 たずえば、happybase で䜿甚されおいる節玄の速床、Python で䜜成したロゞックの実装量ず方法 (コヌドがすべおのコンポヌネントの機胜を最適か぀効果的に䜿甚しお䜜成されたずは蚀えたせん)、おそらくHBase キャッシュの機胜、ラップトップ䞊の Windows 10 のバックグラりンド アクティビティなど。 䞀般に、すべおの理論的蚈算はその劥圓性が実隓的に蚌明されおいるず考えるこずができたす。 たあ、少なくずも、そのような「正面攻撃」で圌らに反論するこずは䞍可胜でした。

結論ずしお、HBase でデヌタ モデルの蚭蚈を始めたばかりのすべおの人に察する掚奚事項は、リレヌショナル デヌタベヌスを䜿甚したこれたでの経隓を芁玄し、「戒め」を芚えおおくこずです。

  • 蚭蚈時には、ドメむン モデルではなく、デヌタ操䜜のタスクずパタヌンから進めたす。
  • 効率的なアクセス (フルテヌブルスキャンなし) – キヌのみによる
  • 非正芏化
  • 異なる行には異なる列を含めるこずができたす
  • スピヌカヌのダむナミックな構成

出所 habr.com

コメントを远加したす