web-dev-qa-db-ja.com

イテレータからSpark RDDを作成する方法は?

明確にするために、私は次のような配列/リストからRDDを探していません

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); // sample
JavaRDD<Integer> rdd = new JavaSparkContext().parallelize(list);

spark RDD from a Java iterator without completely buffering it in memory)を作成するにはどうすればよいですか?

Iterator<Integer> iterator = Arrays.asList(1, 2, 3, 4).iterator(); //sample iterator for illustration
JavaRDD<Integer> rdd = new JavaSparkContext().what("?", iterator); //the Question

追加の質問:

RDDの復元力を提供するために、ソースが再読み取り可能(または何度も読み取り可能)である必要がありますか?言い換えると、イテレーターは基本的に1回限りの読み取りであるため、イテレーターから復元力のある分散データセット(RDD)を作成することも可能ですか?

16
Thamme Gowda

他の誰かが言ったように、sparkストリーミングで何かを行うことはできますが、純粋なスパークに関してはできません。その理由は、あなたが求めていることがスパークのモデルに反するからです。説明。作業を分散して並列化するには、sparkをチャンクに分割する必要があります。HDFSから読み取る場合、その「チャンク」はSpark by HDFS、 HDFSファイルはブロックに編成されているため、Sparkは通常ブロックごとに1つのタスクを生成します。現在、イテレーターはデータへのシーケンシャルアクセスのみを提供するため、spark =チャンクに整理するメモリ内ですべてを読み取ることなく

単一の反復可能パーティションを持つRDDを構築することは可能かもしれませんが、それでも、反復可能の実装をワーカーに送信できるかどうかを判断することは不可能です。 sc.parallelize()を使用する場合spark serializableを実装するパーティションを作成して、各パーティションを異なるワーカーに送信できるようにします。反復可能ファイルは、ネットワーク接続を介して、またはローカルFSであるため、メモリにバッファリングされていない限り、ワーカーに送信することはできません。

11
Roberto Congiu