0

私は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 tfsenthastfおよびsentimentwhich 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())

これは、配布せずに保存すると思います。

4

0 に答える 0