DEA / ドメイン1 データの取り込みと変換
分散コンピューティング
分散コンピューティングは、1台のコンピューターでは時間がかかりすぎる、または載り切らない大量のデータを、複数のコンピューター (ノード) に分けて同時に処理する考え方です。、、、 は、どれも内部で分散処理をしています。
DEA では、分散コンピューティングを定義できること、そしてパーティション、、ドライバーとなどの基本の言葉から、性能問題の原因と対処を読み取れることが問われます。
Point
- Distributed = 分散した の意味です。
- Node = 結節点 です。分散処理では、処理を担当する1台1台のコンピューターを指します。
- MPP = Massively Parallel Processing (超並列処理) の略で、Redshift のようなデータウェアハウスの処理方式です。
- 和訳
- Distribute: 分配する、分散させる
- Weblio英和辞書「distribute」
概要
分散処理は、「分ける」「それぞれで処理する」「まとめる」の3段階で進みます。
| 言葉 | 意味 |
|---|---|
| パーティション | データを分けた1つの塊です。1つのタスクが1つのパーティションを処理します。 |
| 並列処理 | 複数のノードが同時に別のパーティションを処理することです。 |
| 集計や結合のために、同じキーのデータを同じノードへ集め直すことです。ネットワークとディスクを使うため重い処理です。 | |
| ノードを増やして処理能力を上げることです (水平スケーリング)。 | |
| データの局所性 | データの近くで処理し、ネットワークの転送を減らす考え方です。 |
主要技術
①MapReduce の考え方
MapReduce は、分散処理の基本の型です。Hadoop の処理モデルとして広まりました。
| 段階 | 内容 | 例 (単語の出現回数を数える) |
|---|---|---|
| Map | 各ノードが担当分のデータを読み、キーと値の組に変換します | 各行を単語に分け、(単語, 1) を出力します。 |
| Shuffle | 同じキーの組を同じノードへ集めます | 「data」の組をすべて1つのノードへ送ります。 |
| Reduce | キーごとに値をまとめます | 「data」の 1 を合計して出現回数にします。 |
は、この考え方を発展させ、途中の結果をメモリに置いて繰り返し使えるようにしたため、ディスクに書き出す MapReduce より高速です。
②Spark のドライバーとエグゼキューター ⚠️ 頻出
と の主な処理エンジンである は、次の役割分担で動きます。
| 役割 | 担当 | 問題が起きたときの兆候 |
|---|---|---|
| ドライバー | プログラムを解釈し、処理の計画を立て、タスクをに配ります。結果を集めることもあります | 大きな結果を collect() でドライバーに集めると、ドライバーのメモリ不足になります。 |
| エグゼキューター | 各ノードでタスクを実行し、データをメモリに保持します | パーティションが大きすぎたり偏ったりすると、エグゼキューターのメモリ不足になります。 |
| タスク | 1つのパーティションに対する処理の単位です | タスクの数が少なすぎると並列にならず、遅くなります。 |
| ステージ | の境目で区切られたタスクのまとまりです | シャッフルの多い処理は、ステージが増えて遅くなります。 |
Glue では、ワーカーの種類 (G.1X、G.2X など) と数が、エグゼキューターの大きさと数を決めます。EMR では、コアノードとタスクノードの台数とで決まります。
③遅延評価と実行計画
の処理には、変換 (transformation) とアクション (action) の2種類があります。
| 種類 | 例 | 動き |
|---|---|---|
| 変換 | filter、select、join、groupBy | すぐには実行されず、処理の計画に追加されるだけです。 |
| アクション | count、write、collect、show | ここで初めて、それまでの変換がまとめて実行されます。 |
この「アクションまで実行しない」仕組みを遅延評価 (lazy evaluation) と呼びます。Spark はアクションの時点で計画全体を見て、フィルターを読み込みの段階へ押し下げる (述語のプッシュダウン)、不要な列を読まない、といった最適化をします。
同じデータを何度もアクションで使う場合は、cache() でメモリに保持すると、毎回の読み直しを避けられます。
④データスキューとシャッフルの影響
分散処理の速さは、一番遅いタスクで決まります。キーの値に偏りがあると、特定のパーティションだけが大きくなり、そのタスクだけが長く走ります。これを (偏り) と呼びます。
| 症状 | 原因 | 対処 |
|---|---|---|
| ほとんどのタスクは終わったのに、数個だけが長く走る | 結合や集計のキーの偏り | (キーに乱数を付けて分散させる)、 の AQE のスキュー結合の最適化 (#58) |
| の読み書きが大きい | 大きなテーブル同士の結合、広い集計 | 小さい方をにする、結合前に絞り込む |
| タスクが少なく、ノードが遊んでいる | パーティション数が少ない、分割できない圧縮ファイル (gzip の大きな1ファイル) | repartition で増やす、分割可能な形式 ( など) にする |
⑤MPP (Redshift) と Spark の違い
| 観点 | () | ( / ) |
|---|---|---|
| 形 | リーダーノードがクエリの計画を立て、コンピューティングノード (スライス) が並列に実行します | ドライバーが計画を立て、が並列に実行します |
| データの置き場所 | 主に Redshift のマネージドストレージに、で各スライスに配置します | などの外部のストレージから読みます |
| 得意なこと | 繰り返される の集計、多数の利用者の同時のクエリ | 複雑な変換、多様な形式のデータ、の前処理 |
| 偏りの原因 | 分散キーの選び方による行の偏り | パーティションのキーの偏り |
Redshift では、結合で使う列を分散キーにすると、同じキーの行が同じスライスに置かれ、結合時のデータの再配置 (Spark のにあたる動き) を減らせます。
試験対策
①判断マトリクス
| 問題文のキーワード | 考えること | 理由 |
|---|---|---|
| 1台では処理しきれない大量データの変換 | 分散処理 ( / の ) | 複数ノードで並列に処理します。 |
| 数個のタスクだけが長く走る | → 、AQE | 一番遅いタスクが全体の時間を決めます。 |
| ドライバーのメモリ不足 | collect() で大きな結果を集めていないか | 結果は などに書き出します。 |
| 大きなテーブルと小さなテーブルの結合が遅い | を避けます。 | |
| ノードを増やしても速くならない | パーティション数、分割できないファイル | 並列にできる単位が足りません。 |
| 同じ中間結果を何度も使う | cache() | 再計算と読み直しを避けます。 |
| 繰り返しの 集計を多数の利用者が実行 | の | の集計に向きます。 |
②よくある誤答
- ノードを増やせば必ず速くなると考えること。やパーティションの不足があると、増やしても一部のタスクが足を引っ張ります。
filterを書いた時点で処理が走ると考えること。 は遅延評価で、アクションの時点でまとめて実行します。- を軽い処理と考えること。ネットワークとディスクを使う、分散処理で最も重い部分の1つです。