(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-12-10
(54)【発明の名称】圧縮データの分割、処理、および保護
(51)【国際特許分類】
G06F 16/28 20190101AFI20241203BHJP
G06F 16/182 20190101ALI20241203BHJP
【FI】
G06F16/28
G06F16/182
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2024528458
(86)(22)【出願日】2022-11-01
(85)【翻訳文提出日】2024-07-12
(86)【国際出願番号】 US2022048590
(87)【国際公開番号】W WO2023086242
(87)【国際公開日】2023-05-19
(32)【優先日】2021-11-12
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
(71)【出願人】
【識別番号】524178931
【氏名又は名称】エアーメトル インコーポレイテッド
【氏名又は名称原語表記】AIRMETTLE, INC.
【住所又は居所原語表記】2700 Post Oak Blvd.,21st Floor Houston, Texas 77056 U.S.A.
(74)【代理人】
【識別番号】100122426
【氏名又は名称】加藤 清志
(72)【発明者】
【氏名】スティーブンス、ドンポール・シー
(72)【発明者】
【氏名】フス、ジョシュア・アール
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175AA01
5B175CA08
(57)【要約】
圧縮データを分割する技術は、圧縮データを複数の部分に分割することを含む。この技術はさらに、現在の部分に関連付けてて解凍状態を保存することを含み、解凍状態は前の部分のデータに基づいており、他の部分とは独立した現在の部分の解凍を可能にする。
【選択図】
図16
【特許請求の範囲】
【請求項1】
圧縮データを複数の前記圧縮データの部分に分割し、前記部分は、(i)前記圧縮データの現在の部分と、(ii)前記現在の部分の直前の前記圧縮データの前の部分と、を含み、
前記前の部分の解凍に基づいて解凍状態をキャプチャし、前記解凍状態は前記現在の部分の前記解凍を可能にし、および、
前記現在の部分が前記前の部分を参照することなく解凍可能であるように、前記現在の部分を前記解凍状態と関連付けて保存すること、
を含む、圧縮データの管理方法。
【請求項2】
前記現在の部分に関連付けて保存された前記解凍状態は、前記前の部分の解凍されたデータの範囲から形成されたディクショナリを含む、請求項1に記載の方法。
【請求項3】
前記解凍されたデータの範囲は、長さを有し、前記前の部分の終わりまで延びる、請求項2に記載の方法。
【請求項4】
前記圧縮データの前記部分を、ストレージクラスタのストレージノード上のそれぞれのセグメントに保存すること、および、
メタデータにおいて、前記ストレージノード上の前記それぞれのセグメントの位置を追跡すること、
をさらに含む、請求項1~3のいずれか1項に記載の方法。
【請求項5】
前記圧縮データの前記部分を前記それぞれのセグメントに保存することは、前記ストレージクラスタの特定のノード上の現在のセグメントに前記現在の部分を保存することを含み、前記解凍状態に関連して前記現在の部分を保存することは、前記特定のノード上に前記解凍状態を保存することを含む、請求項4に記載の方法。
【請求項6】
前記特定のノードに前記解凍状態を保存することは、前記現在のセグメントのヘッダーおよび/またはフッターに前記解凍状態を保存することを含む、請求項5に記載の方法。
【請求項7】
前記メタデータは、セグメントと、前記それぞれのセグメントに保存された前記圧縮データのそれぞれのバイト範囲とを関連付け、方法は更に:
前記圧縮データの指定されたバイト範囲を受信すること、
前記メタデータから、前記圧縮データの前記指定されたバイト範囲の少なくとも一部を保存するターゲットセグメントを識別すること、および、
前記ターゲットセグメントにアクセスして、前記指定されたバイト範囲またはその前記一部を取得すること、
を含む、請求項4に記載の方法。
【請求項8】
前記メタデータがセグメントを非圧縮データのそれぞれのバイト範囲に関連付け、前記方法は更に:
前記非圧縮データの指定されたバイト範囲を受信すること、
前記メタデータから、解凍されると前記非圧縮データの前記指定されたバイト範囲の少なくとも一部を提供する前記圧縮データを保存するターゲットセグメントを識別すること、および、
前記ターゲットセグメントにアクセスして前記非圧縮データの前記指定されたバイト範囲またはその前記一部を取得すること、
を含む、請求項4に記載の方法。
【請求項9】
前記メタデータが、セグメントを非圧縮データの行または記録のそれぞれの範囲に関連付け、方法は更に:
前記非圧縮データの行または記録の指定された範囲を受信すること、
前記メタデータから、解凍されたときに前記行または記録の前記指定された範囲の少なくとも一部を提供する前記圧縮データを保存するターゲットセグメントを識別すること、および、
前記ターゲットセグメントにアクセスして前記行または記録の前記指定された範囲またはその前記一部を取得すること、
を含む、請求項4に記載の方法。
【請求項10】
前記圧縮データを複数の部分に分割する場合、前記圧縮データの前記部分の非圧縮バージョンは、前記圧縮データの前記部分よりもサイズが互いに近い、請求項2に記載の方法。
【請求項11】
前記圧縮データを分割することは:
前記圧縮データ内のターゲット分割位置を識別すること、および、
前記圧縮データの非圧縮コンテンツに基づいて、前記ターゲット分割位置とは異なる選択された分割位置で前記圧縮データを分割し、前記選択された分割位置は、前記現在の部分と、前記現在の部分の直後に続く次の部分とを分離すること、
を含む、請求項2に記載の方法。
【請求項12】
前記選択された分割位置で前記圧縮データを分割することは:
前記現在の部分の前記圧縮データの範囲を解凍すること、
範囲の解凍されたデータ内の境界を識別し、前記境界は、解凍されたデータの個別に処理可能な単位の終わりを定義し、および、
前記選択された分割位置を、前記境界に続く位置として割り当てること、
を含む、請求項11に記載の方法。
【請求項13】
解凍されたデータの前記個別に処理可能な単位は、(i)CSV(カンマ区切り値)データの行、(ii)JSON(JavaScript Object Notation)記録、または(iii)行区切りデータの他の行または記録区切りデータの記録、のいずれか1つを含む、請求項12に記載の方法。
【請求項14】
前記圧縮データがデフレートブロック内に配置され、
前記境界は、前記圧縮データの特定のデフレートブロック内に含まれ、前記特定のデフレートブロックは終わりを有し、および、
前記選択された分割位置を前記境界に続く位置として割り当てることは、前記選択された分割位置を前記特定のデフレートブロックの終わりとして定義することを含む、請求項12に記載の方法。
【請求項15】
前記境界と前記選択された分割位置との間に位置するデータとしてフィックスアップデータのセットを取得すること、および、
前記フィックスアップデータのセットを前記次の部分に関連付けて保存すること、
をさらに含む、請求項12に記載の方法。
【請求項16】
前記境界のインジケータを前記現在の部分と関連付けて保存することをさらに含み、前記インジケータは、前記現在の部分の前記圧縮データから得られる非圧縮データの処理が無視され始める位置を識別する、請求項15に記載の方法。
【請求項17】
前記フィックスアップデータのセットは、前記次の部分と関連付けて保存されるディクショナリ内に完全に含まれ、前記方法は、前記次の部分と関連付けて、前記ディクショナリ内に前記境界のインジケータを保存することをさらに含む、請求項15に記載の方法。
【請求項18】
前記フィックスアップデータのセットは、前記次の部分と関連付けて保存されるディクショナリ内に完全に含まれず、前記フィックスアップデータのセットを保存することは、前記次の部分と関連付けて、前記ディクショナリ内に含まれていない追加のフィックスアップデータを保存することを含む、請求項16に記載の方法。
【請求項19】
前記現在の部分の前記解凍されたデータ中の記述的な内容を識別し、前記次の部分のデータの独立した処理を容易にするために、前記記述的な内容を前記次の部分と関連付けて保存することをさらに含む、請求項15に記載の方法。
【請求項20】
前記圧縮データを圧縮データの複数の部分に分割することは、2つの連続する部分が共に重複部分を含むように、前記2つの連続する部分の間に前記重複部分を提供することを含む、請求項1に記載の方法。
【請求項21】
メモリに結合されたプロセッサのセットを含む制御回路を備え、前記制御回路は:
圧縮データを複数の前記圧縮データの部分に分割し、前記部分は、(i)前記圧縮データの現在の部分と、(ii)前記現在の部分の直前の前記圧縮データの前の部分と、を含み、
前記前の部分の解凍に基づいて解凍状態をキャプチャし、前記解凍状態は前記現在の部分の前記解凍を可能にし、および、
前記現在の部分が前記前の部分を参照することなく解凍可能であるように、前記現在の部分を前記解凍状態と関連付けて保存する、
ように構成および構築される、コンピュータ化された装置。
【請求項22】
コンピュータ化された装置の制御回路によって実行されると、前記コンピュータ化された装置に圧縮データを管理する方法を実行させる命令を有する非一時的なコンピュータ可読媒体のセットを含むコンピュータプログラム製品であって、前記方法は:
前記圧縮データを複数の前記圧縮データの部分に分割し、前記部分は、(i)前記圧縮データの現在の部分と、(ii)前記現在の部分の直前の前記圧縮データの前の部分と、を含み、
前記前の部分の解凍に基づいて解凍状態をキャプチャし、前記解凍状態は前記現在の部分の前記解凍を可能にし、および、
前記現在の部分が前記前の部分を参照することなく解凍可能であるように、前記現在の部分を前記解凍状態と関連付けて保存すること、
を含む、コンピュータプログラム製品。
【発明の詳細な説明】
【背景技術】
【0001】
関連出願への相互参照:本発明は、2021年11月12日に提出された米国仮出願番号63/278,900の利益を主張するものであり、その内容および教示は、その全体が参照により本明細書に組み込まれます。
連邦政府が後援する研究または開発に関する声明:本発明は、国立科学財団によって授与された2135007に基づく政府支援を受けて行われました。政府は、本発明に対して一定の権利を有します。
データの処理と保護は、安価なプロセッサと記憶媒体が利用可能になったことで、大きく変化した。ユーザは現在、データをローカルで処理し保存することも、ネットワークで接続されたサーバ、コンピューティングクラスタ、またはクラウドにデータを保存することもできる。さらに、クラウド・コンピューティングの選択肢には、パブリック・クラウドとプライベート・クラウドの両方がある。
【0002】
ビッグデータの時代が到来し、ユーザはこれまで以上に大量のデータオブジェクトを保存し、処理することを望んでいる。例えば、表形式データ、ツリーベースのデータ、オーディオデータおよび/またはビデオデータのサイズがギガバイト範囲またはそれ以上に達することは珍しくない。このような大容量データオブジェクトの処理、保護、保存には、独特の課題がある。
【0003】
一般的なアプローチは、大きなオブジェクトを分割してそれぞれのコンピュータに保存することである。プログラムは、オブジェクト内のバイト境界を識別し、サイズが等しいか、ほぼ等しい部分を生成することによって、オブジェクトを分割することができる。分配方式で保存されたデータオブジェクトに対してデータ処理を実行するために、コンピュータは、元のオブジェクトの特定の部分または部分のグループを収集し、収集された部分に対して所望の処理タスクを実行し、結果を生成することができる。
【発明の概要】
【0004】
残念なことに、上述の分配アプローチは非効率的な場合がある。例えば、大きなデータオブジェクトを等しい部分またはほぼ等しい部分に分割する方法は、構造的特徴を無視し、異なるデータ部分間またはデータ部分間に依存関係をもたらす可能性がある。簡単な例として、多くの行の表形式データを含むデータオブジェクトを考えてみる:オブジェクトを分割して等しいサイズにすることは、行を途中で切断することを意味する。そのため、切断された行へのアクセスを含む後続のクエリは、データオブジェクトの2つの部分(行の先頭を保存する部分と、終わりを保存する部分)へのアクセスを必要とする場合がある。この2つの部分は、通常、ネットワーク上の異なるコンピュータに保存される。
【0005】
上記の例を続けると、(切断された行の両方の部分を含む)両方の部分をリクエスト元または他のノードに転送して戻し、そこで部分を再組み立てしてクエリを実行することがさらに必要になる場合がある。これらの行為には、ネットワーク上の大量のデータのコピーが含まれるため、大幅な非効率が生じる。
【0006】
上記に加え、従来のアプローチではコンテンツが無視される可能性がある。例えば、データオブジェクトの分割された部分は、データオブジェクト全体との関連性を失う可能性がある。また、表形式のデータ(例えば、行データのみが保存されている場合)では、フィールド名が欠落している可能性がある。このように、分配オブジェクトから意味のあるデータを抽出するには、目的の処理タスクを完了するために必要なすべてのピースを収集するために、異なるコンピュータに多くのネットワークアクセスを指示する必要がある。必要なのは、大きなデータオブジェクトをより効率的に扱う方法である。
【0007】
この必要性に少なくとも部分的に対処するために、ストレージクラスタにおいてデータオブジェクトを管理するための技術は、データオブジェクト内の境界においてデータオブジェクトを複数の部分に分割することを含む。この技術はさらに、データオブジェクトの部分を、個別に処理可能な単位を提供するセグメントに変換することと、ストレージクラスタの複数のコンピューティングノード間でセグメントを分配してそこに保存することとを含む。
【0008】
有利なことに、セグメントを個別に処理可能な単位として提供することは、データオブジェクトに対する処理タスクの実行に関連する作業負荷を、データオブジェクトのセグメントをローカルに保存するコンピューティングノードに効率的にプッシュダウンできることを意味する。したがって、この技術は、各コンピューティングノードが、そこに保存されたデータオブジェクトのセグメントのみに対して処理タスクを実行する、真の並列処理を可能にする。また、従来の方式に比べてネットワーク・トラフィックが大幅に削減される。例えば、コンピューティングノードのローカルストレージへの高速接続により、全体的な効率が大幅に向上する。さらに、セグメントが独立しているため、処理タスクを完了するためにコンピューティングノード間で(依存関係を解決するためなどの)通信がほとんど、あるいはまったく必要ない。
【0009】
上記に加え、圧縮データを分割、変換、分配する際に、特別な課題が発生する。圧縮データは容易に分割することができるが、結果として得られる部分は、一般に、前の部分のデータを参照せずに解凍することができない。例えば、典型的な解凍アルゴリズムでは、解凍を継続するためのディクショナリとなる、前の解凍のデータを参照する必要がある。しかし、圧縮データを単に分割して分配させただけでは、そのような前の解凍データが特に欠けてしまう。したがって、必要なのは、前の部分や他の部分へのアクセスを必要とせずに、個別の部分を解凍する能力を保持する圧縮データの分割方法である。
【0010】
この必要性に少なくとも部分的に対処するために、圧縮データを分割する改良された技術は、圧縮データを複数の部分に分割することを含む。この技術はさらに、現在の部分に関連づけて解凍状態を記憶することを含み、解凍状態は前の部分のデータに基づき、他の部分とは独立して現在の部分の解凍を可能にする。
【0011】
有利なことに、改良された技術により、圧縮データの一部を他の部分から独立して解凍することが可能になり、したがって、ストレージクラスタの異なるノード上などに分配して一部が保存されている場合の効率が大幅に向上した。
【0012】
特定の実施形態は、圧縮データを管理する方法を対象とする。本方法は、圧縮データを圧縮データの複数の部分に分割することを含み、部分は、(i)圧縮データの現在の部分と、(ii)現在の部分の直前の圧縮データの前の部分とを含む。本方法はさらに、前の部分の解凍に基づいて解凍状態をキャプチャし、解凍状態が現在の部分の解凍を可能にすることと、現在の部分が前の部分を参照することなく解凍可能であるように、解凍状態に関連付けて現在の部分を保存することとを含む。
【0013】
いくつかの例では、現在の部分に関連して記憶された解凍状態は、前の部分の解凍されたデータの範囲から形成されたディクショナリを含む。
【0014】
いくつかの例では、解凍されたデータの範囲は長さを有し、前の部分の終わりまで延びる。
【0015】
いくつかの例では、本方法はさらに、圧縮データの部分をストレージクラスタのストレージノード上のそれぞれのセグメントに保存し、メタデータにおいて、ストレージノード上のそれぞれのセグメントの位置を追跡することを含む。
【0016】
いくつかの例では、圧縮データの部分をそれぞれのセグメントに保存することは、現在の部分をストレージクラスタの特定のノード上の現在のセグメントに保存することを含み、現在の部分を解凍状態と関連付けて保存することは、解凍状態を特定のノード上に保存することを含む。
【0017】
いくつかの例では、特定のノードに解凍状態を保存することは、現在のセグメントのヘッダーおよび/またはフッターに解凍状態を保存することを含む。
【0018】
いくつかの例では、メタデータは、セグメントと、それぞれのセグメントに保存された圧縮データのそれぞれのバイト範囲とを関連付け、方法は、圧縮データの指定されたバイト範囲を受信することと、圧縮データの指定された識別されたバイト範囲の少なくとも一部の部分を保存するターゲットセグメントをメタデータから識別することと、指定されたバイト範囲またはその部分を取得するためにターゲットセグメントにアクセスすることとをさらに含む。
【0019】
いくつかの例では、メタデータはセグメントを非圧縮データのそれぞれのバイト範囲に関連付け、方法はさらに、非圧縮データの指定されたバイト範囲を受信することと、メタデータから、解凍されたときに非圧縮データの識別された指定されたバイト範囲の少なくとも一部を提供する圧縮データを保存するターゲットセグメントを識別することと、ターゲットセグメントにアクセスして非圧縮データの指定されたバイト範囲またはその一部を取得することとを含む。
【0020】
いくつかの例では、メタデータはセグメントを非圧縮データの行または記録のそれぞれの範囲に関連付け、方法はさらに、非圧縮データの行または記録の指定された範囲を受信することと、メタデータから、解凍されたときに行または記録の指定された識別された範囲の少なくとも一部を提供する圧縮データを保存するターゲットセグメントを識別することと、ターゲットセグメントにアクセスして行または記録の指定された範囲またはその一部を取得することとを含む。
【0021】
いくつかの例では、圧縮データを複数の部分に分割するとき、圧縮データの部分の非圧縮バージョンは、圧縮データの部分よりもサイズが互いに近い。
【0022】
いくつかの例では、圧縮データを分割することは、圧縮データ内のターゲット分割位置を識別することと、圧縮データの非圧縮コンテンツに基づいて、ターゲット分割位置とは異なる選択された分割位置で圧縮データを分割することとを含み、選択された分割位置は、現在の部分と、現在の部分の直後に続く次の部分とを分ける。
【0023】
いくつかの例では、選択された分割位置で圧縮データを分割することは、現在の部分の圧縮データの範囲を解凍すること、範囲の解凍されたデータ内の境界を識別すること、境界は、解凍されたデータの個別に処理可能な単位の終わりを定義すること、および選択された分割位置を境界に続く位置として割り当てることを含む。
【0024】
いくつかの例では、解凍データの個別に処理可能な単位は、(i)CSV(カンマ区切り値)データの行、(ii)JSON(JavaScript Object Notation)記録の終わり、または(iii)行区切りデータの他の行または記録区切りデータの記録、のいずれか1つを含む。
【0025】
いくつかの例では、圧縮データはデフレートブロックに配置され、境界は圧縮データの特定のデフレートブロック内に含まれ、特定のデフレートブロックは終わりを有し、選択された分割位置を境界に続く位置として割り当てることは、選択された分割位置を特定のデフレートブロックの終わりとして定義することを含む。
【0026】
いくつかの例では、本方法は、境界と選択された分割位置との間に位置するデータとしてフィックスアップデータのセットを取得することと、フィックスアップデータのセットを次の部分に関連付けて記憶することとをさらに含む。
【0027】
いくつかの例では、本方法は、境界のインジケータを現在の部分に関連付けて記憶することをさらに含み、インジケータは、現在の部分の圧縮データから導出された非圧縮データの処理が無視され始める位置を識別する。
【0028】
いくつかの例では、フィックスアップデータのセットは、次の部分に関連付けて記憶されるディクショナリ内に完全に含まれ、本方法は、次の部分に関連付けて、ディクショナリ内に境界のインジケータを記憶することをさらに含む。
【0029】
いくつかの例では、フィックスアップデータのセットは、次の部分に関連付けて記憶されるディクショナリ内に完全に含まれておらず、フィックスアップデータのセットを記憶することは、次の部分に関連付けて、ディクショナリ内に含まれていない追加のフィックスアップデータを記憶することを含む。
【0030】
いくつかの例では、本方法はさらに、現在の部分の解凍されたデータ中の記述的コンテンツを識別することと、次の部分のデータの独立した処理を容易にするために、次の部分に関連付けて記述的コンテンツを記憶することとを含む。
【0031】
さらなる実施形態は、上述の方法のいずれかのような、圧縮データを管理する方法を実行するように構成および配置されたコンピュータ化装置を対象とする。さらに他の実施形態は、コンピュータプログラム製品を対象とする。コンピュータプログラム製品は、コンピュータ化装置の制御回路上で実行されると、コンピュータ化装置に、上述したいずれかの方法などの圧縮データを管理する方法を実行させる命令を記憶する。
【0032】
前述の概要は、本明細書に提示された例示的な特徴を読者が容易に把握できるようにするための例示目的で提示されたものであるが、この概要は、必須の要素を規定すること、または本明細書の実施形態を何らかの形で限定することを意図するものではない。上述の特徴は、技術的に理にかなった任意の方法で組み合わせることができ、そのような組み合わせが明示的に特定されるか否かにかかわらず、そのような組み合わせのすべてが本明細書に開示されることを意図していることを理解されたい。
【図面の簡単な説明】
【0033】
前述および他の特徴および利点は、添付の図面に示される特定の実施形態の以下の説明から明らかになるであろう。異なる図面全体にわたって同様の参照符号は同じまたは同様の箇所を指す。
【
図1】
図1は、改良された技術の実施形態が実践され得る環境例のブロック図である。
【
図2】
図2は、
図1のゲートウェイ装置の特徴例をさらに詳細に示すブロック図である。
【
図3】
図3Aおよび
図3Bは、表形式データを含むデータオブジェクトを分割するための構成例を示すブロック図である。
【
図4】
図4Aおよび
図4Bは、Parquetファイルを含むデータオブジェクトを分割するための構成例を示すブロック図である。
【
図5】
図5Aおよび
図5Bは、ビデオデータを含むデータオブジェクトを分割するための構成例を示すブロック図である。
【
図6】
図6は、
図1の環境において分配処理タスクを実行するための構成例を示すブロック図である。
【
図7】
図7は、データオブジェクトの複数のセグメントをサイズの小さい順に配置した例を示すブロック図である。
【
図8】
図8は、
図7に示したセグメントを消失訂正符号化するための構成例を示すブロック図である。
【
図9】
図9は、データオブジェクトから作成されたセグメントから形成された複数のリペアグループを示すブロック図である。
【
図10】
図10は、セグメントの所望のターゲットサイズを決定する方法の一例を示すフローチャートである。
【
図11】
図11は、
図1および
図6の環境で使用される可能性のある、例示的なコンピューティングノードのブロック図である。
【
図12】
図12は、一実施形態によるデータオブジェクトの管理方法の一例を示すフローチャートである。
【
図13】
図13は、別の実施形態によるデータオブジェクトの管理方法の一例を示すフローチャートである。
【
図14】
図14は、さらに別の実施形態によるデータオブジェクトの管理方法の一例を示すフローチャートである。
【
図15】
図15は、スライディングディクショナリを使用して圧縮データを解凍するための構成例を示すブロック図である。
【
図16】
図16は、圧縮ペイロードを複数の部分に分割するための構成例を示すブロック図である。
【
図17】
図17は、圧縮ペイロードを複数の部分に分割するための構成例を示すブロック図であり、圧縮ペイロードはデフレートブロックに配置される。
【
図18】
図18は、圧縮データを分割する方法の一例を示すフローチャートである。
【
図19】
図19は、オブジェクトメタデータの構成例を示す表である。
【
図20】
図20は、データ内の自然境界に基づいて圧縮データ内の分割位置を決定する方法の一例を示すフローチャートである。
【
図21】
図21は、データ内の自然境界が解凍ディクショナリ内で発見された場合に、圧縮ペイロードを複数の部分に分割するための構成例を示すブロック図である。
【
図22】
図22は、解凍ディクショナリの前にデータ内の自然境界が発見された場合に、圧縮ペイロードを複数の部分に分割するための構成例を示すブロック図である。
【
図23】
図23は、例示的なセグメントのレイアウト例を示すブロック図である。
【
図24】
図24は、圧縮データを管理する方法の一例を示すフローチャートである。
【発明を実施するための形態】
【0034】
次に、改良された技術の実施形態を説明する。このような実施形態は、特定の特徴および原理を説明するために例示として提供されるが、限定することを意図するものではないことを理解されたい。
【0035】
ストレージクラスタ内でデータオブジェクトを管理するための技術は、データオブジェクト内の境界でデータオブジェクトを複数の部分に分割することを含む。この技術はさらに、データオブジェクトの部分を、個別に処理可能な単位を提供するセグメントに変換することと、ストレージクラスタの複数のコンピューティングノード間でセグメントを分配してそこに保存することとを含む。
【0036】
以下の説明において:
-セクションIは、例示的な環境と、データの分割、処理、および保護を対象とする実施形態を示す。
-セクションIIは、セクションIの実施形態の圧縮データへの適用例を示す。
【0037】
セクションI:データの分割、処理、および保護
本出願は、複数の実施形態を開示する。一実施形態は、ストレージクラスタに分配保存するためにデータオブジェクトを部分に分割することを対象とする。別の実施形態は、ストレージクラスタによって分配処理タスクを実行することを対象とする。さらに別の実施形態は、ストレージクラスタに保存されたデータオブジェクトのデータを保護することを対象とする。これらの実施形態は、以下の実施例に示され説明されるように、単一のシステムのそれぞれの態様として実現されてもよい。あるいは、実施形態は、いずれかの実施形態をサポートする実装が他の実施形態もサポートする必要がないように、独立して実施されてもよい。
【0038】
図1は、改良された技術の実施形態が実践され得る例示的な環境100を示す。示されるように、ゲートウェイ110は、ネットワーク140を介してストレージクラスタ130の複数のコンピューティングノード120にアクセスし、ストレージクラスタ130とクライアント/ユーザとの間のインターフェースとして機能するように構成される。ネットワーク140は、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、インターネット、またはコンピュータ間のデジタル通信をサポートする任意の他のタイプのネットワークまたはネットワークの組み合わせを含むことができる。ゲートウェイ110は、コンピュータまたは他のコンピューティングデバイス(例えば、サーバ、ワークステーション、タブレット、スマートフォン、パーソナルデータアシスタント、ゲーム機、セットトップボックスなど)であってもよく、独自のネットワークインターフェース、プロセッサ、およびメモリを含んでもよい。いくつかの例では、ゲートウェイ110は、ストレージクラスタ130のコンピューティングノード120として提供され得る。複数のコンピューティングノード120(本明細書では「ノード」とも呼ばれる)120-1~120-Nが示されているが、ストレージクラスタ130は、数百以上のような多数のノード120を含んでもよいことを理解されたい。各ノード120は、プログラムを実行するための1つまたは複数のプロセッサおよびメモリ、ならびに1つまたは複数のネットワークインターフェース(例えば、ネットワークインターフェースカード)、および1つまたは複数のソリッドステートドライブ(SSD)、磁気ディスクドライブ、および/またはそのような永続ストレージを含む。ストレージクラスタ130のノード120は、ネットワーク140を介して、または専用ネットワーク(例えば、別個のローカルエリアネットワーク;図示せず)を介して、または他の手段によって相互接続され得る。本明細書では、ストレージクラスタ130の内部ネットワークはすべて、ネットワーク140の一部と見なされる。
【0039】
好ましくは、各ノード120は、それぞれの永続ストレージへの1つ以上の高速接続を有する。例えば、ノード120とそのストレージデバイス(例えば、SSD)との間の接続は、ネットワーク140を介したノード間の接続を1桁以上上回る帯域幅を有することができる。
【0040】
一実施例では、ストレージクラスタ130は、AWS(Amazon Web Services)のS3(Simple Storage Service)、Microsoft Azure Data Lake、および/またはGoogle Cloud Storageなどの市販のクラウドベースのオブジェクトストアと互換性があり得るオブジェクトストアとして構成される。特定の例では、ストレージクラスタ130はS3互換オブジェクトストアとして構成される。この目的のために、各ノード120は、ノード120がオブジェクトストアのメンバーとして参加することを可能にするAPI(アプリケーションプログラムインターフェース)122を含むことができる。
【0041】
クラスタ130は、ノード120が一緒にネットワーク接続された、建物の一室または複数の部屋を占有するデータセンタで実装され得る。他の実装は複数のビルにまたがる可能性があり、メトロクラスタの構成が実現可能である。
【0042】
他の例では、ストレージクラスタ130は、クラウドサービス150内で、例えばそこで提供される物理マシンまたは仮想マシンを使用して実装され得る。例えば、ストレージクラスタ130全体をクラウドサービス150内に完全に配置してもよい。
【0043】
さらに別の例として、クラウドサービス150は、ストレージクラスタ130がクラウドサービス150のキャッシュとして機能する、データのプライマリリポジトリとして機能することができる。したがって、ストレージクラスタ130は、一般的にアクセスされるデータを保存することができるが、通常、クラウドサービス150から利用可能なすべてのデータを保存するわけではない。
【0044】
実装形態は、個人、小規模組織、および/または企業に適しており、SaaS(サービスとしてのソフトウェア)モデルに従って、または他のモデルに従って提供され得る。実施形態は、特に、100メガバイトの範囲またはそれ以上のサイズを有する可能性のある大きなデータオブジェクトを管理するのに適している。この特徴により、実施形態は、データレイクを含むようなビッグデータアプリケーションに適している。しかし、実施形態は、特定のユーザ、サービスモデル、データサイズ、またはアプリケーションに限定されないことを理解すべきである。
【0045】
動作例では、ゲートウェイ110(ストレージクラスタ130の一部であっても、それとは別個であってもよい)は、ストレージクラスタ130によって管理される1つまたは複数のデータオブジェクト160にアクセスする。データオブジェクト160は、クラウドサービス150内に、例えばバケットまたはブロブ内に存在してもよく、または1つ以上の別個のソースによって提供されてもよい。例えば、データオブジェクト160は、データオブジェクト160をデータログまたは進行中の活動の他の記録として生成し得る産業プロセスまたは科学プロセスなどのリアルタイムの活動によって生成され得る。データオブジェクト160は、ファイル、ストリーム、メモリ範囲、またはその他の方法で提示され得る。
【0046】
データオブジェクト160は、特定のオブジェクトタイプに従って構造化されてもよい。例えば、データオブジェクト160は、CSV(カンマ区切り値)またはログファイルなどの表形式オブジェクトとして、JSON(JavaScript Object Notation)またはXML(拡張可能マークアップ言語)ドキュメントなどのツリーベースオブジェクトとして、Apache Parquetファイルなどの列指向オブジェクトとして、ビデオファイルまたはストリームとして、オーディオファイルまたはストリームとして、またはピクチャのコレクションとして提供され得る。特定のタイプのデータが特に提示および/または説明されているが、実施形態は、あらゆるタイプのデータを包含することが意図されており、提示および/または説明されたものは、動作原理を説明するために使用される具体例を提供するに過ぎないことを理解されたい。
【0047】
データオブジェクト160の管理を開始するために、ゲートウェイ110は、データオブジェクトを、例えば、データオブジェクトの先頭から開始して前方に進むようにスキャンしてもよい。通常、ゲートウェイ110は、オブジェクトに最初にアクセスするとき、データオブジェクトのタイプを認識しない場合があり、オブジェクト160の初期スキャンを実行してそのタイプを識別する場合がある。スキャンは、データオブジェクトのセットの領域(通常はオブジェクトの先頭)をサンプリングし、特定のオブジェクトタイプに特有のシーケンスまたは文字を検索し得る。例えば、CSVファイルやログファイルでは一般的に改行文字(NewLine)を使って記録の終わりを示し、カンマ、スペース、その他の文字を使って隣接するフィールドを区切ることがある。データオブジェクトの中には、オブジェクトのタイプを直接識別するヘッダーを含むものもある。例えば、Parquetファイルは、いわゆる「マジックナンバー」を指定する4バイトのヘッダーで始まり、Parquetファイルであることを識別するコード「PAR1」を提供する。ほとんどのファイル・タイプは、それほど苦労することなく識別できるような明確な表示を備えている。しかし、中には識別が難しいものもある。そのような識別が容易でないタイプを認識したい場合は、機械学習や他のタイプの人工知能を含む、より高度なアルゴリズムを適用することができる。
【0048】
ゲートウェイ110がデータオブジェクト160のタイプを識別したら、ゲートウェイ110は、データオブジェクト160を部分に分割し始めることを進めてもよい。例えば、ゲートウェイ110は、データオブジェクトの隣接する処理可能な単位間の区切りとなる境界をデータオブジェクト内で検索してもよい。境界の正確な性質は、オブジェクトの種類によって異なる場合がある。例えば、CSVファイルは、境界を識別するためにNewLine文字を使用することがあり、一方、ビデオファイルまたはストリームは、Iフレーム(符号化画像)を使用することがある。オブジェクトタイプによっては、埋め込まれたメタデータを使用して境界を指定する。たとえば、Parquetファイルには、隣接する行グループ間の境界を識別するフッターが含まれている。
【0049】
データオブジェクトの「処理可能単位」とは、他の処理可能な単位に対する依存関係をほとんど含まないという意味で、独立した処理が可能な領域である。データオブジェクトを処理可能単位に分割することで、ストレージクラスタ130のノード120による効率的な並列処理が促進される。
【0050】
分割は、分割された部分の独立した処理を促進するための第1のステップであるが、最適なパフォーマンスを得るには必ずしも十分ではない。例えば、分割された部分は、データオブジェクト160の他の部分に対する依存関係を保持する原因となる特定のメタデータ(例えば、ヘッダー、フッター、または他のコンテンツ)を欠いている可能性がある。したがって、ゲートウェイ110は、好ましくは、分割された部分をセグメント170に変換する追加のステップを実行する。一例では、変換されたセグメント170は、データオブジェクト160と同じタイプの完全な自己完結型オブジェクトであるかのように処理されることができる。
【0051】
セグメント170は、それらが作成された部分と類似しているが、他の部分への依存性を低減または排除するように調整される。例えば、CSVファイルの第1の部分にヘッダーが含まれているが、それ以降の部分にはヘッダーが含まれていない場合、ゲートウェイ110は第1の部分のヘッダーを、それ以降の部分から形成されるセグメント170それぞれにコピーすることができる。このようにして、各セグメント170はそれ自身のヘッダーを持ち、独立したCSVファイルであるかのように処理することができる。他のオブジェクトタイプについても、オブジェクトタイプに応じた調整を行うことができる。以下に様々な例を示す。
【0052】
こうしてセグメント170がデータオブジェクト160と同じタイプの独立して処理可能な単位として形成された状態で、ゲートウェイ110はセグメント170をストレージクラスタ130の様々なノード120に分配してもよく、これらのノード120は、例えばそれぞれのノード120にローカルに接続された永続ストレージにセグメントを保存する。セグメントの位置を追跡するために、ゲートウェイ110は、オブジェクトメタデータ112を更新してもよい。
【0053】
図1の拡大図に示すように、オブジェクトメタデータ112は、ストレージクラスタ130の動作を容易にするオブジェクト固有の情報を含む。そのようなオブジェクトメタデータ112は、例えば、以下の要素を含み得る:
-ObjID。ストレージクラスタ130の名前空間内で一意であることが好ましいオブジェクト識別子。
-ObjType。CSV、JSON、XML、Parquetなどのデータオブジェクト160の決定されたタイプ。
-SegID。オブジェクトの一部から作成されたセグメント170の識別子。ストレージクラスタ130の名前空間内で一意であることが好ましい。
-ByteRng。現在のセグメントに含まれるデータオブジェクト160のバイト範囲。開始バイト位置と終了バイト位置を指定する値対として(または開始バイト位置と長さとして)表現されてもよい。
-RowRng。現在のセグメントに含まれるデータオブジェクト160の行の範囲。表形式データや、行単位で提供される他のタイプのデータに関連する。
-特徴。セグメント内で検出された、後の処理に関連する特徴。セグメントごとに提供される。
単一レベル構造として示されているが、オブジェクトメタデータ112は、階層構造を含む任意の適切な方法で配置されてもよい。また、オブジェクトメタデータ112の範囲は、提供された例に限定されない。実際、オブジェクトメタデータ112は、ストレージクラスタ130の操作またはそこで実行され得る処理タスクを容易にする任意の情報を保存し得る。
【0054】
いくつかの例では、オブジェクトメタデータ112は、信頼性を高めるために冗長的に保存される。例えば、オブジェクトメタデータ112は、例えば、マルチウェイミラーおよび/または他のRAID(独立ディスク冗長アレイ)または消失訂正符号化技術を使用して、ストレージクラスタ130の複数のノード120上に保存されてもよい。また、本明細書においてゲートウェイ110に起因する活動は、任意の数のコンピュータによって実行されてよく、そのようなコンピュータは、ストレージクラスタ130のノード120を含み得る。例えば、ストレージクラスタ130の特定のノードは、ロードバランサとして指定されてもよく、セグメント170がクラスタのノード間で分配されるときにノード120の作業負荷を考慮してもよい。
【0055】
図1にさらに示されているように、コンピューティングノード120は、それぞれのノード120によって記憶されたセグメント170を記述するセグメントメタデータ124を記憶することができる。セグメントメタデータ124の例は、以下の要素を含むことができる:
-SegID。コンピューティングノード120に保存されているセグメントの一意の識別子。
-HMD。コンピューティングノード120に保存されたセグメントの一部を形成するヘッダーメタデータ。同じオブジェクトから派生した別のセグメントに元々あるヘッダーメタデータのコピーである可能性があり、現在のセグメントの独立した処理を促進するために、現在のセグメントに含まれる。
-FMD。コンピューティングノード120に保存されたセグメントの一部を形成するフッターメタデータ。同じオブジェクトから派生した別のセグメントに元々あるフッターメタデータのコピーである可能性があり、現在のセグメントの独立した処理を促進するために、現在のセグメントに含まれる。
-Loc。ノード120が現在のセグメントにアクセスしうる位置。ディスクドライブや論理ブロックアドレス(LBA)、ボリューム、ファイル、アグリゲート、またはノード120がデータをアドレス指定する際に使用するその他の方法など、任意の適切な方法で表現される。
【0056】
オブジェクトメタデータ112と同様に、セグメントメタデータ124も、信頼性を高めるために冗長的に保存され得る。いくつかの例では、ノード120は、セグメントメタデータ124を、そのメタデータが記述するセグメント170とともに保存し得る。例えば、セグメントAのセグメントメタデータは、セグメントAとともに保存される。同様に、セグメントBのセグメントメタデータは、セグメントBとともに保存される。セグメントメタデータ124は、セグメント170自体が保護されるのと同じ方法で保護され得る。セグメント保護の様々な例を以下に説明する。
【0057】
図2は、ゲートウェイ110の機能例をさらに詳細に示している。この例では、ゲートウェイ110は示された機能を自ら実行するものと想定される。前述のように、機能の一部は、クラスタ130のコンピューティングノード120を含む他のコンピュータによって実行されてもよい。
【0058】
図示されるように、ゲートウェイ110は、タイプ検出器210、スプリッタ220、トランスフォーマ230、および分配器240を含む。タイプ検出器210は、例えばオブジェクトの先頭でバイトをサンプリングすることによって、データオブジェクト160の一連の領域を読み取り、サンプリングに基づいてデータオブジェクト160のオブジェクトタイプを識別する機能を実行する。タイプ検出器210は、決定されたオブジェクトタイプをスプリッタ220およびトランスフォーマ230に通知することができる。
【0059】
スプリッタ220は、データオブジェクト160を部分250に分割する機能を実行する。部分250は、データオブジェクト160のそれぞれの処理可能な単位を含み、データオブジェクト内の境界252によって定義される。スプリッタ220の境界検出器222は、データオブジェクト160をスキャンして境界252、すなわち処理可能な単位間のセパレータを検出し、データオブジェクト160に対する境界252の位置を(例えばバイト位置に基づいて)記録する。前述したように、境界252の性質は、好ましくは、タイプ検出器210の動作に基づいて知られているデータオブジェクト160のオブジェクトタイプに依存する。
【0060】
Parquetファイルを分割するときなど、いくつかの例では、境界検出器222は、データオブジェクト160内のすべての境界252を識別し、各セットの境界の間に新しい部分250を定義することができる。すべての境界を検出することは、境界252が行グループに基づいているParquetファイルではうまく機能し、行グループは大きくなる傾向がある(例えば、メガバイト範囲)。しかし、行グループが異常に小さいことが判明した場合、複数の行グループが単一の部分250内に含まれるように、境界がスキップされることがある。CSVファイルを分割する場合など、他の例では、境界検出器222はデータオブジェクト160のすべての境界をマークすると、望ましくないほど多数の小さな部分250が生成されるため、マークしない。このような場合、境界検出器222は、現在の部分250をスキャンするときに、部分250のスキャンされたサイズがある所望のターゲットサイズを超えるまで、境界252の検出を開始するのを待ち得る。スキャンがターゲットサイズを超えると、境界検出器222は境界の検出を開始し、好ましくは、ターゲットサイズを越えてオブジェクトが含む第1の境界を識別する。こうして、現在の部分が終了し、新しい部分が検出された第1の境界から始まることがある。
【0061】
境界検出器222が境界252についてオブジェクト160をスキャンするとき、特徴検出器224は、後の処理に関連する有用な情報を提供し得る追加の特徴についてオブジェクトをスキャンすることができる。特定のコンテンツの有無が事前に分かっている場合、特定の処理タスクがより速く実行されることが認識されている。特定の例として、CSVファイルの特定のクエリは、データ内に引用符がないことが事前に分かっていれば、より迅速に実行される。したがって、特徴検出器224は、引用符の有無についてCSVファイルをチェックし、それに応じてオブジェクトメタデータ112(「特徴」)を更新し得る。
【0062】
データオブジェクト160の部分250が境界252に基づいて識別されると、トランスフォーマ230は、部分250をそれぞれのセグメント170に変換する。例えば、トランスフォーマ230は、ある部分に見られるメタデータを1つまたは複数の他の部分に追加することによって、部分250の少なくともいくつかを変更し、そのような部分が独立した処理に適したものにする、すなわち、部分250間の依存関係を除去する。調整の性質は、タイプ検出器210の動作に基づいて既知であるオブジェクトタイプに依存する。トランスフォーマ230の動作結果はセグメント170であり、データオブジェクトの個別に処理可能な単位を提供する。例えば、各々のセグメント170は、データオブジェクト160と同じオブジェクトタイプとしてレンダリングされる。したがって、セグメント170は、データオブジェクトを処理できるのと同じように処理できるが、主な違いは、セグメント170がはるかに小さく、より容易に扱えることである。
【0063】
次に、分配器240は、セグメント170を、ストレージクラスタ130の選択されたノード120に分配し、当該ノードに保存させる。このとき、ゲートウェイ110は、セグメント170が送信される場所、例えば、特定のノード120の識別情報を記録するために、オブジェクトメタデータ112を更新する。説明したように、データオブジェクト160は、このようにして分割され、変換され、ストレージクラスタ130のノード120間で分配される。
【0064】
図3Aおよび
図3Bは、CSVファイルなどの表形式データを含むデータオブジェクト160aを分割および変換するための構成例を示す。
図3Aは、分割の結果例を示し、
図3Bは、変換の結果例を示す。
【0065】
図3Aに示すように、データオブジェクト160aは、第1の行310と、2~8(列1参照)とラベル付けされた追加の行とを有する。データオブジェクト160aは4つの列を有する。各行は、CSVの行区切り文字として機能する<NewLine>文字で終了する。
【0066】
データオブジェクト160aを分割するとき、スプリッタ220は、データオブジェクト160aの部分350の最小サイズを定義するターゲットサイズ320を適用してもよい。例えば、スプリッタ220は、ターゲットサイズ320に対応するデータオブジェクト160aに沿った位置(点線で示す)を識別し、識別された位置に続く第1の境界でデータオブジェクト160aを分割してもよい。図示の例では、スプリッタ220は、ターゲットサイズ320に続く第1の境界252として、第6行目の終わりのNewLine文字を検出し、この位置でオブジェクト160aを分割する。その結果、オブジェクト160aの第1の6行が第1の部分350aを形成し、次の2行が第2の部分350bの第1の2行を形成する。スプリッタ220が対象物160aをスキャンし続けるにつれて、第2の部分350bに追加の行が追加されてもよい。
【0067】
スプリッタ220がオブジェクト160aを行境界でうまく分離したとしても(したがって、同じ行の異なる部分が異なる部分350に割り当てられることを回避する)、分割の結果は依然として非効率的である可能性がある。例えば、オブジェクト160aの第1の行310がヘッダー行(例えば、列名を示すテキストを含む行)である場合、第2の部分350bはそのヘッダーを欠くことになり、後の処理が損なわれる可能性がある。例えば、ヘッダーは、特定のクエリまたは他のアクティビティに応答するために必要とされる場合がある。しかしながら、この欠陥は、トランスフォーマ230によって対処され得る。
【0068】
図3Bは、トランスフォーマ230による変更結果の例を示している。ここで、部分350aおよび350bは、それぞれセグメント370aおよび370bとしてレンダリングされている。セグメント370bは、第1のセグメント370aに見られる第1の行310のコピーである第1の行310aを挿入することによって変更されている。第1の行310aの追加により、第2の部分370bは効果的に独立した処理可能な単位に変換される。セグメント370bで行われた変更は、オブジェクト160a用に作成された他のセグメント370でも繰り返され、すべてのセグメント370が、第1のセグメント370aと同じ第1の行310を持つようにされることを理解されたい。このようにして、このようなセグメント370はすべて、独立して処理可能となる。
【0069】
CSVファイルの中には、ヘッダー行を使用しないものがあり、そのような場合、第1の行310は、テキストベースのフィールド名ではなく、データを含む可能性があることに留意されたい。このような場合、第1のセグメント370aの第1の行310をオブジェクト160aの他のセグメント370にレプリケーションすると、冗長なデータが単に伝播されるだけになる事がある。しかし、このようなケースは簡単に処理できる。例えば、クエリまたは他の処理タスク(ストレージクラスタのクライアントからくるタスクなど)は、オブジェクト160aによって表されるCSVファイルがヘッダーを含有するかどうかを指定し得る。もし含むのならば、ヘッダーのコピーは適切であったので、変更する必要はない。しかし、タスクがCSVファイルにヘッダーが含まれていないことを指定した場合、コピーは不要であることが判明する。このような場合、CSVファイルに対して分配処理タスクを実行するノード120は、セグメント370の第1のセグメント370a以外のすべてのセグメントの第1の行を無視するように指示され得る。第1の行310をコピーした結果、セグメント370のサイズと比較して無視できる程度のサイズしか失われない。
【0070】
図4Aおよび
図4Bは、Parquetファイルのような列ベースのデータを含むデータオブジェクト160bを分割および変換するための構成例を示す。
図4Aは、分割および変換前のParquetファイル構造例を示し、
図4Bは、分割および変換後の結果例を示す。
【0071】
図4Aに見られるように、Parquetファイル160bは、上述したように、4バイトの「マジックナンバー」(「PAR1」)で始まり、4バイトの「マジックナンバー」(「PAR1」)で終わる。ファイル160bはさらに、複数の行グループ410(1からNまで、「N」は任意の正の整数)と、フッター420とを含む。行グループ410は、通常それぞれがメガバイト単位の大規模な構造である。フッター420は、ファイル160b内の行グループ410の位置(例えば、バイト位置)を提供する行グループメタデータを含むファイルメタデータを含有する。フッター420はまた、「ファイルメタデータの長さ」を符号化する4バイトのデータエレメントを含む。
【0072】
オブジェクトを前方にスキャンしている間に境界252を直接検出することができるCSVの例とは異なり、行グループ410間の境界は、フッター420を読み取ることによってのみ容易に検出することができる。これは、スプリッタ220が、通常、フッター420に到達する前にファイル160a全体を通過し、その後、遡及的に分割することを意味する。分割は、一般に、行グループの境界ごとに実行され、Parquetファイル160bの各部分260が単一の行グループ410を含むようにされる。行グループ410は内容によって大きさが異なる可能性があるため、2つ以上の行グループ410を1つの部分260に配置することが有益な場合もある。これは設計の好みの問題である。
【0073】
図4Bに示すように、
図4AのParquetファイル160bは、N個の異なるセグメント470(470-1~470-N)としてレンダリングされており、各セグメントは単一の行グループを含む。例えば、セグメント470-1は行グループ1を含み、セグメント470-2は行グループ2を含み、行グループNを含むセグメント470-Nまで続く。
【0074】
トランスフォーマ230によって実装され得る
図4Bに示す変更は、各行グループを自己完結型のParquetファイルとしてレンダリングする。例えば、それぞれのセグメント470-1~470-Nは、先頭と終わりにマジックナンバー「PAR1」を含む。また、それぞれのセグメント470-1~470-Nは、フッター420の変更バージョンであってもよい、変更されたフッターを含む。それぞれのセグメント470のフッターは、その行グループメタデータが、そのセグメントに含まれる行グループ(または複数の行グループ)のみに限定され、そのセグメントに含まれない行グループの行グループメタデータを除外するように準備される。さらに、「ファイルメタデータの長さ」は、各セグメントに設けられ、それぞれのセグメント内のファイルメタデータの実際の長さを反映する。このように、それぞれのセグメント470-1~470-Nは、それ自体が完全なParquetファイルであり、他のParquetファイルと同様に独立した処理が可能である。
【0075】
いくつかの例では、追加のセグメント470-(N+1)が、Parquetファイル160bの最終セグメントとして提供され得る。セグメント470-(N+1)は行グループを含まず、むしろファイル160bの元のフッター420の一部、すなわち「ファイルメタデータ(全行グループ用)」および「ファイルメタデータの長さ」の永続バージョンを提供する。このセグメントは、参照用に提供され、特定の処理タスクを高速化するために有用であるが、自己完結型のParquetファイルとして扱われることは意図されていない。また、クエリを実行する際のデータソースとして使用することも意図していない。
【0076】
図5Aおよび
図5Bは、ビデオファイルまたはストリームなどのビデオデータを含むデータオブジェクト160cを分割および変換するための構成例を示す。
図5Aは、分割および変換前のビデオフレームのシーケンス例を示し、
図5Bは、分割および変換後の結果例を示す。
【0077】
図5Aに見られるように、データオブジェクト160cは、フレーム510のシーケンスを含み、このフレームは、図示の例では、1つまたは複数のIフレーム(例えば、510-1および510c)、1つまたは複数のPフレーム(例えば、510-2、510-3、510a、510d、および510e)、および1つまたは複数のBフレーム(例えば、510b)を含む。周知のように、Iフレームは、完全な画像を含むビデオフレームであり、完全性のために他のフレームに依存しない。対照的に、PフレームおよびBフレームは不完全であり、完全性のために他のフレームに依存する。Pフレームは通常、前のフレームを参照するが、Bフレームは前方または後方を参照する。通常、I-フレームはP-フレームやB-フレームよりもサイズが大きく、保存や送信にコストがかかるため、I-フレームが出現する頻度は非常に低い。
【0078】
オブジェクト160cにおけるビデオデータの分割は、オブジェクト160aにおけるCSVデータの分割とほぼ同様に動作する(
図3Aおよび
図3B)。例えば、スプリッタ220は、ターゲットサイズ320に等しいか、ターゲットサイズ320よりわずかに大きいサイズを有する部分250を生成することを目指し得る。スプリッタ220は、ターゲットサイズを超えた後に生じるデータオブジェクト内の第1の境界252を見つけようとする。ビデオデータ内の境界を検出するために、スプリッタ220は、Iフレームを識別するように構成されてもよく、Iフレームは、より前またはより後のフレームへの参照を必要としないので、自然境界を提供する。図示の例では、スプリッタ220は、ターゲットサイズ320を超える次の境界をIフレーム510cとして識別する。
【0079】
しかし、Iフレーム510cの直前にビデオを分割すると、Bフレーム510bがIフレーム510cを参照するため、Iフレーム510cなしではレンダリングできないという問題が生じる。スプリッタ220がBフレーム510bの直後にビデオを分割すると、Bフレーム510bを含むセグメントにビデオのギャップが現れる。そのため、そのセグメントは、別のセグメントに依存することになり、不完全なものとなる。
【0080】
図5Bは、解決策の例を示している。ここで、これまでに処理されたオブジェクト160cは、2つのセグメント570aおよび570bとしてレンダリングされる。依存関係を解決するために、セグメント570aには、Iフレーム510cのコピー510ccが提供される。コピー510ccは、Bフレーム510bからの必要な参照を提供し、セグメント570aをレンダリングする際のドロップビデオフレームを回避する。一方、セグメント570bは、Iフレーム510cを第1のフレームとして保持し、セグメント570bを開始するための独立したベースラインを提供する。後続のフレーム、たとえば510dおよび510eは、完全性のためにIフレーム510cに依存することがあるが、後続のフレームはいずれもIフレーム510cより前のフレームを参照しない。したがって、それぞれのセグメント570aおよび570bは、完全性のために他のセグメントに依存することなく、独立して個別に処理可能な単位としてレンダリングされる。
【0081】
図6は、追加の実施形態による、分配処理を実行するための構成例を示す。図示の構成は、
図1の環境100で実装されてもよいし、他の環境で実装されてもよい。以下の説明では、環境100での実装を想定しており、上述の特徴は本発明の実施形態の一部を形成する。他の例では、
図6の構成は、異なる特徴を有する他の環境で実施されてもよい。したがって、上述した特徴は、具体的に示されていない限り、例示であって必須ではないものとみなされるべきである。
【0082】
図6に示すように、ゲートウェイ110は、分配処理を実行する役割をサポートするコンポーネントを含む。これらには、上述のオブジェクトメタデータ112に加えて、タスクリクエスタ610、ディスパッチャ620、出力レシーバ630、および出力アグリゲータ640が含まれる。
【0083】
動作例では、タスクリクエスタ610は、指定されたデータオブジェクト160(またはオブジェクト160のセット)に対して処理タスクを実行するためのリクエスト650を開始する。様々なタイプのタスクが考えられる。これらは、例えば、指定されたデータ(例えば、表形式またはツリーベースのデータオブジェクト)の読み取りおよび/またはクエリを含み得る。クエリの種類には、SQL(Simple Query Language)クエリ、キー値ルックアップ、noSQLクエリなどが含まれる。ビデオデータオブジェクトのタスクには、指定されたグラフィックコンテンツ(例えば、顔、ナンバープレート、地理的特徴など)の検索などの分配ビデオ処理タスクが含まれる場合がある。音声データオブジェクトのタスクには、話された単語、音声特性(例えば、トーン、アクセント、ピッチなど)、特定の音などの検索が含まれ得る。基本的に、複数のノード120間で分割可能であり、潜在的に大量のデータへのアクセスを伴うタスクはすべて、
図6の構成で処理するのに適した候補である。
【0084】
リクエスト650が発行されると、ディスパッチャ620は、リクエストされたタスクのコンポーネントをそれぞれのノード120に分配し始める。例えば、ディスパッチャ620は、オブジェクトメタデータ112をチェックして、指定されたデータオブジェクト160(またはオブジェクトのセット)のセグメント170と、ストレージクラスタ130内のそれぞれの位置を識別する。示された単純化された例では、オブジェクトメタデータ112は、データオブジェクト160を構成する3つのセグメント170(S1、S2、およびS3など)(典型的な結果には数十または数百のセグメントが含まれる場合がある)と、それぞれのセグメント170を保存する3つのコンピューティングノード120-1、120-2、120-3を識別する。
【0085】
次に、ディスパッチャ620は、リクエスト650-1、650-2、および650-3を、それぞれ、識別されたノード120-1、120-2、および120-3に送信する。リクエスト650-1、650-2、および650-3は、リクエスト650と類似または同一であってもよく、例えば、リクエスト650で指定されたのと同じクエリまたは他のタスクを提供してもよい。しかしながら、このようなリクエスト650-1、650-2、および650-3は、互いに同一である必要はない。例えば、いくつかのリクエストは、他のリクエストで送信されたものとは異なるセグメント固有のメタデータ(例えば、オブジェクトメタデータ112に保存されている)を含む場合があり、特定のノードでの処理タスクをガイドするために使用されることがある。。
【0086】
特定されたノード120-1、120-2、および120-3は、それぞれリクエスト650-1、650-2、および650-3を受信し、これらの各々のノードは、それぞれのセグメント上でリクエストされたタスクの実行を開始する。例えば、ノード120-1はセグメントS1上でタスクを実行し、ノード120-2はセグメントS2上でタスクを実行し、ノード120-3はセグメントS3上でタスクを実行する。一例では、各ノード120は、他のノード120とコンタクトする必要なく、それぞれのセグメント170上でそれぞれのタスクを独立して実行する。例えば、ノード120-1は、S2またはS3へのアクセスを必要とせずに、S1のみにアクセスすることによってその作業を完了する。他のノードについても同様である。
【0087】
ノード120-1、120-2、および120-3がそれぞれの作業を実行すると、そのようなノードは、ノード120-1からの出力660-1、ノード120-2からの出力660-2、およびノード120-3からの出力660-3として示される、それぞれの出力660を生成する。参加ノードはそれぞれの出力660をゲートウェイ110に送り返し、ゲートウェイ110は出力を出力レシーバ630に収集する。
【0088】
図6の下部付近の拡大図に示すように、出力レシーバ630は、任意の順序で参加ノード120から出力660を受信することができる。第1のシナリオでは、ノード120-1、120-2、および120-3は、出力を送り返す前にそれぞれのタスクが完了するのを待つように構成される。この場合、特定のノードからの出力660は一度に到着し、異なるノードからの出力はそれぞれの完了時間に基づいて異なる時間に到着する可能性がある。出力データ662は、この第1のシナリオによる結果の例を示す。ここでは、ノード120-2からの出力660-2が最初に到着し、したがって出力データ662に最初に現れ、続いて(ノード120-1からの)出力660-1が到着し、次に(ノード120-3からの)出力660-3が最後に到着する。出力660はこのように出力データ662にインターリーブされる。
【0089】
第2のシナリオでは、ノード120-1、120-2、および120-3は、インクリメントが利用可能になると直ちになど、その出力をインクリメントで返すように構成される。この第2のシナリオでは、各参加ノードはその出力660を複数の送信で返送することができ、これは時間的に分配することができる。出力データ664は、このシナリオによる結果の例を示す。ここで、出力データ664は、6つの異なるバッチ(660-1a、660-1b、660-2a、660-2b、660-3a、および660-3b)、すなわち、それぞれのノード120-1、120-2、および120-3からの出力の2つのバッチを含むことが分かる。バッチは、受信された順序で出力データ664に現れ、したがって、第1のシナリオで見られたよりも細かい粒度でインターリーブされる可能性がある。
【0090】
もちろん、ゲートウェイ110は、任意の所望の方法で出力660をソートしてもよく、ストレージクラスタ130の任意のノード120がこのタスクを実行するように呼び出されてもよい。いくつかの例では、影響を受けるノードとゲートウェイ110の両方が出力660のソートに参加し得る。例えば、それぞれのノードは、それぞれの結果660-1、660-2、または660-3がソートされた順序で個別に到着するように、それぞれの出力をソートしてもよい。その後、ゲートウェイ110は、例えば、返された結果をソートしたセットの間でソートするためにアグリゲータ640を採用することによって、作業を完了することができる。
【0091】
ソートには時間がかかり、多くの処理タスクはソートされた出力よりも速度を重視する。高速動作をさらに促進するために、コンピューティングノード120は、出力660をゲートウェイ110に返す際にRDMA(リモートダイレクトメモリアクセス)を採用する例もある。
【0092】
いくつかの処理タスクでは、ディスパッチャ620は、すべての関係ノード(すなわち、対象データオブジェクトのセグメントを保存するすべてのノード)に処理リクエストを送信することができる。他の例では、ディスパッチャ620は、例えば、先験的なセグメントコンテンツ、セグメントのバイト範囲、または他の要因の知識に基づいて、リクエストが送信されるノードを制限することができる。このように関係するノードの数を制限することは、ネットワーク140(
図1)上のトラフィックを低減するのに役立ち、効率をさらに促進する。
【0093】
処理タスクの中にはアグリゲーションを伴うものがある。例えば、クエリは、記録そのものではなく、指定された条件を満たす記録のカウントをリクエストし得る。クエリは、平均値、最大値、最小値、または他のアグリゲート値をリクエストし得る。ノード120は、特定のアグリゲート関数(例えば、カウント、合計、最大、最小など)を自ら実行することができるが、個別のノード120は、通常、複数のノードにわたる出力をアグリゲートしない。むしろ、この機能は、データアグリゲータ640によって実行される場合がある。たとえば、アグリゲータ640は複数のノードからカウントを受信し、各ノードがそれぞれのセグメントの処理から得られた部分的なアグリゲート結果を提供する。次に、アグリゲータ640は、応答ノードからのカウントを合計して、データオブジェクト160全体のアグリゲート合計を生成し得る。データオブジェクトのアグリゲート平均を生成するために、例えば、アグリゲータ640は、カウントと合計の両方を提供するように各参加ノードに指示し得る。次に、返されたすべてのカウントを合計してアグリゲートカウントを生成し、すべての合計を合計してアグリゲート合計を生成し、アグリゲート合計をアグリゲートカウントで割って所望のアグリゲート平均を生成することができる。他のタイプのアグリゲート関数も同様の方法で実行できる。
【0094】
図6の構成は、帯域幅の点で非常に低いコストでアグリゲートクエリを実行できることを理解されたい。各参加ノードはローカルアグリゲートを計算し、その結果のみを返すので、アグリゲートクエリは、非常に大きなデータセットにわたって実行され、通常は1kB未満であり、多くの場合、数バイト程度である、非常に小さな出力660を生成することができる。
【0095】
ゲートウェイ110は、タスクリクエスト650の発信元として、影響を受けるノードへのリクエストのディスパッチャとして、およびノードからの出力660のコレクタとして示され、説明されてきたが、これらの機能は、代替的に、他のコンピュータによって、または複数のコンピュータによって実行されてもよい。実際、これらの機能は、ストレージクラスタ130の1つまたは複数のノード120によって実行されてもよい。したがって、示された例は、限定的ではなく例示的であることを意図している。
【0096】
図7および
図8は、追加の実施形態におけるセグメント170のデータ保護を実行するための例示的な構成を示す。
図6および
図7に図示された構成は、
図1および/または
図6の環境100において、または上記に図示された環境とは異なる環境において実装され得る。
【0097】
図7は、1つのデータオブジェクト160から生成された複数のセグメント170を示し、セグメント170は縦に配置されている。必須ではないが、セグメント170は、この場合、最も早く作成されたセグメント(オブジェクトの先頭に最も近い)が上に表示され、垂直方向に隣接するセグメント170がデータオブジェクト160の隣接する部分に対応するように、順番に配置されてもよい。9つのセグメント170が示されているが、データオブジェクト160からは9つ以上のセグメント170が生成されてもよい。一例では、図示の9つのセグメント170は、データオブジェクトから生成された第1の9つのセグメントである(例えば、スプリッタ220とトランスフォーマ230によって;
図2)。
【0098】
注目すべきことに、セグメント170はそれぞれ長さが異なる。したがって、図の右上に示すように、セグメント170を長さの順に、例えば、最も長いものから最も短いものへとランク付けすることが可能である。
【0099】
図8は、同じランク付けされたセグメント170の拡大図である。ここでは、K+M消去コード処理が9つのセグメント(K=9)に対して(例えば、ゲートウェイ110によって)実行され、様々な形態のパリティ情報を提供するリペアデータのM=3のエレメント810が生成される。K個のセグメントとM個のリペアエレメントは、全体で合計12個のエレメントを含むリペアグループ802を構成する。
【0100】
図示のリペアグループ802は、データ損失が発生する前に最大M個のエレメントに損傷を許容する。損傷したエレメントは、データセグメント170および/またはリペアエレメント810を任意の組み合わせで含み得るリペアグループ802の任意のエレメントであってもよい。全エレメントがM個以上損傷しない限り、完全な回復とリペアが可能である。K=9およびM=3の選択は、他の要因の中でも、所望のデータ保護レベルに基づいて、変化させることができることを理解されたい。一例では、リペアエレメント810は、全く新しいと思われる計算上効率的な手順800を用いて生成される。
【0101】
従来の消失訂正符号化方式では、K個のデータエレメントがすべて等しい長さである必要がある場合がある。データエレメントの長さが等しくない場合は、ゼロパディングを使用して長さを等しくする。その後、K個のデータエレメントの全長を使用してパリティ計算が実行され、K個のデータエレメントと同じ長さのM個のパリティエレメントが生成される。
【0102】
通常の消失訂正符号化アプローチとは対照的に、手順800は不等長を持つデータエレメントからリペアエレメントを生成する。ゼロパディングは必要ない。一例では、手順800は、セグメント170、すなわちK=9のデータエレメントを論理的にアライメントさせることによって進行する。例えば、セグメント170は、図示されるように、それぞれの上部でアライメントされてもよい。あるいは、セグメント170は、それぞれの底部(図示せず)でアライメントされてもよいし、他の既知の方法でアライメントされてもよい。このようなアライメントは、どのセグメント170の実際の移動も必要とされないため、物理的ではなく論理的であることに留意されたい。また、図示のセグメント170の順位は、物理的な順位ではなく論理的な順位であると理解すべきである。
【0103】
セグメント270が論理的にアライメントされた状態で、手順800は、最短のセグメント170(「1」と表示)を識別し、対応する範囲(Rng1)を識別することによって進行する。Rng1はセグメント1とアライメントし、同じサイズと制限を持つ。セグメント1は最短のセグメントであり、セグメント170は論理的にアライメントしているため、K個のセグメント170(セグメント1~9)のすべてがRng1内にデータを持つ。セグメント1~9にまたがるRng1のデータを使用して、手順は、M個のリペアエレメント810のそれぞれに対して1セットずつ、Mセットのリペアデータを計算し、Rng1の位置にあるそれぞれのリペアエレメント810にリペアデータを配置する。こうしてRng1のリペアデータが完成し、そのようなリペアデータはすべてのK個のセグメント170に基づいている。本明細書におけるリペアデータの計算は、従来のK+M消失訂正符号化で使用されるものと同様であってもよく、その詳細は実施形態にとって重要ではないため、これ以上説明しないことを理解されたい。
【0104】
その後、手順800は、追加の範囲について同様の方法で継続される。例えば、Rng2は、セグメント1を越えて広がるセグメント2の部分、すなわち、リペアデータがまだ計算されていないセグメント2の部分に対応する。セグメント1にはRng2にデータがないため、Rng2のリペアデータは、セグメント2~9の対応する部分(すなわち、合計K-1個のセグメント)のみを使用して計算することができる。前と同様に、この手順では、M個のリペアエレメント810のそれぞれに対して1セットずつ、Mセットのリペアデータを計算し、リペアデータをそれぞれのリペアエレメント810に、今度はRng2の位置に配置する。こうしてRng2のリペアデータが完成するが、このようなリペアデータはK-1個のセグメント170のみに基づいている。
【0105】
手順800は、範囲Rng3からRng8の各々について、本方法で継続することができ、各範囲のリペアデータの計算は、直前の範囲の計算よりも1つ少ないセグメントを含む。したがって、Rng3の計算にはK-2個のセグメントが含まれ、Rng4の計算にはK-3個のセグメントが含まれ、Rng8の計算にはK-7個のセグメント、つまりセグメント8と9だけが含まれる。Rng9は1つのセグメント(セグメント9)のみと交差するため、Rng9の計算は不要である。手順800は、Rng9のリペアデータを計算するのではなく、代わりに、影響を受けるデータ、すなわち、Rng9内のセグメント9の部分のレプリカ(コピー)を保存する。Rng9データの別個のコピーは、各リペアエレメント810のRng9の位置に提供されてもよい。
【0106】
消失訂正符号化手順800は、通常、従来の消失訂正符号化よりも計算が高速である。M個のリペアエレメント810のリペアデータを計算するためにK個のデータエレメントすべてを必要とする代わりに、手順800は、最短のデータエレメントのみに対してK個のデータエレメントを必要とする。次に短いデータエレメントごとに、手順800では必要なデータエレメントが1つ少なくなり、最終的には2つのデータエレメントしか必要としないため、計算の複雑さおよび実行時間を低減する。
【0107】
オブジェクト160から生成されるセグメント170は、消失訂正符号化手順800を使用して保護され得ることを理解されたい。例えば、セグメント170をクラスタ130に保存するためにコンピューティングノード120に分配するとき、ゲートウェイ110(または他のコンピュータ)は、低減された計算コストでリペアエレメント810を生成するために手順800を実行することができる。手順800は、一度にK個のセグメント170で動作し、それぞれについてM個のリペアエレメントを生成し、K+M個のエレメントの各セットについてそれぞれのリペアグループ802を形成することができる。
【0108】
図9は、特定のデータオブジェクト160xを保護するために使用され得る複数のリペアグループ802の構成例を示す。図示のように、リペアグループ802-1、802-2、および802-Rまでが、例えば、消失訂正符号化手順802を使用して、データオブジェクト160xのデータ保護を提供する。第1のリペアグループ802-1は、データオブジェクト160xから生成されたK個のセグメント170の第1のグループを含み、保護し、第2のリペアグループ802-2は、同じデータオブジェクト160xから生成されたK個のセグメント170の第2のグループを含み、保護し、以下、セグメント170の最後のグループを保護するR番目のリペアグループ802-Rまで続く。リペアグループ802-RはK個未満のセグメントを含むことに留意されたい。例えば、データオブジェクト160xは、7つのセグメントを生成しただけで終了した(データがなくなった)可能性がある。リペアグループ802を構成するセグメント170は、列(Col1からCol9)に配置され、各列はK個のエレメントのそれぞれの1つに対応している。
【0109】
消失訂正符号化は、データ配置に一定の制約を課し得ることを理解されたい。例えば、同じリペアグループ802に属する2つのセグメント170は、通常、同じディスクドライブ(例えば、SSD、磁気ディスクドライブなど)に保存されるべきではない。そうすることは、消失訂正符号化の冗長性を損ない、セグメントをデータ損失の増大リスクにさらすことになるからである。同様の理由で、同じリペアグループ802に属する2つのセグメント170は、通常、同じコンピューティングノード120に保存されるべきではない。そうすることで、例えば、コンピューティングノード120に障害が発生した場合の冗長性が低下するからである。しかし、これらのルールは、通常、異なるリペアグループ802には適用されない。例えば、2つのセグメントが同じリペアグループ802に属さない限り、異なるリペアグループ802に属するセグメント170を同じコンピューティングノード120に保存しても、冗長性の実質的な損失は生じない。例えば、1つのコンピューティングノード120が、所定のデータオブジェクト160を保護するR個のリペアグループのそれぞれから1つのセグメント170を保存することが許容される場合がある(同じデータオブジェクトの合計R個のセグメント)。
【0110】
さらに、消失訂正符号化はデータを保護する1つの方法であり、他の方法はレプリケーションであることを理解されたい。一例として、データオブジェクト160とそれに関連するリペアデータおよび/またはレプリカはオブジェクトストアのバケットに存在し、データ保護スキームはバケットごとに適用される。データ保護にレプリケーションを使用するバケットは、その中に含まれるすべてのオブジェクト160を含む、すべてのコンテンツの保護にレプリケーションを使用することになる。同様に、データ保護に消失訂正符号化を使用するバケットは、そのすべてのコンテンツに消失訂正符号化を使用する。消失訂正符号化パラメータKおよびMは、バケットごとに選択および適用することもできる。したがって、
図9の構成は、オブジェクト160xを含むバケットがこれらの設定を使用するため、K=9およびM=3の消失訂正符号化を使用することができ、したがって、これらの設定は、バケットのすべてのコンテンツにグローバルに適用される。
【0111】
図10は、データオブジェクト160とそのセグメント170を管理する際に使用される様々な量を決定するための例示的な方法1000を示す。方法1000は、消失訂正符号化を使用したデータ保護を想定しており、セグメント170の所望のターゲットサイズ320(
図3)、およびデータオブジェクト160を保護するために使用するリペアグループ802の数R(
図9)を決定するために使用することができる。方法1000は、例えば、ゲートウェイ110によって、ストレージクラスタ130のノード120によって、またはクラスタ130に接続可能な他のコンピュータによって実行され得る。方法1000の開始時に、データオブジェクト160のサイズと(K+M消失訂正符号化で使用されるような)数Kとが予め知られていると仮定される。
【0112】
1010において、方法1000は、ノード120によって効率的に処理され得るセグメント170の最大サイズSMAXを確立する。最大サイズは、ノード120のハードウェア仕様(例えば、クロック速度、コア数、メモリ量など)、処理タスクの予想される待ち時間およびユーザの期待などの実用的な考慮事項に基づいてもよい。SMAXの典型的な範囲は、例えば、数百キロバイトから数メガバイトの間である。
【0113】
1012において、本方法は、列あたりの平均バイト数B
Cを計算する。一例では、B
Cの値は、データオブジェクト160のサイズ「ObjectSize」と、データオブジェクト160を保護するために使用されるK+M消失訂正符号化で使用される数Kとに基づいてもよい。例えば、B
C=ObjectSize/Kである。
図9に簡単に戻ると、B
Cは、図示された列における列ごとのデータの平均量を表すことがわかる。
【0114】
1014で、方法1000は、例えば、BCをSMAXで割り、最も近い整数に切り上げることによって、リペアグループの数Rを計算する。より具体的には、リペアグループの数は、R=BC/SMAXとして計算され、切り上げられる。
【0115】
1016において、本方法はターゲットセグメントサイズ320をSTAR=BC/Rとして計算する。結果の量STARは、例えば、データオブジェクト160を分割するときに境界252の探索を開始する場所を決定する際に、スプリッタ220に提供され得る。
【0116】
1018で、方法1000は、少なくともSTARと同じ大きさの部分250を生成する方法でデータオブジェクト160を分割するように、例えば、STARを越えて次の境界252まで延びる部分250を生成するように、スプリッタ220に指示する。
【0117】
このようにして、方法1000は、特定のデータオブジェクト160に使用されるターゲットセグメントサイズ320およびリペアグループの数Rを確立するための有用なガイドラインを提供する。これらの量の実際の選択は、管理者の裁量を伴う場合があり、説明した以外の要因によって左右される場合がある。したがって、方法1000は、必須ではなく、助言的であることを意図している。
【0118】
図11は、例示的なコンピューティングノード120をさらに詳細に示す。コンピューティングノード120は、ストレージクラスタ130のコンピューティングノード120-1、120-2、および120-3を代表することを意図している。また、
図1のゲートウェイ110を代表することも意図している。
【0119】
示されるように、コンピューティングノード120は、1つまたは複数のネットワークインターフェースカード(NIC)1110などの1つまたは複数の通信インターフェース、1つまたは複数の処理チップおよび/またはアセンブリなどのプロセッサ1120のセット、ソフトウェアを実行するための揮発性メモリなどのメモリ1130、および1つまたは複数のソリッドステートディスク(SSD)、磁気ディスクドライブなどの永続ストレージ1140を含む。プロセッサ1120のセットとメモリ1130は共に制御回路を形成し、この制御回路は、本明細書で説明するような様々な方法および機能を実行するように構成および配置される。また、メモリ1130は、実行可能命令の形態で実現される、
図1および
図2に示されるような様々なソフトウェア構成を含む。実行可能命令がプロセッサ1120のセットによって実行されると、プロセッサ1120のセットはソフトウェア構成の動作を実行する。一例では、プロセッサ1120のセットのうちの1つ以上がネットワークカード1110(複数可)に存在してもよく、これにより、ネットワーク140を介した高速通信が促進され、帯域幅と効率が向上する。
【0120】
図12、
図13、および
図14は、環境100に関連して実施される可能性のある、例示的な方法1200、1300、および1400を示しており、上述した特徴のいくつかの要約を提供している。方法1200、1300、および1400である。このような方法は、一般的には、例えば、
図1および
図2に関連して説明したソフトウェア構成体によって実行される。方法1200、1300、および1400の様々な行為は、任意の適切な方法で順序付けることができる。従って、実施形態は、いくつかの行為を同時に実行することを含み得る、図示されたものとは異なる順序で行為が実行されるように構築され得る。
【0121】
図12は、データオブジェクトを管理する例示的な方法1200を示す。1210で、データオブジェクト160は、データオブジェクト160内の境界252で複数の部分250に分割される(
図2参照)。境界252は、データオブジェクトのタイプ(例えば、CSV、JSON、XML、Parquet、ビデオなど)に従って、データオブジェクト160の処理可能な単位250間のセパレータを提供する。1220において、部分250は、データオブジェクト160のタイプと同じタイプの個別に処理可能な単位を提供するセグメント170に変換される。例えば、データおよび/またはメタデータは、セグメント170間の依存関係を低減又は排除するために、1つの部分250から他の部分へコピーされてもよく、他の修正が行われてもよい。1230において、セグメント170は、ストレージクラスタ130の複数のコンピューティングノード120の間に分配され、そこに保存される。
【0122】
図13は、データオブジェクトを管理する例示的な方法1300を示す。1310において、データオブジェクト160は、例えば、スプリッタ220(
図2)の操作によって、複数のセグメント170に分割される。1320において、セグメント170は、ストレージクラスタ130の複数のコンピューティングノード120に分配される。1330において、分配処理タスクがストレージクラスタ130によって実行される。分配処理タスクは、ストレージクラスタ130の複数のそれぞれのコンピューティングノード120によって、そこに保存されたそれぞれのセグメント170またはセグメント170のセットに対して独立して実行される。
【0123】
図14は、データオブジェクトを管理する例示的な方法1400を示す。1410では、データオブジェクト160が複数のセグメント170に分割され、セグメント170の少なくとも一部は互いに異なる長さを有する(
図7および
図8参照)。1420において、セグメント170は、ストレージクラスタ130の複数のコンピューティングノード120に分配される。1430において、K個のセグメント170は、K個のセグメントから生成されたリペアデータのM個のエレメント810を使用して保護され、各々のM個のエレメント810は、K個のセグメントから選択されたセグメントのそれぞれのグループ化(例えば、K個のセグメントを有するもののグループ、K-1個のセグメントを有するもののグループなど)から計算されたリペアデータを保存する複数の範囲(例えば、Rng1、Rng2など)を有する。
【0124】
ストレージクラスタ130においてデータオブジェクト160を管理するための改良された技術は、データオブジェクト160を、データオブジェクト160内の境界252において複数の部分250に分割することを含む。この技術はさらに、データオブジェクト160の部分250を、個別に処理可能な単位を提供するセグメント170に変換すること、およびセグメント170をストレージクラスタ130の複数のコンピューティングノード120の間に分配してそこに保存することを含む。
【0125】
セクションII:圧縮データの分割、処理、および保護
本セクションでは、圧縮データを管理する例について説明する。上記のセクションIで説明したような特徴および方法論のいずれもが、このセクションIIで説明する実施形態でも使用できることを理解されたい。しかしながら、セクションIIの特定の実施形態は、セクションIに記載された実施形態とは独立して使用することができる。したがって、特に反対のことが示されていない限り、セクションIの特徴は、以下に説明するセクションIIの特徴のいずれにも必須または必要であるとみなされるべきではない。
【0126】
セクションIIの内容の概要:
圧縮データを分割する改良された技術は、ファイルまたはストリーム内の圧縮データを受信し、ファイルまたはストリームのそれぞれの圧縮部分を保存する複数のセグメントにファイルまたはストリームを分割することを含む。この技術はさらに、現在のセグメントに関連付けて解凍状態を保存することを含み、解凍状態は前のセグメントのデータに基づいており、他のセグメントとは独立して現在のセグメントの解凍を可能にする。
【0127】
いくつかの例では、現在のセグメントに関連付けられて保存された解凍状態は、前のセグメントの解凍されたデータの範囲から形成されたディクショナリを提供する。
【0128】
いくつかの例では、解凍されたデータの範囲は所定の長さを有し、前のセグメントの終わりまで延びる。
【0129】
いくつかの例はさらに、圧縮データの次のセグメントに関連付けて、現在のセグメントの終わりに現れる解凍データの範囲を、次のセグメントの解凍状態として保存することを含む。
【0130】
いくつかの例では、圧縮ファイルまたはストリームは、一連のブロック(たとえば、デフレートブロック)を含み、ファイルまたはストリームを複数のセグメントに分割することは、隣接するブロック間の境界で実行される。
【0131】
いくつかの例では、圧縮データは、一般的なGZIPソフトウェアで使用されているZLIBで使用されているDeflateアルゴリズムを使用して圧縮される。
【0132】
いくつかの例では、この技術はさらに、ファイルまたはストリームから形成されたセグメントと、セグメントに含まれるファイルまたはストリームのそれぞれのバイト範囲とを関連付けるオブジェクトメタデータを保存することを含む。いくつかの例では、オブジェクトメタデータに保存されるバイト範囲は、圧縮データの範囲を含む。いくつかの例では、オブジェクトメタデータに保存されたバイト範囲は、非圧縮データの範囲を含む。いくつかの例では、オブジェクトメタデータに保存されたバイト範囲は、圧縮データの範囲と非圧縮データの範囲の両方を含む。いくつかの例では、オブジェクトメタデータは、圧縮バイト位置に基づいておよび/または非圧縮バイト位置に基づいて、圧縮ファイルまたはストリームのデータへのアクセスを許可する。
【0133】
いくつかの例では、この技術はさらに、セグメントを、それらのセグメントに保存されたデータの行または記録のそれぞれの範囲に関連付けるオブジェクトメタデータを保存することを含む。行または記録の範囲は、番号(例えば、1行目、2行目、100行目など)によって識別することができる。特定の例では、オブジェクトメタデータは、第1の行または記録の番号と、関連するセグメントに保存された行または記録のカウントを示すことができる。行または記録の範囲を保存すると、行番号または記録番号に基づく検索が容易になる。
【0134】
いくつかの例では、ファイルまたはストリームを複数のセグメントに分割することは、圧縮ファイルまたはストリームのデータの内容に関係なく実行される。
【0135】
他の例では、ファイルまたはストリームを複数のセグメントに分割することは、圧縮ファイルまたはストリームのコンテンツに応じて実行される。
【0136】
例えば、ファイルまたはストリームの分割は、関連するデータをまとめた形で実行することができる。
【0137】
一例では、分割は、セグメントのターゲットサイズに基づいて分割のターゲット位置を特定することを含み得るが、その後、関連するデータを一緒に保つように、ターゲット位置とは異なる位置でファイルまたはストリームを分割する。
【0138】
いくつかの例では、分割は、ファイルまたはストリームの少なくとも一部のデータを解凍することと、CSVデータの行の終わり、JSON記録の終わり、ビデオデータのキーフレーム(IDRフレーム)など、解凍されたデータ内の自然境界を突き止めることとを含み得る。このような例では、分割はさらに、ファイルまたはストリーム内の分割位置を、位置付けられた自然境界に続く第1のブロック境界として特定することを含む。
【0139】
いくつかの例では、この技術は、自然境界と分割位置の間に現れるフィックスアップデータを、次のセグメントのメタデータに保存することをさらに含む。
【0140】
いくつかの例では、この技術は、現在のセグメントと次のセグメントの少なくとも一方のメタデータに、自然境界の位置をマークすることをさらに含む。
【0141】
いくつかの例では、フィックスアップデータは、次のセグメントのディクショナリを形成する解凍データの範囲の長さを超えない長さを有する。このような場合、フィックスアップデータの保存は、次のセグメントのメタデータにディクショナリを保存する一部として行われ、追加の保存は必要ない。
【0142】
他の例では、フィックスアップデータは、ディクショナリの解凍データの範囲の長さを超える長さを有する。このような場合、フィックスアップデータを保存することは、次のセグメントのメタデータに、追加のフィックスアップデータ、すなわち、ディクショナリを超えるフィックスアップデータを保存することを含む。
【0143】
いくつかの例では、この技術はさらに、現在のセグメントの解凍されたデータ内に、ヘッダーおよび/またはフッターなどの記述的コンテンツを識別し、次のセグメントのデータの独立した処理を容易にするために、次のセグメントのメタデータに記述的コンテンツを保存することを含む。
【0144】
いくつかの例では、この技術はさらに、セクションIでセグメントについて説明したいずれかの方法で、セグメントを保存、保護、および/または処理することを含む。
【0145】
前述の「セクションIIの内容の概要」は、読者が本明細書に提示された例示的な特徴を容易に把握するのを支援するための例示目的で提示されたものであるが、この概要は、必須の要素を規定すること、または本明細書の実施形態を何らかの形で限定することを意図するものではない。上述の特徴は、技術的に理にかなった任意の方法で組み合わせることができ、そのような組み合わせが明示的に特定されているか否かにかかわらず、そのような組み合わせのすべてが本明細書に開示されることを意図していることを理解されたい。
セクションIIの内容の説明:
【0146】
図15は、圧縮ファイル1510を解凍するための構成例を示す。ファイル1510は、本明細書の改良に従って分割可能なタイプである。例えば、ファイル1510は、一般的なGZIPソフトウェアによって一般的に使用されるZLIBによって使用されるようなDeflateアルゴリズムを使用して圧縮されてもよく、または示された方法で解凍することができる他のタイプのファイルであってもよい。ZLIBについての詳しい情報はインターネット<URL:http://zlib.net/>参照。ZLIBのDeflateアルゴリズムについての詳細は、インターネット<URL:http://zlib.net/feldspar.html>参照。GZIPについての詳しい情報はインターネット<URL:http://www.gnu.org/software/gzip/>参照。
図15の例は圧縮ファイルに関するものであるが、同様の動作は圧縮ストリームのために実行されてもよい。
【0147】
ファイル1510は、たとえば、ヘッダー1512、圧縮データのペイロード1514、およびフッター1516を含むとわかる。解凍は、ペイロード1514の先頭(点P0)から始まり、順方向に進み得る。点P1において、解凍は、初期解凍領域1520aが生成される点まで進んでいる。この初期領域の解凍は、たとえば、ディクショナリなしで、デフォルトディクショナリで、またはユーザ指定のディクショナリで進行することができる。解凍されたデータは、ファイル1510の後続のデータを解凍するためのディクショナリ1530を形成する。たとえば、ディクショナリ1530は、単に最新の解凍データであり、ディクショナリ1530に続く圧縮データは、ディクショナリ1530内のバイト範囲への参照を含む。そのような参照は、例えば、オフセット(例えば、現在の位置から後退したバイト数)および長さとして提供され得る。
【0148】
一例では、ディクショナリ1530は、たとえば32kBなど、決められた長さの解凍データのスライディングウィンドウとして提供される。解凍が進むにつれて、ディクショナリウィンドウ1530は、現在のバイト位置のすぐ後ろに留まりながら進む。例えば、ディクショナリ1530は、解凍された領域1520bの最後に表示され、その後、解凍された領域1520cの最後に表示される(
図15の下部)。
【0149】
図15に示す例はファイル1510のものであるが、同様の原理がストリームにも適用される。したがって、実施形態はファイルに限定されない。
【0150】
図16は、圧縮データを解凍する能力を保持しながら、
図15の圧縮ペイロード1514を分割する例を示す。ここでは、圧縮ペイロード1514は、位置1602(例えば、圧縮データ内の指定されたバイトオフセット)で分割される。圧縮ペイロードの第1の部分250aは第1のセグメント170xに行き、圧縮データの第2の部分250bは第2のセグメント170yに行く。部分250aおよび250bならびにセグメント170xおよび170yは、セクションIに関連して説明した部分250およびセグメント170の例であってよく、例えば、スプリッタ220によって形成される部分およびトランスフォーマ230によって形成されるセグメントであってよい(
図2)。
【0151】
圧縮ペイロードを分割する手順がここで停止すると、第2の圧縮部分250bは、第1の圧縮部分250aから独立して解凍することができない。これは、第2の部分250bの解凍が、ディクショナリ1530(例えば、最近解凍されたデータの範囲)へのアクセスを有することに依存するからである。従来のDeflate解凍は、第1の部分250aについては独立して機能するが(例えば、デフォルトディクショナリやユーザが選択したディクショナリを利用するか、またはディクショナリを利用しないため)、第2の部分250bについては、必要なディクショナリ1530が欠落しているため、独立して機能しない。
【0152】
この欠陥に対処するために、本明細書の実施形態では、第1の部分250aの終了時点のディクショナリ1530の状態をキャプチャし、そのディクショナリを第2の部分250bに関連するメタデータとして保存する。ここでは、このディクショナリを、前の部分の終わりからのものであることを識別するために、参照1530eと呼ぶ。ディクショナリ1530eは、様々な方法で第2の部分250bに関連付けて保存することができる。これらには、例えば、第2の圧縮部分250bを含むセグメント170yのヘッダーとして、セグメント170yのフッターとして、または
図1に関連して説明したセグメントメタデータ124のような別のメタデータとして、ディクショナリを保存することが含まれる。いくつかの例では、フラグおよび/または他の設定など、追加の解凍状態メタデータがディクショナリ1530eとともに保存されることがある。たとえば、Inflateアルゴリズムの状態全体が保存される場合がある。
【0153】
分割位置1602は、圧縮ペイロード1514の長さに沿った任意の位置であり得ることを理解されたい。したがって、分割位置1602でディクショナリ1530をキャプチャするには、ペイロード1514を最初から解凍し、位置1602に達すると解凍を一時停止する必要がある場合がある。この時点で、ディクショナリ1530は、単に現在のディクショナリ状態として(例えば、ZLIBなどのライブラリの呼び出しを経由して)取得されてもよい。圧縮ペイロード1514の解凍は、その後、必要に応じて(例えば、追加の分割が必要な場合)再開されてもよい。
【0154】
第2の部分250bのメタデータにディクショナリ1530eを保持することにより、第2の部分250bを第1の部分250aから独立して解凍することが可能になる。これは、ディクショナリ1530eを使用して第2の部分250bの第1のバイトを解凍し、ディクショナリが第2の部分250bの解凍されたデータから完全に形成されるまで、例えば
図15で説明した方法でディクショナリを前進させることによって行うことができる。その後、通常の方法で解凍を進めることができる。ディクショナリ1530eは、それ自体、圧縮形態で、例えば独立して圧縮オブジェクトとして、第2の部分250bに保存されてもよく、その後、第2の部分250bの解凍が所望されるときに解凍されることを理解すべきである。しかし、ディクショナリ1530eの圧縮保存は必須ではない。
【0155】
図16の例では、2つの部分250を形成する単一の分割のみが示されているが、圧縮ペイロード1514は、任意の所望の数の部分に分割されてもよい。そのような場合、第1の部分を除く各圧縮部分は、直前の部分の終了時点のそれぞれのディクショナリ1530e(および他の任意の所望の解凍状態情報)を含む。
【0156】
部分250aおよび250bは、圧縮ペイロード1514のそれぞれの範囲と好ましくは同一である圧縮データを保存することを理解されたい。したがって、分割行為は、好ましくは、あらゆる点で元の圧縮データを保持する。解凍は、ディクショナリ1530eを提供するため(同様に、後述する他の目的のため)に使用され得るが、ペイロード1514全体の解凍されたデータを保存することは、通常必要でも望ましくもない。むしろ、解凍されたデータは、通常必要とされず、所望のときにいつでも要求に応じて得ることができる。
【0157】
いくつかの例では、圧縮ペイロード1514の分割は、対応する非圧縮データに関する情報に少なくとも部分的に基づくことがある。例えば、データ処理時のコンピューティングリソースのバランスを取ることができるため、データが解凍されたときに類似したデータ量のセグメントを保存することが望ましい場合がある。従って、分割は、解凍されたデータの同様のサイズに解凍される部分250を形成するような方法で行われることがある。これは、(圧縮データの)部分自体のサイズが著しく異なることを意味する場合であっても同様である。したがって、圧縮データを複数の部分に分割する場合、圧縮データの部分の非圧縮バージョンは、互いに大きく異なる場合がある圧縮データの対応する部分よりもサイズが互いに近い場合がある。
【0158】
図17は、
図17のペイロード1514が複数のブロック1710で構成されていると見られる点を除き、
図16と同様の構成を示している。このようなブロック1710は、本明細書では、デフレート(サイズ圧縮)された「デフレートブロック」と呼ぶことがある。ブロック1710のサイズは均一であってもよいが、これは必須ではない。ブロック1710間の境界は、任意の適切な方法で示すことができる。
【0159】
いくつかの例では、ブロック1710は、ペイロード1514を分割するときに一緒にされ得る。したがって、分割はブロック境界(または「境界」)で行われることがある。例えば、圧縮サイズおよび/または解凍サイズなどに基づいて、所望の分割位置が識別されると、実際の分割位置は、例えば、最も近いブロック境界まで前方または後方に移動されてもよい。
【0160】
図18は、圧縮ペイロード1514を分割する例示的な方法1800を示し、上述した活動の一部を要約している。方法1800は、例えば、タイプ検出器210、スプリッタ220、およびトランスフォーマ230を含む、
図2に関連して説明されたゲートウェイ110によって実行されてもよい。
【0161】
1810において、圧縮データが、例えば、圧縮ファイルまたはストリームの形態で受信される。ファイルまたはストリームは圧縮ペイロード1514を含み、このペイロードは例えばZLIBのDeflate圧縮アルゴリズムを使用して圧縮される。
【0162】
1820において、圧縮ペイロード1514内の1つまたは複数の分割位置1602が決定される。分割位置1602の決定は、圧縮部分250の所望のサイズおよび/または圧縮部分250の非圧縮データの所望のサイズを含み得る、任意の数の要因に基づいてもよい。非圧縮サイズを考慮する場合、方法1800は、ペイロード1514の部分の実際の解凍(例えば、分割のためのディクショナリ1530を識別するときに実行される)に基づいて、非圧縮サイズを計算してもよい。分割位置1602は、ペイロード1514に保存されたデータの性質またはタイプを考慮して、または考慮せずに、決定され得る。
【0163】
1830において、ペイロード1514の圧縮データは、決定された分割位置(複数可)1602に基づいて、複数の部分250としてレンダリングされる。例えば、スプリッタ220は、圧縮ペイロード1514を部分250に分離し、それをトランスフォーマ230がそれぞれのセグメント170に配置する。独立した解凍を可能にするために、ディクショナリ1530eは、例えば、それぞれのセグメント170とともに保存されたメタデータとして、第1の部分を除く各部分250とともに提供される。圧縮部分250とともに保存されるディクショナリ1530eは、直前の部分の終了時点の解凍状態を反映する。
【0164】
1840において、方法1800は、圧縮部分250を保存するセグメント170でカバーされるデータの範囲を反映するために、
図1のメタデータ112などのオブジェクトメタデータを更新することをさらに含む。ペイロード1514の分割は、そのデータの実行中の解凍の実行を含むので、オブジェクトメタデータ112は、圧縮データの範囲と同様に、非圧縮データの範囲を反映することができる。オブジェクトメタデータ112はまた、行または記録の範囲、行または記録の総数、圧縮バイトの総数、非圧縮バイトの総数、およびその他の有用な情報を反映することができる。いくつかの例では、オブジェクトメタデータ112は、CSVデータ、JSONデータなどのデータの性質またはタイプを識別し、これは、例えば、タイプ検出器210および/またはスプリッタ220によって識別され得る。
【0165】
図19は、このようなオブジェクトメタデータ112の例をさらに詳細に示す。示されるように、オブジェクトメタデータ112は、セグメント170(SegIDとして指定される)を、圧縮された開始オフセット、終了オフセット、および長さ、ならびに圧縮されていない開始オフセット、終了オフセット、および長さに関連付けることができる。オフセットおよび長さの単位は、たとえばバイトであってもよい。このようにして、オブジェクトメタデータ112は、その範囲が圧縮データの範囲として表現されるか、非圧縮データの範囲として表現されるかにかかわらず、任意のバイト範囲へのランダムアクセスをサポートすることができる。いくつかの実施形態では、開始オフセットが既知である場合、終了オフセットと長さのいずれかが他方を意味するため、終了オフセットと長さの両方を保存することを避けることができることに留意されたい。
【0166】
一例として、クライアントはファイルの一部を圧縮バイト範囲としてリクエストすることができる。オブジェクトメタデータ112にクエリすることにより、クライアントは、リクエストされたデータを保存するセグメント170を、例えば、リクエストされた範囲を包含する圧縮開始オフセットと終了オフセットに関連付けられたSegIDとして識別することができる。次に、リクエストされたバイトは、バイト単位でカウントを進めてリクエストされた範囲の開始と終了を特定することによって、識別されたセグメント170からアクセスされ得る。
【0167】
リクエストされた圧縮バイトの範囲が複数のセグメント(例えば、連続するSegIDを有するセグメント)にまたがる場合、そのようなセグメントは、リストされた開始オフセットおよび終了オフセットに基づいて、再びオブジェクトメタデータ112から識別され得る。クラスタは第1のセグメントを識別し、バイト単位でカウントを進めてリクエストされた範囲の第1のバイトを特定し、リクエストされた範囲の最後のバイトに遭遇するまで、1つまたは複数の後続のセグメントに交差しながらバイト単位でカウントを進め続けることができる。その後、クラスタは、リクエストに対する応答として、第1のバイトと最後のバイトの間の圧縮データを返すことができる。
【0168】
あるいは、クライアントはファイルの一部を非圧縮バイトの範囲としてリクエストし得る。例えば、クライアントはオブジェクトメタデータ112にクエリして、リクエストされた範囲の非圧縮バイトのデータを保存するセグメント170を、例えばリクエストされた範囲を包含する非圧縮の開始オフセットと終了オフセットに関連付けられたSegIDとして識別し得る。次に、リクエストされたデータは、識別されたセグメント170から、識別されたセグメントに保存された部分250の全部または一部を解凍し、解凍されたデータ内をバイト単位でカウントして、リクエストされた範囲の先頭と終わりを特定することによってアクセスすることができる。その後、クラスタは、リクエストに対する応答として、先頭と終わりの間の非圧縮バイトを返すことができる。注目すべきは、これを実現するために、他のセグメントに保存されたデータを解凍する必要はないということである。むしろ、指示されたセグメント170を独立して解凍してもよい。
【0169】
リクエストされた非圧縮バイトの範囲が複数のセグメントにまたがる場合、それらのセグメントはオブジェクトメタデータ112から識別され、順に解凍され得る。たとえば、クラスタは、最初に識別されたセグメントを解凍し、バイト単位でカウントを進め、リクエストされた範囲の第1のバイトを特定する。次にクラスタは、リクエストされた範囲の最後のバイトに遭遇するまで、順次解凍される1つまたは複数の後続のセグメントを非圧縮のバイト単位でカウントを進め続ける。その後、クラスタは第1のバイトと最後のバイトの間の非圧縮データをクエリ応答として返す。
【0170】
いくつかの例では、オブジェクトメタデータ112は、特定のセグメント170に関連して、開始行または記録番号1910と、行または記録のカウント1920とをさらに保存し得る。行または記録は、例えば、CSV行(ライン)、JSON記録、Parquet行グループなどに関連し得る。行または記録は、行または記録番号(例えば、1行目、2行目、100行目など)に基づいて識別され得る。例えば、ペイロード1514を解凍するとき、スプリッタ220は、第1の行または記録の番号および各部分250におけるそのような行または記録のカウントを識別するように、解凍されたデータに行または記録を追跡してよい。スプリッタ220は、いくつかの例では、終了行または記録番号も追跡してよい。
【0171】
CSVデータに対してスプリッタ220を動作させる場合、最初の行がヘッダー行であるかどうかを判断する必要はない。したがって、例えば、開始行/記録1910とカウント1920は、ヘッダー行とコンテンツ行を区別する必要はない。むしろ、ヘッダー行とコンテンツ行はすべて同じようにカウントしてもよい。CSVデータを読み取るための後のリクエストは、(ヘッダーを無視して)絶対的な用語で行を指定してもよいし、ヘッダーに続く行番号に基づいて行を指定してもよい。ヘッダー行が指定された場合、内容行は単純に絶対行数より一つ少ない行数として計算され得る。この調整は、データがリクエストされたときに容易に行うことができ、分割および保存時に行う必要はない。とはいえ、本明細書では、データがヘッダー行を含むかどうかのしるしをオブジェクトメタデータ112が保存することを妨げるものではない。オブジェクトメタデータ112は、関連するデータが圧縮形式で保存されるか非圧縮形式で保存されるかに関係なく、行または記録の開始番号1910およびカウント1920を保存し得ることを理解されたい。
【0172】
開始行または記録番号1910とカウント1920の保存は、ルックアップを非常に容易にする。クライアントが、指定されたデータオブジェクトのCSV行「1000」をリクエストする場合を考える。リクエストに応答して、ストレージクラスタ130は、オブジェクトメタデータ112をチェックして、たとえばメタデータ910および912に基づいて、CSV行1000を保存する特定のセグメントを識別することができる。次に、クラスタは、識別されたセグメントにアクセスし、そのデータを(全部または部分的に)解凍し、開始行/記録1910から行1000までカウントを進めてもよい。その後、クラスタはCSVデータの行1000を抽出してクライアントに返すことができる。同様の行為は、複数のセグメントにまたがる範囲を含む行の範囲に対して実行されてもよい。記録の範囲または行が複数のセグメントにまたがる場合、クラスタはオブジェクトメタデータ112からそのような各セグメントを識別し、各セグメントに順番にアクセスし、そのデータを解凍し、指定された行を抽出し得る。
【0173】
時には、非圧縮データのクエリされたバイト範囲が行や記録の途中で始まったり終わったりして、行や記録の一部だけがリクエストされた範囲に含まれることがある。このような場合、行または記録全体を含めるか、または除外するかのいずれかの規則を採用し得る。たとえば、行または記録のいずれかのバイトがリクエストされたときは常に、行または記録全体を返すという規則を指定することができる。この規則を満たすためには、返されるデータが圧縮されていても、その行または記録の境界を特定するために解凍を実行する必要があり得る。
【0174】
図20は、コンテンツセンシティブな方法でデータを分割する方法2000の例を示す。コンテンツセンシティブな分割は、セグメントに保存されたデータが他のセグメントから独立して処理されるように、データの個別に処理可能な単位をそれぞれのセグメント170に配置しようとする場合に有用である。方法2000は、例えば、
図2に関連して説明したスプリッタ220によって実行することができる。
【0175】
この例では、圧縮ペイロード1514は、関連するデータを一緒に保ち、それによってストレージクラスタ130のノード120による関連するデータの独立した処理を容易にする方法で分割される。方法2000は以下のように進行し得る。
【0176】
2010において、ターゲットサイズが第1の部分250aに対して提供され得る。上述したように、ターゲットサイズは、圧縮データのサイズおよび/または対応する非圧縮データのサイズに基づいてもよい。ターゲットサイズは、例えば、ペイロードの開始オフセットにターゲットサイズを加えたものとして、ペイロード1514内のターゲット分割位置を意味する。ターゲットサイズは、すべての部分250に対して一度に提供されてもよいし、異なる部分250に対して個別に提供されてもよい。
【0177】
2020において、ペイロード1514の解凍が開始される。最初の解凍は、ディクショナリ1530eを必要とせず、むしろ、デフォルトディクショナリ、ユーザが選択したディクショナリを使用するか、またはディクショナリを使用しない場合がある。解凍が開始すると、タイプ検出器210および/またはスプリッタ220は、提供されたデータのタイプ、たとえば、ペイロードがCSVデータ、Parquetデータ、ビデオデータなどを含むかどうかを、たとえば、
図2に関連して説明した方法で識別しようと試み得る。
【0178】
2030において、スプリッタ220は、指定されたターゲットサイズに近い解凍データの境界252を特定する。境界252の例には、CSV記録の終了、JSON記録の終了、Parquet行グループの終了、ビデオデータのキーフレームなどが含まれる。スプリッタ220はまた、CSVヘッダー、Parquetヘッダーおよびフッターなどの記述情報を、非圧縮データ内で識別しようと試み得る。このような記述的データは、基礎となるデータの独立した処理を容易にするために、複数のセグメントに伝搬され得る。
【0179】
2040において、スプリッタ220は、より適切なスプリット位置1602を見つけるために、任意にデフレートブロック単位で前進または後退する。例えば、デフレートブロック1710の終わり付近、すなわち、分割後の次の部分250bのディクショナリ1530eとなる範囲内に、自然境界252を見つけることができれば、一般に最も効率的である。その範囲内に自然境界252が見つからない場合、スプリッタは、次のデフレートブロックまたは前のデフレートブロック(または各方向に複数のブロック)を試して、その終わり付近に境界252を持つデフレートブロックを見つけようと試みることができる。ターゲット分割位置から妥当な距離内に、その終わりの近くに境界252を持つそのようなデフレートブロックが見つからない場合、スプリッタは、ターゲット分割位置の近くのブロックの中から、その終わりに最も近い境界252を持つブロックとして、デフレートブロックを選択することができる。
【0180】
2050において、スプリッタ220は、現在の部分250aの終わりを、選択されたデフレートブロックの終わりとして確定する。スプリッタ220はまた、次の部分250bの開始を、選択されたデフレートブロックの直後に続くデフレートブロック1710の開始として確定する。スプリッタ220はさらに、選択されたデフレートブロックの終わりからディクショナリ1530eを識別する。識別されたディクショナリ1530eは、次の部分250bを含むセグメント170のメタデータに保存される。
【0181】
理想的には、特定された境界252と、選択されたブロック内でそれに続くデータはすべてディクショナリ1530e内に含まれ、ディクショナリ1530eは、次の部分250bのデータを独立して処理するために必要な、必要な「フィックスアップ」データ、すなわち、境界252の後に現れる現在の部分250aのデータをすべて含むようになっている。例えば、フィックスアップデータがなければ、次の部分のデータは完全ではなく、独立して処理することができない(独立して解凍することはできる)。境界252が、選択されたデフレートブロックのディクショナリ1530e内に見出されず、むしろ選択されたデフレートブロックの初期に現れる場合、追加のフィックスアップデータが、すなわち、境界252の後であってディクショナリ1530eの開始前に現れるデータとして、識別され得る。このような追加フィックスアップデータは、例えば追加メタデータとして、次の部分/セグメントとともに保存することができる。これにより、次のセグメントのデータは、現在のセグメントのデータ、または他のセグメントのデータとは独立して処理できるようになる。
【0182】
2060において、境界252の位置が、現在の部分250aのメタデータにマークされる。このようなマーキングは、現在の部分250aの非圧縮データを独立して処理するときに、境界252以降のデータを無視できるようになるため(次の部分250bで処理される可能性があるため)、後で有用である。さらに、いくつかの例では、ステップ2030の間に検出された任意の記述データ(例えば、CSVヘッダー、Parquetヘッダーまたはフッターなど)は、次のセグメント170のメタデータにコピーされ、次の部分の独立した処理を容易にすることができる。
【0183】
2070において、スプリッタ220は、ペイロード1514にさらに分割すべきデータがあるかどうかを判定する。その場合、動作は2010に戻り、次の部分250bについて新しいターゲットサイズとターゲット分割位置が判定され、上述の行為2010~2060が繰り返される。方法2000は、これ以上の分割が不要になるまで本方法で続けられ、その時点で方法2000は終了する。本方法2000は、それぞれのセグメントのデータを独立に解凍できるだけでなく、解凍後にそのようなデータを独立に処理できることを保証するものであることを理解されたい。
【0184】
図21は、自然境界252が、分割位置近傍のデフレートブロック1710のディクショナリ1530e内に見出される構成例を示す。ここで、分割位置2102は、デフレートブロックA~Hを含むペイロード1514のデフレートブロックDとEの境界と一致する。解凍された(膨張された)ブロック2104に見られるように、ブロックDには、ブロックDの終わりのディクショナリ1530e内に含まれる境界252が含まれる。フィックスアップデータ2110は、境界252の後に現れるブロックDのデータとして定義され得る。ペイロード1514が分割されるとき、デフレートブロックA~Dはセグメント170xに割り当てられ、デフレートブロックE~Hはセグメント170yに割り当てられる。
【0185】
独立した処理を容易にするために、セグメント170xは境界252の位置2120を保存する。このような位置2120は、セグメント170x内のデータの後の処理において、境界252の後に現れるデータを無視することを可能にする。また、セグメント170yは、フィックスアップデータ2110を含むメタデータを保存し、この場合、フィックスアップデータ2110はディクショナリ1530e内に完全に含まれている。セグメント170yのメタデータは、フィックスアップデータ2110の位置2130(例えば、保存されたディクショナリ1530e内の境界252の位置)も含む。このようなメタデータは、セグメント170y内のデータを独自に処理するのに有用な任意の記述データ2140(例えば、CSVヘッダー、Parquetヘッダーおよびフッターなど)も含み得る。
【0186】
図22は、ここでは自然境界252がディクショナリ1530eの範囲内に入らず、むしろディクショナリ1530eの前に現れることを除いて、
図21に類似している。この場合、フィックスアップデータ2110は、ディクショナリ1530eのすべてのデータと、追加データ2110aとを含む。追加のフィックスアップデータ2110aは、セグメント170yのメタデータとともに、例えば、ヘッダー、フッターなどに保存されてもよく、圧縮形式で保存されても非圧縮形式で保存されてもよい。
【0187】
図23は、メタデータの分割と保存の追加的な例を示す。示されるように、セグメント170は、デフレートデータのオリジナル部分250に加えて、セグメントヘッダーデータ2310およびセグメントフッターデータ2320を含むことができ、これらは、上述の記述データ2140を提供することができる。セグメント170はさらに、ヘッダー長2330、追加のフィックスアップデータ2110a、および保存された解凍状態2340を含むことがあり、この解凍状態2340は、ディクショナリ1530eのほか、追加のフラグおよび/または設定2350を含み得る。いくつかの例では、ヘッダー長2330内に境界2120および2130が設けられることがあり、境界2120は、現在のセグメントの非圧縮データの処理が停止できる場所を示し、境界2130は、現在のセグメントを処理するためのフィックスアップデータが開始する場所を示す。
【0188】
図24は、特定の実施形態において実施され得る例示的な方法2400を示し、上述した特徴のいくつかの要約を提供する。方法2400は、例えば、
図2に関連して説明したゲートウェイ110によって実行されてもよい。
【0189】
2410において、圧縮データ1514は圧縮データの複数の部分250に分割される。部分250は、(i)圧縮データの現在の部分250bと、(ii)現在の部分250bの直前の圧縮データの前の部分250aとを含む。
【0190】
2420において、前の部分250aの解凍に基づいて、解凍状態2340(例えば、ディクショナリ1530eおよびフラグ/設定2350)がキャプチャされる。解凍状態2340は、現在の部分250bの解凍を可能にする。
【0191】
2430において、現在の部分250bは、現在の部分が前の部分250aを参照することなく解凍可能であるように、解凍状態2340と関連付けられて保存される。
【0192】
圧縮データ1514を分割する改良された技術について説明されている。この技術は、圧縮データ1514を複数の部分250に分割することを含む。この技術は、現在の部分250bに関連付けて解凍状態2340を保存することをさらに含み、解凍状態2340は、前の部分250aのデータに基づいており、現在の部分250bを他の部分から独立して解凍することを可能にする。
【0193】
特定の実施形態を説明したが、多数の代替的な実施形態または変形が可能である。例えば、各セグメント170が圧縮/デフレートデータのそれぞれの部分250を含み、ストレージクラスタ130のそれぞれのノードに保存される実施形態について説明したが、これは単なる例示に過ぎない。あるいは、複数のセグメントをストレージクラスタ130の特定のノードにまとめて保存してもよい。このようなセグメントは、既に上述した形態で保存されてもよいが、代替的に異なる形態をとることもできる。例えば、単一のノード上の複数のセグメント170を結合して、データの単一のシャードを形成することができる。このような場合、シャードの構成セグメント170のヘッダーおよびフッターは、(メモリ内での過剰なジャンピングを避けるために)単一のヘッダーまたはフッターに統合されてもよく、圧縮/解凍データの部分250は、連続的な圧縮範囲として、順番にアグリゲートされてもよい。このような場合、セグメントフッターデータ2320は、アグリゲートされた部分250の前、例えば、追加のフィックスアップデータ2110aの直後に現れることがあり、これにより、オブジェクトの最後まで読み込むことなく、完全なセグメントを構築することができる。このように部分250を保存することにより、個別の部分のサイズおよびノードごとに保存されるデータ量を独立に制御することができる。データをシャードに保存する場合、セクションIの
図7~9に関連して説明したような消失訂正符号化は、それぞれのセグメント170ではなく、それぞれのシャードに対して実行することができる。
【0194】
さらに、圧縮データの部分250が、データの個別の処理可能な単位間の境界252に少なくとも部分的に基づいて定義される例が説明されているが、これは単なる例に過ぎない。生物学的データ、実験データなど、データの形式によっては、処理可能な単位間に明確な境界線252がない場合がある。このような場合、データの重複領域を保存することが望ましい場合がある。重複領域は、圧縮データとして保存してもよいし、非圧縮データとして保存してもよい。圧縮データとして保存される場合、圧縮データの次の部分は、連続する両方の部分が同じ重複領域を含むように、前の部分の終わりより前のある決定されたオフセットから開始することができる。あるいは、領域250は区別されたままであってもよく、圧縮重複領域はメタデータとして、例えばセグメントヘッダーやフッターに保存されてもよい。非圧縮で保存される場合、重複領域はメタデータとして(例えば、セグメントヘッダーやフッターに)保存されてもよい。所望の重複領域の長さがディクショナリ1530eの長さより短い場合、ディクショナリ1530eは既に所望の重複領域を含むので、追加のデータ保存は必要ない場合がある。
【0195】
さらに、本明細書の特定の実施形態を参照して特徴を示し説明してきたが、そのような特徴は、開示された実施形態およびそれらの変形例のいずれにも含まれ得、本明細書に含まれる。したがって、任意の実施形態に関連して開示された特徴は、他の任意の実施形態に含まれることが理解される。
【0196】
さらに、改良またはその一部は、磁気ディスク、磁気テープ、コンパクトディスク、DVD、光ディスク、フラッシュドライブ、ソリッドステートドライブ、SD(セキュアデジタル)チップまたはデバイス、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)などの1つまたは複数の非一時的な、コンピュータ読み取り可能な記憶媒体を含むコンピュータプログラム製品として具現化されてもよい(
図12、
図18、および
図24に媒体1250として例示する)。任意の数のコンピュータ可読媒体を使用することができる。媒体は、1つ以上のコンピュータまたは他のプロセッサ上で実行されると、本明細書に記載される処理を実行する命令がエンコードされていてもよい。このような媒体は、製造品または機械と見なすことができ、ある機械から別の機械へ輸送可能であってもよい。
【0197】
本明細書全体を通して使用される場合、「備える」、「含む」、「含有する」、および「有する」という語は、オープンエンドな様式で何かの特定の項目、ステップ、要素、または態様を規定することを意図している。また、本明細書で使用される場合、特に反対の記述がない限り、「セット」という語は、1つまたは複数の何かを意味する。これは、「のセット」という語句の後に単数または複数の目的語が続くかどうかや、単数または複数の動詞が活用されるかどうかに関係なく、同様である。また、「セット」要素は、存在するすべての要素よりも少ない数を表すこともある。したがって、その集合に含まれない同種の要素がさらに存在する可能性がある。さらに、「第1」、「第2」、「第3」などの序数的表現は、本明細書では識別の目的で形容詞として使用することがある。具体的に示されない限り、これらの序数的表現は、いかなる順序または順序を意味するものでもない。従って、例えば、「第2」の事象は、「第1」の事象の前または後に起こる可能性があり、また、第1の事象が発生しない場合であっても起こり得る。さらに、本明細書において、特定の要素、特徴、または行為を「第1の」そのような要素、特徴、または行為であると特定することは、「第2の」または他のそのような要素、特徴、または行為も存在しなければならないことをリクエストするものとして解釈されるべきではない。むしろ、「第1」の項目が唯一であってもよい。また、特に反対の記載がない限り、「~に基づく」は非排他的であることを意図している。したがって、「に基づく」は、特に断りのない限り、「に排他的に基づく」という意味ではなく、「に少なくとも部分的に基づく」という意味に解釈されるべきである。特定の実施形態が本明細書に開示されているが、これらは例示としてのみ提供されており、限定的なものとして解釈されるべきではないことを理解されたい。
【0198】
したがって、当業者であれば、以下の特許請求の範囲から逸脱することなく、本明細書に開示された実施形態に対して形態および細部の様々な変更を加えることができることを理解するであろう。
【国際調査報告】