2017-01-02 15 views
0

私は次のタイプでRDDがあるとします。私は、リスト全体が同じワーカーに配置されていることを並列化レベル

RDD[(Long, List(Integer))] 

を想定することはできますか?私は、特定の操作がRDDレベルで受け入れ可能か、またはドライバで計算されるべきかどうかを知りたい。例えば:Listaggregateの結果または任意の他の操作であってもよく、必ずしも一体に作成されないことに注意

val data: RDD[(Long, List(Integer))] = someFunction() //creates list for each timeslot 

ください。

val diffFromMax = data.map(item => (item._1, findDiffFromMax(item._2))) 

def findDiffFromMax(data: List[Integer]): List[Integer] = { 
    val maxItem = data.max 
    data.map(item => (maxItem - item)) 
} 

事はそれがmaxItemは、ネットワークトラフィックの多くを引き起こす可能性が計算配布されListです。これは、次のタイプのRDDで処理することができます。

RDD[(Long, Integer /*Max Item*/,List(Integer))] 

ここで、max項目はドライバで計算されます。

そこで質問(実際には2つの質問)、次のとおりです。

  1. RDDデータのどの時点で私は、データが1つのワーカーに位置していることを前提とすることができますか? (医師または個人の評価を参考にした回答があれば)タプルの内部でタプルの場合にはどうなりますか:((Long, Integer), Double)
  2. タプルでアルゴリズムを設計する一般的な方法は何ですか?私はいつもそのデータを別の労働者に見えるかのように扱うべきですか? (Long、(Strong、Double))であるか、タイムライン(Long)でユーザー(String)にデータがある場合は、最初のタプルフィールドの最小粒度((Long、String)、Double)または多分(String、(Long、Double))?またはこれは最適ではないかもしれませんし、行列が良いですか?

答えて

3

短い答えははいです。あなたのリストは1人のワーカーに配置されます。

あなたのタプルは、RDDの1つのレコードです。単一のレコードは、単一のパーティション(常に1人の作業者)に存在します。 findDiffFromMaxを実行すると、それはターゲットワーカーで実行されます(関数はすべてのワーカーに直列化されて実行されます)。

(k、v)のタプルを生成するときには、これはキー値のペアを意味するので、RDDでキーベースの操作を行うことができます。 ((ロング、(強い、ダブル))対((ロング、ストリング)、ダブル)または他の方法の順序は、それがすべて単一のレコードであるので、本当に重要ではありません。重要な唯一のことは、キー操作を行うためのキーなので、質問は計算の論理になります。

+0

Thxリストの代わりにParArrayがある場合はどうでしょうか?単一のレコードであるタプルにまだ残っているので問題になりませんか?私のケースがRDDの場合(ParArray [(Long、Integer)]]すべてのParArrayは単一のレコードですか? –

+0

別の質問は、そのキーとバレルのペアから、タプル内の同じ最初の要素を持つタプルが一緒に配置される* ALL *と言うことができますか?私は、再転換せずに参加することができますか? –

+0

この点に関して、RDDはRDD [T]と定義され、ここで、Tはレコードタイプであり、レコードは常に単一のパーティション内にある。 TをParArray [(Long、Integer)]にすると、単一のレコードになります。もちろん、レコードが大きすぎる場合は、おそらくOOMの例外または同様の問題が発生するので、それを超えてはいけません。説明のために –