第5章. データのパーティション分割
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
パーティショニングとは、"分割する行為。"分割する、または分離する境界を作ることによって分離すること "と定義されている。データのパーティション分割は、Spark、Amazon Athena、Google BigQueryのようなツールで、クエリの実行パフォーマンスを向上させるために使われている。ビッグデータ・ソリューションをスケールアウトするために、データのパーティション分割が行われ、別々に管理、アクセス、並列実行が可能になる。
本書の前の章で説明したように、Sparkはデータをパーティション分割と呼ばれる小さな塊に分割し、ワーカーノードのエクゼキュータを使ってこれらのパーティションを並列処理する(多くのパーティションを同時に処理できる)。例えば、入力が1,000億レコードある場合、Sparkはそれを10,000のパーティションに分割し、各パーティションは約1,000万の要素を持つことになる:
-
合計記録100,000,000,000
-
パーティション数10,000
-
パーティションあたりの要素数:10,000,000
-
可能な最大並列度:10,000
注
デフォルトでは、Sparkは、JavaのObject.hashCode() 関数を使用するHashPartitioner 、ハッシュベースのパーティショニングを実装している。
データのパーティション分割は、管理性とスケーラビリティを向上させ、競合を減らし、パフォーマンスを最適化することができる。世界各国(7大陸、195カ国)の都市の1時間ごとの気温データを持っていて、特定の大陸、国、または国のセットのデータをクエリして分析することが目的だとする。もしデータのパーティション分割を適切に行わなければ、クエリごとに、データセット全体を読み込み、読み取り、マッパーとリデューサーを適用して、求めている結果を得なければならない。ほとんどのクエリでは、実際に必要なのはデータのサブセットだけなので、これはあまり効率的ではない。もっと速い方法は、必要なデータだけをロードすることだ。
Sparkにおけるデータのパーティション分割は、主にタスクが独立して実行できるようにする並列化の目的で行われるが、Amazon AthenaやGoogle BigQueryなどのクエリツールでは、データセット全体ではなくデータのスライスを分析できるようにする目的で行われる。PySparkではDataFramesをカラム名で物理的に分割するのが非常に簡単なので、これらのツールは効率的にクエリを実行できる。
パーティション入門
データのパーティション分割を行うことで、各クエリがスキャンするデータ量を制限することができ、パフォーマンスを向上させ、コストを削減することができる。例えば、データのパーティション分割にSparkとHiveを活用しているAmazon Athenaでは、任意のキーでデータを分割することができる(BigQueryも同じ機能を提供している)。そのため、先ほどの天気データの例では、すべての国のデータセットを使用するのではなく、特定のフォルダを選択してクエリに使用することができる。
データがSpark DataFrameのようなテーブルで表現されている場合、パーティション分割はそのテーブルを特定のカラムの値に基づいて関連する部分に分割する方法である。パーティショニングは、1つまたは複数の列(これらの列はパーティション・キーと呼ばれる)に基づいて行うことができる。これらのパーティショニングされたカラムの値は、各行がどのパーティションに格納されるべきかを決定するために使われる。パーティションを分割することで、分析のためにデータセット全体をロードするのではなく、データのスライスに対してクエリを実行することが容易になる。例えば、ゲノミクスのデータレコードには合計25本の染色体が含まれ、それらは ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access