あなたはFLINKは、メモリを管理する方法を理解していることを確認するために、これを読んだ後?

個人ブログのナビゲーションページ(クリック、右側にリンク個人のブログを開くために):ダニエルは、テクノロジ・スタックにあなたを取ります 

序文

今日では、大規模なデータセットを分析するための多くのオープンソース・システムは、JavaやJVMベースのプログラミング言語を使用しています。最も有名な例は、Apache Hadoopの、ならびにこのようなApacheのスパーク、Apacheのドリルは、Apache FLINKなどの新しいフレームワークです。これは、データ分析エンジンが直面する共通の課題に基づいてJVMのメモリ(キャッシュと効率的な処理を含む)、大量のデータを格納する方法です。適度に良好なJVMのメモリ管理は、区別するために、システムの構成と安定した動作少量の構成及び予測不可能なシステムが困難であることができます。

この記事では、我々はそのカスタムシリアライズとデシリアライズのメカニズムを議論するためには、Apache FLINKメモリを管理する方法について説明します、そしてそれはどのようにバイナリデータと協力しています。

データは、ヒープメモリ上のオブジェクトを直接

JVMで大量のデータを扱うための最も直接的な方法は、ヒープメモリに保存されているオブジェクトとして、これらのデータにであり、あなたがオブジェクトのリストをソートするソートする場合は、メモリ内のデータを直接操作します。しかし、この方法のいくつかの明らかな欠点があり、まず、多数回の作成と破棄を頻繁にターゲットは、監視およびヒープメモリの使用は非常に単純なものではありません制御します。オブジェクトがあまりにも多く割り当てた場合、OutOfMemoryErrorが、直接殺したJVMプロセスのリードをトリガー、メモリの過剰使用につながります。別の態様は、JVMのガベージコレクション、ガベージコレクションのオーバーヘッドが簡単に50%以上に達することができたときにこれらのオブジェクトは、主に、新生代に住んでいるので、ということです。最後に、Javaは(JVMおよびプラットフォームに応じて)特定の空間オーバーヘッドを持つオブジェクトです。有意に利用可能なメモリの有効量を減少させることができる小さなオブジェクトの数とデータ・セットの。あなたは、システム設計、システムのチューニングに精通している場合は、特定のパラメータに応じてシステムを調整することができ、数は、多かれ少なかれ発生し、ヒープメモリの過剰使用を避けるのOutOfMemoryErrorに制御することができるが、このような構成の効果は限られており、チューニングされ特に、データおよび実行環境変化の大量の場合には

FLINKはどのように行うことですか?

ApacheのFLINKは目的が最高の技術のMapReduceベースのシステムと並列データベース・システムを結合することを研究プロジェクトで始まりました。この文脈では、FLINKは、常に独自のメモリデータ処理方法がありました。むしろ直接ヒープメモリ上のオブジェクトよりも、予め割り当てられたメモリセグメントの固定数に標的配列をFLINK。これは、DBMSスタイルのソートアルゴリズムだと最低のシリアライズとデシリアライズコストのために、動作するバイナリデータのできるだけ接続します。データをメモリに格納することができるよりも、データを処理する場合、オペレータは、ディスクへのデータの部分をオーバーフローFLINKあろう。実際には、より多くのではなく、通常のJavaよりC / C ++のような内部FLINK実装ルックスがたくさん。必要に応じて配列データの格納用メモリセグメントにおいて、ディスクにFLINKとオーバーフロー方法をまとめ下図:

バイナリデータのFLINKアクティブなメモリ管理および操作は、いくつかの利点を有します。

図1に示すように、メモリ効率的でセキュアな実行アルゴリズム外側コア  割り当てられるメモリセグメントの数が固定されているので、このようにして残りのメモリリソースを監視することは非常に簡単です。メモリ不足の場合には、プロセスオペレータは、より効率的にディスクに書き込まれたメモリセグメントの数が多いことが、再び戻ってメモリにそれらを読むことができます。したがって、OutOfMemoryErrorが効果的に防止されます。

図2に示すように、ガベージコレクションの圧力を低下させる  すべてのデータは2進数で長寿命サイクル管理FLINKメモリ内にあるので、すべてのデータ・オブジェクトは、可変であっても短命であり、再使用することができるからです。オブジェクトの短いライフサイクルを大幅にガベージコレクションへの圧力を減少させ、より効果的なガベージコレクション、することができます。今、事前に割り当てられたメモリ・セグメントは、ガベージコレクションの圧力を低下させるために、FLINKコミュニティが積極的に外部メモリヒープに配布され、長年のターゲットJVMのヒープです。このような努力は、JVMのヒープが小さくなる可能になり、消費ガベージコレクションの時間が少なくなります。

3は、データ・ストレージ・省スペースの  データは、バイナリ形式で保存されている場合、Javaオブジェクトは、ストレージのオーバーヘッドを持っている、あなたは、このオーバーヘッドを回避することができます。

図4に示すように、効率的なバイナリ操作とキャッシュ感度  適切なバイナリ表現で与えられる場合に、かつ効率的に動作することができるバイナリデータを比較します。さらに、相関値、ハッシュコード、キー、およびポインタのバイナリ表現をメモリに連続して格納されてもよいです。これは、データ構造は、一般的に、より効率的なバッファアクセスモードを持っています。

これらは、大規模データ解析のためのデータ処理システムにおける積極的なメモリ管理が非常に望ましい特徴が、これらの機能を実現するためのコストも高くなります。使用して、バイナリデータおよび容易な操作の自動メモリ管理を達成するために、  java.util.HashMap オーバーフローの比率が達成される  hash-table (バイト配列と支持カスタムシリアル化)。もちろん、ApacheのFLINKだけでなく、JVMベースのバイナリデータとデータ処理システムを動作させます。例えば、Apacheのドリルは、ApacheのIgniteは、ApacheのGeodeは最近、それはまた、Apacheはこの方向に進化スパークすると発表した同様の技術を使用しています。

以下は、オブジェクトがシリアライズとデシリアライズし、バイナリデータを操作する場合はされている場合、我々は、メモリFLINKを割り当てる方法を詳細に説明します。我々はまた、いくつかのプロセスパフォーマンスデータを通じてバイナリデータに、ヒープ上のオブジェクトと操作を比較します。

メモリを割り当てる方法をFLINK?

(FLINKマスターとの連携用)アクター・システム、IOManager(ディスクへのオーバーフローデータを担当し、リードバック)、MemoryManager(メモリ使用量を調整する責任):FLINKタスクマネージャは、いくつかの内部構成要素から構成されています。この記事では、我々は、メインMemoryManagerを説明します。

、MemorySegmentsを割り当てる責任を計算し、データは、例えば、オペレータが、分散処理、ソート、および他の事業者に加入MemoryManager。FLINKは、バイトの従来のJava配列によってサポートMemorySegmentメモリ割当単位、(デフォルトサイズは32キロバイトである)です。MemorySegmentは、Java危険なメソッドを使用して、バイトの配列に非常に効果的な支援の読み取りと書き込みのアクセスを提供します。あなたは、Java NIOのByteBufferのカスタマイズされたバージョンとして見ることができますMemorySegment。複数のMemorySegment大きな連続したメモリブロック、FLINK java.io.DataOutput上で動作するため、界面java.io.DataInputのJava実装の論理ビューを使用しています。

MemorySegmentsタスクマネージャの起動時に一度割り当てられ、タスクマネージャを閉じたときに破壊されました。そのため、タスクマネージャのライフサイクル全体で、MemorySegmentは再利用可能で、ごみは収集されません。タスクマネージャは、すべてのコアサービスを初期化して開始し、すべての内部データ構造の後、MemoryManagerはMemorySegmentsの作成を開始します。JVMヒープメモリ割り当てMemoryManager(全てが配置されていてもよい)によってデフォルトで、サービスの初期化、70%が利用できます。ユーザ定義関数によって作成されたオブジェクトを含むインスタンス化されたオブジェクトのためのタスクの処理中に残っているJVMヒープメモリ。次の図に示すのメモリレイアウトタスクマネージャJVMの起動:

どのようにFLINKは、オブジェクトをシリアライズ?

Javaのエコシステムは、オブジェクトがバイナリ表現とリターンに変換することができ、いくつかのライブラリを提供します。一般的な代替は、標準のJavaシリアライゼーション、Kryo、Apacheのアブロ、ApacheのスリフトやGoogleのいるProtobufです。FLINKは、バイナリ表現に、独自のカスタムフレームワーク配列、制御データが含まれています。バイナリデータの操作は、レイアウトの順序を正確に理解する必要があるため、これは重要です。さらに、バイナリデータのレイアウトで実行される動作シーケンスに基づいて、構成が大幅に性能を向上させることができます。FLINKタイプの直列化機構は、オブジェクトのシリアライズとデシリアライズするプログラムの実行が、完全に知られる前に、という事実を利用します。

FLINK処理プログラムは、任意のJavaデータオブジェクトまたはScalaで発現させることができます。最適化プログラムの前に、データ・タイプは、プログラム・データ・ストリームを特定の各処理工程に要します。Javaプログラムのために、FLINKは戻り型を分析するための反射型抽出アセンブリ基づいて、ユーザ定義関数を提供しました。Scalaのプログラムは、Scalaのコンパイラの助けを借りて分析することができます。種別情報を用いてFLINKは、各データタイプを表します。

FLINKのタイプ分類

注:この図Dongwei柯は記事「はじめとApache FLINKタイプの直列化機構」を選択し、侵略を削除しました

FLINKデータTypeInformationsのいくつかの種類があります。

  • BasicTypeInfo:Javaまたはjava.lang.Stringですべての基本的なタイプ

  • BasicArrayTypeInfo:配列またはjava.lang.StringでJavaの基本タイプがあります

  • WritableTypeInfo:Hadoopのための任意の実装書き込み可能なインタフェース

  • TupleTypeInfo:どれFLINKタプル(Tuple1 Tuple25まで)。FLINKタプルは、固定長フィールドを持つJavaのタプルであるのタイプを示します

  • CaseClassTypeInfo:(Scalaのタプルを含む)任意のスカラCaseClass

  • PojoTypeInfo:任意のPOJO(JavaやScalaの)、で、すべてのフィールドがパブリックまたはゲッターとセッターを介してアクセスするオブジェクトでは、ユニバーサル命名規則に従ってください

  • GenericTypeInfo:データ型は、他のタイプとして識別することはできません

種別情報クラス継承図

付属のJava / C / C ++ /機械学習/アルゴリズムとデータ構造/フロントエンド/アンドロイド/パイソン/プログラマ読み/シングル書籍図書Daquanは:

(乾燥した個人ブログでそこ開くには、右クリックしてください):技術的なドライ開花を
===== >> ①[Javaのダニエルは、高度なへの道であなたを取る] << ====
===== >> ②[+ ACMアルゴリズムデータ構造ダニエルは、高度なへの道であなたを取る] << ===
===== >> ③[データベースダニエルは高度への道であなたを取る] << == ===
===== >> ④[ダニエルWebフロントエンドの高度への道であなたを取るために] << ====
===== >> ⑤[機械学習のPythonとダニエルあなたにエントリを取ります高度なロード] << ====
===== >> ⑥[建築家ダニエルは高度への道であなたを取る] << =====
===== >> ⑦[C ++ダニエルは、道路上をお連れに進ん] << ====
===== >> ⑧[ダニエルは高度への道であなたを取るのiOS] << ====
=====> > ⑨[ウェブセキュリティダニエルは、高度なへの道であなたを取る] ===== <<
===== >> ⑩[Linuxオペレーティングシステムを、ダニエルは高度への道であなたを取る] = << ====

何の未収果物はありません、あなたの若い友人は、友人がテクニックを学びたい願って、道路の方法ですべての障害を克服することは、技術に結びつける本を理解して、コードをノック、原理を理解し、実践を行くことになります決定しましたそれはあなたの将来、あなたの夢を生活、あなたの仕事をもたらすでしょう。

公開された47元の記事 ウォンの賞賛0 ビュー294

おすすめ

転載: blog.csdn.net/weixin_41663412/article/details/104843144