2016-05-03 4 views
3

私はまだSparkの新機能がありますが、Spark Appを作成することができました。私は、JDBCドライバを使用してSQL Serverからデータを再処理できるようにする必要があります(高価なSPを削除しています) SQL ServerをJDBC経由でデータフレームに変換した後、いくつかの結合、グループ、フィルタを実行して、最終的に結果を別のテーブルにJDBC経由で戻します。このすべてはAmazon Web ServicesのSpark EMRでm3.xlargeで約2分で約2分で正常に実行されます。私のSpark Appは1人のエグゼキュータだけで動作しているのはなぜですか?

私の質問は次のとおりです:1.今はクラスタに1つのマスターと2つのコアがありますが、新しいステップを起動するたびに、履歴サーバーから見ることができます私は2人のエグゼクティブが表示されているので、使用されていないドライバー、id 1のエグゼキューターが約1410個のタスクを処理しているのを見ることができます。そして、私はどのように進むべきかについて完全にはわかりません。

また、これはAWSに固有のものですが、何らかの形で関連する2つの質問を投稿したくないのですが、同時に2つのステップを実行できる方法はありますか?このプロセスを1日に何度も実行する(クライアントデータを処理する)ので、このプロセスの2回のスパークサブミットを同時に実行できることを意味します。私はそのステップで新しいクラスタを立ち上げることができると知っていますが、私は処理を速くしたいだけで、新しいクラスタを立ち上げるだけでも時間がかかります。 ありがとうございます!あなたの最初の質問については

+0

あなたは糸(AWS EMR 4.x)で走っていますか?あなたは何(spark-submit)コマンドを起動しますか? –

+0

はい、私はEMR 4.6を実行しています。私はそれを何度もさまざまな議論と小さな変化で立ち上げました。 "spark-submit --deploy-mode cluster --executor-memory 10g --total-executor-cores 8 ..."または "spark-submit --master yarn --deploy-mode cluster --num-executors 3。 .. "とその他いくつかの変更点があります。 –

+0

データを読み取っている間に偶然に遅い(実行者が1人しかいない)のですか? Sparkは、明らかにHDFSから直接読み取るときには並行して読み込むだけであることに注意してください。他のデータソースから読み込むと、ただ一つのエグゼキュータが使用されます(私が気付いたときに[this](https://www.dataiku.com/learn/guide/spark/tips-and-troubleshooting.html)を見つけました) S3からの同じ問題の読書)。 –

答えて

1

私はこれが事実であるかどうかわからないけど、似た何かが私たちに起こった、多分それは助けることができます。

sqlContext.read.format("jdbc").load()(またはそれに準ずるもの)を使用してJDBCソースから読み取っている場合、デフォルトでは結果のデータフレームは分割されません。したがって、それが当てはまる場合は、最初に分割せずに結果のデータフレームに変換を適用すると、1つのエグゼキュータのみが処理できるようになります。あなたの場合ではない場合、次の解決策はおそらくあなたの問題を解決しません。

私たちの解決策は、データに1から32(希望するパーティション数)の値を持つ数値列を作成し、jdbcリーダーのパーティション化オプションを設定してパーティション化列として使用することでした(this link ):

val connectionOptions = Map[String, String] (... <connection options> ...) 
val options = connectionOptions ++ Map[String, String] (
    "partitionColumn" -> "column name", 
    "lowerBound" -> "1", 
    "upperBound" -> "32", 
    "numPartitions" -> "32" 
) 

val df = sqlContext.read.format("jdbc").options(options).load() 

だから、このアプローチでは、並行して処理することができ読み取りタスク(実際にパフォーマンスを向上させ、OOMエラーを回避)しただけでなく、結果のデータフレームは、すべてのために並列に分割して処理しました。その後の変換。

私は役立つことを願っています。

関連する問題