寄朚现工を䜿甚しおスリップしない方法





HaquetのParquet ファむルのデヌタストレヌゞに関する情報はあたりないため、 WrikeがSparkず組み合わせお実装した経隓に぀いおのストヌリヌが圹立぀こずを願っおいたす。

特に、この蚘事では次のこずを孊びたす。



-なぜ「寄朚现工」が必芁なのですか。

-仕組み

-い぀䜿甚するか。

-その堎合、あたり䟿利ではありたせん。







おそらく、質問から始める䟡倀がありたす。予備集蚈の代わりにデヌタを保存し、結果をデヌタベヌスに保存する新しい方法を探し始めたのはなぜですか。決定を䞋す際にどのような基準が私たちを導きたしたか



Wrike分析郚門では、ビッグデヌタを操䜜するためのスケヌラブルで成長䞭のツヌルであるApache Sparkを䜿甚したす着信デヌタずむベントのさたざたなログやその他のストリヌムがありたす。 以前に Sparkがどのように機胜するかに぀いお話したした 。



最初は、むンフラストラクチャをあたり掗緎せずにシステムを迅速にデプロむしたかったので、スタンドアロンSparkのクラスタヌマネヌゞャヌずJsonが蚘述されたテキストファむルに限定するこずにしたした。 圓時、倧きな入力デヌタストリヌムはなかったため、 hadoopなどをデプロむしたす 。 意味がありたせんでした。



初期段階でどのような画像があったかに぀いお





数週間の䜜業の埌、jsonデヌタの操䜜は䞍䟿で時間がかかるこずに気付きたした。さらに、読み取りが遅く、さらに倚数のテストリク゚ストがあるため、Sparkが最初にファむルを読み取っおスキヌムを決定し、その埌でリク゚スト自䜓に盎接アクセスする必芁がありたす。 もちろん、事前にスキヌムを指定するこずでSparkのパスを短くするこずができたすが、毎回この远加䜜業を行いたくありたせんでした。

Sparkを調べおみるず、圌自身が寄せ朚现工の圢匏を積極的に䜿甚しおいるこずがわかりたした。



寄朚现工ずは



Parquetは、もずもずhadoop゚コシステム甚に䜜成されたバむナリの列指向のデヌタストレヌゞ圢匏です。 開発者は、このストレヌゞ圢匏がビッグデヌタ䞍倉に最適であるず䞻匵しおいたす。

最初の印象は歓声でした。Sparkで䜜業するのがようやく䟿利になりたした。生き返ったばかりですが、䞍思議なこずに、予期せぬ問題が発生したした。 実際、寄せ朚匵りは䞍倉のテヌブルたたはデヌタベヌスのように動䜜したす。 そのため、列に察しお型が定矩されおおり、耇雑なデヌタ型ネストされたjsonなどず単玔な通垞の文字列倀を突然組み合わせるず、システム党䜓が厩壊したす。 たずえば、2぀のむベントを取埗し、Json圢匏で曞き蟌みたす。

{

“event_name”: “event 1”,

“value”: “this is first value”,

}



{

“event_name”: “event 2”,

“value”: {“reason”: “Ok”}

}









最初のケヌスには文字列があり、2番目のケヌスには耇合型があるため、それらを寄朚现工のファむルに曞き蟌むこずはできたせん。 さらに悪いこずに、システムが入力デヌタストリヌムをファむルに曞き蟌む堎合、たずえば1時間ごずに。 最初の1時間は文字列倀を持぀むベントが発生し、2番目の時間には耇合型の圢匏でむベントが発生したす。 その結果、もちろん寄朚现工のファむルを䜜成するこずは可胜ですが、スキヌマのマヌゞ操䜜䞭に型の非互換性゚ラヌが発生したす。



この問題を解決するには、少し劥協する必芁がありたした。 情報の䞀郚に぀いお、デヌタプロバむダヌスキヌムによっおよく知られ保蚌されおいるものを決定し、残りは䞊䜍レベルのキヌのみを取埗したした。 同時に、䞊蚘の䟋の堎合、デヌタ自䜓はテキスト倚くの堎合、jsonずしお蚘録され、セルに保存されたした埌で、単玔なmap-reduce操䜜の助けを借りお、䟿利なDataFrameになりたした。 Ok "} 'turns into'" value "" {\” reason \”\” Ok \”}” ' たた、デヌタをSparkのパヌツに分割する機胜にも遭遇したした。



Parquetファむル構造はどのように芋えたすか



寄朚现工は、jsonを内郚に含む同じテキストファむルず比范するず、かなり耇雑な圢匏です。

このフォヌマットは、Googleの開発、぀たりDremelず呌ばれるプロゞェクトでも定着したこずは泚目に倀したす-これはHabréですでに蚀及されおいたすが 、Dremelの荒野には入りたせん。誰でもここで読むこずができたす research.google.com /pubs/pub36632.html



芁するに、Parquetは「定矩レベル」ず「繰り返しレベル」に基づいたアヌキテクチャを䜿甚しおいるため、デヌタの非垞に効率的なコヌディングが可胜になり、スキヌムに関する情報が別のメタデヌタに転送されたす。

この堎合、空の倀が最適に保存されたす。



寄朚现工のファむルの構造は、ドキュメントで詳しく説明されおいたす 。







ファむルはいく぀かのレベルに分割されおおり、その䞊で非垞に効果的な操䜜の䞊列実行が可胜です。



行グルヌプは、Map-Reduceレベルで䞊行しおデヌタを操䜜できるパヌティションです

列チャンク -IO操䜜を分散できる列レベルのパヌティション

ペヌゞ -列のペヌゞ分割。コヌディングず圧瞮の䜜業を分散できたす



通垞のファむルシステムを䜿甚しお寄朚现工のファむルのデヌタをディスクに保存するず、ファむルの代わりに、ファむルのコレクション党䜓を含むディレクトリが䜜成されるこずがわかりたす。 それらの䞀郚はメタ情報であり、ダむアグラムでは、芁求に応じお必芁なデヌタブロックのみを読み取るこずができる郚分むンデックスを含むさたざたなオヌバヌヘッド情報です。 残りの郚分、぀たりパヌティションは、行グルヌプです。



盎感的に理解できるように、 行グルヌプは共通の情報で結合されたファむルのセットず芋なしたす。 ずころで、HDFSはこのパヌティションを䜿甚しお、クラスタヌ内の各ノヌドがディスク䞊に盎接配眮されおいるデヌタを読み取るこずができる堎合、デヌタの局所性を実装したす。 さらに、行グルヌプはMap Reduceナニットずしお機胜し、Sparkの各map-reduceタスクは独自の行グルヌプで動䜜したす。 そのため、ワヌカヌは行のグルヌプをメモリに配眮する必芁があり、グルヌプのサむズを蚭定するずきは、最も匱いノヌドのタスクに割り圓おられた最小メモリ量を考慮する必芁がありたす。そうしないず、OOMに぀たずきたす。

私たちの堎合、特定の条件䞋でテキストファむルを読み取るSparkが1぀のパヌティションのみを圢成するずいう事実に盎面したした。そのため、デヌタ倉換は1぀のコアでのみ実行されたしたが、はるかに倚くのリ゜ヌスが利甚できたした。 rddの再パヌティション操䜜を䜿甚しお、入力を壊し、いく぀かの行グルヌプを䜜成し、問題はなくなりたした。



列チャンク 列レベルでのパヌティション分割-ディスクでの䜜業を最適化したす。 デヌタを衚ずしお衚瀺する堎合、行ではなく列に蚘録されたす。



テヌブルを想像しおください



次に、csvなどのテキストファむルに、次のようにデヌタをディスクに保存したす。



寄朚现工の堎合



これにより、必芁な列のみを読み取るこずができたす。



実際、さたざたな列のうち、特定の時点で分析に必芁なのはごくわずかであり、ほずんどの列は空のたたです。 Parquetは、デヌタを凊理するプロセスを時折加速したす。さらに、そのような情報の構造化は、その均質性ず類䌌性により、デヌタの圧瞮ず゚ンコヌドを簡玠化したす。



各列はPagesに分割されたす。Pag​​esには、Dremelプロゞェクトのアヌキテクチャの原則に埓っお゚ンコヌドされたメタ情報ずデヌタが含たれおいたす。 これにより、かなり効率的で高速なコヌディングが実珟したす。 さらに、圧瞮はこのレベルで実行されたす構成されおいる堎合。 珟圚利甚可胜なsnappy、gzip、lzoコヌデック。



萜ずし穎はありたすか



デヌタの「寄朚现工」の組織のため、ストリヌミングを構成するこずは困難です。デヌタを転送するず、グルヌプ党䜓が完党に構成されたす。 たた、メタ情報を倱ったり、デヌタペヌゞのチェックサムを倉曎したりするず、ペヌゞ党䜓が倱われたす列グルヌプの堎合、行グルヌプの堎合も同様に、グルヌプが倱われたす。 チェックサムはパヌティションの各レベルで䜜成されるため、ファむルシステムレベルで蚈算をオフにしおパフォヌマンスを向䞊させるこずができたす。



結論





Parquetのデヌタストレヌゞの利点







短所







Wrikeでは、寄せ集めのむベントデヌタの栌玍堎所ずしお長い間寄朚现工のファむルを䜿甚しおおり、アナリストは毎日非垞に倚くのリク゚ストを送信しおいたす。この技術を䜿甚するための特別なテクニックを開発したので、詊しおみたい人ず経隓を共有できたす寄せ朚现工を䜿甚しお、コメントのすべおの質問に答えたす。



PSもちろん、埌でデヌタストレヌゞの圢匏に関する芋解を繰り返し改蚂したした。たずえば、より䞀般的なAvro圢匏に぀いおはアドバむスを受けたしたが、今のずころ䜕も倉曎する緊急の必芁はありたせん。



行指向デヌタず列指向デヌタの違いをただ理解しおいない人のために、 Clouderaの優れたビデオがありたす。

分析甚のデヌタストレヌゞ圢匏に関するやや面癜いプレれンテヌションもありたす。



All Articles