私は3台のマシンを持っています.4x CPU、8G RAMを備えた1xマスター; 4x CPU と 16G RAM を備えた 2x エグゼキューター。
マスターはスタンドアロン モード(YARN なし) で、pyspark を使用しています。
それが巨大なインフラストラクチャでなくても、ある程度のパフォーマンスが期待できます。操作の実行reduce
時:
tfsent = tfsent.reduce(lambda x,y: Row(tf=spvecadd(x.tf, y.tf), sentiment=spvecadd(x.sentiment, y.sentiment)))
where tfsent
hastf
およびsentiment
which are SparseVector
、およびspvecadd
は追加する自家製関数ですSparseVector
これを行うと、3x 4CPU で、executor の 1 つだけが 100% 実行されます。他は0%、メモリは5G/16G前後。理解できません: * なぜこれほど長いのですか * なぜ 1x CPU しか動作していないのですか?
データを自分でパーティション分割する必要がありますか? (つまり、両方のエグゼキューターに明示的にデータを配布するということですか? 私の考えでは、それが Spark の仕事だとしても)。
ヘルプ、アイデア、ヒントをありがとう
追加情報
両方のエグゼキュータがマスターに接続され、タスクに「割り当て」られています (spark Web UI を使用して確認できます)。
私は約380k回線を持っています。両方のベクトル次元は 100 未満です (これは多くありません)。
複雑さは、行数よりも次元に大きく依存する場合があります。
アップデート
repartition(8)
RDDを分散させるために使用する必要があることがわかりました。これで問題は解決しましたが、完全に私の質問ではありませんでした:なぜこれをしなければならないのですか?
データの取り方のせいだと思います。私はデータベースから読んでいます。
df = (sqlContext
.read.format('jdbc')
.options(url=c.url, dbtable='(%s) tmp '%initial_query, user=c.user, password=c.password)
.load())
これは、配布せずに保存すると思います。